DEF",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "
test",
+ "`\"'>
",
+ "`\"'>
",
+ "`\"'>
",
+ "`\"'>
",
+ "`\"'>
",
+ "`\"'>
",
+ "`\"'>
",
+ "`\"'>
",
+ "`\"'>
",
+ "`\"'>
",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "\"`'>",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
",
+ "
XXX",
+ "
javascript:alert(1)\"` `>",
+ "
",
+ "
",
+ "\">",
+ "",
+ "",
+ "",
+ "",
+ "\">",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "perl -e 'print \"\";' > out",
+ "",
+ "",
+ "",
+ "",
+ "<",
+ "",
+ "1;DROP TABLE users",
+ "1'; DROP TABLE users-- 1",
+ "' OR 1=1 -- 1",
+ "' OR '1'='1",
+ "'; EXEC sp_MSForEachTable 'DROP TABLE ?'; --",
+ " ",
+ "%",
+ "_",
+ "-",
+ "--",
+ "--version",
+ "--help",
+ "$USER",
+ "/dev/null; touch /tmp/blns.fail ; echo",
+ "`touch /tmp/blns.fail`",
+ "$(touch /tmp/blns.fail)",
+ "@{[system \"touch /tmp/blns.fail\"]}",
+ "eval(\"puts 'hello world'\")",
+ "System(\"ls -al /\")",
+ "`ls -al /`",
+ "Kernel.exec(\"ls -al /\")",
+ "Kernel.exit(1)",
+ "%x('ls -al /')",
+ "]>
&xxe;",
+ "$HOME",
+ "$ENV{'HOME'}",
+ "%d",
+ "%s%s%s%s%s",
+ "{0}",
+ "%*.*s",
+ "%@",
+ "%n",
+ "File:///",
+ "../../../../../../../../../../../etc/passwd%00",
+ "../../../../../../../../../../../etc/hosts",
+ "() { 0; }; touch /tmp/blns.shellshock1.fail;",
+ "() { _; } >_[$($())] { touch /tmp/blns.shellshock2.fail; }",
+ "<<< %s(un='%s') = %u",
+ "+++ATH0",
+ "CON",
+ "PRN",
+ "AUX",
+ "CLOCK$",
+ "NUL",
+ "A:",
+ "ZZ:",
+ "COM1",
+ "LPT1",
+ "LPT2",
+ "LPT3",
+ "COM2",
+ "COM3",
+ "COM4",
+ "DCC SEND STARTKEYLOGGER 0 0 0",
+ "Scunthorpe General Hospital",
+ "Penistone Community Church",
+ "Lightwater Country Park",
+ "Jimmy Clitheroe",
+ "Horniman Museum",
+ "shitake mushrooms",
+ "RomansInSussex.co.uk",
+ "http://www.cum.qc.ca/",
+ "Craig Cockburn, Software Specialist",
+ "Linda Callahan",
+ "Dr. Herman I. Libshitz",
+ "magna cum laude",
+ "Super Bowl XXX",
+ "medieval erection of parapets",
+ "evaluate",
+ "mocha",
+ "expression",
+ "Arsenal canal",
+ "classic",
+ "Tyson Gay",
+ "Dick Van Dyke",
+ "basement",
+ "If you're reading this, you've been in a coma for almost 20 years now. We're trying a new technique. We don't know where this message will end up in your dream, but we hope it works. Please wake up, we miss you.",
+ "Roses are \u001b[0;31mred\u001b[0m, violets are \u001b[0;34mblue. Hope you enjoy terminal hue",
+ "But now...\u001b[20Cfor my greatest trick...\u001b[8m",
+ "The quic\b\b\b\b\b\bk brown fo\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007x... [Beeeep]",
+ "Powerلُلُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ冗",
+ "🏳0🌈️",
+ "జ్ఞా",
+ "گچپژ",
+ "{% print 'x' * 64 * 1024**3 %}",
+ "{{ \"\".__class__.__mro__[2].__subclasses__()[40](\"/etc/passwd\").read() }}"
+]
diff --git a/cmd/fuzzbot/fuzzbot.go b/cmd/fuzzbot/fuzzbot.go
new file mode 100644
index 0000000..896dc6b
--- /dev/null
+++ b/cmd/fuzzbot/fuzzbot.go
@@ -0,0 +1,114 @@
+package main
+
+import (
+ "crypto/rand"
+ "cwtch.im/cwtch/event"
+ "cwtch.im/cwtch/model"
+ "cwtch.im/cwtch/protocol/connections"
+ "encoding/json"
+ "git.openprivacy.ca/openprivacy/log"
+ "git.openprivacy.ca/sarah/cwtchbot"
+ "io/ioutil"
+ "os"
+ "os/user"
+ "path"
+)
+
+type BLNS struct {
+ inputs []string
+}
+
+func main() {
+ user, _ := user.Current()
+ log.SetLevel(log.LevelDebug)
+ cwtchbot := bot.NewCwtchBot(path.Join(user.HomeDir, "/.fuzzbot/"), "fuzzbot")
+
+ cwtchbot.Launch()
+
+ blns := new(BLNS)
+ blns_file, err := ioutil.ReadFile("./cmd/fuzzbot/blns.json")
+ if err != nil {
+ log.Errorf("could not read BLNS file %v", err)
+ os.Exit(1)
+ }
+ var inputs []string
+ err = json.Unmarshal(blns_file, &inputs)
+ if err != nil {
+ log.Errorf("could not decode BLNS file %v", err)
+ }
+ blns.inputs = inputs
+
+ input := make([]byte, 64)
+ _, err = rand.Read(input)
+ if err != nil {
+ panic(err)
+ }
+ cwtchbot.Peer.SetName(string(input))
+
+ for {
+ log.Infof("Process.....\n")
+ message := cwtchbot.Queue.Next()
+ switch message.EventType {
+ case event.NewMessageFromGroup:
+ if message.Data[event.RemotePeer] != cwtchbot.Peer.GetOnion() {
+ log.Infof("New Message: %v\v", message.Data[event.Data])
+ cwtchbot.Peer.SendMessageToGroupTracked(message.Data[event.GroupID], message.Data[event.Data])
+ }
+ case event.NewMessageFromPeer:
+ log.Infof("New Event: %v", message)
+ cwtchbot.Queue.Publish(event.NewEvent(event.PeerAcknowledgement, map[event.Field]string{event.EventID: message.EventID, event.RemotePeer: message.Data[event.RemotePeer]}))
+ msg := cwtchbot.UnpackMessage(message.Data[event.Data])
+ log.Infof("Message: %v", msg)
+ switch msg.Data {
+ case "blns":
+ {
+ reply := string(cwtchbot.PackMessage(msg.Overlay, "Starting the Fuzzing Process..."))
+ cwtchbot.Peer.SendMessageToPeer(message.Data[event.RemotePeer], reply)
+ for _, input := range blns.inputs {
+ reply := string(cwtchbot.PackMessage(msg.Overlay, input))
+ cwtchbot.Peer.SendMessageToPeer(message.Data[event.RemotePeer], reply)
+ }
+ }
+ case "random-overlay":
+ {
+ reply := string(cwtchbot.PackMessage(msg.Overlay, "Starting the Fuzzing Process..."))
+ cwtchbot.Peer.SendMessageToPeer(message.Data[event.RemotePeer], reply)
+ for i := 0; i < 100; i++ {
+ input := make([]byte, 64)
+ _, err := rand.Read(input)
+ if err != nil {
+ panic(err)
+ }
+ reply := string(cwtchbot.PackMessage(msg.Overlay, string(input)))
+ cwtchbot.Peer.SendMessageToPeer(message.Data[event.RemotePeer], reply)
+ }
+ }
+ case "random":
+ {
+ reply := string(cwtchbot.PackMessage(msg.Overlay, "Starting the Fuzzing Process..."))
+ cwtchbot.Peer.SendMessageToPeer(message.Data[event.RemotePeer], reply)
+ for i := 0; i < 100; i++ {
+ input := make([]byte, 64)
+ _, err := rand.Read(input)
+ if err != nil {
+ panic(err)
+ }
+ reply := string(input)
+ cwtchbot.Peer.SendMessageToPeer(message.Data[event.RemotePeer], reply)
+ }
+ }
+ case "fuzz-peer-details":
+ }
+ case event.PeerStateChange:
+ state := message.Data[event.ConnectionState]
+ if state == connections.ConnectionStateName[connections.AUTHENTICATED] {
+ log.Infof("Auto approving stranger %v", message.Data[event.RemotePeer])
+ cwtchbot.Peer.AddContact("stranger", message.Data[event.RemotePeer], model.AuthApproved)
+ }
+ case event.NewGetValMessageFromPeer:
+
+ default:
+ log.Infof("New Event: %v", message)
+ }
+ }
+}
diff --git a/go.mod b/go.mod
index 8c3686d..e71889d 100644
--- a/go.mod
+++ b/go.mod
@@ -3,7 +3,7 @@ module git.openprivacy.ca/sarah/cwtchbot
go 1.14
require (
- cwtch.im/cwtch v0.4.6
- git.openprivacy.ca/openprivacy/connectivity v1.3.0
- git.openprivacy.ca/openprivacy/log v1.0.1
+ cwtch.im/cwtch v0.6.9
+ git.openprivacy.ca/openprivacy/connectivity v1.4.2
+ git.openprivacy.ca/openprivacy/log v1.0.2
)
diff --git a/go.sum b/go.sum
index 723a273..a4a03ab 100644
--- a/go.sum
+++ b/go.sum
@@ -1,15 +1,31 @@
cwtch.im/cwtch v0.4.6 h1:jQT0WZY0BGS/EKZrtvL48kMYoed00/q1ycvI0u7Dez4=
cwtch.im/cwtch v0.4.6/go.mod h1:Mh7vQQ3z55+prpX6EuUkg4QNQkBACMoDcgCNBeAH2EY=
+cwtch.im/cwtch v0.6.4 h1:7P7+c7pBw2/aGE1cVWWLlLWhkVrGwuhQomIRbWB840E=
+cwtch.im/cwtch v0.6.4/go.mod h1:snHZIZwRQPAZG2LRZsN5SpAIbeR597VJoDS+KHm7q9w=
+cwtch.im/cwtch v0.6.9 h1:R4UgKd8ucw8qGZ0K0RrYB+tZrgCXJ83HsH/MrNfsqps=
+cwtch.im/cwtch v0.6.9/go.mod h1:KDy4lWWxcYAjeKclwVFkoTQ2dWnZcM0k3Xck+zEuBmE=
cwtch.im/tapir v0.2.1 h1:t1YJB9q5sV1A9xwiiwL6WVfw3dwQWLoecunuzT1PQtw=
cwtch.im/tapir v0.2.1/go.mod h1:xzzZ28adyUXNkYL1YodcHsAiTt3IJ8Loc29YVn9mIEQ=
+git.openprivacy.ca/cwtch.im/tapir v0.3.4 h1:g7yZkfz/vWr/t2tFXa/t0Ebr/w665uIKpxpCZ3lIPCo=
+git.openprivacy.ca/cwtch.im/tapir v0.3.4/go.mod h1:+Niy2AHhQC351ZTtfhC0uLjViCICyOxCJZsIlGKKNAU=
git.openprivacy.ca/openprivacy/bine v0.0.3 h1:PSHUmNqaW7BZUX8n2eTDeNbjsuRe+t5Ae0Og+P+jDM0=
git.openprivacy.ca/openprivacy/bine v0.0.3/go.mod h1:13ZqhKyqakDsN/ZkQkIGNULsmLyqtXc46XBcnuXm/mU=
+git.openprivacy.ca/openprivacy/bine v0.0.4 h1:CO7EkGyz+jegZ4ap8g5NWRuDHA/56KKvGySR6OBPW+c=
+git.openprivacy.ca/openprivacy/bine v0.0.4/go.mod h1:13ZqhKyqakDsN/ZkQkIGNULsmLyqtXc46XBcnuXm/mU=
git.openprivacy.ca/openprivacy/connectivity v1.2.0/go.mod h1:B7vzuVmChJtSKoh0ezph5vu6DQ0gIk0zHUNG6IgXCcA=
git.openprivacy.ca/openprivacy/connectivity v1.3.0 h1:e2EeV6CaMNwOb+PzAjF0hGCeOqAPagRaDL4en5ITf7U=
git.openprivacy.ca/openprivacy/connectivity v1.3.0/go.mod h1:s0/QhONuUqJQfYTAgUlu+ya7G3Ov6bKgpT5QkOhVxDI=
+git.openprivacy.ca/openprivacy/connectivity v1.3.1 h1:d1t7rtzn+Fc63Z2M4mAGmGYU8hSeoZqglvfVBYkg0Lw=
+git.openprivacy.ca/openprivacy/connectivity v1.3.1/go.mod h1:s0/QhONuUqJQfYTAgUlu+ya7G3Ov6bKgpT5QkOhVxDI=
+git.openprivacy.ca/openprivacy/connectivity v1.3.3 h1:OKHZ/pzY95+UNOhF74DisSYPh7lULtjbxFQnK9r6cAk=
+git.openprivacy.ca/openprivacy/connectivity v1.3.3/go.mod h1:DL9QitHjpyNspMUe3wjIej9gFgDK2FdRKP2JE4+7T90=
+git.openprivacy.ca/openprivacy/connectivity v1.4.2 h1:rQFIjWunLlRmXL5Efsv+7+1cA70T6Uza6RCy2PRm9zc=
+git.openprivacy.ca/openprivacy/connectivity v1.4.2/go.mod h1:bR0Myx9nm2YzWtsThRelkNMV4Pp7sPDa123O1qsAbVo=
git.openprivacy.ca/openprivacy/log v1.0.0/go.mod h1:gGYK8xHtndRLDymFtmjkG26GaMQNgyhioNS82m812Iw=
git.openprivacy.ca/openprivacy/log v1.0.1 h1:NWV5oBTatvlSzUE6wtB+UQCulgyMOtm4BXGd34evMys=
git.openprivacy.ca/openprivacy/log v1.0.1/go.mod h1:gGYK8xHtndRLDymFtmjkG26GaMQNgyhioNS82m812Iw=
+git.openprivacy.ca/openprivacy/log v1.0.2 h1:HLP4wsw4ljczFAelYnbObIs821z+jgMPCe8uODPnGQM=
+git.openprivacy.ca/openprivacy/log v1.0.2/go.mod h1:gGYK8xHtndRLDymFtmjkG26GaMQNgyhioNS82m812Iw=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cretz/bine v0.1.1-0.20200124154328-f9f678b84cca/go.mod h1:6PF6fWAvYtwjRGkAuDEJeWNOv3a2hUouSP/yRYXmvHw=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -20,7 +36,9 @@ github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is=
github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s=
github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc=
github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o=
+github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
@@ -30,11 +48,13 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWb
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/struCoder/pidusage v0.1.3 h1:pZcSa6asBE38TJtW0Nui6GeCjLTpaT/jAnNP7dUTLSQ=
github.com/struCoder/pidusage v0.1.3/go.mod h1:pWBlW3YuSwRl6h7R5KbvA4N8oOqe9LjaKW5CwT1SPjI=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg=
@@ -54,6 +74,8 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb h1:mUVeFHoDKis5nxCAzoAi7E8Ghb86EXh/RK6wtvJIqRY=
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0=
+golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -62,8 +84,15 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44 h1:Bli41pIlzTzf3KEY06n+xnzK/BESIg2ze4Pgfh/aI8c=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e h1:FDhOuMEY4JVRztM/gsbk+IKUQ8kj74bxZrgw87eMMVc=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=