From 8365b983c34045c0cda58efe56676229cc28f312 Mon Sep 17 00:00:00 2001 From: sibasankarnayak Date: Thu, 24 Feb 2022 16:44:01 +0000 Subject: [PATCH 1/8] collapsed html to details --- go.mod | 1 + go.sum | 1 + server/webhook/issue.go | 6 +++--- server/webhook/merge_request.go | 12 ++++++++++-- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 82492c5f..d9732939 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/mattermost/mattermost-plugin-api v0.0.21 github.com/mattermost/mattermost-server/v6 v6.0.3 github.com/mholt/archiver/v3 v3.5.0 + github.com/microcosm-cc/bluemonday v1.0.2 github.com/pkg/errors v0.9.1 github.com/stretchr/testify v1.7.0 github.com/xanzy/go-gitlab v0.48.0 diff --git a/go.sum b/go.sum index b2ede619..c2f6afa3 100644 --- a/go.sum +++ b/go.sum @@ -606,6 +606,7 @@ github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i github.com/mholt/archiver/v3 v3.5.0 h1:nE8gZIrw66cu4osS/U7UW7YDuGMHssxKutU8IfWxwWE= github.com/mholt/archiver/v3 v3.5.0/go.mod h1:qqTTPUK/HZPFgFQ/TJ3BzvTpF/dPtFVJXdQbCmeMxwc= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= +github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= diff --git a/server/webhook/issue.go b/server/webhook/issue.go index 9f52ab5a..c1f71dac 100644 --- a/server/webhook/issue.go +++ b/server/webhook/issue.go @@ -53,7 +53,7 @@ func (w *webhook) handleDMIssue(event *gitlab.IssueEvent) ([]*HandleWebhook, err pathWithNamespace: event.Project.PathWithNamespace, IID: fmt.Sprintf("%d", event.ObjectAttributes.IID), URL: event.ObjectAttributes.URL, - body: event.ObjectAttributes.Description, + body: w.sanitizeDescription(event.ObjectAttributes.Description), }); mention != nil { handlers = append(handlers, mention) } @@ -72,14 +72,14 @@ func (w *webhook) handleChannelIssue(event *gitlab.IssueEvent) ([]*HandleWebhook switch issue.Action { case actionOpen: - message = fmt.Sprintf("#### %s\n##### [%s#%v](%s)\n###### new issue by [%s](%s) on [%s](%s)\n\n%s", issue.Title, repo.PathWithNamespace, issue.IID, issue.URL, senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername), issue.CreatedAt, issue.URL, issue.Description) + message = fmt.Sprintf("#### %s\n##### [%s#%v](%s)\n###### new issue by [%s](%s) on [%s](%s)\n\n%s", issue.Title, repo.PathWithNamespace, issue.IID, issue.URL, senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername), issue.CreatedAt, issue.URL, w.sanitizeDescription(issue.Description)) case actionClose: message = fmt.Sprintf("[%s] Issue [%s](%s) closed by [%s](%s)", repo.PathWithNamespace, issue.Title, issue.URL, senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername)) case actionReopen: message = fmt.Sprintf("[%s] Issue [%s](%s) reopened by [%s](%s)", repo.PathWithNamespace, issue.Title, issue.URL, senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername)) case actionUpdate: if len(event.Changes.Labels.Current) > 0 && !sameLabels(event.Changes.Labels.Current, event.Changes.Labels.Previous) { - message = fmt.Sprintf("#### %s\n##### [%s#%v](%s)\n###### issue labeled `%s` by [%s](%s) on [%s](%s)\n\n%s", issue.Title, repo.PathWithNamespace, issue.IID, issue.URL, labelToString(event.Changes.Labels.Current), event.User.Username, event.User.WebsiteURL, issue.UpdatedAt, issue.URL, issue.Description) + message = fmt.Sprintf("#### %s\n##### [%s#%v](%s)\n###### issue labeled `%s` by [%s](%s) on [%s](%s)\n\n%s", issue.Title, repo.PathWithNamespace, issue.IID, issue.URL, labelToString(event.Changes.Labels.Current), event.User.Username, event.User.WebsiteURL, issue.UpdatedAt, issue.URL, w.sanitizeDescription(issue.Description)) } } diff --git a/server/webhook/merge_request.go b/server/webhook/merge_request.go index f245c0e6..c52e4bc1 100644 --- a/server/webhook/merge_request.go +++ b/server/webhook/merge_request.go @@ -2,7 +2,9 @@ package webhook import ( "fmt" + "strings" + "github.com/microcosm-cc/bluemonday" "github.com/xanzy/go-gitlab" ) @@ -56,7 +58,7 @@ func (w *webhook) handleDMMergeRequest(event *gitlab.MergeEvent) ([]*HandleWebho pathWithNamespace: event.Project.PathWithNamespace, IID: fmt.Sprintf("%d", event.ObjectAttributes.IID), URL: event.ObjectAttributes.URL, - body: event.ObjectAttributes.Description, + body: w.sanitizeDescription(event.ObjectAttributes.Description), }); mention != nil { handlers = append(handlers, mention) } @@ -75,7 +77,7 @@ func (w *webhook) handleChannelMergeRequest(event *gitlab.MergeEvent) ([]*Handle switch pr.Action { case actionOpen: - message = fmt.Sprintf("#### %s\n##### [%s!%v](%s) new merge-request by [%s](%s) on [%s](%s)\n\n%s", pr.Title, repo.PathWithNamespace, pr.IID, pr.URL, senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername), pr.CreatedAt, pr.URL, pr.Description) + message = fmt.Sprintf("#### %s\n##### [%s!%v](%s) new merge-request by [%s](%s) on [%s](%s)\n\n%s", pr.Title, repo.PathWithNamespace, pr.IID, pr.URL, senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername), pr.CreatedAt, pr.URL, w.sanitizeDescription(pr.Description)) case actionMerge: message = fmt.Sprintf("[%s] Merge request [!%v %s](%s) was merged by [%s](%s)", repo.PathWithNamespace, pr.IID, pr.Title, pr.URL, senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername)) case actionClose: @@ -115,3 +117,9 @@ func (w *webhook) handleChannelMergeRequest(event *gitlab.MergeEvent) ([]*Handle return res, nil } + +func (wh *webhook) sanitizeDescription(description string) string { + var policy = bluemonday.StrictPolicy() + policy.SkipElementsContent("details") + return strings.TrimSpace(policy.Sanitize(description)) +} From b59b5a427ab468da4f5dbfa1939f9b4b152e557a Mon Sep 17 00:00:00 2001 From: sibasankarnayak Date: Fri, 25 Feb 2022 14:24:14 +0000 Subject: [PATCH 2/8] linting issue --- server/webhook/merge_request.go | 2 +- webapp/package-lock.json | 190 ++++++++++++++------------------ webapp/package.json | 2 +- 3 files changed, 85 insertions(+), 109 deletions(-) diff --git a/server/webhook/merge_request.go b/server/webhook/merge_request.go index c52e4bc1..f69615f4 100644 --- a/server/webhook/merge_request.go +++ b/server/webhook/merge_request.go @@ -118,7 +118,7 @@ func (w *webhook) handleChannelMergeRequest(event *gitlab.MergeEvent) ([]*Handle return res, nil } -func (wh *webhook) sanitizeDescription(description string) string { +func (w *webhook) sanitizeDescription(description string) string { var policy = bluemonday.StrictPolicy() policy.SkipElementsContent("details") return strings.TrimSpace(policy.Sanitize(description)) diff --git a/webapp/package-lock.json b/webapp/package-lock.json index 1117f669..7f2e67f8 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -1391,11 +1391,6 @@ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1452,9 +1447,9 @@ }, "dependencies": { "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" } } }, @@ -1686,12 +1681,12 @@ } }, "buffer": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", - "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, "buffer-from": { @@ -2356,14 +2351,6 @@ "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", "dev": true }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "~0.4.13" - } - }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -3048,12 +3035,12 @@ "dev": true }, "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, @@ -3896,6 +3883,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -4215,7 +4203,8 @@ "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true }, "is-string": { "version": "1.0.5", @@ -4262,15 +4251,6 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" - } - }, "js-levenshtein": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", @@ -4293,9 +4273,9 @@ } }, "jsan": { - "version": "3.1.13", - "resolved": "https://registry.npmjs.org/jsan/-/jsan-3.1.13.tgz", - "integrity": "sha512-9kGpCsGHifmw6oJet+y8HaCl14y7qgAsxVdV3pCHDySNR3BfDC30zgkssd7x5LRVAT22dnpbe9JdzzmXZnq9/g==" + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/jsan/-/jsan-3.1.14.tgz", + "integrity": "sha512-wStfgOJqMv4QKktuH273f5fyi3D3vy2pHOiSDGPvpcS/q+wb/M7AK3vkCcaHbkZxDOlDU/lDJgccygKSG2OhtA==" }, "jsesc": { "version": "2.5.2", @@ -4458,9 +4438,9 @@ "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" }, "lodash-es": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", - "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, "loose-envify": { "version": "1.4.0", @@ -4520,14 +4500,15 @@ } }, "mattermost-redux": { - "version": "github:mattermost/mattermost-redux#b56e7e3a6f7f5de281fd3541eefec9345a8bbc89", - "from": "github:mattermost/mattermost-redux#b56e7e3a6f7f5de281fd3541eefec9345a8bbc89", + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/mattermost-redux/-/mattermost-redux-5.33.0.tgz", + "integrity": "sha512-snrPWhsHGzYaJDlHXnCC4HViEdvIgmjOYOczufK8ZsbGHs+UMnnnHEdiIg4Fh5dtk4iQoUVFSs6a5ZoG3FqrjQ==", "requires": { - "form-data": "2.5.1", + "core-js": "3.8.3", + "form-data": "3.0.0", "gfycat-sdk": "1.4.18", - "isomorphic-fetch": "2.2.1", - "moment-timezone": "0.5.26", - "redux": "4.0.4", + "moment-timezone": "0.5.32", + "redux": "4.0.5", "redux-action-buffer": "1.2.0", "redux-offline": "git+https://github.com/enahum/redux-offline.git#885024de96b6ec73650c340c8928066585c413df", "redux-persist": "4.9.1", @@ -4535,14 +4516,20 @@ "redux-thunk": "2.3.0", "remote-redux-devtools": "0.5.16", "reselect": "4.0.0", - "serialize-error": "5.0.0", + "rudder-sdk-js": "1.0.14", + "serialize-error": "6.0.0", "shallow-equals": "1.0.0" }, "dependencies": { + "core-js": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.3.tgz", + "integrity": "sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q==" + }, "redux": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.4.tgz", - "integrity": "sha512-vKv4WdiJxOWKxK0yRoaK3Y4pxxB0ilzVx6dszU2W8wLxlb2yikRph4iV/ymtdJ6ZxpBLFbyrxklnT5yBbQSl3Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", + "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", "requires": { "loose-envify": "^1.4.0", "symbol-observable": "^1.2.0" @@ -4618,16 +4605,16 @@ } }, "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" }, "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", "requires": { - "mime-db": "1.43.0" + "mime-db": "1.51.0" } }, "mimic-fn": { @@ -4712,14 +4699,14 @@ } }, "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" }, "moment-timezone": { - "version": "0.5.26", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.26.tgz", - "integrity": "sha512-sFP4cgEKTCymBBKgoxZjYzlSovC20Y6J7y3nanDc5RoBIXKlZhoYwBoZGe3flwU6A372AcRwScH8KiwV6zjy1g==", + "version": "0.5.32", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.32.tgz", + "integrity": "sha512-Z8QNyuQHQAmWucp8Knmgei8YNo28aLjJq6Ma+jy1ZSpSk5nyfRT8xgUbSQvD2+2UajISfenndwvFuH3NGS+nvA==", "requires": { "moment": ">= 2.9.0" } @@ -4758,9 +4745,9 @@ "optional": true }, "nanoid": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.9.tgz", - "integrity": "sha512-J2X7aUpdmTlkAuSe9WaQ5DsTZZPW1r/zmEWKsGhbADO6Gm9FMd2ZzJ8NhsmP4OtA9oFhXfxNqPlreHEDOGB4sg==" + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", + "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" }, "nanomatch": { "version": "1.2.13", @@ -4799,15 +4786,6 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - }, "node-libs-browser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", @@ -5740,12 +5718,12 @@ } }, "redux-devtools-instrument": { - "version": "1.9.6", - "resolved": "https://registry.npmjs.org/redux-devtools-instrument/-/redux-devtools-instrument-1.9.6.tgz", - "integrity": "sha512-MwvY4cLEB2tIfWWBzrUR02UM9qRG2i7daNzywRvabOSVdvAY7s9BxSwMmVRH1Y/7QWjplNtOwgT0apKhHg2Qew==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/redux-devtools-instrument/-/redux-devtools-instrument-1.10.0.tgz", + "integrity": "sha512-X8JRBCzX2ADSMp+iiV7YQ8uoTNyEm0VPFPd4T854coz6lvRiBrFSqAr9YAS2n8Kzxx8CJQotR0QF9wsMM+3DvA==", "requires": { - "lodash": "^4.2.0", - "symbol-observable": "^1.0.2" + "lodash": "^4.17.19", + "symbol-observable": "^1.2.0" } }, "redux-offline": { @@ -5875,9 +5853,9 @@ } }, "remotedev-serialize": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/remotedev-serialize/-/remotedev-serialize-0.1.8.tgz", - "integrity": "sha512-3YG/FDcOmiK22bl5oMRM8RRnbGrFEuPGjbcDG+z2xi5aQaNQNZ8lqoRnZTwXVfaZtutXuiAQOgPRrogzQk8edg==", + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/remotedev-serialize/-/remotedev-serialize-0.1.9.tgz", + "integrity": "sha512-5tFdZg9mSaAWTv6xmQ7HtHjKMLSFQFExEZOtJe10PLsv1wb7cy7kYHtBvTYRro27/3fRGEcQBRNKSaixOpb69w==", "requires": { "jsan": "^3.1.13" } @@ -6018,6 +5996,11 @@ "resolved": "https://registry.npmjs.org/rn-host-detect/-/rn-host-detect-1.2.0.tgz", "integrity": "sha512-btNg5kzHcjZZ7t7mvvV/4wNJ9e3MPgrWivkRgWURzXL0JJ0pwWlU4zrbmdlz3HHzHOxhBhHB4D+/dbMFfu4/4A==" }, + "rudder-sdk-js": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/rudder-sdk-js/-/rudder-sdk-js-1.0.14.tgz", + "integrity": "sha512-q86qmF6VUXjTUCv1YRFc2V1pt408D641nD2ymKFaLtGZTLjkZCzotQ7cW8c48vPKlSWwekkBlA3kghy/NKGwOw==" + }, "run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", @@ -6063,7 +6046,8 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "sc-channel": { "version": "1.2.0", @@ -6110,11 +6094,11 @@ "dev": true }, "serialize-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-5.0.0.tgz", - "integrity": "sha512-/VtpuyzYf82mHYTtI4QKtwHa79vAdU5OQpNPAmE/0UDdlGT0ZxHwC+J6gXkw29wwoVI8fMPsfcVHOwXtUQYYQA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-6.0.0.tgz", + "integrity": "sha512-3vmBkMZLQO+BR4RPHcyRGdE09XCF6cvxzk2N2qn8Er3F91cy8Qt7VvEbZBOpaL53qsBbe2cFOefU6tRY6WDelA==", "requires": { - "type-fest": "^0.8.0" + "type-fest": "^0.12.0" } }, "serialize-javascript": { @@ -6324,9 +6308,9 @@ } }, "socketcluster-client": { - "version": "14.3.1", - "resolved": "https://registry.npmjs.org/socketcluster-client/-/socketcluster-client-14.3.1.tgz", - "integrity": "sha512-Sd/T0K/9UlqTfz+HUuFq90dshA5OBJPQbdkRzGtcKIOm52fkdsBTt0FYpiuzzxv5VrU7PWpRm6KIfNXyPwlLpw==", + "version": "14.3.2", + "resolved": "https://registry.npmjs.org/socketcluster-client/-/socketcluster-client-14.3.2.tgz", + "integrity": "sha512-xDtgW7Ss0ARlfhx53bJ5GY5THDdEOeJnT+/C9Rmrj/vnZr54xeiQfrCZJbcglwe732nK3V+uZq87IvrRl7Hn4g==", "requires": { "buffer": "^5.2.1", "clone": "2.1.1", @@ -6337,7 +6321,7 @@ "sc-errors": "^2.0.1", "sc-formatter": "^3.0.1", "uuid": "3.2.1", - "ws": "7.1.0" + "ws": "^7.5.0" } }, "source-list-map": { @@ -6801,9 +6785,9 @@ } }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz", + "integrity": "sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==" }, "typedarray": { "version": "0.0.6", @@ -7200,11 +7184,6 @@ } } }, - "whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" - }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -7300,12 +7279,9 @@ } }, "ws": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.0.tgz", - "integrity": "sha512-Swie2C4fs7CkwlHu1glMePLYJJsWjzhl1vm3ZaLplD0h7OMkZyZ6kLTB/OagiU923bZrPFXuDTeEqaEN4NWG4g==", - "requires": { - "async-limiter": "^1.0.0" - } + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==" }, "xtend": { "version": "4.0.2", diff --git a/webapp/package.json b/webapp/package.json index c8782a54..2fb9e8aa 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "core-js": "3.1.4", - "mattermost-redux": "github:mattermost/mattermost-redux#b56e7e3a6f7f5de281fd3541eefec9345a8bbc89", + "mattermost-redux": "5.33.0", "prop-types": "15.7.2", "react": "16.8.6", "react-bootstrap": "0.32.4", From 084280cd0dacc9581c574c0dc758f0b39982ba5a Mon Sep 17 00:00:00 2001 From: sibasankarnayak Date: Tue, 1 Mar 2022 12:42:39 +0000 Subject: [PATCH 3/8] resolved comments and removed unwanted changes --- server/webhook/issue.go | 6 +++--- server/webhook/merge_request.go | 12 ++---------- server/webhook/webhook.go | 7 +++++++ webapp/package.json | 2 +- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/server/webhook/issue.go b/server/webhook/issue.go index c1f71dac..5047d372 100644 --- a/server/webhook/issue.go +++ b/server/webhook/issue.go @@ -53,7 +53,7 @@ func (w *webhook) handleDMIssue(event *gitlab.IssueEvent) ([]*HandleWebhook, err pathWithNamespace: event.Project.PathWithNamespace, IID: fmt.Sprintf("%d", event.ObjectAttributes.IID), URL: event.ObjectAttributes.URL, - body: w.sanitizeDescription(event.ObjectAttributes.Description), + body: SanitizeDescription(event.ObjectAttributes.Description), }); mention != nil { handlers = append(handlers, mention) } @@ -72,14 +72,14 @@ func (w *webhook) handleChannelIssue(event *gitlab.IssueEvent) ([]*HandleWebhook switch issue.Action { case actionOpen: - message = fmt.Sprintf("#### %s\n##### [%s#%v](%s)\n###### new issue by [%s](%s) on [%s](%s)\n\n%s", issue.Title, repo.PathWithNamespace, issue.IID, issue.URL, senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername), issue.CreatedAt, issue.URL, w.sanitizeDescription(issue.Description)) + message = fmt.Sprintf("#### %s\n##### [%s#%v](%s)\n###### new issue by [%s](%s) on [%s](%s)\n\n%s", issue.Title, repo.PathWithNamespace, issue.IID, issue.URL, senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername), issue.CreatedAt, issue.URL, SanitizeDescription(issue.Description)) case actionClose: message = fmt.Sprintf("[%s] Issue [%s](%s) closed by [%s](%s)", repo.PathWithNamespace, issue.Title, issue.URL, senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername)) case actionReopen: message = fmt.Sprintf("[%s] Issue [%s](%s) reopened by [%s](%s)", repo.PathWithNamespace, issue.Title, issue.URL, senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername)) case actionUpdate: if len(event.Changes.Labels.Current) > 0 && !sameLabels(event.Changes.Labels.Current, event.Changes.Labels.Previous) { - message = fmt.Sprintf("#### %s\n##### [%s#%v](%s)\n###### issue labeled `%s` by [%s](%s) on [%s](%s)\n\n%s", issue.Title, repo.PathWithNamespace, issue.IID, issue.URL, labelToString(event.Changes.Labels.Current), event.User.Username, event.User.WebsiteURL, issue.UpdatedAt, issue.URL, w.sanitizeDescription(issue.Description)) + message = fmt.Sprintf("#### %s\n##### [%s#%v](%s)\n###### issue labeled `%s` by [%s](%s) on [%s](%s)\n\n%s", issue.Title, repo.PathWithNamespace, issue.IID, issue.URL, labelToString(event.Changes.Labels.Current), event.User.Username, event.User.WebsiteURL, issue.UpdatedAt, issue.URL, SanitizeDescription(issue.Description)) } } diff --git a/server/webhook/merge_request.go b/server/webhook/merge_request.go index f69615f4..77616d27 100644 --- a/server/webhook/merge_request.go +++ b/server/webhook/merge_request.go @@ -2,9 +2,7 @@ package webhook import ( "fmt" - "strings" - "github.com/microcosm-cc/bluemonday" "github.com/xanzy/go-gitlab" ) @@ -58,7 +56,7 @@ func (w *webhook) handleDMMergeRequest(event *gitlab.MergeEvent) ([]*HandleWebho pathWithNamespace: event.Project.PathWithNamespace, IID: fmt.Sprintf("%d", event.ObjectAttributes.IID), URL: event.ObjectAttributes.URL, - body: w.sanitizeDescription(event.ObjectAttributes.Description), + body: SanitizeDescription(event.ObjectAttributes.Description), }); mention != nil { handlers = append(handlers, mention) } @@ -77,7 +75,7 @@ func (w *webhook) handleChannelMergeRequest(event *gitlab.MergeEvent) ([]*Handle switch pr.Action { case actionOpen: - message = fmt.Sprintf("#### %s\n##### [%s!%v](%s) new merge-request by [%s](%s) on [%s](%s)\n\n%s", pr.Title, repo.PathWithNamespace, pr.IID, pr.URL, senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername), pr.CreatedAt, pr.URL, w.sanitizeDescription(pr.Description)) + message = fmt.Sprintf("#### %s\n##### [%s!%v](%s) new merge-request by [%s](%s) on [%s](%s)\n\n%s", pr.Title, repo.PathWithNamespace, pr.IID, pr.URL, senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername), pr.CreatedAt, pr.URL, SanitizeDescription(pr.Description)) case actionMerge: message = fmt.Sprintf("[%s] Merge request [!%v %s](%s) was merged by [%s](%s)", repo.PathWithNamespace, pr.IID, pr.Title, pr.URL, senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername)) case actionClose: @@ -117,9 +115,3 @@ func (w *webhook) handleChannelMergeRequest(event *gitlab.MergeEvent) ([]*Handle return res, nil } - -func (w *webhook) sanitizeDescription(description string) string { - var policy = bluemonday.StrictPolicy() - policy.SkipElementsContent("details") - return strings.TrimSpace(policy.Sanitize(description)) -} diff --git a/server/webhook/webhook.go b/server/webhook/webhook.go index 4ee5ac85..dde8ecac 100644 --- a/server/webhook/webhook.go +++ b/server/webhook/webhook.go @@ -6,6 +6,7 @@ import ( "github.com/mattermost/mattermost-plugin-gitlab/server/subscription" + "github.com/microcosm-cc/bluemonday" "github.com/xanzy/go-gitlab" ) @@ -151,3 +152,9 @@ func normalizeNamespacedProject(pathWithNamespace string) (namespace string, pro } return strings.Join(splits[:len(splits)-1], "/"), splits[len(splits)-1] } + +func SanitizeDescription(description string) string { + var policy = bluemonday.StrictPolicy() + policy.SkipElementsContent("details") + return strings.TrimSpace(policy.Sanitize(description)) +} diff --git a/webapp/package.json b/webapp/package.json index 2fb9e8aa..c8782a54 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "core-js": "3.1.4", - "mattermost-redux": "5.33.0", + "mattermost-redux": "github:mattermost/mattermost-redux#b56e7e3a6f7f5de281fd3541eefec9345a8bbc89", "prop-types": "15.7.2", "react": "16.8.6", "react-bootstrap": "0.32.4", From a61e2825c8dbef4049e3ddf126463f41dd694c1f Mon Sep 17 00:00:00 2001 From: sibasankarnayak Date: Tue, 1 Mar 2022 13:04:37 +0000 Subject: [PATCH 4/8] resolved changes --- server/webhook/issue.go | 6 +++--- server/webhook/merge_request.go | 4 ++-- server/webhook/webhook.go | 2 +- webapp/package.json | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/server/webhook/issue.go b/server/webhook/issue.go index 5047d372..1bbd8ef5 100644 --- a/server/webhook/issue.go +++ b/server/webhook/issue.go @@ -53,7 +53,7 @@ func (w *webhook) handleDMIssue(event *gitlab.IssueEvent) ([]*HandleWebhook, err pathWithNamespace: event.Project.PathWithNamespace, IID: fmt.Sprintf("%d", event.ObjectAttributes.IID), URL: event.ObjectAttributes.URL, - body: SanitizeDescription(event.ObjectAttributes.Description), + body: sanitizeDescription(event.ObjectAttributes.Description), }); mention != nil { handlers = append(handlers, mention) } @@ -72,14 +72,14 @@ func (w *webhook) handleChannelIssue(event *gitlab.IssueEvent) ([]*HandleWebhook switch issue.Action { case actionOpen: - message = fmt.Sprintf("#### %s\n##### [%s#%v](%s)\n###### new issue by [%s](%s) on [%s](%s)\n\n%s", issue.Title, repo.PathWithNamespace, issue.IID, issue.URL, senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername), issue.CreatedAt, issue.URL, SanitizeDescription(issue.Description)) + message = fmt.Sprintf("#### %s\n##### [%s#%v](%s)\n###### new issue by [%s](%s) on [%s](%s)\n\n%s", issue.Title, repo.PathWithNamespace, issue.IID, issue.URL, senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername), issue.CreatedAt, issue.URL, sanitizeDescription(issue.Description)) case actionClose: message = fmt.Sprintf("[%s] Issue [%s](%s) closed by [%s](%s)", repo.PathWithNamespace, issue.Title, issue.URL, senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername)) case actionReopen: message = fmt.Sprintf("[%s] Issue [%s](%s) reopened by [%s](%s)", repo.PathWithNamespace, issue.Title, issue.URL, senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername)) case actionUpdate: if len(event.Changes.Labels.Current) > 0 && !sameLabels(event.Changes.Labels.Current, event.Changes.Labels.Previous) { - message = fmt.Sprintf("#### %s\n##### [%s#%v](%s)\n###### issue labeled `%s` by [%s](%s) on [%s](%s)\n\n%s", issue.Title, repo.PathWithNamespace, issue.IID, issue.URL, labelToString(event.Changes.Labels.Current), event.User.Username, event.User.WebsiteURL, issue.UpdatedAt, issue.URL, SanitizeDescription(issue.Description)) + message = fmt.Sprintf("#### %s\n##### [%s#%v](%s)\n###### issue labeled `%s` by [%s](%s) on [%s](%s)\n\n%s", issue.Title, repo.PathWithNamespace, issue.IID, issue.URL, labelToString(event.Changes.Labels.Current), event.User.Username, event.User.WebsiteURL, issue.UpdatedAt, issue.URL, sanitizeDescription(issue.Description)) } } diff --git a/server/webhook/merge_request.go b/server/webhook/merge_request.go index 77616d27..ce26691b 100644 --- a/server/webhook/merge_request.go +++ b/server/webhook/merge_request.go @@ -56,7 +56,7 @@ func (w *webhook) handleDMMergeRequest(event *gitlab.MergeEvent) ([]*HandleWebho pathWithNamespace: event.Project.PathWithNamespace, IID: fmt.Sprintf("%d", event.ObjectAttributes.IID), URL: event.ObjectAttributes.URL, - body: SanitizeDescription(event.ObjectAttributes.Description), + body: sanitizeDescription(event.ObjectAttributes.Description), }); mention != nil { handlers = append(handlers, mention) } @@ -75,7 +75,7 @@ func (w *webhook) handleChannelMergeRequest(event *gitlab.MergeEvent) ([]*Handle switch pr.Action { case actionOpen: - message = fmt.Sprintf("#### %s\n##### [%s!%v](%s) new merge-request by [%s](%s) on [%s](%s)\n\n%s", pr.Title, repo.PathWithNamespace, pr.IID, pr.URL, senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername), pr.CreatedAt, pr.URL, SanitizeDescription(pr.Description)) + message = fmt.Sprintf("#### %s\n##### [%s!%v](%s) new merge-request by [%s](%s) on [%s](%s)\n\n%s", pr.Title, repo.PathWithNamespace, pr.IID, pr.URL, senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername), pr.CreatedAt, pr.URL, sanitizeDescription(pr.Description)) case actionMerge: message = fmt.Sprintf("[%s] Merge request [!%v %s](%s) was merged by [%s](%s)", repo.PathWithNamespace, pr.IID, pr.Title, pr.URL, senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername)) case actionClose: diff --git a/server/webhook/webhook.go b/server/webhook/webhook.go index dde8ecac..3e2706c9 100644 --- a/server/webhook/webhook.go +++ b/server/webhook/webhook.go @@ -153,7 +153,7 @@ func normalizeNamespacedProject(pathWithNamespace string) (namespace string, pro return strings.Join(splits[:len(splits)-1], "/"), splits[len(splits)-1] } -func SanitizeDescription(description string) string { +func sanitizeDescription(description string) string { var policy = bluemonday.StrictPolicy() policy.SkipElementsContent("details") return strings.TrimSpace(policy.Sanitize(description)) diff --git a/webapp/package.json b/webapp/package.json index c8782a54..a74d29ea 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -37,4 +37,4 @@ "webpack": "4.35.3", "webpack-cli": "3.3.5" } -} +} \ No newline at end of file From 71911790987fe6dbafbd500e66ebe8433585f066 Mon Sep 17 00:00:00 2001 From: sibasankarnayak Date: Tue, 1 Mar 2022 13:06:22 +0000 Subject: [PATCH 5/8] resolved changes --- webapp/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/package.json b/webapp/package.json index a74d29ea..c8782a54 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -37,4 +37,4 @@ "webpack": "4.35.3", "webpack-cli": "3.3.5" } -} \ No newline at end of file +} From 09ba2c7b7246f157e33ccdd6c114abb5b8462a51 Mon Sep 17 00:00:00 2001 From: sibasankarnayak Date: Tue, 1 Mar 2022 13:08:23 +0000 Subject: [PATCH 6/8] resolved changes --- webapp/package-lock.json | 190 ++++++++++++++++++++++----------------- 1 file changed, 107 insertions(+), 83 deletions(-) diff --git a/webapp/package-lock.json b/webapp/package-lock.json index 7f2e67f8..1117f669 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -1391,6 +1391,11 @@ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1447,9 +1452,9 @@ }, "dependencies": { "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" } } }, @@ -1681,12 +1686,12 @@ } }, "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", + "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } }, "buffer-from": { @@ -2351,6 +2356,14 @@ "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", "dev": true }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "~0.4.13" + } + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -3035,12 +3048,12 @@ "dev": true }, "form-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", - "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, @@ -3883,7 +3896,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -4203,8 +4215,7 @@ "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-string": { "version": "1.0.5", @@ -4251,6 +4262,15 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, "js-levenshtein": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", @@ -4273,9 +4293,9 @@ } }, "jsan": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/jsan/-/jsan-3.1.14.tgz", - "integrity": "sha512-wStfgOJqMv4QKktuH273f5fyi3D3vy2pHOiSDGPvpcS/q+wb/M7AK3vkCcaHbkZxDOlDU/lDJgccygKSG2OhtA==" + "version": "3.1.13", + "resolved": "https://registry.npmjs.org/jsan/-/jsan-3.1.13.tgz", + "integrity": "sha512-9kGpCsGHifmw6oJet+y8HaCl14y7qgAsxVdV3pCHDySNR3BfDC30zgkssd7x5LRVAT22dnpbe9JdzzmXZnq9/g==" }, "jsesc": { "version": "2.5.2", @@ -4438,9 +4458,9 @@ "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" }, "lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", + "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==" }, "loose-envify": { "version": "1.4.0", @@ -4500,15 +4520,14 @@ } }, "mattermost-redux": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/mattermost-redux/-/mattermost-redux-5.33.0.tgz", - "integrity": "sha512-snrPWhsHGzYaJDlHXnCC4HViEdvIgmjOYOczufK8ZsbGHs+UMnnnHEdiIg4Fh5dtk4iQoUVFSs6a5ZoG3FqrjQ==", + "version": "github:mattermost/mattermost-redux#b56e7e3a6f7f5de281fd3541eefec9345a8bbc89", + "from": "github:mattermost/mattermost-redux#b56e7e3a6f7f5de281fd3541eefec9345a8bbc89", "requires": { - "core-js": "3.8.3", - "form-data": "3.0.0", + "form-data": "2.5.1", "gfycat-sdk": "1.4.18", - "moment-timezone": "0.5.32", - "redux": "4.0.5", + "isomorphic-fetch": "2.2.1", + "moment-timezone": "0.5.26", + "redux": "4.0.4", "redux-action-buffer": "1.2.0", "redux-offline": "git+https://github.com/enahum/redux-offline.git#885024de96b6ec73650c340c8928066585c413df", "redux-persist": "4.9.1", @@ -4516,20 +4535,14 @@ "redux-thunk": "2.3.0", "remote-redux-devtools": "0.5.16", "reselect": "4.0.0", - "rudder-sdk-js": "1.0.14", - "serialize-error": "6.0.0", + "serialize-error": "5.0.0", "shallow-equals": "1.0.0" }, "dependencies": { - "core-js": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.3.tgz", - "integrity": "sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q==" - }, "redux": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", - "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.4.tgz", + "integrity": "sha512-vKv4WdiJxOWKxK0yRoaK3Y4pxxB0ilzVx6dszU2W8wLxlb2yikRph4iV/ymtdJ6ZxpBLFbyrxklnT5yBbQSl3Q==", "requires": { "loose-envify": "^1.4.0", "symbol-observable": "^1.2.0" @@ -4605,16 +4618,16 @@ } }, "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" }, "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", "requires": { - "mime-db": "1.51.0" + "mime-db": "1.43.0" } }, "mimic-fn": { @@ -4699,14 +4712,14 @@ } }, "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" }, "moment-timezone": { - "version": "0.5.32", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.32.tgz", - "integrity": "sha512-Z8QNyuQHQAmWucp8Knmgei8YNo28aLjJq6Ma+jy1ZSpSk5nyfRT8xgUbSQvD2+2UajISfenndwvFuH3NGS+nvA==", + "version": "0.5.26", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.26.tgz", + "integrity": "sha512-sFP4cgEKTCymBBKgoxZjYzlSovC20Y6J7y3nanDc5RoBIXKlZhoYwBoZGe3flwU6A372AcRwScH8KiwV6zjy1g==", "requires": { "moment": ">= 2.9.0" } @@ -4745,9 +4758,9 @@ "optional": true }, "nanoid": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", - "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.9.tgz", + "integrity": "sha512-J2X7aUpdmTlkAuSe9WaQ5DsTZZPW1r/zmEWKsGhbADO6Gm9FMd2ZzJ8NhsmP4OtA9oFhXfxNqPlreHEDOGB4sg==" }, "nanomatch": { "version": "1.2.13", @@ -4786,6 +4799,15 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, "node-libs-browser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", @@ -5718,12 +5740,12 @@ } }, "redux-devtools-instrument": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/redux-devtools-instrument/-/redux-devtools-instrument-1.10.0.tgz", - "integrity": "sha512-X8JRBCzX2ADSMp+iiV7YQ8uoTNyEm0VPFPd4T854coz6lvRiBrFSqAr9YAS2n8Kzxx8CJQotR0QF9wsMM+3DvA==", + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/redux-devtools-instrument/-/redux-devtools-instrument-1.9.6.tgz", + "integrity": "sha512-MwvY4cLEB2tIfWWBzrUR02UM9qRG2i7daNzywRvabOSVdvAY7s9BxSwMmVRH1Y/7QWjplNtOwgT0apKhHg2Qew==", "requires": { - "lodash": "^4.17.19", - "symbol-observable": "^1.2.0" + "lodash": "^4.2.0", + "symbol-observable": "^1.0.2" } }, "redux-offline": { @@ -5853,9 +5875,9 @@ } }, "remotedev-serialize": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/remotedev-serialize/-/remotedev-serialize-0.1.9.tgz", - "integrity": "sha512-5tFdZg9mSaAWTv6xmQ7HtHjKMLSFQFExEZOtJe10PLsv1wb7cy7kYHtBvTYRro27/3fRGEcQBRNKSaixOpb69w==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/remotedev-serialize/-/remotedev-serialize-0.1.8.tgz", + "integrity": "sha512-3YG/FDcOmiK22bl5oMRM8RRnbGrFEuPGjbcDG+z2xi5aQaNQNZ8lqoRnZTwXVfaZtutXuiAQOgPRrogzQk8edg==", "requires": { "jsan": "^3.1.13" } @@ -5996,11 +6018,6 @@ "resolved": "https://registry.npmjs.org/rn-host-detect/-/rn-host-detect-1.2.0.tgz", "integrity": "sha512-btNg5kzHcjZZ7t7mvvV/4wNJ9e3MPgrWivkRgWURzXL0JJ0pwWlU4zrbmdlz3HHzHOxhBhHB4D+/dbMFfu4/4A==" }, - "rudder-sdk-js": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/rudder-sdk-js/-/rudder-sdk-js-1.0.14.tgz", - "integrity": "sha512-q86qmF6VUXjTUCv1YRFc2V1pt408D641nD2ymKFaLtGZTLjkZCzotQ7cW8c48vPKlSWwekkBlA3kghy/NKGwOw==" - }, "run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", @@ -6046,8 +6063,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sc-channel": { "version": "1.2.0", @@ -6094,11 +6110,11 @@ "dev": true }, "serialize-error": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-6.0.0.tgz", - "integrity": "sha512-3vmBkMZLQO+BR4RPHcyRGdE09XCF6cvxzk2N2qn8Er3F91cy8Qt7VvEbZBOpaL53qsBbe2cFOefU6tRY6WDelA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-5.0.0.tgz", + "integrity": "sha512-/VtpuyzYf82mHYTtI4QKtwHa79vAdU5OQpNPAmE/0UDdlGT0ZxHwC+J6gXkw29wwoVI8fMPsfcVHOwXtUQYYQA==", "requires": { - "type-fest": "^0.12.0" + "type-fest": "^0.8.0" } }, "serialize-javascript": { @@ -6308,9 +6324,9 @@ } }, "socketcluster-client": { - "version": "14.3.2", - "resolved": "https://registry.npmjs.org/socketcluster-client/-/socketcluster-client-14.3.2.tgz", - "integrity": "sha512-xDtgW7Ss0ARlfhx53bJ5GY5THDdEOeJnT+/C9Rmrj/vnZr54xeiQfrCZJbcglwe732nK3V+uZq87IvrRl7Hn4g==", + "version": "14.3.1", + "resolved": "https://registry.npmjs.org/socketcluster-client/-/socketcluster-client-14.3.1.tgz", + "integrity": "sha512-Sd/T0K/9UlqTfz+HUuFq90dshA5OBJPQbdkRzGtcKIOm52fkdsBTt0FYpiuzzxv5VrU7PWpRm6KIfNXyPwlLpw==", "requires": { "buffer": "^5.2.1", "clone": "2.1.1", @@ -6321,7 +6337,7 @@ "sc-errors": "^2.0.1", "sc-formatter": "^3.0.1", "uuid": "3.2.1", - "ws": "^7.5.0" + "ws": "7.1.0" } }, "source-list-map": { @@ -6785,9 +6801,9 @@ } }, "type-fest": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz", - "integrity": "sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" }, "typedarray": { "version": "0.0.6", @@ -7184,6 +7200,11 @@ } } }, + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -7279,9 +7300,12 @@ } }, "ws": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==" + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.0.tgz", + "integrity": "sha512-Swie2C4fs7CkwlHu1glMePLYJJsWjzhl1vm3ZaLplD0h7OMkZyZ6kLTB/OagiU923bZrPFXuDTeEqaEN4NWG4g==", + "requires": { + "async-limiter": "^1.0.0" + } }, "xtend": { "version": "4.0.2", From 67afe0aa51e3277b29f4f05623aebe665270fb49 Mon Sep 17 00:00:00 2001 From: sibasankarnayak Date: Mon, 2 May 2022 16:53:22 +0000 Subject: [PATCH 7/8] Merge remote-tracking branch 'upstream/master' into mm-249 --- .golangci.yml | 14 +- CODEOWNERS | 2 +- Makefile | 181 ++- build/custom.mk | 16 +- build/go.mod | 9 + build/go.sum | 1644 ++++++++++++++++++++++++++ build/legacy.mk | 3 + build/manifest/main.go | 52 - build/pluginctl/main.go | 173 +++ build/setup.mk | 2 +- build/sync/plan.yml | 44 + docs/feature-summary.md | 6 +- docs/setup/configuration.md | 2 +- go.mod | 14 +- go.sum | 1295 ++++++++++++++++---- plugin.go | 18 + plugin.json | 4 +- public/new-oauth-application.png | Bin 0 -> 135463 bytes server/api.go | 539 +++++---- server/cluster.go | 55 + server/command.go | 182 ++- server/command_test.go | 36 +- server/configuration.go | 138 ++- server/configuration_test.go | 113 ++ server/flow.go | 829 +++++++++++++ server/gitlab/api.go | 181 ++- server/gitlab/gitlab.go | 77 +- server/gitlab/mocks/mock_gitlab.go | 170 +-- server/gitlab/user.go | 22 +- server/gitlab/webhook.go | 4 +- server/manifest.go | 12 - server/mocks/mock_gitlab.go | 175 +-- server/oauth.go | 87 ++ server/plugin.go | 292 +++-- server/subscription/subscription.go | 6 +- server/subscriptions.go | 7 +- server/telemetry.go | 53 + server/utils.go | 22 +- server/webhook.go | 75 +- server/webhook/issue.go | 25 +- server/webhook/issue_test.go | 3 +- server/webhook/merge_request.go | 11 +- server/webhook/merge_request_test.go | 3 +- server/webhook/note.go | 17 +- server/webhook/note_test.go | 5 +- server/webhook/pipeline.go | 9 +- server/webhook/pipeline_test.go | 3 +- server/webhook/push.go | 13 +- server/webhook/push_test.go | 3 +- server/webhook/tag.go | 9 +- server/webhook/tag_test.go | 3 +- server/webhook/webhook.go | 26 +- server/webhook/webhook_test.go | 3 +- server/webhook_test.go | 19 +- webapp/src/manifest.js | 8 +- 55 files changed, 5569 insertions(+), 1145 deletions(-) create mode 100644 build/go.mod create mode 100644 build/go.sum create mode 100644 build/legacy.mk create mode 100644 build/pluginctl/main.go create mode 100644 build/sync/plan.yml create mode 100644 plugin.go create mode 100644 public/new-oauth-application.png create mode 100644 server/cluster.go create mode 100644 server/flow.go delete mode 100644 server/manifest.go create mode 100644 server/oauth.go create mode 100644 server/telemetry.go diff --git a/.golangci.yml b/.golangci.yml index 934f61c3..068e12ac 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -3,9 +3,6 @@ run: modules-download-mode: readonly linters-settings: - goconst: - min-len: 2 - min-occurrences: 2 gofmt: simplify: true goimports: @@ -15,6 +12,8 @@ linters-settings: govet: check-shadowing: true enable-all: true + disable: + - fieldalignment misspell: locale: US ignore-words: @@ -26,7 +25,6 @@ linters: - bodyclose - deadcode - errcheck - - goconst - gocritic - gofmt - goimports @@ -35,7 +33,6 @@ linters: - gosimple - govet - ineffassign - - interfacer - misspell - nakedret - staticcheck @@ -49,11 +46,6 @@ linters: issues: exclude-rules: - - path: server/manifest.go - linters: - - deadcode - - unused - - varcheck - path: server/configuration.go linters: - unused @@ -61,4 +53,4 @@ issues: linters: - bodyclose - goconst - - scopelint # https://github.com/kyoh86/scopelint/issues/4 \ No newline at end of file + - scopelint # https://github.com/kyoh86/scopelint/issues/4 diff --git a/CODEOWNERS b/CODEOWNERS index 0fd134e0..c11eb6ad 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1 +1 @@ -* @iomodo +* @mickmister diff --git a/Makefile b/Makefile index d369942c..31e1777d 100644 --- a/Makefile +++ b/Makefile @@ -1,19 +1,28 @@ GO ?= $(shell command -v go 2> /dev/null) NPM ?= $(shell command -v npm 2> /dev/null) CURL ?= $(shell command -v curl 2> /dev/null) +MM_DEBUG ?= MANIFEST_FILE ?= plugin.json GOPATH ?= $(shell go env GOPATH) GO_TEST_FLAGS ?= -race GO_BUILD_FLAGS ?= MM_UTILITIES_DIR ?= ../mattermost-utilities +DLV_DEBUG_PORT := 2346 +DEFAULT_GOOS := $(shell go env GOOS) +DEFAULT_GOARCH := $(shell go env GOARCH) export GO111MODULE=on # You can include assets this directory into the bundle. This can be e.g. used to include profile pictures. ASSETS_DIR ?= assets +## Define the default target (make all) +.PHONY: default +default: all + # Verify environment, and define PLUGIN_ID, PLUGIN_VERSION, HAS_SERVER and HAS_WEBAPP as needed. include build/setup.mk +include build/legacy.mk BUNDLE_NAME ?= $(PLUGIN_ID)-$(PLUGIN_VERSION).tar.gz @@ -23,25 +32,19 @@ ifneq ($(wildcard build/custom.mk),) endif ## Checks the code style, tests, builds and bundles the plugin. +.PHONY: all all: check-style test dist -## Propagates plugin manifest information into the server/ and webapp/ folders as required. -.PHONY: apply -apply: - ./build/bin/manifest apply - -## Runs golangci-lint and eslint. +## Runs eslint and golangci-lint .PHONY: check-style -check-style: webapp/.npminstall golangci-lint +check-style: webapp/node_modules @echo Checking for style guide compliance ifneq ($(HAS_WEBAPP),) cd webapp && npm run lint endif -## Run golangci-lint on codebase. -.PHONY: golangci-lint -golangci-lint: +ifneq ($(HAS_SERVER),) @if ! [ -x "$$(command -v golangci-lint)" ]; then \ echo "golangci-lint is not installed. Please see https://github.com/golangci/golangci-lint#install for installation instructions."; \ exit 1; \ @@ -49,21 +52,41 @@ golangci-lint: @echo Running golangci-lint golangci-lint run ./... +endif -## Builds the server, if it exists, including support for multiple architectures. +## Builds the server, if it exists, for all supported architectures, unless MM_SERVICESETTINGS_ENABLEDEVELOPER is set .PHONY: server server: ifneq ($(HAS_SERVER),) mkdir -p server/dist; +ifeq ($(MM_DEBUG),) +ifneq ($(MM_SERVICESETTINGS_ENABLEDEVELOPER),) + @echo Building plugin only for $(DEFAULT_GOOS)-$(DEFAULT_GOARCH) because MM_SERVICESETTINGS_ENABLEDEVELOPER is enabled + cd server && $(GO) build $(GO_BUILD_FLAGS) -trimpath -o dist/plugin-$(DEFAULT_GOOS)-$(DEFAULT_GOARCH); +else cd server && env GOOS=linux GOARCH=amd64 $(GO) build $(GO_BUILD_FLAGS) -trimpath -o dist/plugin-linux-amd64; cd server && env GOOS=linux GOARCH=arm64 $(GO) build $(GO_BUILD_FLAGS) -trimpath -o dist/plugin-linux-arm64; cd server && env GOOS=darwin GOARCH=amd64 $(GO) build $(GO_BUILD_FLAGS) -trimpath -o dist/plugin-darwin-amd64; cd server && env GOOS=darwin GOARCH=arm64 $(GO) build $(GO_BUILD_FLAGS) -trimpath -o dist/plugin-darwin-arm64; cd server && env GOOS=windows GOARCH=amd64 $(GO) build $(GO_BUILD_FLAGS) -trimpath -o dist/plugin-windows-amd64.exe; endif +else + $(info DEBUG mode is on; to disable, unset MM_DEBUG) +ifneq ($(MM_SERVICESETTINGS_ENABLEDEVELOPER),) + @echo Building plugin only for $(DEFAULT_GOOS)-$(DEFAULT_GOARCH) because MM_SERVICESETTINGS_ENABLEDEVELOPER is enabled + cd server && $(GO) build $(GO_BUILD_FLAGS) -gcflags "all=-N -l" -trimpath -o dist/plugin-$(DEFAULT_GOOS)-$(DEFAULT_GOARCH); +else + cd server && env GOOS=linux GOARCH=amd64 $(GO) build $(GO_BUILD_FLAGS) -gcflags "all=-N -l" -trimpath -o dist/plugin-linux-amd64; + cd server && env GOOS=linux GOARCH=arm64 $(GO) build $(GO_BUILD_FLAGS) -gcflags "all=-N -l" -trimpath -o dist/plugin-linux-arm64; + cd server && env GOOS=darwin GOARCH=amd64 $(GO) build $(GO_BUILD_FLAGS) -gcflags "all=-N -l" -trimpath -o dist/plugin-darwin-amd64; + cd server && env GOOS=darwin GOARCH=arm64 $(GO) build $(GO_BUILD_FLAGS) -gcflags "all=-N -l" -trimpath -o dist/plugin-darwin-arm64; + cd server && env GOOS=windows GOARCH=amd64 $(GO) build $(GO_BUILD_FLAGS) -gcflags "all=-N -l" -trimpath -o dist/plugin-windows-amd64.exe; +endif +endif +endif ## Ensures NPM dependencies are installed without having to run this all the time. -webapp/.npminstall: +webapp/node_modules: $(wildcard webapp/package.json) ifneq ($(HAS_WEBAPP),) cd webapp && $(NPM) install touch $@ @@ -71,17 +94,13 @@ endif ## Builds the webapp, if it exists. .PHONY: webapp -webapp: webapp/.npminstall +webapp: webapp/node_modules ifneq ($(HAS_WEBAPP),) +ifeq ($(MM_DEBUG),) cd webapp && $(NPM) run build; +else + cd webapp && $(NPM) run debug; endif - -## Builds the webapp in debug mode, if it exists. -.PHONY: webapp-debug -webapp-debug: webapp/.npminstall -ifneq ($(HAS_WEBAPP),) - cd webapp && \ - $(NPM) run debug; endif ## Generates a tar bundle of the plugin for install. @@ -94,15 +113,15 @@ ifneq ($(wildcard $(ASSETS_DIR)/.),) cp -r $(ASSETS_DIR) dist/$(PLUGIN_ID)/ endif ifneq ($(HAS_PUBLIC),) - cp -r public/ dist/$(PLUGIN_ID)/ + cp -r public dist/$(PLUGIN_ID)/ endif ifneq ($(HAS_SERVER),) - mkdir -p dist/$(PLUGIN_ID)/server/dist; - cp -r server/dist/* dist/$(PLUGIN_ID)/server/dist/; + mkdir -p dist/$(PLUGIN_ID)/server + cp -r server/dist dist/$(PLUGIN_ID)/server/ endif ifneq ($(HAS_WEBAPP),) - mkdir -p dist/$(PLUGIN_ID)/webapp/dist; - cp -r webapp/dist/* dist/$(PLUGIN_ID)/webapp/dist/; + mkdir -p dist/$(PLUGIN_ID)/webapp + cp -r webapp/dist dist/$(PLUGIN_ID)/webapp/ endif cd dist && tar -cvzf $(BUNDLE_NAME) $(PLUGIN_ID) @@ -110,36 +129,85 @@ endif ## Builds and bundles the plugin. .PHONY: dist -dist: apply server webapp bundle +dist: server webapp bundle -## Installs the plugin to a (development) server. -## It uses the API if appropriate environment variables are defined, -## and otherwise falls back to trying to copy the plugin to a sibling mattermost-server directory. +## Builds and installs the plugin to a server. .PHONY: deploy deploy: dist - ./build/bin/deploy $(PLUGIN_ID) dist/$(BUNDLE_NAME) + ./build/bin/pluginctl deploy $(PLUGIN_ID) dist/$(BUNDLE_NAME) + +## Builds and installs the plugin to a server, updating the webapp automatically when changed. +.PHONY: watch +watch: server bundle +ifeq ($(MM_DEBUG),) + cd webapp && $(NPM) run build:watch +else + cd webapp && $(NPM) run debug:watch +endif -.PHONY: debug-deploy -debug-deploy: debug-dist deploy +## Installs a previous built plugin with updated webpack assets to a server. +.PHONY: deploy-from-watch +deploy-from-watch: bundle + ./build/bin/pluginctl deploy $(PLUGIN_ID) dist/$(BUNDLE_NAME) -.PHONY: debug-dist -debug-dist: apply server webapp-debug bundle +## Setup dlv for attaching, identifying the plugin PID for other targets. +.PHONY: setup-attach +setup-attach: + $(eval PLUGIN_PID := $(shell ps aux | grep "plugins/${PLUGIN_ID}" | grep -v "grep" | awk -F " " '{print $$2}')) + $(eval NUM_PID := $(shell echo -n ${PLUGIN_PID} | wc -w)) + + @if [ ${NUM_PID} -gt 2 ]; then \ + echo "** There is more than 1 plugin process running. Run 'make kill reset' to restart just one."; \ + exit 1; \ + fi + +## Check if setup-attach succeeded. +.PHONY: check-attach +check-attach: + @if [ -z ${PLUGIN_PID} ]; then \ + echo "Could not find plugin PID; the plugin is not running. Exiting."; \ + exit 1; \ + else \ + echo "Located Plugin running with PID: ${PLUGIN_PID}"; \ + fi + +## Attach dlv to an existing plugin instance. +.PHONY: attach +attach: setup-attach check-attach + dlv attach ${PLUGIN_PID} + +## Attach dlv to an existing plugin instance, exposing a headless instance on $DLV_DEBUG_PORT. +.PHONY: attach-headless +attach-headless: setup-attach check-attach + dlv attach ${PLUGIN_PID} --listen :$(DLV_DEBUG_PORT) --headless=true --api-version=2 --accept-multiclient + +## Detach dlv from an existing plugin instance, if previously attached. +.PHONY: detach +detach: setup-attach + @DELVE_PID=$(shell ps aux | grep "dlv attach ${PLUGIN_PID}" | grep -v "grep" | awk -F " " '{print $$2}') && \ + if [ "$$DELVE_PID" -gt 0 ] > /dev/null 2>&1 ; then \ + echo "Located existing delve process running with PID: $$DELVE_PID. Killing." ; \ + kill -9 $$DELVE_PID ; \ + fi ## Runs any lints and unit tests defined for the server and webapp, if they exist. .PHONY: test -test: webapp/.npminstall +test: webapp/node_modules ifneq ($(HAS_SERVER),) $(GO) test -v $(GO_TEST_FLAGS) ./server/... endif ifneq ($(HAS_WEBAPP),) - cd webapp && $(NPM) run fix && $(NPM) run test; + cd webapp && $(NPM) run test; +endif +ifneq ($(wildcard ./build/sync/plan/.),) + cd ./build/sync && $(GO) test -v $(GO_TEST_FLAGS) ./... endif ## Creates a coverage report for the server code. .PHONY: coverage -coverage: webapp/.npminstall +coverage: webapp/node_modules ifneq ($(HAS_SERVER),) - $(GO) test $(GO_TEST_FLAGS) -coverprofile=server/coverage.txt ./server/... + $(GO) test $(GO_TEST_FLAGS) -coverprofile=server/coverage.txt ./... $(GO) tool cover -html=server/coverage.txt endif @@ -154,6 +222,31 @@ else endif endif +## Disable the plugin. +.PHONY: disable +disable: detach + ./build/bin/pluginctl disable $(PLUGIN_ID) + +## Enable the plugin. +.PHONY: enable +enable: + ./build/bin/pluginctl enable $(PLUGIN_ID) + +## Reset the plugin, effectively disabling and re-enabling it on the server. +.PHONY: reset +reset: detach + ./build/bin/pluginctl reset $(PLUGIN_ID) + +## Kill all instances of the plugin, detaching any existing dlv instance. +.PHONY: kill +kill: detach + $(eval PLUGIN_PID := $(shell ps aux | grep "plugins/${PLUGIN_ID}" | grep -v "grep" | awk -F " " '{print $$2}')) + + @for PID in ${PLUGIN_PID}; do \ + echo "Killing plugin pid $$PID"; \ + kill -9 $$PID; \ + done; \ + ## Clean removes all build artifacts. .PHONY: clean clean: @@ -163,13 +256,21 @@ ifneq ($(HAS_SERVER),) rm -fr server/dist endif ifneq ($(HAS_WEBAPP),) - rm -fr webapp/.npminstall rm -fr webapp/junit.xml rm -fr webapp/dist rm -fr webapp/node_modules endif rm -fr build/bin/ +## Sync directory with a starter template +sync: +ifndef STARTERTEMPLATE_PATH + @echo STARTERTEMPLATE_PATH is not set. + @echo Set STARTERTEMPLATE_PATH to a local clone of https://github.com/mattermost/mattermost-plugin-starter-template and retry. + @exit 1 +endif + cd ${STARTERTEMPLATE_PATH} && go run ./build/sync/main.go ./build/sync/plan.yml $(PWD) + # Help documentation à la https://marmelab.com/blog/2016/02/29/auto-documented-makefile.html help: - @cat Makefile | grep -v '\.PHONY' | grep -v '\help:' | grep -B1 -E '^[a-zA-Z0-9_.-]+:.*' | sed -e "s/:.*//" | sed -e "s/^## //" | grep -v '\-\-' | sed '1!G;h;$$!d' | awk 'NR%2{printf "\033[36m%-30s\033[0m",$$0;next;}1' | sort \ No newline at end of file + @cat Makefile build/*.mk | grep -v '\.PHONY' | grep -v '\help:' | grep -B1 -E '^[a-zA-Z0-9_.-]+:.*' | sed -e "s/:.*//" | sed -e "s/^## //" | grep -v '\-\-' | sed '1!G;h;$$!d' | awk 'NR%2{printf "\033[36m%-30s\033[0m",$$0;next;}1' | sort diff --git a/build/custom.mk b/build/custom.mk index efad4fbd..5cd49bb0 100644 --- a/build/custom.mk +++ b/build/custom.mk @@ -1 +1,15 @@ -# Include custome targets and environment variables here +# Include custom targets and environment variables here + +ifndef MM_RUDDER_WRITE_KEY + MM_RUDDER_WRITE_KEY = 1d5bMvdrfWClLxgK1FvV3s4U1tg +endif +GO_BUILD_FLAGS += -ldflags '-X "github.com/mattermost/mattermost-plugin-api/experimental/telemetry.rudderWriteKey=$(MM_RUDDER_WRITE_KEY)"' + +## Generates mock golang interfaces for testing +.PHONY: mock +mock: +ifneq ($(HAS_SERVER),) + go install github.com/golang/mock/mockgen@v1.6.0 + mockgen -destination server/mocks/mock_gitlab.go github.com/mattermost/mattermost-plugin-gitlab/server/gitlab Gitlab + mockgen -destination server/gitlab/mocks/mock_gitlab.go github.com/mattermost/mattermost-plugin-gitlab/server/gitlab Gitlab +endif \ No newline at end of file diff --git a/build/go.mod b/build/go.mod new file mode 100644 index 00000000..eb40144f --- /dev/null +++ b/build/go.mod @@ -0,0 +1,9 @@ +module github.com/mattermost/mattermost-plugin-starter-template/build + +go 1.12 + +require ( + github.com/mattermost/mattermost-server/v6 v6.2.1 + github.com/mholt/archiver/v3 v3.5.0 + github.com/pkg/errors v0.9.1 +) diff --git a/build/go.sum b/build/go.sum new file mode 100644 index 00000000..4e9b1a27 --- /dev/null +++ b/build/go.sum @@ -0,0 +1,1644 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= +cloud.google.com/go v0.37.1/go.mod h1:SAbnLi6YTSPKSI0dTUEOVLCkyPfKXK8n4ibqiMoj4ok= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.88.0/go.mod h1:dnKwfYbP9hQhefiUvpbcAyoGSHUrOxR20JVElLiUvEY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/spanner v1.24.0/go.mod h1:EZI0yH1D/PrXK0XH9Ba5LGXTXWeqZv0ClOD/19a0Z58= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +code.sajari.com/docconv v1.2.0/go.mod h1:r8yfCP6OKbZ9Xkd87aBa4nfpk6ud/PoyLwex3n6cXSc= +contrib.go.opencensus.io/exporter/ocagent v0.4.9/go.mod h1:ueLzZcP7LPhPulEBukGn4aLh7Mx9YJwpVJ9nL2FYltw= +dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= +dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= +dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= +git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +git.apache.org/thrift.git v0.12.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= +github.com/Azure/azure-sdk-for-go v26.5.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-storage-blob-go v0.13.0/go.mod h1:pA9kNqtjUeQF2zOSu4s//nUdBD+e64lEuc4sVnuOfNs= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest v11.5.2+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest/adal v0.9.2/go.mod h1:/3SMAM86bP6wC9Ev35peQDUeqFZBMH07vvUOmg4z/fE= +github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/ClickHouse/clickhouse-go v1.4.3/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= +github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/HdrHistogram/hdrhistogram-go v0.9.0/go.mod h1:nxrse8/Tzg2tg3DZcZjm6qEclQKK70g0KxO61gFFZD4= +github.com/JalfResi/justext v0.0.0-20170829062021-c0282dea7198/go.mod h1:0SURuH1rsE8aVWvutuMZghRNrNrYEUzibzJfhEYR8L0= +github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/squirrel v1.5.0/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PaulARoy/azurestoragecache v0.0.0-20170906084534-3c249a3ba788/go.mod h1:lY1dZd8HBzJ10eqKERHn3CU59tfhzcAVb2c0ZhIWSOk= +github.com/PuerkitoBio/goquery v1.4.1/go.mod h1:T9ezsOHcCrDCgA8aF1Cqr3sSYbO/xgdy8/R/XiIMAhA= +github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= +github.com/PuerkitoBio/goquery v1.7.1/go.mod h1:XY0pP4kfraEmmV1O7Uf6XyjoslwsneBbgeDjLYuN8xY= +github.com/RoaringBitmap/roaring v0.9.4/go.mod h1:icnadbWcNyfEHlYdr+tDlOTih1Bf/h+rzPpv4sbomAA= +github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/advancedlogic/GoOse v0.0.0-20191112112754-e742535969c1/go.mod h1:f3HCSN1fBWjcpGtXyM119MJgeQl838v6so/PQOqvE1w= +github.com/advancedlogic/GoOse v0.0.0-20210820140952-9d5822d4a625/go.mod h1:f3HCSN1fBWjcpGtXyM119MJgeQl838v6so/PQOqvE1w= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= +github.com/andybalholm/brotli v1.0.3 h1:fpcw+r1N1h0Poc1F/pHbW40cUm/lMEQslZtCkBQ0UnM= +github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY= +github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow/go/arrow v0.0.0-20200601151325-b2287a20f230/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= +github.com/apache/arrow/go/arrow v0.0.0-20210521153258-78c88a9f517b/go.mod h1:R4hW3Ug0s+n4CUsWHKOj00Pu01ZqU4x/hSF5kXUcXKQ= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/araddon/dateparse v0.0.0-20180729174819-cfd92a431d0e/go.mod h1:SLqhdZcd+dF3TEVL2RMoob5bBP5R1P1qkox+HtCBgGI= +github.com/araddon/dateparse v0.0.0-20200409225146-d820a6159ab1/go.mod h1:SLqhdZcd+dF3TEVL2RMoob5bBP5R1P1qkox+HtCBgGI= +github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de/go.mod h1:DCaWoUhZrYW9p1lxo/cm8EmUOOzAPSEZNGF2DK1dJgw= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/avct/uasurfer v0.0.0-20191028135549-26b5daa857f1/go.mod h1:noBAuukeYOXa0aXGqxr24tADqkwDO2KRD15FsuaZ5a8= +github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.19.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.40.57/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/aws/aws-sdk-go-v2 v1.3.2/go.mod h1:7OaACgj2SX3XGWnrIjGlJM22h6yD6MEWKvm7levnnM8= +github.com/aws/aws-sdk-go-v2 v1.6.0/go.mod h1:tI4KhsR5VkzlUa2DZAdwx7wCAYGwkZZ1H31PYrBFx1w= +github.com/aws/aws-sdk-go-v2/config v1.1.5/go.mod h1:P3F1hku7qzC81txjwXnwOM6Ex6ezkU6+/557Teyb64E= +github.com/aws/aws-sdk-go-v2/config v1.3.0/go.mod h1:lOxzHWDt/k7MMidA/K8DgXL4+ynnZYsDq65Qhs/l3dg= +github.com/aws/aws-sdk-go-v2/credentials v1.1.5/go.mod h1:Ir1R6tPiR1/2y1hes8yOijFMz54hzSmgcmCDo6F45Qc= +github.com/aws/aws-sdk-go-v2/credentials v1.2.1/go.mod h1:Rfvim1eZTC9W5s8YJyYYtl1KMk6e8fHv+wMRQGO4Ru0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.6/go.mod h1:0+fWMitrmIpENiY8/1DyhdYPUCAPvd9UNz9mtCsEoLQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.1.1/go.mod h1:GTXAhrxHQOj9N+J5tYVjwt+rpRyy/42qLjlgw9pz1a0= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.1.2/go.mod h1:Azf567f5wBUfUbwpyJJnLM/geFFIzEulGR30L+nQZOE= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.2.1/go.mod h1:2JOqaBP3I6TEm27NLb11UiD9j4HZsJ+EW4N7vCf8WGQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.0.0/go.mod h1:g3XMXuxvqSMUjnsXXp/960152w0wFS4CXVYgQaSVOHE= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.0.4/go.mod h1:BCfU3Uo2fhKcMZFp9zU5QQGQxqWCOYmZ/27Dju3S/do= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.1.0/go.mod h1:zdjOOy0ojUn3iNELo6ycIHSMCp4xUbycSHfb8PnbbyM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.6/go.mod h1:L0KWr0ASo83PRZu9NaZaDsw3koS6PspKv137DMDZjHo= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.1.1/go.mod h1:2+ehJPkdIdl46VCj67Emz/EH2hpebHZtaLdzqg+sWOI= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.2.2/go.mod h1:nnutjMLuna0s3GVY/MAkpLX03thyNER06gXvnMAPj5g= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.3.1/go.mod h1:IpjxfORBAFfkMM0VEx5gPPnEy6WV4Hk0F/+zb/SUWyw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.5.0/go.mod h1:uwA7gs93Qcss43astPUb1eq4RyceNmYWAQjZFDOAMLo= +github.com/aws/aws-sdk-go-v2/service/s3 v1.8.0/go.mod h1:zHCjYoODbYRLz/iFicYswq1gRoxBnHvpY5h2Vg3/tJ4= +github.com/aws/aws-sdk-go-v2/service/sso v1.1.5/go.mod h1:bpGz0tidC4y39sZkQSkpO/J0tzWCMXHbw6FZ0j1GkWM= +github.com/aws/aws-sdk-go-v2/service/sso v1.2.1/go.mod h1:VimPFPltQ/920i1X0Sb0VJBROLIHkDg2MNP10D46OGs= +github.com/aws/aws-sdk-go-v2/service/sts v1.2.2/go.mod h1:ssRzzJ2RZOVuKj2Vx1YE7ypfil/BIlgmQnCSW4DistU= +github.com/aws/aws-sdk-go-v2/service/sts v1.4.1/go.mod h1:G9osDWA52WQ38BDcj65VY1cNmcAQXAXTsE8IWH8j81w= +github.com/aws/smithy-go v1.3.1/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aws/smithy-go v1.4.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= +github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= +github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.2.1/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwjwegp5jy4= +github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blevesearch/bleve/v2 v2.2.1/go.mod h1:D5bhQ5baElbPGQARUm4j+NrWlrmIrndMJqviN+U9ndk= +github.com/blevesearch/bleve_index_api v1.0.1/go.mod h1:fiwKS0xLEm+gBRgv5mumf0dhgFr2mDgZah1pqv1c1M4= +github.com/blevesearch/go-porterstemmer v1.0.3/go.mod h1:angGc5Ht+k2xhJdZi511LtmxuEf0OVpvUUNrwmM1P7M= +github.com/blevesearch/mmap-go v1.0.2/go.mod h1:ol2qBqYaOUsGdm7aRMRrYGgPvnwLe6Y+7LMvAB5IbSA= +github.com/blevesearch/mmap-go v1.0.3/go.mod h1:pYvKl/grLQrBxuaRYgoTssa4rVujYYeenDp++2E+yvs= +github.com/blevesearch/scorch_segment_api/v2 v2.1.0/go.mod h1:uch7xyyO/Alxkuxa+CGs79vw0QY8BENSBjg6Mw5L5DE= +github.com/blevesearch/segment v0.9.0/go.mod h1:9PfHYUdQCgHktBgvtUOF4x+pc4/l8rdH0u5spnW85UQ= +github.com/blevesearch/snowballstem v0.9.0/go.mod h1:PivSj3JMc8WuaFkTSRDW2SlrulNWPl4ABg1tC/hlgLs= +github.com/blevesearch/upsidedown_store_api v1.0.1/go.mod h1:MQDVGpHZrpe3Uy26zJBf/a8h0FZY6xJbthIMm8myH2Q= +github.com/blevesearch/vellum v1.0.7/go.mod h1:doBZpmRhwTsASB4QdUZANlJvqVAUdUyX0ZK7QJCTeBE= +github.com/blevesearch/zapx/v11 v11.3.1/go.mod h1:YzTfUm4kS3e8OmTXDHVV8OzC5MWPO/VPJZQgPNVb4Lc= +github.com/blevesearch/zapx/v12 v12.3.1/go.mod h1:RMl6lOZqF+sTxKvhQDJ5yK2LT3Mu7E2p/jGdjAaiRxs= +github.com/blevesearch/zapx/v13 v13.3.1/go.mod h1:eppobNM35U4C22yDvTuxV9xPqo10pwfP/jugL4INWG4= +github.com/blevesearch/zapx/v14 v14.3.1/go.mod h1:zXNcVzukh0AvG57oUtT1T0ndi09H0kELNaNmekEy0jw= +github.com/blevesearch/zapx/v15 v15.3.1/go.mod h1:C+f/97ZzTzK6vt/7sVlZdzZxKu+5+j4SrGCvr9dJzaY= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= +github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= +github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/cockroachdb/cockroach-go/v2 v2.1.1/go.mod h1:7NtUnP6eK+l6k483WSYNrq3Kb23bWV10IRV1TyeSpwM= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/couchbase/ghistogram v0.1.0/go.mod h1:s1Jhy76zqfEecpNWJfWUiKZookAFaiGOEoyzgHt9i7k= +github.com/couchbase/moss v0.1.0/go.mod h1:9MaHIaRuy9pvLPUJxB8sh8OrLfyDczECVL37grCIubs= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.10.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/dgoogauth v0.0.0-20190221195224-5a805980a5f3/go.mod h1:hEfFauPHz7+NnjR/yHJGhrKo1Za+zStgwUETx3yzqgY= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/dhui/dktest v0.3.4/go.mod h1:4m4n6lmXlmVfESth7mzdcv8nBI5mOb5UROPqjM02csU= +github.com/die-net/lrucache v0.0.0-20181227122439-19a39ef22a11/go.mod h1:ew0MSjCVDdtGMjF3kzLK9hwdgF5mOE8SbYVF3Rc7mkU= +github.com/disintegration/imaging v1.6.0/go.mod h1:xuIt+sRxDFrHS0drzXUlCJthkJ8k7lkkUojDSR247MQ= +github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v17.12.0-ce-rc1.0.20210128214336-420b1d36250f+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dsnet/compress v0.0.1 h1:PlZu0n3Tuv04TzpfPbrnI0HW/YwodEXDS+oPKahKF0Q= +github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo= +github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dyatlov/go-opengraph v0.0.0-20210112100619-dae8665a5b09 h1:AQLr//nh20BzN3hIWj2+/Gt3FwSs8Nwo/nz4hMIcLPg= +github.com/dyatlov/go-opengraph v0.0.0-20210112100619-dae8665a5b09/go.mod h1:nYia/MIs9OyvXXYboPmNOj0gVWo97Wx0sde+ZuKkoM4= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= +github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/set v0.2.1/go.mod h1:+RKtMCH+favT2+3YecHGxcc0b4KyVWA1QWWJUs4E0CI= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= +github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/fsouza/fake-gcs-server v1.17.0/go.mod h1:D1rTE4YCyHFNa99oyJJ5HyclvN/0uQR+pM/VdlL83bw= +github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= +github.com/getsentry/sentry-go v0.11.0/go.mod h1:KBQIxiZAetw62Cj8Ri964vAEWVdgfaUCn30Q3bCvANo= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gigawattio/window v0.0.0-20180317192513-0f5467e35573/go.mod h1:eBvb3i++NHDH4Ugo9qCvMw8t0mTSctaEa5blJbWcNxs= +github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= +github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-asn1-ber/asn1-ber v1.3.2-0.20191121212151-29be175fc3a3/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +github.com/go-asn1-ber/asn1-ber v1.5.3 h1:u7utq56RUFiynqUzgVMFDymapcOtQ/MZkh3H4QYkxag= +github.com/go-asn1-ber/asn1-ber v1.5.3/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= +github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= +github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= +github.com/go-redis/redis/v8 v8.0.0/go.mod h1:isLoQT/NFSP7V67lyvM9GmdvLdyZ7pEhsXvvyQtnQTo= +github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w= +github.com/go-resty/resty/v2 v2.0.0/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= +github.com/go-resty/resty/v2 v2.3.0/go.mod h1:UpN9CgLZNsv4e9XG50UU8xdI0F43UQ4HmxLBDwaroHU= +github.com/go-resty/resty/v2 v2.6.0/go.mod h1:PwvJS6hvaPkjtjNg9ph+VrSD92bi5Zq73w/BIH7cC3Q= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= +github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= +github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= +github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= +github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= +github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= +github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= +github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= +github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= +github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= +github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= +github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= +github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= +github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= +github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= +github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= +github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-migrate/migrate/v4 v4.15.0/go.mod h1:g9qbiDvB47WyrRnNu2t2gMZFNHKnatsYRxsGZbCi4EM= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v2.0.0+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-github/v35 v35.2.0/go.mod h1:s0515YVTI+IMrDoy9Y4pHt9ShGpzHvHO8rZ7L7acgvs= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210715191844-86eeefc3e471/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20211004101933-6b77bd30416d/go.mod h1:cz9oNYuRUWGdHmLF2IodMLkAhcPtXeULvcBNagUrxTI= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/schema v1.2.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gregjones/httpcache v0.0.0-20190212212710-3befbb6ad0cc/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.6.2/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c/go.mod h1:ObS/W+h8RYb1Y7fYivughjxojTmIu5iAIjSrSLCLeqE= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= +github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b/go.mod h1:VzxiSdG6j1pi7rwGm/xYI5RbtpBgM8sARDXlvEvxlu0= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack v1.1.5/go.mod h1:gWVc3sv/wbDmR3rQsj1CAktEZzoz1YNK9NfGLXJ69/4= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-plugin v1.4.3/go.mod h1:5fGEH17QVwTTcR0zV7yhDPLLmFX9YSZ38b18Udy6vYQ= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.2.4/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/hashicorp/yamux v0.0.0-20210826001029-26ff87cf9493/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= +github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= +github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= +github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= +github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= +github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= +github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= +github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= +github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= +github.com/jackc/pgconn v1.4.0/go.mod h1:Y2O3ZDF0q4mMacyWV3AstPJpeHXWGEetiFttmq5lahk= +github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= +github.com/jackc/pgconn v1.5.1-0.20200601181101-fa742c524853/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= +github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= +github.com/jackc/pgerrcode v0.0.0-20201024163028-a0d42d470451/go.mod h1:a/s9Lp5W7n/DD0VrVoyJ00FbP2ytTPDVOivvn2bMlds= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= +github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.0.7/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= +github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= +github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= +github.com/jackc/pgtype v1.2.0/go.mod h1:5m2OfMh1wTK7x+Fk952IDmI4nw3nPrvtQdM0ZT4WpC0= +github.com/jackc/pgtype v1.3.1-0.20200510190516-8cd94a14c75a/go.mod h1:vaogEUkALtxZMCH411K+tKzNpwzCKU+AnPzBKZ+I+Po= +github.com/jackc/pgtype v1.3.1-0.20200606141011-f6355165a91c/go.mod h1:cvk9Bgu/VzJ9/lxTO5R5sf80p0DiucVtN7ZxvaC4GmQ= +github.com/jackc/pgtype v1.6.2/go.mod h1:JCULISAZBFGrHaOXIIFiyfzW5VY0GRitRr8NeJsrdig= +github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= +github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= +github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= +github.com/jackc/pgx/v4 v4.5.0/go.mod h1:EpAKPLdnTorwmPUUsqrPxy5fphV18j9q3wrfRXgo+kA= +github.com/jackc/pgx/v4 v4.6.1-0.20200510190926-94ba730bb1e9/go.mod h1:t3/cdRQl6fOLDxqtlyhe9UWgfIi9R8+8v8GKV5TRA/o= +github.com/jackc/pgx/v4 v4.6.1-0.20200606145419-4e5062306904/go.mod h1:ZDaNWkt9sW1JMiNn0kdYBaLelIhw7Pg4qd+Vk6tw7Hg= +github.com/jackc/pgx/v4 v4.10.1/go.mod h1:QlrWebbs3kqEZPHCTGyxecvzG6tvIsYu+A5b1raylkA= +github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jamiealquiza/envy v1.1.0/go.mod h1:MP36BriGCLwEHhi1OU8E9569JNZrjWfCvzG7RsPnHus= +github.com/jaytaylor/html2text v0.0.0-20180606194806-57d518f124b0/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= +github.com/jaytaylor/html2text v0.0.0-20200412013138-3577fbdbcff7/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= +github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= +github.com/jhump/protoreflect v1.6.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/jmoiron/sqlx v1.3.1/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= +github.com/jmoiron/sqlx v1.3.4/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= +github.com/k0kubun/pp v2.3.0+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg= +github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= +github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= +github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= +github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= +github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= +github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= +github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid v1.3.1 h1:5JNjFYYQrZeKRJ0734q51WCEEn2huer72Dc7K+R/b6s= +github.com/klauspost/cpuid v1.3.1/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4= +github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/pgzip v1.2.4/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE= +github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +github.com/kljensen/snowball v0.6.0/go.mod h1:27N7E8fVU5H68RlUmnWwZCfxgt4POBJfENGMvNRhldw= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/ktrysmt/go-bitbucket v0.6.4/go.mod h1:9u0v3hsd2rqCHRIpbir1oP7F58uo5dq19sBYvuMoyQ4= +github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= +github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= +github.com/ledongthuc/pdf v0.0.0-20210621053716-e28cb8259002/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= +github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= +github.com/levigross/exp-html v0.0.0-20120902181939-8df60c69a8f5/go.mod h1:QMe2wuKJ0o7zIVE8AqiT8rd8epmm6WDIZ2wyuBqYPzM= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.3/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= +github.com/markbates/pkger v0.15.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= +github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= +github.com/marstr/guid v0.0.0-20170427235115-8bdf7d1a087c/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= +github.com/mattermost/go-i18n v1.11.1-0.20211013152124-5c415071e404 h1:Khvh6waxG1cHc4Cz5ef9n3XVCxRWpAKUtqg9PJl5+y8= +github.com/mattermost/go-i18n v1.11.1-0.20211013152124-5c415071e404/go.mod h1:RyS7FDNQlzF1PsjbJWHRI35exqaKGSO9qD4iv8QjE34= +github.com/mattermost/gorp v1.6.2-0.20210714143452-8b50f5209a7f/go.mod h1:QCQ3U0M9T/BlAdjKFJo0I1oe/YAgbyjNdhU8bpOLafk= +github.com/mattermost/gosaml2 v0.3.3/go.mod h1:Z429EIOiEi9kbq6yHoApfzlcXpa6dzRDc6pO+Vy2Ksk= +github.com/mattermost/gziphandler v0.0.1/go.mod h1:CvvZR7sXqhj81V2swXuQY7T04Ccc89u7W7pHNPKev8g= +github.com/mattermost/ldap v0.0.0-20201202150706-ee0e6284187d h1:/RJ/UV7M5c7L2TQ0KNm4yZxxFvC1nvRz/gY/Daa35aI= +github.com/mattermost/ldap v0.0.0-20201202150706-ee0e6284187d/go.mod h1:HLbgMEI5K131jpxGazJ97AxfPDt31osq36YS1oxFQPQ= +github.com/mattermost/logr/v2 v2.0.15 h1:+WNbGcsc3dBao65eXlceB6dTILNJRIrvubnsTl3zBew= +github.com/mattermost/logr/v2 v2.0.15/go.mod h1:mpPp935r5dIkFDo2y9Q87cQWhFR/4xXpNh0k/y8Hmwg= +github.com/mattermost/mattermost-server/v6 v6.2.1 h1:kMUJgiuPuXUktpFWsd/286wfw5VAWkl/CzIgFaVNjY8= +github.com/mattermost/mattermost-server/v6 v6.2.1/go.mod h1:VH26NcOr3xgkSBAvh4q+9+RoBD/M9gYO2F1PISq9KMw= +github.com/mattermost/rsc v0.0.0-20160330161541-bbaefb05eaa0/go.mod h1:nV5bfVpT//+B1RPD2JvRnxbkLmJEYXmRaaVl15fsXjs= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= +github.com/mholt/archiver/v3 v3.5.0 h1:nE8gZIrw66cu4osS/U7UW7YDuGMHssxKutU8IfWxwWE= +github.com/mholt/archiver/v3 v3.5.0/go.mod h1:qqTTPUK/HZPFgFQ/TJ3BzvTpF/dPtFVJXdQbCmeMxwc= +github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= +github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= +github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.14 h1:T7cw8P586gVwEEd0y21kTYtloD576XZgP62N8pE130s= +github.com/minio/minio-go/v7 v7.0.14/go.mod h1:S23iSP5/gbMwtxeY5FM71R+TkAYyzEdoNEDDwpt8yWs= +github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v0.0.0-20180220230111-00c29f56e238/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= +github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw= +github.com/muesli/smartcrop v0.2.1-0.20181030220600-548bbf0c0965/go.mod h1:i2fCI/UorTfgEpPPLWiFBv4pye+YAG78RwcQLUkocpI= +github.com/muesli/smartcrop v0.3.0/go.mod h1:i2fCI/UorTfgEpPPLWiFBv4pye+YAG78RwcQLUkocpI= +github.com/mutecomm/go-sqlcipher/v4 v4.4.0/go.mod h1:PyN04SaWalavxRGH9E8ZftG6Ju7rsPrGmQRjrEaVpiY= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8/go.mod h1:86wM1zFnC6/uDBfZGNwB65O+pR2OFi5q/YQaEUid1qA= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= +github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= +github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= +github.com/neo4j/neo4j-go-driver v1.8.1-0.20200803113522-b626aa943eba/go.mod h1:ncO5VaFWh0Nrt+4KT4mOZboaczBZcLuHrG+/sUeP8gI= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= +github.com/nwaples/rardecode v1.1.2 h1:Cj0yZY6T1Zx1R7AhTbyGSALm44/Mmq+BAPc4B/p/d3M= +github.com/nwaples/rardecode v1.1.2/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/olekukonko/tablewriter v0.0.0-20180506121414-d4647c9c7a84/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/olivere/elastic v6.2.37+incompatible/go.mod h1:J+q1zQJTgAz9woqsbVRqGeB5G1iqDKVBWLNSYW8yfJ8= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= +github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/oov/psd v0.0.0-20210618170533-9fb823ddb631/go.mod h1:GHI1bnmAcbp96z6LNfBJvtrjxhaXGkbsk967utPlvL8= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= +github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= +github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= +github.com/otiai10/gosseract/v2 v2.2.4/go.mod h1:ahOp/kHojnOMGv1RaUnR0jwY5JVa6BYKhYAS8nbMLSo= +github.com/otiai10/gosseract/v2 v2.3.1/go.mod h1:2ZOGgdTIXQzCS5f+N1HkcXRgDX6K3ZoYe3Yvo++cpp4= +github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= +github.com/otiai10/mint v1.3.2/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= +github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= +github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/peterbourgon/diskv v0.0.0-20171120014656-2973218375c3/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/philhofer/fwd v1.1.1 h1:GdGcTjf5RNAxwS4QLsiMzJYj5KEvPJD3Abr261yRQXQ= +github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= +github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4/v4 v4.0.3/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.4/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.7/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.8 h1:ieHkV+i2BRzngO4Wd/3HGowuZStgq6QkPsD1eolNAO4= +github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +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/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.31.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/reflog/dateconstraints v0.2.1/go.mod h1:Ax8AxTBcJc3E/oVS2hd2j7RDM/5MDtuPwuR7lIHtPLo= +github.com/remyoudompheng/bigfft v0.0.0-20190728182440-6a916e37a237/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/richardlehane/mscfb v1.0.3/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= +github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rs/cors v1.8.0/go.mod h1:EBwu+T5AvHOcXwvZIkQFjUN6s8Czyqw12GL/Y0tUyRM= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.3.0 h1:6NjYksEUlhurdVehpc7S7dk6DAmcKv8V9gG0FsVN2U4= +github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= +github.com/rudderlabs/analytics-go v3.3.1+incompatible/go.mod h1:LF8/ty9kUX4PTY3l5c97K3nZZaX5Hwsvt+NBaRL/f30= +github.com/russellhaering/goxmldsig v1.1.1/go.mod h1:gM4MDENBQf7M+V824SGfyIUVFWydB7n0KkEubVJl+Tw= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/satori/go.uuid v0.0.0-20180103174451-36e9d2ebbde5/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= +github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= +github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4/go.mod h1:C1a7PQSMz9NShzorzCiG2fk9+xuCgLkPeCvMHYR2OWg= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/segmentio/backo-go v0.0.0-20200129164019-23eae7c10bd3/go.mod h1:9/Rh6yILuLysoQnZ2oNooD2g7aBnvM7r/fNVxRNWfBc= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= +github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= +github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= +github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= +github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= +github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= +github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= +github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= +github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= +github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= +github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= +github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= +github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= +github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= +github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= +github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= +github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= +github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= +github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= +github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= +github.com/simplereach/timeutils v1.2.0/go.mod h1:VVbQDfN/FHRZa1LSqcwo4kNZ62OOyqLLGQKYB3pB0Q8= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/snowflakedb/gosnowflake v1.4.3/go.mod h1:1kyg2XEduwti88V11PKRHImhXLK5WpGiayY6lFNYb98= +github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= +github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/splitio/go-client/v6 v6.1.0/go.mod h1:CEGAEFT99Fwb32ZIRcnZoXTMXddtB6IIpTmt3RP8mnM= +github.com/splitio/go-split-commons/v3 v3.1.0/go.mod h1:29NCy20oAS4ZMy4qkwTd6277eieVDonx4V/aeDU/wUQ= +github.com/splitio/go-toolkit/v4 v4.2.0/go.mod h1:EdIHN0yzB1GTXDYQc0KdKvnjkO/jfUM2YqHVYfhD3Wo= +github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf/go.mod h1:RJID2RhlZKId02nZ62WenDCkgHFerpIOmW0iT7GKmXM= +github.com/steveyen/gtreap v0.1.0/go.mod h1:kl/5J7XbrOmlIbYIXdRHDDE5QxHqpk0cmkT7Z4dM9/Y= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +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.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= +github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/throttled/throttled v2.2.5+incompatible/go.mod h1:0BjlrEGQmvxps+HuXLsyRdqpSRvJpq0PNIsOtqP9Nos= +github.com/tidwall/gjson v1.9.2/go.mod h1:2tcKM/KQ/GjiTN7mfTL/HdNmef9Q6AZLaSK2RdfvSjw= +github.com/tidwall/match v1.1.0/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tinylib/msgp v1.1.6 h1:i+SbKraHhnrf9M5MYmvQhFnbLhAXSDWF8WWsuyRdocw= +github.com/tinylib/msgp v1.1.6/go.mod h1:75BAfg2hauQhs3qedfdDZmWAPcFMAvJE5b9rGOMufyw= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/tylerb/graceful v1.2.15/go.mod h1:LPYTbOYmUTdabwRt0TGhLllQ0MUNbs0Y5q1WXJOI9II= +github.com/uber/jaeger-client-go v2.29.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= +github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulikunitz/xz v0.5.10 h1:t92gobL9l3HE202wg3rlk19F6X+JOxl9BBrCCMYEYd8= +github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= +github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= +github.com/vmihailenco/msgpack/v5 v5.3.4/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/wiggin77/merror v1.0.2/go.mod h1:uQTcIU0Z6jRK4OwqganPYerzQxSFJ4GSHM3aurxxQpg= +github.com/wiggin77/merror v1.0.3 h1:8+ZHV+aSnJoYghE3EUThl15C6rvF2TYRSvOSBjdmNR8= +github.com/wiggin77/merror v1.0.3/go.mod h1:H2ETSu7/bPE0Ymf4bEwdUoo73OOEkdClnoRisfw0Nm0= +github.com/wiggin77/srslog v1.0.1 h1:gA2XjSMy3DrRdX9UqLuDtuVAAshb8bE1NhX1YK0Qe+8= +github.com/wiggin77/srslog v1.0.1/go.mod h1:fehkyYDq1QfuYn60TDPu9YdY2bB85VUW2mvN1WynEls= +github.com/xanzy/go-gitlab v0.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVThkpGiXrs= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= +github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= +github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c h1:3lbZUMbMiGUW/LMkfsEABsc5zNT9+b1CvsJx47JzJ8g= +github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c/go.mod h1:UrdRz5enIKZ63MEE3IF9l2/ebyx59GyGgPi+tICQdmM= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= +gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.mongodb.org/mongo-driver v1.7.0/go.mod h1:Q4oFMbo1+MSNqICAdYMlC/zSTrwCogR4R8NzkI+yfU8= +go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= +go.opencensus.io v0.19.1/go.mod h1:gug0GbSHa8Pafr0d2urOSgoXHZ6x/RUlaiT0d9pqb4A= +go.opencensus.io v0.19.2/go.mod h1:NO/8qkisMZLZ1FCsKNqtJPwc8/TaclWyY0B6wcYNg9M= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/otel v0.11.0/go.mod h1:G8UCk+KooF2HLkgo8RHX9epABH/aRGYET7gQOqBVdB0= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= +golang.org/x/build v0.0.0-20190314133821-5284462c4bec/go.mod h1:atTaCNAy0f16Ah5aV1gMSwgiKVHwu/JncqDpuRr7lS4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20200908183739-ae8ad444f925/go.mod h1:1phAWC201xIgDyaFpmDeZkgf70Q4Pd/CNqfRtVPtxNw= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190321063152-3fc05d484e9f/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190225153610-fe579d43d832/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211006190231-62292e806868 h1:KlOXYy8wQWTUJYFgkUI40Lzr06ofg5IRXUK5C7qZt1k= +golang.org/x/net v0.0.0-20211006190231-62292e806868/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/oauth2 v0.0.0-20180227000427-d7d64896b5ff/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190319182350-c85d3e98c914/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +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/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180224232135-f6cff0780e54/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181218192612-074acd46bca6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181221143128-b4a75ba826a6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +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-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211006225509-1a26e0398eed h1:E159xujlywdAeN3FqsTBPzRKGUq/pDHolXbuttkC36E= +golang.org/x/sys v0.0.0-20211006225509-1a26e0398eed/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181219222714-6e267b5cc78e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190424220101-1e8e1cfdf96b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= +google.golang.org/api v0.2.0/go.mod h1:IfRCZScioGtypHNTlz3gFk67J8uePVW7uDTBzXuIkhU= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/appengine v1.0.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= +google.golang.org/genproto v0.0.0-20181219182458-5a97ab628bfb/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= +google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190321212433-e79c0c59cdb5/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200911024640-645f7a48b24f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210207032614-bba0dbe2a9ea/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210721163202-f1cecdd8b78a/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210726143408-b02e89920bf0/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20211005153810-c76a74d43a8e/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= +gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.63.2 h1:tGK/CyBg7SMzb60vP1M03vNZ3VDu3wGQJwn7Sxi9r3c= +gopkg.in/ini.v1 v1.63.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mail.v2 v2.3.1/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/olivere/elastic.v6 v6.2.37/go.mod h1:2cTT8Z+/LcArSWpCgvZqBgt3VOqXiy7v00w12Lz8bd4= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/postgres v1.0.8/go.mod h1:4eOzrI1MUfm6ObJU/UcmbXyiHSs8jSwH95G5P5dxcAg= +gorm.io/gorm v1.20.12/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= +gorm.io/gorm v1.21.4/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20180920025451-e3ad64cb4ed3/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +modernc.org/b v1.0.0/go.mod h1:uZWcZfRj1BpYzfN9JTerzlNUnnPsV9O2ZA8JsRcubNg= +modernc.org/cc/v3 v3.32.4/go.mod h1:0R6jl1aZlIl2avnYfbfHBS1QB6/f+16mihBObaBC878= +modernc.org/ccgo/v3 v3.9.2/go.mod h1:gnJpy6NIVqkETT+L5zPsQFj7L2kkhfPMzOghRNv/CFo= +modernc.org/db v1.0.0/go.mod h1:kYD/cO29L/29RM0hXYl4i3+Q5VojL31kTUVpVJDw0s8= +modernc.org/file v1.0.0/go.mod h1:uqEokAEn1u6e+J45e54dsEA/pw4o7zLrA2GwyntZzjw= +modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= +modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/internal v1.0.0/go.mod h1:VUD/+JAkhCpvkUitlEOnhpVxCgsBI90oTzSCRcqQVSM= +modernc.org/libc v1.7.13-0.20210308123627-12f642a52bb8/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w= +modernc.org/libc v1.9.5/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w= +modernc.org/lldb v1.0.0/go.mod h1:jcRvJGWfCGodDZz8BPwiKMJxGJngQ/5DrRapkQnLob8= +modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= +modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.0.4/go.mod h1:nV2OApxradM3/OVbs2/0OsP6nPfakXpi50C7dcoHXlc= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/ql v1.0.0/go.mod h1:xGVyrLIatPcO2C1JvI/Co8c0sr6y91HKFNy4pt9JXEY= +modernc.org/sortutil v1.1.0/go.mod h1:ZyL98OQHJgH9IEfN71VsamvJgrtRX9Dj2gX+vH86L1k= +modernc.org/sqlite v1.10.6/go.mod h1:Z9FEjUtZP4qFEg6/SiADg9XCER7aYy9a/j7Pg9P7CPs= +modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/tcl v1.5.2/go.mod h1:pmJYOLgpiys3oI4AeAafkcUfE+TKKilminxNyU/+Zlo= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.0.1-0.20210308123920-1f282aa71362/go.mod h1:8/SRk5C/HgiQWCgXdfpb+1RvhORdkz5sw72d3jjtyqA= +modernc.org/z v1.0.1/go.mod h1:8/SRk5C/HgiQWCgXdfpb+1RvhORdkz5sw72d3jjtyqA= +modernc.org/zappy v1.0.0/go.mod h1:hHe+oGahLVII/aTTyWK/b53VDHMAGCBYYeZ9sn83HC4= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= +willnorris.com/go/gifresize v1.0.0/go.mod h1:eBM8gogBGCcaH603vxSpnfjwXIpq6nmnj/jauBDKtAk= +willnorris.com/go/imageproxy v0.10.0/go.mod h1:2tWdKRneln3E9X/zwH1RINpQAQWPeUiNynZ7UQ9OROk= diff --git a/build/legacy.mk b/build/legacy.mk new file mode 100644 index 00000000..0c327339 --- /dev/null +++ b/build/legacy.mk @@ -0,0 +1,3 @@ +.PHONY: apply +apply: + @echo make apply is deprecated and has no effect. diff --git a/build/manifest/main.go b/build/manifest/main.go index 7acdb7e6..5a5664ec 100644 --- a/build/manifest/main.go +++ b/build/manifest/main.go @@ -3,34 +3,12 @@ package main import ( "encoding/json" "fmt" - "io/ioutil" "os" "github.com/mattermost/mattermost-server/v6/model" "github.com/pkg/errors" ) -const pluginIDGoFileTemplate = `// This file is automatically generated. Do not modify it manually. -// Code generated .* DO NOT EDIT. - -package main - -var manifest = struct { - ID string - Version string -}{ - ID: "%s", - Version: "%s", -} -` - -const pluginIDJSFileTemplate = `// This file is automatically generated. Do not modify it manually. -// Code generated .* DO NOT EDIT. - -export const id = '%s'; -export const version = '%s'; -` - func main() { if len(os.Args) <= 1 { panic("no cmd specified") @@ -59,11 +37,6 @@ func main() { fmt.Printf("true") } - case "apply": - if err := applyManifest(manifest); err != nil { - panic("failed to apply manifest: " + err.Error()) - } - default: panic("unrecognized command: " + cmd) } @@ -101,28 +74,3 @@ func dumpPluginID(manifest *model.Manifest) { func dumpPluginVersion(manifest *model.Manifest) { fmt.Printf("%s", manifest.Version) } - -// applyManifest propagates the plugin_id into the server and webapp folders, as necessary -func applyManifest(manifest *model.Manifest) error { - if manifest.HasServer() { - if err := ioutil.WriteFile( - "server/manifest.go", - []byte(fmt.Sprintf(pluginIDGoFileTemplate, manifest.Id, manifest.Version)), - 0600, - ); err != nil { - return errors.Wrap(err, "failed to write server/manifest.go") - } - } - - if manifest.HasWebapp() { - if err := ioutil.WriteFile( - "webapp/src/manifest.js", - []byte(fmt.Sprintf(pluginIDJSFileTemplate, manifest.Id, manifest.Version)), - 0600, - ); err != nil { - return errors.Wrap(err, "failed to open webapp/src/manifest.js") - } - } - - return nil -} diff --git a/build/pluginctl/main.go b/build/pluginctl/main.go new file mode 100644 index 00000000..8b143f5f --- /dev/null +++ b/build/pluginctl/main.go @@ -0,0 +1,173 @@ +// main handles deployment of the plugin to a development server using the Client4 API. +package main + +import ( + "errors" + "fmt" + "log" + "net" + "os" + + "github.com/mattermost/mattermost-server/v6/model" +) + +const helpText = ` +Usage: + pluginctl deploy + pluginctl disable + pluginctl enable + pluginctl reset +` + +func main() { + err := pluginctl() + if err != nil { + fmt.Printf("Failed: %s\n", err.Error()) + fmt.Print(helpText) + os.Exit(1) + } +} + +func pluginctl() error { + if len(os.Args) < 3 { + return errors.New("invalid number of arguments") + } + + client, err := getClient() + if err != nil { + return err + } + + switch os.Args[1] { + case "deploy": + if len(os.Args) < 4 { + return errors.New("invalid number of arguments") + } + return deploy(client, os.Args[2], os.Args[3]) + case "disable": + return disablePlugin(client, os.Args[2]) + case "enable": + return enablePlugin(client, os.Args[2]) + case "reset": + return resetPlugin(client, os.Args[2]) + default: + return errors.New("invalid second argument") + } +} + +func getClient() (*model.Client4, error) { + socketPath := os.Getenv("MM_LOCALSOCKETPATH") + if socketPath == "" { + socketPath = model.LocalModeSocketPath + } + + client, connected := getUnixClient(socketPath) + if connected { + log.Printf("Connecting using local mode over %s", socketPath) + return client, nil + } + + if os.Getenv("MM_LOCALSOCKETPATH") != "" { + log.Printf("No socket found at %s for local mode deployment. Attempting to authenticate with credentials.", socketPath) + } + + siteURL := os.Getenv("MM_SERVICESETTINGS_SITEURL") + adminToken := os.Getenv("MM_ADMIN_TOKEN") + adminUsername := os.Getenv("MM_ADMIN_USERNAME") + adminPassword := os.Getenv("MM_ADMIN_PASSWORD") + + if siteURL == "" { + return nil, errors.New("MM_SERVICESETTINGS_SITEURL is not set") + } + + client = model.NewAPIv4Client(siteURL) + + if adminToken != "" { + log.Printf("Authenticating using token against %s.", siteURL) + client.SetToken(adminToken) + return client, nil + } + + if adminUsername != "" && adminPassword != "" { + client := model.NewAPIv4Client(siteURL) + log.Printf("Authenticating as %s against %s.", adminUsername, siteURL) + _, _, err := client.Login(adminUsername, adminPassword) + if err != nil { + return nil, fmt.Errorf("failed to login as %s: %w", adminUsername, err) + } + + return client, nil + } + + return nil, errors.New("one of MM_ADMIN_TOKEN or MM_ADMIN_USERNAME/MM_ADMIN_PASSWORD must be defined") +} + +func getUnixClient(socketPath string) (*model.Client4, bool) { + _, err := net.Dial("unix", socketPath) + if err != nil { + return nil, false + } + + return model.NewAPIv4SocketClient(socketPath), true +} + +// deploy attempts to upload and enable a plugin via the Client4 API. +// It will fail if plugin uploads are disabled. +func deploy(client *model.Client4, pluginID, bundlePath string) error { + pluginBundle, err := os.Open(bundlePath) + if err != nil { + return fmt.Errorf("failed to open %s: %w", bundlePath, err) + } + defer pluginBundle.Close() + + log.Print("Uploading plugin via API.") + _, _, err = client.UploadPluginForced(pluginBundle) + if err != nil { + return fmt.Errorf("failed to upload plugin bundle: %s", err.Error()) + } + + log.Print("Enabling plugin.") + _, err = client.EnablePlugin(pluginID) + if err != nil { + return fmt.Errorf("failed to enable plugin: %s", err.Error()) + } + + return nil +} + +// disablePlugin attempts to disable the plugin via the Client4 API. +func disablePlugin(client *model.Client4, pluginID string) error { + log.Print("Disabling plugin.") + _, err := client.DisablePlugin(pluginID) + if err != nil { + return fmt.Errorf("failed to disable plugin: %w", err) + } + + return nil +} + +// enablePlugin attempts to enable the plugin via the Client4 API. +func enablePlugin(client *model.Client4, pluginID string) error { + log.Print("Enabling plugin.") + _, err := client.EnablePlugin(pluginID) + if err != nil { + return fmt.Errorf("failed to enable plugin: %w", err) + } + + return nil +} + +// resetPlugin attempts to reset the plugin via the Client4 API. +func resetPlugin(client *model.Client4, pluginID string) error { + err := disablePlugin(client, pluginID) + if err != nil { + return err + } + + err = enablePlugin(client, pluginID) + if err != nil { + return err + } + + return nil +} diff --git a/build/setup.mk b/build/setup.mk index bc1fdc35..493b06fc 100644 --- a/build/setup.mk +++ b/build/setup.mk @@ -8,7 +8,7 @@ endif $(shell cd build/manifest && $(GO) build -o ../bin/manifest) # Ensure that the deployment tools are compiled. Go's caching makes this quick. -$(shell cd build/deploy && $(GO) build -o ../bin/deploy) +$(shell cd build/pluginctl && $(GO) build -o ../bin/pluginctl) # Extract the plugin id from the manifest. PLUGIN_ID ?= $(shell build/bin/manifest id) diff --git a/build/sync/plan.yml b/build/sync/plan.yml new file mode 100644 index 00000000..bb48626e --- /dev/null +++ b/build/sync/plan.yml @@ -0,0 +1,44 @@ +checks: + - type: repo_is_clean + params: + repo: source + - type: repo_is_clean + params: + repo: target +actions: + - paths: + - build/pluginctl + - build/manifest + actions: + - type: overwrite_directory + params: + create: true + - paths: + - Makefile + actions: + - type: overwrite_file + params: + create: true + - paths: + - .editorconfig + - .gitattributes + - .gitignore + - build/.gitignore + - build/go.mod + - build/go.sum + - build/setup.mk + - server/.gitignore + #- webapp/.eslintrc.json + - webapp/.npmrc + - webapp/babel.config.js + #- webapp/package.json + - webapp/tsconfig.json + - webapp/webpack.config.js + - webapp/src/manifest.test.ts + - webapp/tests/setup.js + actions: + - type: overwrite_file + params: + create: true + conditions: + - type: file_unaltered diff --git a/docs/feature-summary.md b/docs/feature-summary.md index e15dea65..70e4fd73 100644 --- a/docs/feature-summary.md +++ b/docs/feature-summary.md @@ -43,11 +43,11 @@ Interact with the GitLab plugin using the `/gitlab` slash command. ### Subscribe To/Unsubscribe From a Repository -Use `/gitlab subscribe owner[/repo] [features]` to subscribe a Mattermost channel to receive posts for new merge requests and/or issues, or other features (as listed above), from a GitLab repository. Ensure that the webhook is configured, otherwise this will not work properly. +Use `/gitlab subscriptions add owner[/repo] [features]` to subscribe a Mattermost channel to receive posts for new merge requests and/or issues, or other features (as listed above), from a GitLab repository. Ensure that the webhook is configured, otherwise this will not work properly. -Use `/gitlab unsubscribe owner/repo` to unsubscribe from it. +Use `/gitlab subscriptions delete owner/repo` to unsubscribe from it. -`/gitlab subscribe list` lists what you have subscribed to. +`/gitlab subscriptions list` lists what you have subscribed to. ### Connect To/Disconnect From GitLab diff --git a/docs/setup/configuration.md b/docs/setup/configuration.md index 3ee83ad4..9a334952 100644 --- a/docs/setup/configuration.md +++ b/docs/setup/configuration.md @@ -2,7 +2,7 @@ ### Step 1: Register an OAuth Application in GitLab -1. Go to https://gitlab.com/profile/applications or https://gitlab.yourdomain.com/profile/applications to register an OAuth app. +1. Go to https://gitlab.com/-/profile/applications or https://gitlab.yourdomain.com/-/profile/applications to register an OAuth app. 1. Set the following values: - **Name**: `Mattermost GitLab Plugin - ` - **Redirect URI**: `https://your-mattermost-url.com/plugins/com.github.manland.mattermost-plugin-gitlab/oauth/complete`, replacing `https://your-mattermost-url.com` with your Mattermost URL diff --git a/go.mod b/go.mod index d9732939..9b43de61 100644 --- a/go.mod +++ b/go.mod @@ -1,16 +1,16 @@ module github.com/mattermost/mattermost-plugin-gitlab -go 1.13 +go 1.16 require ( github.com/golang/mock v1.6.0 - github.com/mattermost/mattermost-plugin-api v0.0.21 - github.com/mattermost/mattermost-server/v6 v6.0.3 - github.com/mholt/archiver/v3 v3.5.0 - github.com/microcosm-cc/bluemonday v1.0.2 + github.com/gorilla/mux v1.8.0 + github.com/mattermost/mattermost-plugin-api v0.0.27 + github.com/mattermost/mattermost-server/v6 v6.5.0 + github.com/microcosm-cc/bluemonday v1.0.18 github.com/pkg/errors v0.9.1 github.com/stretchr/testify v1.7.0 - github.com/xanzy/go-gitlab v0.48.0 - golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914 + github.com/xanzy/go-gitlab v0.55.0 + golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c ) diff --git a/go.sum b/go.sum index c2f6afa3..6a0b96c5 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,8 @@ +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= -cloud.google.com/go v0.37.1/go.mod h1:SAbnLi6YTSPKSI0dTUEOVLCkyPfKXK8n4ibqiMoj4ok= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= @@ -15,9 +15,22 @@ cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bP cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.63.0/go.mod h1:GmezbQc7T2snqkEXWfZ0sy0VfkB/ivI2DdtJL2DEmlg= -cloud.google.com/go v0.64.0/go.mod h1:xfORb36jGvE+6EexW71nMEtL025s3x6xvuYUKM4JLv4= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.88.0/go.mod h1:dnKwfYbP9hQhefiUvpbcAyoGSHUrOxR20JVElLiUvEY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -27,267 +40,543 @@ cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM7 cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/spanner v1.9.0/go.mod h1:xvlEn0NZ5v1iJPYsBnUVRDNvccDxsBTEi16pJRKQVws= +cloud.google.com/go/spanner v1.24.0/go.mod h1:EZI0yH1D/PrXK0XH9Ba5LGXTXWeqZv0ClOD/19a0Z58= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -code.sajari.com/docconv v1.1.1-0.20210427001343-7b3472bc323a/go.mod h1:KPNt2zuWplps1W0TpOb6ltHj4Xu+j6h7a+YkqGHrxQE= -contrib.go.opencensus.io/exporter/ocagent v0.4.9/go.mod h1:ueLzZcP7LPhPulEBukGn4aLh7Mx9YJwpVJ9nL2FYltw= +cloud.google.com/go/storage v1.16.1/go.mod h1:LaNorbty3ehnU3rEjXSNV/NRgQA0O8Y+uh6bPe5UOk4= +code.sajari.com/docconv v1.2.0/go.mod h1:r8yfCP6OKbZ9Xkd87aBa4nfpk6ud/PoyLwex3n6cXSc= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= -git.apache.org/thrift.git v0.12.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Azure/azure-sdk-for-go v26.5.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= +github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v55.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-autorest v11.5.2+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= +github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.0/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ClickHouse/clickhouse-go v1.3.12/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= +github.com/ClickHouse/clickhouse-go v1.4.3/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/HdrHistogram/hdrhistogram-go v0.9.0/go.mod h1:nxrse8/Tzg2tg3DZcZjm6qEclQKK70g0KxO61gFFZD4= github.com/JalfResi/justext v0.0.0-20170829062021-c0282dea7198/go.mod h1:0SURuH1rsE8aVWvutuMZghRNrNrYEUzibzJfhEYR8L0= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Julusian/godocdown v0.0.0-20170816220326-6d19f8ff2df8/go.mod h1:INZr5t32rG59/5xeltqoCJoNY7e5x/3xoY9WSWVWg74= -github.com/Masterminds/glide v0.13.2/go.mod h1:STyF5vcenH/rUqTEv+/hBXlSTo7KYwg2oc2f4tzPWic= -github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/squirrel v1.5.0/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= -github.com/Masterminds/vcs v1.13.0/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= +github.com/Masterminds/squirrel v1.5.1/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= +github.com/Masterminds/squirrel v1.5.2/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= +github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= +github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= +github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= +github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= +github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= +github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= +github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= +github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PaulARoy/azurestoragecache v0.0.0-20170906084534-3c249a3ba788/go.mod h1:lY1dZd8HBzJ10eqKERHn3CU59tfhzcAVb2c0ZhIWSOk= github.com/PuerkitoBio/goquery v1.4.1/go.mod h1:T9ezsOHcCrDCgA8aF1Cqr3sSYbO/xgdy8/R/XiIMAhA= github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= -github.com/PuerkitoBio/goquery v1.7.0/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= -github.com/RoaringBitmap/roaring v0.4.23/go.mod h1:D0gp8kJQgE1A4LQ5wFLggQEyvDi06Mq5mKs52e1TwOo= -github.com/RoaringBitmap/roaring v0.8.0/go.mod h1:jdT9ykXwHFNdJbEtxePexlFYH9LXucApeS0/+/g+p1I= +github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/RoaringBitmap/roaring v0.9.4/go.mod h1:icnadbWcNyfEHlYdr+tDlOTih1Bf/h+rzPpv4sbomAA= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/advancedlogic/GoOse v0.0.0-20191112112754-e742535969c1/go.mod h1:f3HCSN1fBWjcpGtXyM119MJgeQl838v6so/PQOqvE1w= -github.com/advancedlogic/GoOse v0.0.0-20200830213114-1225d531e0ad/go.mod h1:f3HCSN1fBWjcpGtXyM119MJgeQl838v6so/PQOqvE1w= +github.com/advancedlogic/GoOse v0.0.0-20210820140952-9d5822d4a625/go.mod h1:f3HCSN1fBWjcpGtXyM119MJgeQl838v6so/PQOqvE1w= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= -github.com/andybalholm/brotli v1.0.3 h1:fpcw+r1N1h0Poc1F/pHbW40cUm/lMEQslZtCkBQ0UnM= -github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= +github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY= +github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/apache/arrow/go/arrow v0.0.0-20200601151325-b2287a20f230/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow/go/arrow v0.0.0-20210818145353-234c94e4ce64/go.mod h1:2qMFB56yOP3KzkB3PbYZ4AlUFg3a88F67TIx5lB/WwY= +github.com/apache/arrow/go/arrow v0.0.0-20211013220434-5962184e7a30/go.mod h1:Q7yQnSMnLvcXlZ8RV+jwz/6y1rQTqbX6C82SndT52Zs= github.com/araddon/dateparse v0.0.0-20180729174819-cfd92a431d0e/go.mod h1:SLqhdZcd+dF3TEVL2RMoob5bBP5R1P1qkox+HtCBgGI= github.com/araddon/dateparse v0.0.0-20200409225146-d820a6159ab1/go.mod h1:SLqhdZcd+dF3TEVL2RMoob5bBP5R1P1qkox+HtCBgGI= github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de/go.mod h1:DCaWoUhZrYW9p1lxo/cm8EmUOOzAPSEZNGF2DK1dJgw= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/avct/uasurfer v0.0.0-20191028135549-26b5daa857f1/go.mod h1:noBAuukeYOXa0aXGqxr24tADqkwDO2KRD15FsuaZ5a8= +github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.19.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.38.67/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.40.42/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/aws/aws-sdk-go v1.42.11/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/aws/aws-sdk-go v1.42.49/go.mod h1:OGr6lGMAKGlG9CVrYnWYDKIyb829c6EVBRjxqjmPepc= +github.com/aws/aws-sdk-go-v2 v1.8.0/go.mod h1:xEFuWz+3TYdlPRuo+CqATbeDWIWyaT5uAPwPaWtgse0= +github.com/aws/aws-sdk-go-v2 v1.9.2/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2/config v1.6.0/go.mod h1:TNtBVmka80lRPk5+S9ZqVfFszOQAGJJ9KbT3EM3CHNU= +github.com/aws/aws-sdk-go-v2/config v1.8.3/go.mod h1:4AEiLtAb8kLs7vgw2ZV3p2VZ1+hBavOc84hqxVNpCyw= +github.com/aws/aws-sdk-go-v2/credentials v1.3.2/go.mod h1:PACKuTJdt6AlXvEq8rFI4eDmoqDFC5DpVKQbWysaDgM= +github.com/aws/aws-sdk-go-v2/credentials v1.4.3/go.mod h1:FNNC6nQZQUuyhq5aE5c7ata8o9e4ECGmS4lAXC7o1mQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.4.0/go.mod h1:Mj/U8OpDbcVcoctrYwA2bak8k/HFPdcLzI/vaiXMwuM= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.6.0/go.mod h1:gqlclDEZp4aqJOancXK6TN24aKhT0W0Ae9MHk3wzTMM= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.4.0/go.mod h1:eHwXu2+uE/T6gpnYWwBwqoeqRf9IXyCcolyOWDRAErQ= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.5.4/go.mod h1:Ex7XQmbFmgFHrjUX6TN3mApKW5Hglyga+F7wZHTtYhA= +github.com/aws/aws-sdk-go-v2/internal/ini v1.2.0/go.mod h1:Q5jATQc+f1MfZp3PDMhn6ry18hGvE0i8yvbXoKbnZaE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.2.4/go.mod h1:ZcBrrI3zBKlhGFNYWvju0I3TR93I7YIgAfy82Fh4lcQ= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.2.2/go.mod h1:EASdTcM1lGhUe1/p4gkojHwlGJkeoRjjr1sRCzup3Is= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.3.0/go.mod h1:v8ygadNyATSm6elwJ/4gzJwcFhri9RqS8skgHKiwXPU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.2.2/go.mod h1:NXmNI41bdEsJMrD0v9rUvbGCB5GwdBEpKvUvIY3vTFg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.2/go.mod h1:72HRZDLMtmVQiLG2tLfQcaWLCssELvGl+Zf2WVxMmR8= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.5.2/go.mod h1:QuL2Ym8BkrLmN4lUofXYq6000/i5jPjosCNK//t6gak= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.7.2/go.mod h1:np7TMuJNT83O0oDOSF8i4dF3dvGqA6hPYYo6YYkzgRA= +github.com/aws/aws-sdk-go-v2/service/s3 v1.12.0/go.mod h1:6J++A5xpo7QDsIeSqPK4UHqMSyPOCopa+zKtqAMhqVQ= +github.com/aws/aws-sdk-go-v2/service/s3 v1.16.1/go.mod h1:CQe/KvWV1AqRc65KqeJjrLzr5X2ijnFTTVzJW0VBRCI= +github.com/aws/aws-sdk-go-v2/service/sso v1.3.2/go.mod h1:J21I6kF+d/6XHVk7kp/cx9YVD2TMD2TbLwtRGVcinXo= +github.com/aws/aws-sdk-go-v2/service/sso v1.4.2/go.mod h1:NBvT9R1MEF+Ud6ApJKM0G+IkPchKS7p7c2YPKwHmBOk= +github.com/aws/aws-sdk-go-v2/service/sts v1.6.1/go.mod h1:hLZ/AnkIKHLuPGjEiyghNEdvJ2PP0MgOxcmv9EBJ4xs= +github.com/aws/aws-sdk-go-v2/service/sts v1.7.2/go.mod h1:8EzeIqfWt2wWT4rJVu3f21TfrhJ8AEMzVybRNSb/b4g= +github.com/aws/smithy-go v1.7.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= +github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.2.1/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwjwegp5jy4= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/blevesearch/bleve v1.0.14/go.mod h1:e/LJTr+E7EaoVdkQZTfoz7dt4KoDNvDbLb8MSKuNTLQ= -github.com/blevesearch/blevex v1.0.0/go.mod h1:2rNVqoG2BZI8t1/P1awgTKnGlx5MP9ZbtEciQaNhswc= -github.com/blevesearch/cld2 v0.0.0-20200327141045-8b5f551d37f5/go.mod h1:PN0QNTLs9+j1bKy3d/GB/59wsNBFC4sWLWG3k69lWbc= +github.com/blevesearch/bleve/v2 v2.3.0/go.mod h1:egW/6gZEhM3oBvRjuHXGvGb92cKZ9867OqPZAmCG8MQ= +github.com/blevesearch/bleve_index_api v1.0.1/go.mod h1:fiwKS0xLEm+gBRgv5mumf0dhgFr2mDgZah1pqv1c1M4= github.com/blevesearch/go-porterstemmer v1.0.3/go.mod h1:angGc5Ht+k2xhJdZi511LtmxuEf0OVpvUUNrwmM1P7M= github.com/blevesearch/mmap-go v1.0.2/go.mod h1:ol2qBqYaOUsGdm7aRMRrYGgPvnwLe6Y+7LMvAB5IbSA= +github.com/blevesearch/mmap-go v1.0.3/go.mod h1:pYvKl/grLQrBxuaRYgoTssa4rVujYYeenDp++2E+yvs= +github.com/blevesearch/scorch_segment_api/v2 v2.1.0/go.mod h1:uch7xyyO/Alxkuxa+CGs79vw0QY8BENSBjg6Mw5L5DE= github.com/blevesearch/segment v0.9.0/go.mod h1:9PfHYUdQCgHktBgvtUOF4x+pc4/l8rdH0u5spnW85UQ= github.com/blevesearch/snowballstem v0.9.0/go.mod h1:PivSj3JMc8WuaFkTSRDW2SlrulNWPl4ABg1tC/hlgLs= -github.com/blevesearch/zap/v11 v11.0.14/go.mod h1:MUEZh6VHGXv1PKx3WnCbdP404LGG2IZVa/L66pyFwnY= -github.com/blevesearch/zap/v12 v12.0.14/go.mod h1:rOnuZOiMKPQj18AEKEHJxuI14236tTQ1ZJz4PAnWlUg= -github.com/blevesearch/zap/v13 v13.0.6/go.mod h1:L89gsjdRKGyGrRN6nCpIScCvvkyxvmeDCwZRcjjPCrw= -github.com/blevesearch/zap/v14 v14.0.5/go.mod h1:bWe8S7tRrSBTIaZ6cLRbgNH4TUDaC9LZSpRGs85AsGY= -github.com/blevesearch/zap/v15 v15.0.3/go.mod h1:iuwQrImsh1WjWJ0Ue2kBqY83a0rFtJTqfa9fp1rbVVU= +github.com/blevesearch/upsidedown_store_api v1.0.1/go.mod h1:MQDVGpHZrpe3Uy26zJBf/a8h0FZY6xJbthIMm8myH2Q= +github.com/blevesearch/vellum v1.0.7/go.mod h1:doBZpmRhwTsASB4QdUZANlJvqVAUdUyX0ZK7QJCTeBE= +github.com/blevesearch/zapx/v11 v11.3.2/go.mod h1:YzTfUm4kS3e8OmTXDHVV8OzC5MWPO/VPJZQgPNVb4Lc= +github.com/blevesearch/zapx/v12 v12.3.2/go.mod h1:RMl6lOZqF+sTxKvhQDJ5yK2LT3Mu7E2p/jGdjAaiRxs= +github.com/blevesearch/zapx/v13 v13.3.2/go.mod h1:eppobNM35U4C22yDvTuxV9xPqo10pwfP/jugL4INWG4= +github.com/blevesearch/zapx/v14 v14.3.2/go.mod h1:zXNcVzukh0AvG57oUtT1T0ndi09H0kELNaNmekEy0jw= +github.com/blevesearch/zapx/v15 v15.3.2/go.mod h1:C+f/97ZzTzK6vt/7sVlZdzZxKu+5+j4SrGCvr9dJzaY= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= +github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= -github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= +github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= +github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= +github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/cockroachdb/cockroach-go v0.0.0-20190925194419-606b3d062051/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/codegangsta/cli v1.20.0/go.mod h1:/qJNoX69yVSKu5o4jLyXAENLRyk1uhi7zkbQ3slBdOA= +github.com/cockroachdb/cockroach-go/v2 v2.1.1/go.mod h1:7NtUnP6eK+l6k483WSYNrq3Kb23bWV10IRV1TyeSpwM= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= -github.com/containerd/containerd v1.4.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= +github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= +github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= +github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= +github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= +github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= +github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= +github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= +github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= +github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= +github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= +github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= +github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= +github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= +github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= +github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= +github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= +github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= +github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= +github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= +github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= +github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= +github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= +github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= +github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= +github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= +github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= +github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= +github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= +github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= +github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= +github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= +github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= +github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= +github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= +github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= +github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/corpix/uarand v0.1.1/go.mod h1:SFKZvkcRoLqVRFZ4u25xPmp6m9ktANfbpXZ7SJ0/FNU= github.com/couchbase/ghistogram v0.1.0/go.mod h1:s1Jhy76zqfEecpNWJfWUiKZookAFaiGOEoyzgHt9i7k= -github.com/couchbase/moss v0.1.0/go.mod h1:9MaHIaRuy9pvLPUJxB8sh8OrLfyDczECVL37grCIubs= -github.com/couchbase/vellum v1.0.2/go.mod h1:FcwrEivFpNi24R3jLOs3n+fs5RnuQnQqCLBJ1uAg1W4= +github.com/couchbase/moss v0.2.0/go.mod h1:9MaHIaRuy9pvLPUJxB8sh8OrLfyDczECVL37grCIubs= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cznic/b v0.0.0-20181122101859-a26611c4d92d/go.mod h1:URriBxXwVq5ijiJ12C7iIZqlA69nTlI+LgI6/pwftG8= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= -github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= -github.com/cznic/strutil v0.0.0-20181122101858-275e90344537/go.mod h1:AHHPPPXTw0h6pVabbcbyGRK1DckRn7r/STdZEeIDzZc= +github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= +github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= +github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= +github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= +github.com/dave/jennifer v1.4.1/go.mod h1:7jEdnm+qBcxl8PC0zyp7vxcpSRnzXSt9r39tpTVGlwA= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.0.0-20200620013148-b91950f658ec/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/denisenkom/go-mssqldb v0.10.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= +github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/dgoogauth v0.0.0-20190221195224-5a805980a5f3/go.mod h1:hEfFauPHz7+NnjR/yHJGhrKo1Za+zStgwUETx3yzqgY= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dhui/dktest v0.3.3/go.mod h1:EML9sP4sqJELHn4jV7B0TY8oF6077nk83/tz7M56jcQ= -github.com/die-net/lrucache v0.0.0-20181227122439-19a39ef22a11/go.mod h1:ew0MSjCVDdtGMjF3kzLK9hwdgF5mOE8SbYVF3Rc7mkU= -github.com/disintegration/imaging v1.6.0/go.mod h1:xuIt+sRxDFrHS0drzXUlCJthkJ8k7lkkUojDSR247MQ= +github.com/dhui/dktest v0.3.7/go.mod h1:nYMOkafiA07WchSwKnKFUSbGMb2hMm5DrCGiXYG6gwM= +github.com/die-net/lrucache v0.0.0-20190707192454-883874fe3947/go.mod h1:KsMcjmY1UCGl7ozPbdVPDOvLaFeXnptSvtNRczhxNto= github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= +github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v17.12.0-ce-rc1.0.20200618181300-9dc6525e6118+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.9+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dsnet/compress v0.0.1 h1:PlZu0n3Tuv04TzpfPbrnI0HW/YwodEXDS+oPKahKF0Q= -github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s= github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dvyukov/go-fuzz v0.0.0-20210429054444-fca39067bc72/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= github.com/dyatlov/go-opengraph v0.0.0-20210112100619-dae8665a5b09 h1:AQLr//nh20BzN3hIWj2+/Gt3FwSs8Nwo/nz4hMIcLPg= github.com/dyatlov/go-opengraph v0.0.0-20210112100619-dae8665a5b09/go.mod h1:nYia/MIs9OyvXXYboPmNOj0gVWo97Wx0sde+ZuKkoM4= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/elazarl/go-bindata-assetfs v1.0.1/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= -github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= -github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.12.0 h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc= -github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/set v0.2.1/go.mod h1:+RKtMCH+favT2+3YecHGxcc0b4KyVWA1QWWJUs4E0CI= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/fcjr/aia-transport-go v1.2.2/go.mod h1:onSqSq3tGkM14WusDx7q9FTheS9R1KBtD+QBWI6zG/w= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/form3tech-oss/jwt-go v3.2.5+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fsouza/fake-gcs-server v1.17.0/go.mod h1:D1rTE4YCyHFNa99oyJJ5HyclvN/0uQR+pM/VdlL83bw= -github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= +github.com/gabriel-vasile/mimetype v1.3.1/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= +github.com/gabriel-vasile/mimetype v1.4.0/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= +github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/getsentry/sentry-go v0.11.0/go.mod h1:KBQIxiZAetw62Cj8Ri964vAEWVdgfaUCn30Q3bCvANo= +github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gigawattio/window v0.0.0-20180317192513-0f5467e35573/go.mod h1:eBvb3i++NHDH4Ugo9qCvMw8t0mTSctaEa5blJbWcNxs= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/glycerine/go-unsnap-stream v0.0.0-20181221182339-f9677308dec2/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= -github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-asn1-ber/asn1-ber v1.3.2-0.20191121212151-29be175fc3a3/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-asn1-ber/asn1-ber v1.5.3 h1:u7utq56RUFiynqUzgVMFDymapcOtQ/MZkh3H4QYkxag= github.com/go-asn1-ber/asn1-ber v1.5.3/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= +github.com/go-morph/morph v0.2.3-0.20220215130848-76392b135ee5/go.mod h1:XQh5WcM351wOV3z3zEWRM8RaJ65E2p4P7WWbmFAi8x4= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= +github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= github.com/go-redis/redis/v8 v8.0.0/go.mod h1:isLoQT/NFSP7V67lyvM9GmdvLdyZ7pEhsXvvyQtnQTo= -github.com/go-redis/redis/v8 v8.10.0/go.mod h1:vXLTvigok0VtUX0znvbcEW1SOt4OA9CU1ZfnOtKOaiM= +github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w= github.com/go-resty/resty/v2 v2.0.0/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= github.com/go-resty/resty/v2 v2.3.0/go.mod h1:UpN9CgLZNsv4e9XG50UU8xdI0F43UQ4HmxLBDwaroHU= -github.com/go-resty/resty/v2 v2.6.0/go.mod h1:PwvJS6hvaPkjtjNg9ph+VrSD92bi5Zq73w/BIH7cC3Q= +github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= +github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= +github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= +github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= +github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= +github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= +github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= +github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= +github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= +github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= +github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= +github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= +github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= +github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= +github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= +github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0= +github.com/gocql/gocql v0.0.0-20210515062232-b7ef815b4556/go.mod h1:DL0ekTmBSTdlNF25Orwt/JMzqIq3EJ4MVa/J/uK64OY= +github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= +github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/golang-migrate/migrate/v4 v4.14.1/go.mod h1:l7Ks0Au6fYHuUIxUhQ0rcVX1uLlJg54C/VvW7tvxSz0= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-migrate/migrate/v4 v4.15.1/go.mod h1:/CrBenUbcDqsW29jGTR/XFqCfVi/Y6mHXlooCcSOJMQ= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -296,6 +585,7 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -314,19 +604,21 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= +github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v2.0.0+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -334,16 +626,23 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= -github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= +github.com/google/go-github/v35 v35.2.0/go.mod h1:s0515YVTI+IMrDoy9Y4pHt9ShGpzHvHO8rZ7L7acgvs= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -351,67 +650,92 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210715191844-86eeefc3e471/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20190910122728-9d188e94fb99/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20210621113107-84c6004145de h1:q+tIagAgwJBQPaeOPvis2b+cxfaZ5HNkzoctl7SMxDQ= -github.com/gopherjs/gopherjs v0.0.0-20210621113107-84c6004145de/go.mod h1:MtKwTfDNYAP5EtbQSMYjTSqvj1aXJKQRASWq3bwaP+g= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gopherjs/gopherjs v0.0.0-20211111143520-d0d5ecc1a356/go.mod h1:cz9oNYuRUWGdHmLF2IodMLkAhcPtXeULvcBNagUrxTI= +github.com/gopherjs/gopherjs v0.0.0-20220104163920-15ed2e8cf2bd/go.mod h1:cz9oNYuRUWGdHmLF2IodMLkAhcPtXeULvcBNagUrxTI= +github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= +github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/schema v1.2.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/graph-gophers/graphql-go v1.3.0 h1:Eb9x/q6MFpCLz7jBCiP/WTxjSDrYLR1QY41SORZyNJ0= +github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/gregjones/httpcache v0.0.0-20190212212710-3befbb6ad0cc/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.6.2/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c/go.mod h1:ObS/W+h8RYb1Y7fYivughjxojTmIu5iAIjSrSLCLeqE= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b/go.mod h1:VzxiSdG6j1pi7rwGm/xYI5RbtpBgM8sARDXlvEvxlu0= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= +github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v0.16.1 h1:IVQwpTGNRRIHafnTs2dQLIk4ENtneRIEEJWOVDqz99o= -github.com/hashicorp/go-hclog v0.16.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.1.0 h1:QsGcniKx5/LuX2eYoeL+Np3UKYPNaN7YKpTh29h8rbw= +github.com/hashicorp/go-hclog v1.1.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v1.1.5/go.mod h1:gWVc3sv/wbDmR3rQsj1CAktEZzoz1YNK9NfGLXJ69/4= +github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-plugin v1.4.2 h1:yFvG3ufXXpqiMiZx9HLcaK3XbIqQ1WJFR/F1a2CuVw0= -github.com/hashicorp/go-plugin v1.4.2/go.mod h1:5fGEH17QVwTTcR0zV7yhDPLLmFX9YSZ38b18Udy6vYQ= +github.com/hashicorp/go-plugin v1.4.3 h1:DXmvivbWD5qdiBts9TpBC7BYL1Aia5sxbRgQB+v6UZM= +github.com/hashicorp/go-plugin v1.4.3/go.mod h1:5fGEH17QVwTTcR0zV7yhDPLLmFX9YSZ38b18Udy6vYQ= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.6.8 h1:92lWxgpa+fF3FozM4B3UZtHZMJX8T5XT+TFdCxsPyWs= github.com/hashicorp/go-retryablehttp v0.6.8/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= @@ -425,16 +749,27 @@ github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uG github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.2.4/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.3.1/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= +github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= -github.com/hashicorp/yamux v0.0.0-20210316155119-a95892c5f864 h1:Y4V+SFe7d3iH+9pJCoeWIOS5/xBJIFsltS7E+KJSsJY= -github.com/hashicorp/yamux v0.0.0-20210316155119-a95892c5f864/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hashicorp/yamux v0.0.0-20211028200310-0bc27b27de87 h1:xixZ2bWeofWV68J+x6AzmKuVM/JWCQwkWm6GW/MUR6I= +github.com/hashicorp/yamux v0.0.0-20211028200310-0bc27b27de87/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428/go.mod h1:uhpZMVGznybq1itEKXj6RYw9I71qK4kH+OGMjRC4KEo= -github.com/ikawaha/kagome.ipadic v1.1.2/go.mod h1:DPSBbU0czaJhAb/5uKQZHMc9MTVRpDugJfX+HddPHHg= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= @@ -442,13 +777,18 @@ github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/ github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= +github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= -github.com/jackc/pgconn v1.3.2/go.mod h1:LvCquS3HbBKwgl7KbX9KyqEIumJAbm1UMcTvGaIf3bM= +github.com/jackc/pgconn v1.4.0/go.mod h1:Y2O3ZDF0q4mMacyWV3AstPJpeHXWGEetiFttmq5lahk= +github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= +github.com/jackc/pgconn v1.5.1-0.20200601181101-fa742c524853/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= +github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= +github.com/jackc/pgerrcode v0.0.0-20201024163028-a0d42d470451/go.mod h1:a/s9Lp5W7n/DD0VrVoyJ00FbP2ytTPDVOivvn2bMlds= github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= @@ -458,59 +798,92 @@ github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.0.7/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= +github.com/jackc/pgtype v1.2.0/go.mod h1:5m2OfMh1wTK7x+Fk952IDmI4nw3nPrvtQdM0ZT4WpC0= +github.com/jackc/pgtype v1.3.1-0.20200510190516-8cd94a14c75a/go.mod h1:vaogEUkALtxZMCH411K+tKzNpwzCKU+AnPzBKZ+I+Po= +github.com/jackc/pgtype v1.3.1-0.20200606141011-f6355165a91c/go.mod h1:cvk9Bgu/VzJ9/lxTO5R5sf80p0DiucVtN7ZxvaC4GmQ= +github.com/jackc/pgtype v1.6.2/go.mod h1:JCULISAZBFGrHaOXIIFiyfzW5VY0GRitRr8NeJsrdig= github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= +github.com/jackc/pgx/v4 v4.5.0/go.mod h1:EpAKPLdnTorwmPUUsqrPxy5fphV18j9q3wrfRXgo+kA= +github.com/jackc/pgx/v4 v4.6.1-0.20200510190926-94ba730bb1e9/go.mod h1:t3/cdRQl6fOLDxqtlyhe9UWgfIi9R8+8v8GKV5TRA/o= +github.com/jackc/pgx/v4 v4.6.1-0.20200606145419-4e5062306904/go.mod h1:ZDaNWkt9sW1JMiNn0kdYBaLelIhw7Pg4qd+Vk6tw7Hg= +github.com/jackc/pgx/v4 v4.10.1/go.mod h1:QlrWebbs3kqEZPHCTGyxecvzG6tvIsYu+A5b1raylkA= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jamiealquiza/envy v1.1.0/go.mod h1:MP36BriGCLwEHhi1OU8E9569JNZrjWfCvzG7RsPnHus= +github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jaytaylor/html2text v0.0.0-20180606194806-57d518f124b0/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= github.com/jaytaylor/html2text v0.0.0-20200412013138-3577fbdbcff7/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= +github.com/jaytaylor/html2text v0.0.0-20211105163654-bc68cce691ba/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jhump/protoreflect v1.6.0 h1:h5jfMVslIg6l29nsMs0D8Wj17RDVdNYti0vDN/PZZoE= github.com/jhump/protoreflect v1.6.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/jmoiron/sqlx v1.3.1/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= github.com/jmoiron/sqlx v1.3.4/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/k0kubun/pp v2.3.0+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= +github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= +github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.1 h1:wXr2uRxZTJXHLly6qhJabee5JqIhTRoLBhDOA74hDEQ= +github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.14.2 h1:S0OHlFk/Gbon/yauFJ4FfJJF5V0fc5HbBTJazi28pRw= +github.com/klauspost/compress v1.14.2/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= @@ -518,47 +891,59 @@ github.com/klauspost/cpuid v1.3.1 h1:5JNjFYYQrZeKRJ0734q51WCEEn2huer72Dc7K+R/b6s github.com/klauspost/cpuid v1.3.1/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.6 h1:dQ5ueTiftKxp0gyjKSx5+8BtPWkyQbd95m8Gys/RarI= -github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/pgzip v1.2.4/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.11 h1:i2lw1Pm7Yi/4O6XCSyJWqEHI2MDw2FzUK6o/D21xn2A= +github.com/klauspost/cpuid/v2 v2.0.11/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/kljensen/snowball v0.6.0/go.mod h1:27N7E8fVU5H68RlUmnWwZCfxgt4POBJfENGMvNRhldw= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -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/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/ktrysmt/go-bitbucket v0.6.4/go.mod h1:9u0v3hsd2rqCHRIpbir1oP7F58uo5dq19sBYvuMoyQ4= github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= +github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= github.com/ledongthuc/pdf v0.0.0-20210621053716-e28cb8259002/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= +github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= github.com/levigross/exp-html v0.0.0-20120902181939-8df60c69a8f5/go.mod h1:QMe2wuKJ0o7zIVE8AqiT8rd8epmm6WDIZ2wyuBqYPzM= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= -github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk= +github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= +github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= github.com/markbates/pkger v0.15.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= -github.com/marstr/guid v0.0.0-20170427235115-8bdf7d1a087c/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= -github.com/mattermost/go-i18n v1.11.0/go.mod h1:RyS7FDNQlzF1PsjbJWHRI35exqaKGSO9qD4iv8QjE34= +github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= +github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/mattermost/go-i18n v1.11.1-0.20211013152124-5c415071e404 h1:Khvh6waxG1cHc4Cz5ef9n3XVCxRWpAKUtqg9PJl5+y8= github.com/mattermost/go-i18n v1.11.1-0.20211013152124-5c415071e404/go.mod h1:RyS7FDNQlzF1PsjbJWHRI35exqaKGSO9qD4iv8QjE34= github.com/mattermost/gorp v1.6.2-0.20210714143452-8b50f5209a7f/go.mod h1:QCQ3U0M9T/BlAdjKFJo0I1oe/YAgbyjNdhU8bpOLafk= @@ -566,60 +951,73 @@ github.com/mattermost/gosaml2 v0.3.3/go.mod h1:Z429EIOiEi9kbq6yHoApfzlcXpa6dzRDc github.com/mattermost/gziphandler v0.0.1/go.mod h1:CvvZR7sXqhj81V2swXuQY7T04Ccc89u7W7pHNPKev8g= github.com/mattermost/ldap v0.0.0-20201202150706-ee0e6284187d h1:/RJ/UV7M5c7L2TQ0KNm4yZxxFvC1nvRz/gY/Daa35aI= github.com/mattermost/ldap v0.0.0-20201202150706-ee0e6284187d/go.mod h1:HLbgMEI5K131jpxGazJ97AxfPDt31osq36YS1oxFQPQ= -github.com/mattermost/logr v1.0.13 h1:6F/fM3csvH6Oy5sUpJuW7YyZSzZZAhJm5VcgKMxA2P8= -github.com/mattermost/logr v1.0.13/go.mod h1:Mt4DPu1NXMe6JxPdwCC0XBoxXmN9eXOIRPoZarU2PXs= -github.com/mattermost/logr/v2 v2.0.10 h1:i6rJbuX/EkBM9maM8M0eJ3rxB+fsBKNslPvzSlA2w/M= -github.com/mattermost/logr/v2 v2.0.10/go.mod h1:mpPp935r5dIkFDo2y9Q87cQWhFR/4xXpNh0k/y8Hmwg= -github.com/mattermost/mattermost-plugin-api v0.0.21 h1:0uQ9kQwFFEvb+qxwXqwbaDGmxwwv3wv6iHdhMWG3KiA= -github.com/mattermost/mattermost-plugin-api v0.0.21/go.mod h1:qz19Y+5HLbjtzY2RZ6B8ZZx90XUrmoRsHkSAfvfKU1M= -github.com/mattermost/mattermost-server/v6 v6.0.0-20210901153517-42e75fad4dae/go.mod h1:kmxJuVgpX13Th+e5L1ZsBs4aq+ETmmDg9joo5r4cIw8= -github.com/mattermost/mattermost-server/v6 v6.0.3 h1:ElebBbO3FQDdiqElyntNNUSxRfVIdSRDm4VbXKViXxM= -github.com/mattermost/mattermost-server/v6 v6.0.3/go.mod h1:I7hgNyInWiVaIcGjYMDoJufO1E4SbK3Zj+3OEIk417g= +github.com/mattermost/logr/v2 v2.0.15 h1:+WNbGcsc3dBao65eXlceB6dTILNJRIrvubnsTl3zBew= +github.com/mattermost/logr/v2 v2.0.15/go.mod h1:mpPp935r5dIkFDo2y9Q87cQWhFR/4xXpNh0k/y8Hmwg= +github.com/mattermost/mattermost-plugin-api v0.0.27 h1:zFKQ6JW1/f0MfR5dP9P2umNNYVcLtTO74mM/PrVPNC4= +github.com/mattermost/mattermost-plugin-api v0.0.27/go.mod h1:MM+tZ+36Obm9jqcveoxY2RFbwLaZKZUgR1zUlc0UBYw= +github.com/mattermost/mattermost-server/v6 v6.3.0/go.mod h1:L9gIoi9ESBh/NefsaZCfOVBMnbhx+v3kXhInGt3DQmA= +github.com/mattermost/mattermost-server/v6 v6.5.0 h1:9S+/vQirO4XNpT+4TC/MlHNYpd2bgFvoRnBkImRCtNQ= +github.com/mattermost/mattermost-server/v6 v6.5.0/go.mod h1:JRRn3uSrynvCY45ystGEJqis/Xo8PFhCDSO4SNDMncU= github.com/mattermost/rsc v0.0.0-20160330161541-bbaefb05eaa0/go.mod h1:nV5bfVpT//+B1RPD2JvRnxbkLmJEYXmRaaVl15fsXjs= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= -github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= -github.com/mholt/archiver/v3 v3.5.0 h1:nE8gZIrw66cu4osS/U7UW7YDuGMHssxKutU8IfWxwWE= -github.com/mholt/archiver/v3 v3.5.0/go.mod h1:qqTTPUK/HZPFgFQ/TJ3BzvTpF/dPtFVJXdQbCmeMxwc= +github.com/mholt/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/microcosm-cc/bluemonday v1.0.18/go.mod h1:Z0r70sCuXHig8YpBzCc5eGHAap2K7e/u082ZUpDRRqM= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +github.com/miekg/dns v1.1.46/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= +github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.11 h1:7utSkCtMQPYYB1UB8FR3d0QSiOWE6F/JYXon29imYek= -github.com/minio/minio-go/v7 v7.0.11/go.mod h1:WoyW+ySKAKjY98B9+7ZbI8z8S3jaxaisdcvj9TGlazA= +github.com/minio/minio-go/v7 v7.0.16/go.mod h1:pUV0Pc+hPd1nccgmzQF/EXh48l/Z/yps6QPF1aaie4g= +github.com/minio/minio-go/v7 v7.0.21 h1:xrc4BQr1Fa4s5RwY0xfMjPZFJ1bcYBCCHYlngBdWV+k= +github.com/minio/minio-go/v7 v7.0.21/go.mod h1:ei5JjmxwHaMrgsMrn4U/+Nmg+d8MKS1U2DAn1ou4+Do= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -633,65 +1031,111 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v0.0.0-20180220230111-00c29f56e238/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= +github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= +github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw= -github.com/muesli/smartcrop v0.2.1-0.20181030220600-548bbf0c0965/go.mod h1:i2fCI/UorTfgEpPPLWiFBv4pye+YAG78RwcQLUkocpI= github.com/muesli/smartcrop v0.3.0/go.mod h1:i2fCI/UorTfgEpPPLWiFBv4pye+YAG78RwcQLUkocpI= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mutecomm/go-sqlcipher/v4 v4.4.0/go.mod h1:PyN04SaWalavxRGH9E8ZftG6Ju7rsPrGmQRjrEaVpiY= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8/go.mod h1:86wM1zFnC6/uDBfZGNwB65O+pR2OFi5q/YQaEUid1qA= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/neo4j/neo4j-go-driver v1.8.1-0.20200803113522-b626aa943eba/go.mod h1:ncO5VaFWh0Nrt+4KT4mOZboaczBZcLuHrG+/sUeP8gI= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= -github.com/ngdinhtoan/glide-cleanup v0.2.0/go.mod h1:UQzsmiDOb8YV3nOsCxK/c9zPpCZVNoHScRE3EO9pVMM= github.com/nicksnyder/go-i18n/v2 v2.0.3/go.mod h1:oDab7q8XCYMRlcrBnaY/7B1eOectbvj6B1UPBT+p5jo= -github.com/nwaples/rardecode v1.1.0 h1:vSxaY8vQhOcVr4mm5e8XllHWTiM4JF507A0Katqw7MQ= github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= +github.com/nwaples/rardecode v1.1.2/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.0-20180506121414-d4647c9c7a84/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/olivere/elastic v6.2.35+incompatible/go.mod h1:J+q1zQJTgAz9woqsbVRqGeB5G1iqDKVBWLNSYW8yfJ8= +github.com/olivere/elastic v6.2.37+incompatible/go.mod h1:J+q1zQJTgAz9woqsbVRqGeB5G1iqDKVBWLNSYW8yfJ8= +github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/oov/psd v0.0.0-20210618170533-9fb823ddb631/go.mod h1:GHI1bnmAcbp96z6LNfBJvtrjxhaXGkbsk967utPlvL8= +github.com/oov/psd v0.0.0-20220121172623-5db5eafcecbb/go.mod h1:GHI1bnmAcbp96z6LNfBJvtrjxhaXGkbsk967utPlvL8= +github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= +github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= +github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= +github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= +github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= +github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= -github.com/openzipkin/zipkin-go v0.1.3/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= github.com/otiai10/gosseract/v2 v2.2.4/go.mod h1:ahOp/kHojnOMGv1RaUnR0jwY5JVa6BYKhYAS8nbMLSo= @@ -703,89 +1147,125 @@ github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144T github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= +github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= +github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= +github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/peterbourgon/diskv v0.0.0-20171120014656-2973218375c3/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/philhofer/fwd v1.1.1 h1:GdGcTjf5RNAxwS4QLsiMzJYj5KEvPJD3Abr261yRQXQ= github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= -github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4/v4 v4.0.3/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.8 h1:ieHkV+i2BRzngO4Wd/3HGowuZStgq6QkPsD1eolNAO4= +github.com/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.11/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.14/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= +github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= 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/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/reflog/dateconstraints v0.2.1/go.mod h1:Ax8AxTBcJc3E/oVS2hd2j7RDM/5MDtuPwuR7lIHtPLo= github.com/remyoudompheng/bigfft v0.0.0-20190728182440-6a916e37a237/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/richardlehane/mscfb v1.0.3/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= +github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= +github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/robertkrimen/godocdown v0.0.0-20130622164427-0bfa04905481/go.mod h1:C9WhFzY47SzYBIvzFqSvHIR6ROgDo4TtdTuRaOMjF/s= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rs/cors v1.8.0/go.mod h1:EBwu+T5AvHOcXwvZIkQFjUN6s8Czyqw12GL/Y0tUyRM= +github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.3.0 h1:6NjYksEUlhurdVehpc7S7dk6DAmcKv8V9gG0FsVN2U4= github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/rudderlabs/analytics-go v3.3.1+incompatible/go.mod h1:LF8/ty9kUX4PTY3l5c97K3nZZaX5Hwsvt+NBaRL/f30= -github.com/russellhaering/goxmldsig v1.1.0/go.mod h1:QK8GhXPB3+AfuCrfo0oRISa9NfzeCpWmxeGnqEpDF9o= +github.com/rudderlabs/analytics-go v3.3.2+incompatible h1:bDajEJTYhfHjNYxbQFMA/2dHlOjyeSgxS7GPIdMZ52Q= +github.com/rudderlabs/analytics-go v3.3.2+incompatible/go.mod h1:LF8/ty9kUX4PTY3l5c97K3nZZaX5Hwsvt+NBaRL/f30= +github.com/russellhaering/goxmldsig v1.1.1/go.mod h1:gM4MDENBQf7M+V824SGfyIUVFWydB7n0KkEubVJl+Tw= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/satori/go.uuid v0.0.0-20180103174451-36e9d2ebbde5/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4/go.mod h1:C1a7PQSMz9NShzorzCiG2fk9+xuCgLkPeCvMHYR2OWg= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/segmentio/backo-go v0.0.0-20200129164019-23eae7c10bd3 h1:ZuhckGJ10ulaKkdvJtiAqsLTiPrLaXSdnVgXJKJkTxE= github.com/segmentio/backo-go v0.0.0-20200129164019-23eae7c10bd3/go.mod h1:9/Rh6yILuLysoQnZ2oNooD2g7aBnvM7r/fNVxRNWfBc= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= @@ -813,7 +1293,10 @@ github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYED github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= github.com/simplereach/timeutils v1.2.0/go.mod h1:VVbQDfN/FHRZa1LSqcwo4kNZ62OOyqLLGQKYB3pB0Q8= +github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= @@ -821,37 +1304,52 @@ github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/assertions v1.0.0 h1:UVQPSSmc3qtTi+zPPkCXvZX9VvW/xT/NsRvKfwY81a8= -github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= -github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/snowflakedb/glog v0.0.0-20180824191149-f5055e6f21ce/go.mod h1:EB/w24pR5VKI60ecFnKqXzxX3dOorz1rnVicQTQrGM0= -github.com/snowflakedb/gosnowflake v1.3.5/go.mod h1:13Ky+lxzIm3VqNDZJdyvu9MCGy+WgRdYFdXp96UcLZU= +github.com/snowflakedb/gosnowflake v1.6.3/go.mod h1:6hLajn6yxuJ4xUHZegMekpq9rnQbGJ7TMwXjgTmA6lg= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= github.com/splitio/go-client/v6 v6.1.0/go.mod h1:CEGAEFT99Fwb32ZIRcnZoXTMXddtB6IIpTmt3RP8mnM= github.com/splitio/go-split-commons/v3 v3.1.0/go.mod h1:29NCy20oAS4ZMy4qkwTd6277eieVDonx4V/aeDU/wUQ= github.com/splitio/go-toolkit/v4 v4.2.0/go.mod h1:EdIHN0yzB1GTXDYQc0KdKvnjkO/jfUM2YqHVYfhD3Wo= github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf/go.mod h1:RJID2RhlZKId02nZ62WenDCkgHFerpIOmW0iT7GKmXM= -github.com/stephens2424/writerset v1.0.2/go.mod h1:aS2JhsMn6eA7e82oNmW4rfsgAOp9COBTTl8mzkwADnc= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/steveyen/gtreap v0.1.0/go.mod h1:kl/5J7XbrOmlIbYIXdRHDDE5QxHqpk0cmkT7Z4dM9/Y= +github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.3.0 h1:NGXK3lHquSN08v5vWalVI/L8XU9hdzE/G6xsrze47As= github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -860,64 +1358,83 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= -github.com/tebeka/snowball v0.4.2/go.mod h1:4IfL14h1lvwZcp1sfXuuc7/7yCsvVffTWxWxCLfFpYg= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= +github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= github.com/throttled/throttled v2.2.5+incompatible/go.mod h1:0BjlrEGQmvxps+HuXLsyRdqpSRvJpq0PNIsOtqP9Nos= -github.com/tidwall/gjson v1.8.0/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk= -github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tidwall/pretty v1.1.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/gjson v1.11.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.14.0 h1:6aeJ0bzojgWLa82gDQHcx3S0Lr/O51I9bJ5nv6JFx5w= +github.com/tidwall/gjson v1.14.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tinylib/msgp v1.1.6 h1:i+SbKraHhnrf9M5MYmvQhFnbLhAXSDWF8WWsuyRdocw= github.com/tinylib/msgp v1.1.6/go.mod h1:75BAfg2hauQhs3qedfdDZmWAPcFMAvJE5b9rGOMufyw= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/tylerb/graceful v1.2.15/go.mod h1:LPYTbOYmUTdabwRt0TGhLllQ0MUNbs0Y5q1WXJOI9II= github.com/uber/jaeger-client-go v2.29.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= -github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ulikunitz/xz v0.5.10 h1:t92gobL9l3HE202wg3rlk19F6X+JOxl9BBrCCMYEYd8= +github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= -github.com/vmihailenco/msgpack/v5 v5.3.4/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= +github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= -github.com/wiggin77/cfg v1.0.2/go.mod h1:b3gotba2e5bXTqTW48DwIFoLc+4lWKP7WPi/CdvZ4aE= github.com/wiggin77/merror v1.0.2/go.mod h1:uQTcIU0Z6jRK4OwqganPYerzQxSFJ4GSHM3aurxxQpg= github.com/wiggin77/merror v1.0.3 h1:8+ZHV+aSnJoYghE3EUThl15C6rvF2TYRSvOSBjdmNR8= github.com/wiggin77/merror v1.0.3/go.mod h1:H2ETSu7/bPE0Ymf4bEwdUoo73OOEkdClnoRisfw0Nm0= github.com/wiggin77/srslog v1.0.1 h1:gA2XjSMy3DrRdX9UqLuDtuVAAshb8bE1NhX1YK0Qe+8= github.com/wiggin77/srslog v1.0.1/go.mod h1:fehkyYDq1QfuYn60TDPu9YdY2bB85VUW2mvN1WynEls= -github.com/willf/bitset v1.1.10/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= github.com/xanzy/go-gitlab v0.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVThkpGiXrs= -github.com/xanzy/go-gitlab v0.48.0 h1:RP9r4pMDIwE2fbtc+QYiC1euDsPGHcAjPkhje4X3QPU= -github.com/xanzy/go-gitlab v0.48.0/go.mod h1:UW8JJbyBbqtOyBYNHRo261IRdHUFJr2m0y0z1xUiu+E= -github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= -github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +github.com/xanzy/go-gitlab v0.55.0 h1:klg5EgPYtsF6QlnVFpOpv/FmhqQxCUUG7zLJIL1NKz8= +github.com/xanzy/go-gitlab v0.55.0/go.mod h1:F0QEXwmqiBUxCgJm8fE9S+1veX4XC9Z4cfaAbqwk4YM= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= +github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c h1:3lbZUMbMiGUW/LMkfsEABsc5zNT9+b1CvsJx47JzJ8g= github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c/go.mod h1:UrdRz5enIKZ63MEE3IF9l2/ebyx59GyGgPi+tICQdmM= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= @@ -926,47 +1443,57 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.3.8 h1:Nw158Q8QN+CPgTmVRByhVwapp8Mm1e2blinhmx4wx5E= -github.com/yuin/goldmark v1.3.8/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.4/go.mod h1:rmuwmfZ0+bvzB24eSC//bk1R1Zp3hM0OXYv/G2LIilg= +github.com/yuin/goldmark v1.4.5 h1:4OEQwtW2uLXjEdgnGM3Vg652Pq37X7NOIRzFWb3BzIc= +github.com/yuin/goldmark v1.4.5/go.mod h1:rmuwmfZ0+bvzB24eSC//bk1R1Zp3hM0OXYv/G2LIilg= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.mongodb.org/mongo-driver v1.1.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= +go.mongodb.org/mongo-driver v1.7.0/go.mod h1:Q4oFMbo1+MSNqICAdYMlC/zSTrwCogR4R8NzkI+yfU8= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= -go.opencensus.io v0.19.1/go.mod h1:gug0GbSHa8Pafr0d2urOSgoXHZ6x/RUlaiT0d9pqb4A= -go.opencensus.io v0.19.2/go.mod h1:NO/8qkisMZLZ1FCsKNqtJPwc8/TaclWyY0B6wcYNg9M= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/otel v0.11.0/go.mod h1:G8UCk+KooF2HLkgo8RHX9epABH/aRGYET7gQOqBVdB0= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel v1.0.0-RC1/go.mod h1:x9tRa9HK4hSSq7jf2TKbqFbtt58/TGk0f9XiEYISI1I= -go.opentelemetry.io/otel/internal/metric v0.21.0/go.mod h1:iOfAaY2YycsXfYD4kaRSbLx2LKmfpKObWBEv9QK5zFo= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/metric v0.21.0/go.mod h1:JWCt1bjivC4iCrz/aCrM1GSw+ZcvY44KCbaeeRhzHnc= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/oteltest v1.0.0-RC1/go.mod h1:+eoIG0gdEOaPNftuy1YScLr1Gb4mL/9lpDkZ0JjMRq4= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/otel/trace v1.0.0-RC1/go.mod h1:86UHmyHWFEtWjfWPSbu0+d0Pf9Q6e1U+3ViBOc+NXAg= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.8.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= -golang.org/x/build v0.0.0-20190314133821-5284462c4bec/go.mod h1:atTaCNAy0f16Ah5aV1gMSwgiKVHwu/JncqDpuRr7lS4= +golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -974,24 +1501,38 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190506204251-e1dfcc566284/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e h1:gsTQYXdTw2Gq7RBsWvlQ91b+aEQ6bXFUngBGuR8sPpI= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220208233918-bba287dce954 h1:BkypuErRT9A9I/iljuaG3/zdMjd/J6m8tKKJQtGfSdA= +golang.org/x/crypto v0.0.0-20220208233918-bba287dce954/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= @@ -1001,13 +1542,17 @@ golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMk golang.org/x/exp v0.0.0-20200908183739-ae8ad444f925/go.mod h1:1phAWC201xIgDyaFpmDeZkgf70Q4Pd/CNqfRtVPtxNw= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190321063152-3fc05d484e9f/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210622092929-e6eecd499c2c/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -1017,6 +1562,7 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -1027,12 +1573,17 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1041,7 +1592,6 @@ golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190225153610-fe579d43d832/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -1050,14 +1600,18 @@ golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1073,34 +1627,65 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201029221708-28c70e62bb1d/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211013171255-e13a2654a71e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180227000427-d7d64896b5ff/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190319182350-c85d3e98c914/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914 h1:3B43BWw0xEBsLZ/NO1VALz6fppU3481pik+2Ksv45z8= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 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/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1118,9 +1703,7 @@ golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181218192612-074acd46bca6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181221143128-b4a75ba826a6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1128,14 +1711,24 @@ golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1143,16 +1736,23 @@ golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1163,67 +1763,121 @@ golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201029080932-201ba4db2418/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210326220804-49726bf1d181/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 h1:RqytpXGR1iVNX7psjB3ff8y7sNFinVFvkx1c8SjBkio= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220207234003-57398862261d h1:Bm7BNOQt2Qv7ZqysjeLjgCBanX+88Z/OtdvsrEv1Djc= +golang.org/x/sys v0.0.0-20220207234003-57398862261d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181219222714-6e267b5cc78e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190424220101-1e8e1cfdf96b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1247,20 +1901,28 @@ golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200806022845-90696ccdc692/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200814230902-9882f1d1823d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200817023811-d00afeaade8f/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200818005847-188abfa75333/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200928182047-19e03678916f/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1268,11 +1930,16 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= -google.golang.org/api v0.2.0/go.mod h1:IfRCZScioGtypHNTlz3gFk67J8uePVW7uDTBzXuIkhU= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1289,6 +1956,23 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= google.golang.org/appengine v1.0.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1297,20 +1981,21 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= -google.golang.org/genproto v0.0.0-20181219182458-5a97ab628bfb/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190321212433-e79c0c59cdb5/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= @@ -1319,6 +2004,7 @@ google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -1329,27 +2015,67 @@ google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200815001618-f69a88009b70/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200911024640-645f7a48b24f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201030142918-24207fddd1c3/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84 h1:R1r5J0u6Cx+RNl/6mezTw6oA14cmKC96FeUwL6A9bd4= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210207032614-bba0dbe2a9ea/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210630183607-d20f26d13c79/go.mod h1:yiaVoXHpRzHGyxV3o4DktVWY4mSUErTKaeEOq6C3t3U= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210721163202-f1cecdd8b78a/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210726143408-b02e89920bf0/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210825212027-de86158e7fda/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211013025323-ce878158c4d4/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220208230804-65c12eb4c068 h1:pwzFiZfBTH/GjBWz1BcDwMBaHBo8mZvpLa7eBKJpFAk= +google.golang.org/genproto v0.0.0-20220208230804-65c12eb4c068/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -1358,10 +2084,25 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.44.0 h1:weqSxi/TMs1SqFRMHCtBgXRs8k3X39QIDEZ0pRcttUg= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1373,36 +2114,50 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= +gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.64.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.3 h1:jRskFVxYaMGAMUbN0UZ7niA9gzL9B49DOqE78vg0k3w= +gopkg.in/ini.v1 v1.66.3/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mail.v2 v2.3.1/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/olivere/elastic.v6 v6.2.35/go.mod h1:2cTT8Z+/LcArSWpCgvZqBgt3VOqXiy7v00w12Lz8bd4= +gopkg.in/olivere/elastic.v6 v6.2.37/go.mod h1:2cTT8Z+/LcArSWpCgvZqBgt3VOqXiy7v00w12Lz8bd4= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1414,10 +2169,14 @@ gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/postgres v1.0.8/go.mod h1:4eOzrI1MUfm6ObJU/UcmbXyiHSs8jSwH95G5P5dxcAg= +gorm.io/gorm v1.20.12/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= +gorm.io/gorm v1.21.4/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20180920025451-e3ad64cb4ed3/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1425,22 +2184,68 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= +k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= +k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= +k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= +k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= +k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= +k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= +k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= +k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= +k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= +k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= +k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= +k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= +k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= +k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= modernc.org/b v1.0.0/go.mod h1:uZWcZfRj1BpYzfN9JTerzlNUnnPsV9O2ZA8JsRcubNg= +modernc.org/cc/v3 v3.32.4/go.mod h1:0R6jl1aZlIl2avnYfbfHBS1QB6/f+16mihBObaBC878= +modernc.org/ccgo/v3 v3.9.2/go.mod h1:gnJpy6NIVqkETT+L5zPsQFj7L2kkhfPMzOghRNv/CFo= modernc.org/db v1.0.0/go.mod h1:kYD/cO29L/29RM0hXYl4i3+Q5VojL31kTUVpVJDw0s8= modernc.org/file v1.0.0/go.mod h1:uqEokAEn1u6e+J45e54dsEA/pw4o7zLrA2GwyntZzjw= modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= modernc.org/internal v1.0.0/go.mod h1:VUD/+JAkhCpvkUitlEOnhpVxCgsBI90oTzSCRcqQVSM= +modernc.org/libc v1.7.13-0.20210308123627-12f642a52bb8/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w= +modernc.org/libc v1.9.5/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w= modernc.org/lldb v1.0.0/go.mod h1:jcRvJGWfCGodDZz8BPwiKMJxGJngQ/5DrRapkQnLob8= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= +modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.0.4/go.mod h1:nV2OApxradM3/OVbs2/0OsP6nPfakXpi50C7dcoHXlc= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= modernc.org/ql v1.0.0/go.mod h1:xGVyrLIatPcO2C1JvI/Co8c0sr6y91HKFNy4pt9JXEY= modernc.org/sortutil v1.1.0/go.mod h1:ZyL98OQHJgH9IEfN71VsamvJgrtRX9Dj2gX+vH86L1k= +modernc.org/sqlite v1.10.6/go.mod h1:Z9FEjUtZP4qFEg6/SiADg9XCER7aYy9a/j7Pg9P7CPs= modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/tcl v1.5.2/go.mod h1:pmJYOLgpiys3oI4AeAafkcUfE+TKKilminxNyU/+Zlo= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.0.1-0.20210308123920-1f282aa71362/go.mod h1:8/SRk5C/HgiQWCgXdfpb+1RvhORdkz5sw72d3jjtyqA= +modernc.org/z v1.0.1/go.mod h1:8/SRk5C/HgiQWCgXdfpb+1RvhORdkz5sw72d3jjtyqA= modernc.org/zappy v1.0.0/go.mod h1:hHe+oGahLVII/aTTyWK/b53VDHMAGCBYYeZ9sn83HC4= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= willnorris.com/go/gifresize v1.0.0/go.mod h1:eBM8gogBGCcaH603vxSpnfjwXIpq6nmnj/jauBDKtAk= -willnorris.com/go/imageproxy v0.10.0/go.mod h1:2tWdKRneln3E9X/zwH1RINpQAQWPeUiNynZ7UQ9OROk= +willnorris.com/go/imageproxy v0.11.2/go.mod h1:pyA05z6P0nLWX6QmeqMUyK6v9HnWE/bqnPnrzUST0KU= diff --git a/plugin.go b/plugin.go new file mode 100644 index 00000000..6d297752 --- /dev/null +++ b/plugin.go @@ -0,0 +1,18 @@ +package root + +import ( + _ "embed" // Need to embed manifest file + "encoding/json" + "strings" + + "github.com/mattermost/mattermost-server/v6/model" +) + +//go:embed plugin.json +var manifestString string + +var Manifest model.Manifest + +func init() { + _ = json.NewDecoder(strings.NewReader(manifestString)).Decode(&Manifest) +} diff --git a/plugin.json b/plugin.json index 3cbb9ae3..9c181ccf 100644 --- a/plugin.json +++ b/plugin.json @@ -7,7 +7,7 @@ "release_notes_url": "https://github.com/mattermost/mattermost-plugin-gitlab/releases/tag/v1.4.0", "icon_path": "assets/icon.svg", "version": "1.4.0", - "min_server_version": "5.38.0", + "min_server_version": "6.5.0", "server": { "executables": { "linux-amd64": "server/dist/plugin-linux-amd64", @@ -22,7 +22,7 @@ "bundle_path": "webapp/dist/main.js" }, "settings_schema": { - "header": "To set up the GitLab plugin, you need to register a GitLab OAuth app here https://gitlab.com/profile/applications.", + "header": "To set up the GitLab plugin, you need to register a GitLab OAuth app here https://gitlab.com/-/profile/applications.", "footer": "To report an issue, make a suggestion, or submit a contribution, [check the repository](https://github.com/mattermost/mattermost-plugin-gitlab).", "settings": [ { diff --git a/public/new-oauth-application.png b/public/new-oauth-application.png new file mode 100644 index 0000000000000000000000000000000000000000..85fa84215d5e527301acc84599fcf623b4374969 GIT binary patch literal 135463 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%0AoL^Q)#cD*R*DuKBpHgN&ab z5|W?|Bn>7yFJTfHEm~s$MEnB-HL5|<$z@J1-Tbnj>e#U=Ky0`EfVKjo+k{)bfD zS|FNXx%@-moR0%i++JbW9`$kKE^JAWHK~2f40dpr>*?s zx|dCOl>!)BpYlY?T28HJ+Vjh88#mIr_CGh?T@wWpkTznIP0tS1GW=Kb{v-JTieW#7 z{qITG{~=e~*O&!1e%aPpeX)IO{&@IffXcrB;~ K5;1An@Ba&Z6v9jZ literal 0 HcmV?d00001 diff --git a/server/api.go b/server/api.go index 26261eb0..19b57146 100644 --- a/server/api.go +++ b/server/api.go @@ -4,23 +4,185 @@ import ( "context" "encoding/json" "fmt" - "io" "net/http" - "os" - "path/filepath" + "runtime/debug" "strconv" "strings" "time" + "github.com/gorilla/mux" + "github.com/pkg/errors" + "golang.org/x/oauth2" + + "github.com/mattermost/mattermost-plugin-api/experimental/bot/logger" + "github.com/mattermost/mattermost-plugin-api/experimental/flow" "github.com/mattermost/mattermost-server/v6/model" "github.com/mattermost/mattermost-server/v6/plugin" - "golang.org/x/oauth2" "github.com/mattermost/mattermost-plugin-gitlab/server/gitlab" ) const ( APIErrorIDNotConnected = "not_connected" + + requestTimeout = 5 * time.Second +) + +func (p *Plugin) ServeHTTP(c *plugin.Context, w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + + p.router.ServeHTTP(w, r) +} + +func (p *Plugin) initializeAPI() { + p.router = mux.NewRouter() + p.router.Use(p.withRecovery) + + oauthRouter := p.router.PathPrefix("/oauth").Subrouter() + apiRouter := p.router.PathPrefix("/api/v1").Subrouter() + apiRouter.Use(p.checkConfigured) + + p.router.HandleFunc("/webhook", p.handleWebhook).Methods(http.MethodPost) + + oauthRouter.HandleFunc("/connect", p.checkAuth(p.attachContext(p.connectUserToGitlab), ResponseTypePlain)).Methods(http.MethodGet) + oauthRouter.HandleFunc("/complete", p.checkAuth(p.attachContext(p.completeConnectUserToGitlab), ResponseTypePlain)).Methods(http.MethodGet) + + apiRouter.HandleFunc("/connected", p.attachContext(p.getConnected)).Methods(http.MethodGet) + + apiRouter.HandleFunc("/user", p.checkAuth(p.attachContext(p.getGitlabUser), ResponseTypeJSON)).Methods(http.MethodPost) + apiRouter.HandleFunc("/todo", p.checkAuth(p.attachUserContext(p.postToDo), ResponseTypeJSON)).Methods(http.MethodPost) + apiRouter.HandleFunc("/reviews", p.checkAuth(p.attachUserContext(p.getReviews), ResponseTypePlain)).Methods(http.MethodGet) + apiRouter.HandleFunc("/yourprs", p.checkAuth(p.attachUserContext(p.getYourPrs), ResponseTypePlain)).Methods(http.MethodGet) + apiRouter.HandleFunc("/yourassignments", p.checkAuth(p.attachUserContext(p.getYourAssignments), ResponseTypePlain)).Methods(http.MethodGet) + apiRouter.HandleFunc("/unreads", p.checkAuth(p.attachUserContext(p.getUnreads), ResponseTypePlain)).Methods(http.MethodGet) + + apiRouter.HandleFunc("/settings", p.checkAuth(p.attachUserContext(p.updateSettings), ResponseTypePlain)).Methods(http.MethodPost) +} + +type Context struct { + Ctx context.Context + UserID string + Log logger.Logger +} + +func (p *Plugin) createContext(_ http.ResponseWriter, r *http.Request) (*Context, context.CancelFunc) { + userID := r.Header.Get("Mattermost-User-ID") + + logger := logger.New(p.API).With(logger.LogContext{ + "userid": userID, + }) + + ctx, cancel := context.WithTimeout(context.Background(), requestTimeout) + + context := &Context{ + Ctx: ctx, + UserID: userID, + Log: logger, + } + + return context, cancel +} + +// HTTPHandlerFuncWithContext is http.HandleFunc but with a Context attached +type HTTPHandlerFuncWithContext func(c *Context, w http.ResponseWriter, r *http.Request) + +func (p *Plugin) attachContext(handler HTTPHandlerFuncWithContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + context, cancel := p.createContext(w, r) + defer cancel() + + handler(context, w, r) + } +} + +type UserContext struct { + Context + GitlabInfo *gitlab.UserInfo +} + +// HTTPHandlerFuncWithUserContext is http.HandleFunc but with a UserContext attached +type HTTPHandlerFuncWithUserContext func(c *UserContext, w http.ResponseWriter, r *http.Request) + +func (p *Plugin) attachUserContext(handler HTTPHandlerFuncWithUserContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + context, cancel := p.createContext(w, r) + defer cancel() + + info, apiErr := p.getGitlabUserInfoByMattermostID(context.UserID) + if apiErr != nil { + p.writeAPIError(w, apiErr) + return + } + + context.Log = context.Log.With(logger.LogContext{ + "gitlab username": info.GitlabUsername, + "gitlab userid": info.GitlabUserID, + }) + + userContext := &UserContext{ + Context: *context, + GitlabInfo: info, + } + + handler(userContext, w, r) + } +} + +func (p *Plugin) withRecovery(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + defer func() { + if x := recover(); x != nil { + p.API.LogError("Recovered from a panic", + "url", r.URL.String(), + "error", x, + "stack", string(debug.Stack())) + } + }() + + next.ServeHTTP(w, r) + }) +} + +func (p *Plugin) checkConfigured(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + config := p.getConfiguration() + + if err := config.IsValid(); err != nil { + http.Error(w, "This plugin is not configured.", http.StatusNotImplemented) + return + } + + next.ServeHTTP(w, r) + }) +} + +func (p *Plugin) checkAuth(handler http.HandlerFunc, responseType ResponseType) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + userID := r.Header.Get("Mattermost-User-ID") + if userID == "" { + switch responseType { + case ResponseTypeJSON: + p.writeAPIError(w, &APIErrorResponse{ID: "", Message: "Not authorized.", StatusCode: http.StatusUnauthorized}) + case ResponseTypePlain: + http.Error(w, "Not authorized", http.StatusUnauthorized) + default: + p.API.LogError("Unknown ResponseType detected") + } + return + } + + handler(w, r) + } +} + +// ResponseType indicates type of response returned by api +type ResponseType string + +const ( + // ResponseTypeJSON indicates that response type is json + ResponseTypeJSON ResponseType = "JSON_RESPONSE" + // ResponseTypePlain indicates that response type is text plain + ResponseTypePlain ResponseType = "TEXT_RESPONSE" ) type APIErrorResponse struct { @@ -29,6 +191,10 @@ type APIErrorResponse struct { StatusCode int `json:"status_code"` } +func (e *APIErrorResponse) Error() string { + return e.Message +} + func (p *Plugin) writeAPIError(w http.ResponseWriter, err *APIErrorResponse) { b, _ := json.Marshal(err) w.WriteHeader(err.StatusCode) @@ -49,47 +215,7 @@ func (p *Plugin) writeAPIResponse(w http.ResponseWriter, resp interface{}) { } } -func (p *Plugin) ServeHTTP(c *plugin.Context, w http.ResponseWriter, r *http.Request) { - config := p.getConfiguration() - - if err := config.IsValid(); err != nil { - http.Error(w, "This plugin is not configured.", http.StatusNotImplemented) - return - } - - w.Header().Set("Content-Type", "application/json") - - switch path := r.URL.Path; path { - case "/webhook": - p.handleWebhook(w, r) - case "/assets/profile.png": - p.handleProfileImage(w, r) - case "/oauth/connect": - p.connectUserToGitlab(w, r) - case "/oauth/complete": - p.completeConnectUserToGitlab(w, r) - case "/api/v1/connected": - p.getConnected(w, r) - case "/api/v1/todo": - p.postToDo(w, r) - case "/api/v1/reviews": - p.getReviews(w, r) - case "/api/v1/yourprs": - p.getYourPrs(w, r) - case "/api/v1/yourassignments": - p.getYourAssignments(w, r) - case "/api/v1/unreads": - p.getUnreads(w, r) - case "/api/v1/settings": - p.updateSettings(w, r) - case "/api/v1/user": - p.getGitlabUser(w, r) - default: - http.NotFound(w, r) - } -} - -func (p *Plugin) connectUserToGitlab(w http.ResponseWriter, r *http.Request) { +func (p *Plugin) connectUserToGitlab(c *Context, w http.ResponseWriter, r *http.Request) { userID := r.Header.Get("Mattermost-User-ID") if userID == "" { http.Error(w, "Not authorized", http.StatusUnauthorized) @@ -101,106 +227,172 @@ func (p *Plugin) connectUserToGitlab(w http.ResponseWriter, r *http.Request) { state := fmt.Sprintf("%v_%v", model.NewId()[0:15], userID) if err := p.API.KVSet(state, []byte(state)); err != nil { - p.API.LogError("can't store state oauth2", "err", err.DetailedError) + c.Log.WithError(err).Warnf("Can't store state oauth2") http.Error(w, "can't store state oauth2", http.StatusInternalServerError) return } url := conf.AuthCodeURL(state, oauth2.AccessTypeOffline) + ch := p.oauthBroker.SubscribeOAuthComplete(userID) + + go func() { + ctx, cancel := context.WithTimeout(context.Background(), 45*time.Second) + defer cancel() + + var errorMsg string + select { + case err := <-ch: + if err != nil { + errorMsg = err.Error() + } + case <-ctx.Done(): + errorMsg = "Timed out waiting for OAuth connection. Please check if the SiteURL is correct." + } + + if errorMsg != "" { + _, err := p.poster.DMWithAttachments(userID, &model.SlackAttachment{ + Text: fmt.Sprintf("There was an error connecting to your GitLab: `%s` Please double check your configuration.", errorMsg), + Color: string(flow.ColorDanger), + }) + if err != nil { + c.Log.WithError(err).Warnf("Failed to DM with cancel information") + } + } + + p.oauthBroker.UnsubscribeOAuthComplete(userID, ch) + }() + http.Redirect(w, r, url, http.StatusFound) } -func (p *Plugin) completeConnectUserToGitlab(w http.ResponseWriter, r *http.Request) { +func (p *Plugin) completeConnectUserToGitlab(c *Context, w http.ResponseWriter, r *http.Request) { authedUserID := r.Header.Get("Mattermost-User-ID") if authedUserID == "" { http.Error(w, "Not authorized", http.StatusUnauthorized) return } + var rErr error + defer func() { + p.oauthBroker.publishOAuthComplete(authedUserID, rErr, false) + }() + config := p.getConfiguration() - ctx := context.Background() conf := p.getOAuthConfig() code := r.URL.Query().Get("code") if len(code) == 0 { - http.Error(w, "missing authorization code", http.StatusBadRequest) + rErr = errors.New("missing authorization code") + http.Error(w, rErr.Error(), http.StatusBadRequest) return } state := r.URL.Query().Get("state") - if storedState, err := p.API.KVGet(state); err != nil { - p.API.LogError("can't get state from store", "err", err.Error()) - http.Error(w, "missing stored state", http.StatusBadRequest) - return - } else if string(storedState) != state { - http.Error(w, "invalid state", http.StatusBadRequest) + storedState, appErr := p.API.KVGet(state) + if appErr != nil { + c.Log.WithError(appErr).Warnf("Can't get state from store") + + rErr = errors.Wrap(appErr, "missing stored state") + http.Error(w, rErr.Error(), http.StatusBadRequest) return } - userID := strings.Split(state, "_")[1] + appErr = p.API.KVDelete(state) + if appErr != nil { + c.Log.WithError(appErr).Warnf("Failed to delete state token") - if err := p.API.KVDelete(state); err != nil { - p.API.LogError("can't delete state in store", "err", err.DetailedError) + rErr = errors.Wrap(appErr, "error deleting stored state") + http.Error(w, rErr.Error(), http.StatusBadRequest) } + if string(storedState) != state { + rErr = errors.New("invalid state token") + http.Error(w, rErr.Error(), http.StatusBadRequest) + return + } + + userID := strings.Split(state, "_")[1] + if userID != authedUserID { - http.Error(w, "Not authorized, incorrect user", http.StatusUnauthorized) + rErr = errors.New("not authorized, incorrect user") + http.Error(w, rErr.Error(), http.StatusUnauthorized) return } - tok, err := conf.Exchange(ctx, code) + tok, err := conf.Exchange(c.Ctx, code) if err != nil { - p.API.LogError("can't exchange state", "err", err.Error()) - http.Error(w, err.Error(), http.StatusInternalServerError) + c.Log.WithError(err).Warnf("Can't exchange state") + + rErr = errors.Wrap(err, "Failed to exchange oauth code into token") + http.Error(w, rErr.Error(), http.StatusInternalServerError) return } - userInfo, err := p.GitlabClient.GetCurrentUser(userID, *tok) + userInfo, err := p.GitlabClient.GetCurrentUser(c.Ctx, userID, *tok) if err != nil { - p.API.LogError("can't retrieve user info from gitLab API", "err", err.Error()) - http.Error(w, "Unable to connect user to GitLab", http.StatusInternalServerError) + c.Log.WithError(err).Warnf("Can't retrieve user info from gitLab API") + + rErr = errors.Wrap(err, "unable to connect user to GitLab") + http.Error(w, rErr.Error(), http.StatusInternalServerError) return } - if err := p.storeGitlabUserInfo(userInfo); err != nil { - p.API.LogError("can't store user info", "err", err.Error()) - http.Error(w, "Unable to connect user to GitLab", http.StatusInternalServerError) + if err = p.storeGitlabUserInfo(userInfo); err != nil { + c.Log.WithError(err).Warnf("Can't store user info") + + rErr = errors.Wrap(err, "Unable to connect user to GitLab") + http.Error(w, rErr.Error(), http.StatusInternalServerError) return } - if err := p.storeGitlabToUserIDMapping(userInfo.GitlabUsername, userID); err != nil { - p.API.LogError("can't store GitLab to user id mapping", "err", err.Error()) + if err = p.storeGitlabToUserIDMapping(userInfo.GitlabUsername, userID); err != nil { + c.Log.WithError(err).Warnf("Can't store GitLab to user id mapping") } - if err := p.storeGitlabIDToUserIDMapping(userInfo.GitlabUsername, userInfo.GitlabUserID); err != nil { - p.API.LogError("can't store GitLab to GitLab id mapping", "err", err.Error()) + if err = p.storeGitlabIDToUserIDMapping(userInfo.GitlabUsername, userInfo.GitlabUserID); err != nil { + c.Log.WithError(err).Warnf("Can't store GitLab to GitLab id mapping") } - // Post intro post - message := fmt.Sprintf("#### Welcome to the Mattermost GitLab Plugin!\n"+ - "You've connected your Mattermost account to %s on GitLab. Read about the features of this plugin below:\n\n"+ - "##### Daily Reminders\n"+ - "The first time you log in each day, you will get a post right here letting you know what messages you need to read and what merge requests are awaiting your review.\n"+ - "Turn off reminders with `/gitlab settings reminders off`.\n\n"+ - "##### Notifications\n"+ - "When someone mentions you, requests your review, comments on or modifies one of your merge requests/issues, or assigns you, you'll get a post here about it.\n"+ - "Turn off notifications with `/gitlab settings notifications off`.\n\n"+ - "##### Sidebar Buttons\n"+ - "Check out the buttons in the left-hand sidebar of Mattermost.\n"+ - "* The first button tells you how many merge requests you have submitted.\n"+ - "* The second shows the number of merge requests that are awaiting your review.\n"+ - "* The third shows the number of merge requests and issues you are assigned to.\n"+ - "* The fourth tracks the number of unread messages you have.\n"+ - "* The fifth will refresh the numbers.\n\n"+ - "Click on them!\n\n"+ - "##### Slash Commands\n"+ - strings.ReplaceAll(commandHelp, "|", "`"), userInfo.GitlabUsername) + flow := p.flowManager.setupFlow.ForUser(authedUserID) + + stepName, err := flow.GetCurrentStep() + if err != nil { + c.Log.WithError(err).Warnf("Failed to get current step") + } - if err := p.CreateBotDMPost(userID, message, "custom_git_welcome"); err != nil { - p.API.LogError("can't send help message with bot dm", "err", err.Error()) + if stepName == stepOAuthConnect { + err = flow.Go(stepWebhookQuestion) + if err != nil { + c.Log.WithError(err).Warnf("Failed go to next step") + } + } else { + // Only post introduction message if no setup wizard is running + // Post intro post + message := fmt.Sprintf("#### Welcome to the Mattermost GitLab Plugin!\n"+ + "You've connected your Mattermost account to %s on GitLab. Read about the features of this plugin below:\n\n"+ + "##### Daily Reminders\n"+ + "The first time you log in each day, you will get a post right here letting you know what messages you need to read and what merge requests are awaiting your review.\n"+ + "Turn off reminders with `/gitlab settings reminders off`.\n\n"+ + "##### Notifications\n"+ + "When someone mentions you, requests your review, comments on or modifies one of your merge requests/issues, or assigns you, you'll get a post here about it.\n"+ + "Turn off notifications with `/gitlab settings notifications off`.\n\n"+ + "##### Sidebar Buttons\n"+ + "Check out the buttons in the left-hand sidebar of Mattermost.\n"+ + "* The first button tells you how many merge requests you have submitted.\n"+ + "* The second shows the number of merge requests that are awaiting your review.\n"+ + "* The third shows the number of merge requests and issues you are assigned to.\n"+ + "* The fourth tracks the number of unread messages you have.\n"+ + "* The fifth will refresh the numbers.\n\n"+ + "Click on them!\n\n"+ + "##### Slash Commands\n"+ + strings.ReplaceAll(commandHelp, "|", "`"), userInfo.GitlabUsername) + + if err := p.CreateBotDMPost(userID, message, "custom_git_welcome"); err != nil { + c.Log.WithError(err).Warnf("Can't send help message with bot dm") + } } p.API.PublishWebSocketEvent( @@ -235,28 +427,6 @@ func (p *Plugin) completeConnectUserToGitlab(w http.ResponseWriter, r *http.Requ } } -func (p *Plugin) handleProfileImage(w http.ResponseWriter, r *http.Request) { - config := p.getConfiguration() - - img, err := os.Open(filepath.Join(config.PluginsDirectory, manifest.ID, "assets", "profile.png")) - if err != nil { - http.NotFound(w, r) - p.API.LogError("Unable to read GitLab profile image", "err", err.Error()) - return - } - defer func() { - if err = img.Close(); err != nil { - p.API.LogError("can't close img", "err", err.Error()) - } - }() - - w.Header().Set("Content-Type", "image/png") - _, err = io.Copy(w, img) - if err != nil { - p.API.LogError("can't copy image profile to http response writer", "err", err.Error()) - } -} - type ConnectedResponse struct { Connected bool `json:"connected"` GitlabUsername string `json:"gitlab_username"` @@ -274,18 +444,12 @@ type GitlabUserResponse struct { Username string `json:"username"` } -func (p *Plugin) getGitlabUser(w http.ResponseWriter, r *http.Request) { - requestorID := r.Header.Get("Mattermost-User-ID") - if requestorID == "" { - p.writeAPIError(w, &APIErrorResponse{ID: "", Message: "Not authorized.", StatusCode: http.StatusUnauthorized}) - return - } - +func (p *Plugin) getGitlabUser(c *Context, w http.ResponseWriter, r *http.Request) { req := &GitlabUserRequest{} dec := json.NewDecoder(r.Body) if err := dec.Decode(&req); err != nil || req.UserID == "" { if err != nil { - p.API.LogError("Error decoding JSON body", "err", err.Error()) + c.Log.WithError(err).Warnf("Error decoding JSON body") } p.writeAPIError(w, &APIErrorResponse{ID: "", Message: "Please provide a JSON object with a non-blank user_id field.", StatusCode: http.StatusBadRequest}) return @@ -309,22 +473,16 @@ func (p *Plugin) getGitlabUser(w http.ResponseWriter, r *http.Request) { p.writeAPIResponse(w, &GitlabUserResponse{Username: userInfo.GitlabUsername}) } -func (p *Plugin) getConnected(w http.ResponseWriter, r *http.Request) { +func (p *Plugin) getConnected(c *Context, w http.ResponseWriter, r *http.Request) { config := p.getConfiguration() - userID := r.Header.Get("Mattermost-User-ID") - if userID == "" { - p.writeAPIError(w, &APIErrorResponse{ID: "", Message: "Not authorized.", StatusCode: http.StatusUnauthorized}) - return - } - resp := &ConnectedResponse{ Connected: false, GitlabURL: config.GitlabURL, Organization: config.GitlabGroup, } - info, _ := p.getGitlabUserInfoByMattermostID(userID) + info, _ := p.getGitlabUserInfoByMattermostID(c.UserID) if info != nil && info.Token != nil { resp.Connected = true resp.GitlabUsername = info.GitlabUsername @@ -343,10 +501,10 @@ func (p *Plugin) getConnected(w http.ResponseWriter, r *http.Request) { nt := time.Unix(now/1000, 0).In(timezone) lt := time.Unix(lastPostAt/1000, 0).In(timezone) if nt.Sub(lt).Hours() >= 1 && (nt.Day() != lt.Day() || nt.Month() != lt.Month() || nt.Year() != lt.Year()) { - p.PostToDo(info) + p.PostToDo(c.Ctx, info) info.LastToDoPostAt = now if err := p.storeGitlabUserInfo(info); err != nil { - p.API.LogError("can't store user info", "err", err.Error()) + c.Log.WithError(err).Warnf("Can't store user info") } } } @@ -355,22 +513,10 @@ func (p *Plugin) getConnected(w http.ResponseWriter, r *http.Request) { p.writeAPIResponse(w, resp) } -func (p *Plugin) getUnreads(w http.ResponseWriter, r *http.Request) { - userID := r.Header.Get("Mattermost-User-ID") - if userID == "" { - http.Error(w, "Not authorized", http.StatusUnauthorized) - return - } - - user, err := p.getGitlabUserInfoByMattermostID(userID) +func (p *Plugin) getUnreads(c *UserContext, w http.ResponseWriter, r *http.Request) { + result, err := p.GitlabClient.GetUnreads(c.Ctx, c.GitlabInfo) if err != nil { - p.writeAPIError(w, err) - return - } - - result, errRequest := p.GitlabClient.GetUnreads(user) - if errRequest != nil { - p.API.LogError("unable to list unreads in GitLab API", "err", errRequest.Error()) + c.Log.WithError(err).Warnf("Unable to list unreads in GitLab API") p.writeAPIError(w, &APIErrorResponse{ID: "", Message: "Unable to list unreads in GitLab API.", StatusCode: http.StatusInternalServerError}) return } @@ -378,24 +524,10 @@ func (p *Plugin) getUnreads(w http.ResponseWriter, r *http.Request) { p.writeAPIResponse(w, result) } -func (p *Plugin) getReviews(w http.ResponseWriter, r *http.Request) { - userID := r.Header.Get("Mattermost-User-ID") - if userID == "" { - http.Error(w, "Not authorized", http.StatusUnauthorized) - return - } - - user, err := p.getGitlabUserInfoByMattermostID(userID) - +func (p *Plugin) getReviews(c *UserContext, w http.ResponseWriter, r *http.Request) { + result, err := p.GitlabClient.GetReviews(c.Ctx, c.GitlabInfo) if err != nil { - p.writeAPIError(w, err) - return - } - - result, errRequest := p.GitlabClient.GetReviews(user) - - if errRequest != nil { - p.API.LogError("unable to list merge-request where assignee in GitLab API", "err", errRequest.Error()) + c.Log.WithError(err).Warnf("Unable to list merge-request where assignee in GitLab API") p.writeAPIError(w, &APIErrorResponse{ID: "", Message: "Unable to list merge-request in GitLab API.", StatusCode: http.StatusInternalServerError}) return } @@ -403,24 +535,10 @@ func (p *Plugin) getReviews(w http.ResponseWriter, r *http.Request) { p.writeAPIResponse(w, result) } -func (p *Plugin) getYourPrs(w http.ResponseWriter, r *http.Request) { - userID := r.Header.Get("Mattermost-User-ID") - if userID == "" { - http.Error(w, "Not authorized", http.StatusUnauthorized) - return - } - - user, err := p.getGitlabUserInfoByMattermostID(userID) - +func (p *Plugin) getYourPrs(c *UserContext, w http.ResponseWriter, r *http.Request) { + result, err := p.GitlabClient.GetYourPrs(c.Ctx, c.GitlabInfo) if err != nil { - p.writeAPIError(w, err) - return - } - - result, errRequest := p.GitlabClient.GetYourPrs(user) - - if errRequest != nil { - p.API.LogError("can't list merge-request where author in GitLab API", "err", errRequest.Error()) + c.Log.WithError(err).Warnf("Can't list merge-request where author in GitLab API") p.writeAPIError(w, &APIErrorResponse{ID: "", Message: "Unable to list merge-request in GitLab API.", StatusCode: http.StatusInternalServerError}) return } @@ -428,24 +546,10 @@ func (p *Plugin) getYourPrs(w http.ResponseWriter, r *http.Request) { p.writeAPIResponse(w, result) } -func (p *Plugin) getYourAssignments(w http.ResponseWriter, r *http.Request) { - userID := r.Header.Get("Mattermost-User-ID") - if userID == "" { - http.Error(w, "Not authorized", http.StatusUnauthorized) - return - } - - user, err := p.getGitlabUserInfoByMattermostID(userID) - +func (p *Plugin) getYourAssignments(c *UserContext, w http.ResponseWriter, r *http.Request) { + result, err := p.GitlabClient.GetYourAssignments(c.Ctx, c.GitlabInfo) if err != nil { - p.writeAPIError(w, err) - return - } - - result, errRequest := p.GitlabClient.GetYourAssignments(user) - - if errRequest != nil { - p.API.LogError("unable to list issue where assignee in GitLab API", "err", errRequest.Error()) + c.Log.WithError(err).Warnf("Unable to list issue where assignee in GitLab API") p.writeAPIError(w, &APIErrorResponse{ID: "", Message: "Unable to list issue in GitLab API.", StatusCode: http.StatusInternalServerError}) return } @@ -453,41 +557,22 @@ func (p *Plugin) getYourAssignments(w http.ResponseWriter, r *http.Request) { p.writeAPIResponse(w, result) } -func (p *Plugin) postToDo(w http.ResponseWriter, r *http.Request) { - userID := r.Header.Get("Mattermost-User-ID") - if userID == "" { - p.writeAPIError(w, &APIErrorResponse{ID: "", Message: "Not authorized.", StatusCode: http.StatusUnauthorized}) - return - } - - user, err := p.getGitlabUserInfoByMattermostID(userID) - +func (p *Plugin) postToDo(c *UserContext, w http.ResponseWriter, r *http.Request) { + _, text, err := p.GetToDo(c.Ctx, c.GitlabInfo) if err != nil { - p.writeAPIError(w, err) - return - } - - _, text, errRequest := p.GetToDo(user) - if errRequest != nil { - p.API.LogError("can't get todo", "err", errRequest.Error()) + c.Log.WithError(err).Warnf("Can't get todo") p.writeAPIError(w, &APIErrorResponse{ID: "", Message: "Encountered an error getting the to do items.", StatusCode: http.StatusUnauthorized}) return } - if err := p.CreateBotDMPost(userID, text, "custom_git_todo"); err != nil { + if appErr := p.CreateBotDMPost(c.UserID, text, "custom_git_todo"); appErr != nil { p.writeAPIError(w, &APIErrorResponse{ID: "", Message: "Encountered an error posting the to do items.", StatusCode: http.StatusUnauthorized}) } p.writeAPIResponse(w, struct{ status string }{status: "OK"}) } -func (p *Plugin) updateSettings(w http.ResponseWriter, r *http.Request) { - userID := r.Header.Get("Mattermost-User-ID") - if userID == "" { - http.Error(w, "Not authorized", http.StatusUnauthorized) - return - } - +func (p *Plugin) updateSettings(c *UserContext, w http.ResponseWriter, r *http.Request) { var settings *gitlab.UserSettings err := json.NewDecoder(r.Body).Decode(&settings) if settings == nil || err != nil { @@ -495,16 +580,16 @@ func (p *Plugin) updateSettings(w http.ResponseWriter, r *http.Request) { return } - info, errGitlab := p.getGitlabUserInfoByMattermostID(userID) - if errGitlab != nil { - p.writeAPIError(w, errGitlab) + info, apiErr := p.getGitlabUserInfoByMattermostID(c.UserID) + if apiErr != nil { + p.writeAPIError(w, apiErr) return } info.Settings = settings if err := p.storeGitlabUserInfo(info); err != nil { - p.API.LogError("can't store GitLab user info when update settings", "err", err.Error()) + c.Log.WithError(err).Errorf("can't store GitLab user info when update settings") http.Error(w, "Encountered error updating settings", http.StatusInternalServerError) } diff --git a/server/cluster.go b/server/cluster.go new file mode 100644 index 00000000..a6f8ae5e --- /dev/null +++ b/server/cluster.go @@ -0,0 +1,55 @@ +package main + +import ( + "encoding/json" + + "github.com/mattermost/mattermost-server/v6/model" +) + +const ( + oauthCompleteEventID = "oauth-complete" +) + +func (p *Plugin) sendOAuthCompleteEvent(event OAuthCompleteEvent) { + p.sendMessageToCluster(oauthCompleteEventID, event) +} + +func (p *Plugin) sendMessageToCluster(id string, v interface{}) { + b, err := json.Marshal(v) + if err != nil { + p.API.LogWarn("couldn't get JSON bytes from cluster message", + "id", id, + "error", err, + ) + return + } + + event := model.PluginClusterEvent{Id: id, Data: b} + opts := model.PluginClusterEventSendOptions{ + SendType: model.PluginClusterEventSendTypeReliable, + } + + if err := p.API.PublishPluginClusterEvent(event, opts); err != nil { + p.API.LogWarn("error publishing cluster event", + "id", id, + "error", err, + ) + } +} + +func (p *Plugin) HandleClusterEvent(ev model.PluginClusterEvent) { + p.API.LogError("received cluster event", "id", ev.Id) + + switch ev.Id { + case oauthCompleteEventID: + var event OAuthCompleteEvent + if err := json.Unmarshal(ev.Data, &event); err != nil { + p.API.LogWarn("cannot unmarshal cluster event with OAuth complete event", "error", err) + return + } + + p.oauthBroker.publishOAuthComplete(event.UserID, event.Err, true) + default: + p.API.LogWarn("unknown cluster event", "id", ev.Id) + } +} diff --git a/server/command.go b/server/command.go index d01c35e6..f0f7eff6 100644 --- a/server/command.go +++ b/server/command.go @@ -1,8 +1,10 @@ package main import ( + "context" "fmt" "strings" + "time" "github.com/mattermost/mattermost-plugin-api/experimental/command" "github.com/mattermost/mattermost-server/v6/model" @@ -77,7 +79,11 @@ const ( commandList = "list" ) -func (p *Plugin) getCommand() (*model.Command, error) { +const ( + commandTimeout = 6 * time.Second +) + +func (p *Plugin) getCommand(config *configuration) (*model.Command, error) { iconData, err := command.GetIconData(p.API, "assets/icon.svg") if err != nil { return nil, errors.Wrap(err, "failed to get icon data") @@ -88,7 +94,7 @@ func (p *Plugin) getCommand() (*model.Command, error) { AutoComplete: true, AutoCompleteDesc: "Available commands: connect, disconnect, todo, me, settings, subscriptions, webhook, and help", AutoCompleteHint: "[command]", - AutocompleteData: getAutocompleteData(), + AutocompleteData: getAutocompleteData(config), AutocompleteIconData: iconData, }, nil } @@ -109,7 +115,7 @@ func (p *Plugin) getCommandResponse(args *model.CommandArgs, text string) *model } // ExecuteCommand is the entrypoint for /gitlab commands. It returns a message to display to the user or an error. -func (p *Plugin) ExecuteCommand(_ *plugin.Context, args *model.CommandArgs) (*model.CommandResponse, *model.AppError) { +func (p *Plugin) ExecuteCommand(c *plugin.Context, args *model.CommandArgs) (*model.CommandResponse, *model.AppError) { var ( split = strings.Fields(args.Command) command = split[0] @@ -126,13 +132,43 @@ func (p *Plugin) ExecuteCommand(_ *plugin.Context, args *model.CommandArgs) (*mo return &model.CommandResponse{}, nil } + ctx, cancel := context.WithTimeout(context.Background(), commandTimeout) + defer cancel() + + if action == "setup" { + message := p.handleSetup(c, args, parameters) + if message != "" { + p.postCommandResponse(args, message) + } + return &model.CommandResponse{}, nil + } + + config := p.getConfiguration() + + if err := config.IsValid(); err != nil { + isSysAdmin, err := p.isAuthorizedSysAdmin(args.UserId) + var text string + switch { + case err != nil: + text = "Error checking user's permissions" + p.API.LogWarn(text, "error", err.Error()) + case isSysAdmin: + text = "Before using this plugin, you'll need to configure it by running `/gitlab setup`" + default: + text = "Please contact your system administrator to configure the GitLab plugin." + } + + p.postCommandResponse(args, text) + return &model.CommandResponse{}, nil + } + if action == "connect" { config := p.API.GetConfig() if config.ServiceSettings.SiteURL == nil { return p.getCommandResponse(args, "Encountered an error connecting to GitLab."), nil } - resp := p.getCommandResponse(args, fmt.Sprintf("[Click here to link your GitLab account.](%s/plugins/%s/oauth/connect)", *config.ServiceSettings.SiteURL, manifest.ID)) + resp := p.getCommandResponse(args, fmt.Sprintf("[Click here to link your GitLab account.](%s/plugins/%s/oauth/connect)", *config.ServiceSettings.SiteURL, manifest.Id)) return resp, nil } @@ -150,11 +186,9 @@ func (p *Plugin) ExecuteCommand(_ *plugin.Context, args *model.CommandArgs) (*mo return p.getCommandResponse(args, text), nil } - config := p.getConfiguration() - switch action { case "subscriptions", "subscription", "subscribe": - message := p.subscribeCommand(parameters, args.ChannelId, config, info) + message := p.subscribeCommand(ctx, parameters, args.ChannelId, config, info) response := p.getCommandResponse(args, message) return response, nil case "unsubscribe": @@ -176,19 +210,19 @@ func (p *Plugin) ExecuteCommand(_ *plugin.Context, args *model.CommandArgs) (*mo p.disconnectGitlabAccount(args.UserId) return p.getCommandResponse(args, "Disconnected your GitLab account."), nil case "todo": - _, text, err := p.GetToDo(info) + _, text, err := p.GetToDo(ctx, info) if err != nil { p.API.LogError("can't get todo in command", "err", err.Error()) return p.getCommandResponse(args, "Encountered an error getting your to do items."), nil } return p.getCommandResponse(args, text), nil case "me": - gitUser, err := p.GitlabClient.GetUserDetails(info) + gitUser, err := p.GitlabClient.GetUserDetails(ctx, info) if err != nil { return p.getCommandResponse(args, "Encountered an error getting your GitLab profile."), nil } - text := fmt.Sprintf("You are connected to GitLab as:\n# [![image](%s =40x40)](%s) [%s](%s)", gitUser.AvatarURL, gitUser.WebsiteURL, gitUser.Username, gitUser.WebsiteURL) + text := fmt.Sprintf("You are connected to GitLab as:\n# [![image](%s =40x40)](%s) [%s](%s)", gitUser.AvatarURL, gitUser.WebURL, gitUser.Username, gitUser.WebsiteURL) return p.getCommandResponse(args, text), nil case "settings": if len(parameters) < 2 { @@ -234,7 +268,7 @@ func (p *Plugin) ExecuteCommand(_ *plugin.Context, args *model.CommandArgs) (*mo return p.getCommandResponse(args, "Settings updated."), nil case "webhook": - message := p.webhookCommand(parameters, info, config.EnablePrivateRepo) + message := p.webhookCommand(ctx, parameters, info, config.EnablePrivateRepo) response := p.getCommandResponse(args, message) return response, nil @@ -243,8 +277,45 @@ func (p *Plugin) ExecuteCommand(_ *plugin.Context, args *model.CommandArgs) (*mo } } +func (p *Plugin) handleSetup(c *plugin.Context, args *model.CommandArgs, parameters []string) string { + userID := args.UserId + isSysAdmin, err := p.isAuthorizedSysAdmin(userID) + if err != nil { + p.API.LogWarn("Failed to check if user is System Admin", "error", err.Error()) + + return "Error checking user's permissions" + } + + if !isSysAdmin { + return "Only System Admins are allowed to set up the plugin." + } + + if len(parameters) == 0 { + err = p.flowManager.StartSetupWizard(userID, "") + } else { + command := parameters[0] + + switch { + case command == "oauth": + err = p.flowManager.StartOauthWizard(userID) + case command == "webhook": + err = p.flowManager.StartWebhookWizard(userID) + case command == "announcement": + err = p.flowManager.StartAnnouncementWizard(userID) + default: + return fmt.Sprintf("Unknown subcommand %v", command) + } + } + + if err != nil { + return err.Error() + } + + return "" +} + // webhookCommand processes the /gitlab webhook commands -func (p *Plugin) webhookCommand(parameters []string, info *gitlab.UserInfo, enablePrivateRepo bool) string { +func (p *Plugin) webhookCommand(ctx context.Context, parameters []string, info *gitlab.UserInfo, enablePrivateRepo bool) string { if len(parameters) < 1 { return unknownActionMessage } @@ -257,14 +328,14 @@ func (p *Plugin) webhookCommand(parameters []string, info *gitlab.UserInfo, enab } namespace := parameters[1] - group, project, err := p.GitlabClient.ResolveNamespaceAndProject(info, namespace, enablePrivateRepo) + group, project, err := p.GitlabClient.ResolveNamespaceAndProject(ctx, info, namespace, enablePrivateRepo) if err != nil { return err.Error() } var webhookInfo []*gitlab.WebhookInfo if project != "" { - webhookInfo, err = p.GitlabClient.GetProjectHooks(info, group, project) + webhookInfo, err = p.GitlabClient.GetProjectHooks(ctx, info, group, project) if err != nil { if strings.Contains(err.Error(), projectNotFoundError) { return projectNotFoundMessage + namespace @@ -272,7 +343,7 @@ func (p *Plugin) webhookCommand(parameters []string, info *gitlab.UserInfo, enab return err.Error() } } else { - webhookInfo, err = p.GitlabClient.GetGroupHooks(info, group) + webhookInfo, err = p.GitlabClient.GetGroupHooks(ctx, info, group) if err != nil { if strings.Contains(err.Error(), groupNotFoundError) { return groupNotFoundMessage + group @@ -319,24 +390,12 @@ func (p *Plugin) webhookCommand(parameters []string, info *gitlab.UserInfo, enab } namespace := parameters[1] - group, projectName, namespaceErr := p.GitlabClient.ResolveNamespaceAndProject(info, namespace, enablePrivateRepo) + group, project, namespaceErr := p.GitlabClient.ResolveNamespaceAndProject(ctx, info, namespace, enablePrivateRepo) if namespaceErr != nil { return namespaceErr.Error() } - // If project scope - if projectName != "" { - project, err := p.GitlabClient.GetProject(info, group, projectName) - if err != nil { - return err.Error() - } - newWebhook, err := p.GitlabClient.NewProjectHook(info, project.ID, hookOptions) - if err != nil { - return err.Error() - } - return fmt.Sprintf("Webhook Created:\n%s", newWebhook.String()) - } - // If webhook is group scoped - newWebhook, err := p.GitlabClient.NewGroupHook(info, group, hookOptions) + + newWebhook, err := CreateHook(ctx, p.GitlabClient, info, group, project, hookOptions) if err != nil { return err.Error() } @@ -446,10 +505,10 @@ func (p *Plugin) subscriptionsListCommand(channelID string) string { } // subscriptionsAddCommand subscripes to A GitLab Project -func (p *Plugin) subscriptionsAddCommand(info *gitlab.UserInfo, config *configuration, fullPath, channelID, features string) string { +func (p *Plugin) subscriptionsAddCommand(ctx context.Context, info *gitlab.UserInfo, config *configuration, fullPath, channelID, features string) string { var err error - namespace, project, err := p.GitlabClient. - ResolveNamespaceAndProject(info, fullPath, config.EnablePrivateRepo) + namespace, project, err := p.GitlabClient.ResolveNamespaceAndProject( + ctx, info, fullPath, config.EnablePrivateRepo) if err != nil { if errors.Is(err, gitlab.ErrNotFound) { @@ -475,7 +534,7 @@ func (p *Plugin) subscriptionsAddCommand(info *gitlab.UserInfo, config *configur } var hasHook bool if project != "" { - hasHook, err = p.HasProjectHook(info, namespace, project) + hasHook, err = p.HasProjectHook(ctx, info, namespace, project) if err != nil { return fmt.Sprintf( "Unable to determine status of Webhook. See [setup instructions](%s) to validate.", @@ -483,7 +542,7 @@ func (p *Plugin) subscriptionsAddCommand(info *gitlab.UserInfo, config *configur ) } } else { - hasHook, err = p.HasGroupHook(info, namespace) + hasHook, err = p.HasGroupHook(ctx, info, namespace) if err != nil { return fmt.Sprintf( "Unable to determine status of Webhook. See [setup instructions](%s) to validate.", @@ -504,7 +563,7 @@ func (p *Plugin) subscriptionsAddCommand(info *gitlab.UserInfo, config *configur // subscribeCommand process the /gitlab subscribe command. // It returns a message and handles all errors my including helpful information in the message -func (p *Plugin) subscribeCommand(parameters []string, channelID string, config *configuration, info *gitlab.UserInfo) string { +func (p *Plugin) subscribeCommand(ctx context.Context, parameters []string, channelID string, config *configuration, info *gitlab.UserInfo) string { if len(parameters) == 0 { return invalidSubscribeSubCommand } @@ -522,7 +581,7 @@ func (p *Plugin) subscribeCommand(parameters []string, channelID string, config // Resolve namespace and project name fullPath := normalizePath(parameters[1], config.GitlabURL) - return p.subscriptionsAddCommand(info, config, fullPath, channelID, features) + return p.subscriptionsAddCommand(ctx, info, config, fullPath, channelID, features) case commandDelete: if len(parameters) < 2 { return specifyRepositoryMessage @@ -538,17 +597,37 @@ func (p *Plugin) subscribeCommand(parameters []string, channelID string, config } } -func getAutocompleteData() *model.AutocompleteData { - gitlabCommand := model.NewAutocompleteData("gitlab", "[command]", "Available commands: connect, disconnect, todo, subscribe, unsubscribe, me, settings, webhook") +func (p *Plugin) isAuthorizedSysAdmin(userID string) (bool, error) { + user, appErr := p.API.GetUser(userID) + if appErr != nil { + return false, appErr + } + if !strings.Contains(user.Roles, "system_admin") { + return false, nil + } + return true, nil +} + +func getAutocompleteData(config *configuration) *model.AutocompleteData { + if !config.IsOAuthConfigured() { + gitlab := model.NewAutocompleteData("gitlab", "[command]", "Available commands: setup") + + setup := model.NewAutocompleteData("setup", "", "Set up the GitLab plugin") + gitlab.AddCommand(setup) + + return gitlab + } + + gitlab := model.NewAutocompleteData("gitlab", "[command]", "Available commands: connect, disconnect, todo, subscribe, unsubscribe, me, settings, webhook, setup") connect := model.NewAutocompleteData("connect", "", "Connect your GitLab account") - gitlabCommand.AddCommand(connect) + gitlab.AddCommand(connect) disconnect := model.NewAutocompleteData("disconnect", "", "disconnect your GitLab account") - gitlabCommand.AddCommand(disconnect) + gitlab.AddCommand(disconnect) todo := model.NewAutocompleteData("todo", "", "Get a list of unread messages and merge requests awaiting your review") - gitlabCommand.AddCommand(todo) + gitlab.AddCommand(todo) subscriptions := model.NewAutocompleteData("subscriptions", "[command]", "Available commands: Add, List, Delete") @@ -564,10 +643,10 @@ func getAutocompleteData() *model.AutocompleteData { subscriptionsDelete.AddTextArgument("Project path: includes user or group name with optional slash project name", "owner[/repo]", "") subscriptions.AddCommand(subscriptionsDelete) - gitlabCommand.AddCommand(subscriptions) + gitlab.AddCommand(subscriptions) me := model.NewAutocompleteData("me", "", "Displays the connected GitLab account") - gitlabCommand.AddCommand(me) + gitlab.AddCommand(me) settings := model.NewAutocompleteData("settings", "[setting]", "Update your user settings") settingOptions := []model.AutocompleteListItem{{ @@ -587,7 +666,7 @@ func getAutocompleteData() *model.AutocompleteData { Item: "off", }} settings.AddStaticListArgument("New value", true, value) - gitlabCommand.AddCommand(settings) + gitlab.AddCommand(settings) webhook := model.NewAutocompleteData("webhook", "[command]", "Available Commands: list, add") webhookList := model.NewAutocompleteData(commandList, "owner/[repo]", "List existing project or group webhooks") @@ -601,10 +680,17 @@ func getAutocompleteData() *model.AutocompleteData { webhookAdd.AddTextArgument("[Optional] token: Secret for webhook. Defaults to token used in plugin's settings.", "[token]", "") webhook.AddCommand(webhookAdd) - gitlabCommand.AddCommand(webhook) + gitlab.AddCommand(webhook) help := model.NewAutocompleteData("help", "", "Display GiLab Plug Help.") - gitlabCommand.AddCommand(help) + gitlab.AddCommand(help) + + setup := model.NewAutocompleteData("setup", "[command]", "Available commands: oauth, webhook, announcement") + setup.RoleID = model.SystemAdminRoleId + setup.AddCommand(model.NewAutocompleteData("oauth", "", "Set up the OAuth2 Application in GitLab")) + setup.AddCommand(model.NewAutocompleteData("webhook", "", "Create a webhook from GitLab to Mattermost")) + setup.AddCommand(model.NewAutocompleteData("announcement", "", "Announce to your team that they can use GitLab integration")) + gitlab.AddCommand(setup) - return gitlabCommand + return gitlab } diff --git a/server/command_test.go b/server/command_test.go index c0d1d465..c5a9ca78 100644 --- a/server/command_test.go +++ b/server/command_test.go @@ -1,12 +1,13 @@ package main import ( - "errors" + "context" "testing" "github.com/golang/mock/gomock" "github.com/mattermost/mattermost-server/v6/model" "github.com/mattermost/mattermost-server/v6/plugin/plugintest" + "github.com/pkg/errors" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" gitLabAPI "github.com/xanzy/go-gitlab" @@ -72,13 +73,12 @@ func TestSubscribeCommand(t *testing.T) { for _, test := range subscribeCommandTests { t.Run(test.testName, func(t *testing.T) { mockCtrl := gomock.NewController(t) - defer mockCtrl.Finish() channelID := "12345" userInfo := &gitlab.UserInfo{} p := getTestPlugin(t, mockCtrl, test.webhookInfo, test.mattermostURL, test.projectHookErr, test.mockGitlab) - subscribeMessage := p.subscribeCommand(test.parameters, channelID, &configuration{}, userInfo) + subscribeMessage := p.subscribeCommand(context.Background(), test.parameters, channelID, &configuration{}, userInfo) assert.Equal(t, test.want, subscribeMessage, "Subscribe command message should be the same.") }) @@ -192,20 +192,19 @@ func TestListWebhookCommand(t *testing.T) { p := new(Plugin) mockCtrl := gomock.NewController(t) - defer mockCtrl.Finish() mockedClient := mocks.NewMockGitlab(mockCtrl) if test.scope == "project" { - mockedClient.EXPECT().GetProjectHooks(gomock.Any(), gomock.Any(), gomock.Any()).Return(test.webhookInfo, nil) - mockedClient.EXPECT().ResolveNamespaceAndProject(gomock.Any(), gomock.Any(), true).Return("group", "project", nil) + mockedClient.EXPECT().GetProjectHooks(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(test.webhookInfo, nil) + mockedClient.EXPECT().ResolveNamespaceAndProject(gomock.Any(), gomock.Any(), gomock.Any(), true).Return("group", "project", nil) p.GitlabClient = mockedClient } else if test.scope == "group" { - mockedClient.EXPECT().GetGroupHooks(gomock.Any(), gomock.Any()).Return(test.webhookInfo, nil) - mockedClient.EXPECT().ResolveNamespaceAndProject(gomock.Any(), gomock.Any(), true).Return("group", "", nil) + mockedClient.EXPECT().GetGroupHooks(gomock.Any(), gomock.Any(), gomock.Any()).Return(test.webhookInfo, nil) + mockedClient.EXPECT().ResolveNamespaceAndProject(gomock.Any(), gomock.Any(), gomock.Any(), true).Return("group", "", nil) p.GitlabClient = mockedClient } - got := p.webhookCommand(test.parameters, &gitlab.UserInfo{}, true) + got := p.webhookCommand(context.Background(), test.parameters, &gitlab.UserInfo{}, true) assert.Equal(t, test.want, got) }) } @@ -216,10 +215,10 @@ func getTestPlugin(t *testing.T, mockCtrl *gomock.Controller, hooks []*gitlab.We mockedClient := mocks.NewMockGitlab(mockCtrl) if mockGitlab { - mockedClient.EXPECT().ResolveNamespaceAndProject(gomock.Any(), gomock.Any(), gomock.Any()).Return("group", "project", nil) - mockedClient.EXPECT().GetProjectHooks(gomock.Any(), gomock.Any(), gomock.Any()).Return(hooks, projectHookErr) + mockedClient.EXPECT().ResolveNamespaceAndProject(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return("group", "project", nil) + mockedClient.EXPECT().GetProjectHooks(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(hooks, projectHookErr) if projectHookErr == nil { - mockedClient.EXPECT().GetGroupHooks(gomock.Any(), gomock.Any()).Return(hooks, projectHookErr) + mockedClient.EXPECT().GetGroupHooks(gomock.Any(), gomock.Any(), gomock.Any()).Return(hooks, projectHookErr) } } @@ -341,17 +340,16 @@ func TestAddWebhookCommand(t *testing.T) { p := new(Plugin) mockCtrl := gomock.NewController(t) - defer mockCtrl.Finish() mockedClient := mocks.NewMockGitlab(mockCtrl) if test.scope == "group" { - mockedClient.EXPECT().NewGroupHook(gomock.Any(), gomock.Any(), gomock.Any()).Return(test.webhook, nil) - mockedClient.EXPECT().ResolveNamespaceAndProject(gomock.Any(), gomock.Any(), true).Return("group", "", nil) + mockedClient.EXPECT().NewGroupHook(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(test.webhook, nil) + mockedClient.EXPECT().ResolveNamespaceAndProject(gomock.Any(), gomock.Any(), gomock.Any(), true).Return("group", "", nil) } else { project := &gitLabAPI.Project{ID: 4} - mockedClient.EXPECT().ResolveNamespaceAndProject(gomock.Any(), gomock.Any(), true).Return("group", "project", nil) - mockedClient.EXPECT().GetProject(gomock.Any(), gomock.Any(), gomock.Any()).Return(project, nil) - mockedClient.EXPECT().NewProjectHook(gomock.Any(), gomock.Any(), gomock.Any()).Return(test.webhook, nil) + mockedClient.EXPECT().ResolveNamespaceAndProject(gomock.Any(), gomock.Any(), gomock.Any(), true).Return("group", "project", nil) + mockedClient.EXPECT().GetProject(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(project, nil) + mockedClient.EXPECT().NewProjectHook(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(test.webhook, nil) } p.GitlabClient = mockedClient @@ -361,7 +359,7 @@ func TestAddWebhookCommand(t *testing.T) { api.On("GetConfig", mock.Anything).Return(conf) p.SetAPI(api) - got := p.webhookCommand(test.parameters, &gitlab.UserInfo{}, true) + got := p.webhookCommand(context.Background(), test.parameters, &gitlab.UserInfo{}, true) assert.Equal(t, test.want, got) }) diff --git a/server/configuration.go b/server/configuration.go index a82dd4a9..a4c52c12 100644 --- a/server/configuration.go +++ b/server/configuration.go @@ -1,11 +1,13 @@ package main import ( - "fmt" - "net/url" + "crypto/rand" + "encoding/base64" + "encoding/json" "reflect" "strings" + "github.com/mattermost/mattermost-plugin-api/experimental/telemetry" "github.com/mattermost/mattermost-server/v6/model" "github.com/pkg/errors" @@ -24,15 +26,14 @@ import ( // If you add non-reference types to your configuration struct, be sure to rewrite Clone as a deep // copy appropriate for your types. type configuration struct { - GitlabURL string - GitlabOAuthClientID string - GitlabOAuthClientSecret string - WebhookSecret string - EncryptionKey string - GitlabGroup string - EnablePrivateRepo bool - PluginsDirectory string - UsePreregisteredApplication bool + GitlabURL string `json:"gitlaburl"` + GitlabOAuthClientID string `json:"gitlaboauthclientid"` + GitlabOAuthClientSecret string `json:"gitlaboauthclientsecret"` + WebhookSecret string `json:"webhooksecret"` + EncryptionKey string `json:"encryptionkey"` + GitlabGroup string `json:"gitlabgroup"` + EnablePrivateRepo bool `json:"enableprivaterepo"` + UsePreregisteredApplication bool `json:"usepreregisteredapplication"` } // Clone shallow copies the configuration. Your implementation may require a deep copy if @@ -42,28 +43,92 @@ func (c *configuration) Clone() *configuration { return &clone } +func (c *configuration) ToMap() (map[string]interface{}, error) { + var out map[string]interface{} + data, err := json.Marshal(c) + if err != nil { + return nil, err + } + err = json.Unmarshal(data, &out) + if err != nil { + return nil, err + } + + return out, nil +} + +func (c *configuration) setDefaults(isCloud bool) (bool, error) { + changed := false + + if c.EncryptionKey == "" { + secret, err := generateSecret() + if err != nil { + return false, err + } + + c.EncryptionKey = secret + changed = true + } + + if c.WebhookSecret == "" { + secret, err := generateSecret() + if err != nil { + return false, err + } + + c.WebhookSecret = secret + changed = true + } + + if isCloud && !c.UsePreregisteredApplication && !c.IsOAuthConfigured() { + c.UsePreregisteredApplication = true + changed = true + } + + return changed, nil +} + +func (c *configuration) sanitize() { + // Ensure GitlabURL ends with a slash + c.GitlabURL = strings.TrimRight(c.GitlabURL, "/") + + // Trim spaces around org and OAuth credentials + c.GitlabGroup = strings.TrimSpace(c.GitlabGroup) + c.GitlabOAuthClientID = strings.TrimSpace(c.GitlabOAuthClientID) + c.GitlabOAuthClientSecret = strings.TrimSpace(c.GitlabOAuthClientSecret) +} + +func (c *configuration) IsOAuthConfigured() bool { + return (c.GitlabOAuthClientID != "" && c.GitlabOAuthClientSecret != "") || + c.UsePreregisteredApplication +} + +// IsSASS return if SASS gitlab at https://gitlab.com is used +func (c *configuration) IsSASS() bool { + return c.GitlabURL == "https://gitlab.com" +} + // IsValid checks if all needed fields are set. func (c *configuration) IsValid() error { - if _, err := url.ParseRequestURI(c.GitlabURL); err != nil { + if err := isValidURL(c.GitlabURL); err != nil { return errors.New("must have a valid GitLab URL") } if !c.UsePreregisteredApplication { if c.GitlabOAuthClientID == "" { - return fmt.Errorf("must have a GitLab oauth client id") + return errors.New("must have a GitLab oauth client id") } if c.GitlabOAuthClientSecret == "" { - return fmt.Errorf("must have a GitLab oauth client secret") + return errors.New("must have a GitLab oauth client secret") } } - gitLabURL := strings.TrimSuffix(c.GitlabURL, "/") - if c.UsePreregisteredApplication && gitLabURL != "https://gitlab.com" { + if c.UsePreregisteredApplication && !c.IsSASS() { return errors.New("pre-registered application can only be used with official public GitLab") } if c.EncryptionKey == "" { - return fmt.Errorf("must have an encryption key") + return errors.New("must have an encryption key") } return nil @@ -107,11 +172,6 @@ func (p *Plugin) setConfiguration(configuration *configuration, serverConfigurat panic("setConfiguration called with the existing configuration") } - // PluginDirectory should be set based on server configuration and not the plugin configuration - if serverConfiguration.PluginSettings.Directory != nil { - configuration.PluginsDirectory = *serverConfiguration.PluginSettings.Directory - } - p.configuration = configuration } @@ -124,15 +184,45 @@ func (p *Plugin) OnConfigurationChange() error { return errors.Wrap(err, "failed to load plugin configuration") } + configuration.sanitize() + serverConfiguration := p.API.GetConfig() p.setConfiguration(configuration, serverConfiguration) - if err := configuration.IsValid(); err != nil { - return err + command, err := p.getCommand(configuration) + if err != nil { + return errors.Wrap(err, "failed to get command") + } + + err = p.API.RegisterCommand(command) + if err != nil { + return errors.Wrap(err, "failed to register command") } + enableDiagnostics := false + if config := p.API.GetConfig(); config != nil { + if configValue := config.LogSettings.EnableDiagnostics; configValue != nil { + enableDiagnostics = *configValue + } + } + + p.tracker = telemetry.NewTracker(p.telemetryClient, p.API.GetDiagnosticId(), p.API.GetServerVersion(), manifest.Id, manifest.Version, "gitlab", enableDiagnostics) + p.GitlabClient = gitlab.New(configuration.GitlabURL, configuration.GitlabGroup, p.isNamespaceAllowed) return nil } + +func generateSecret() (string, error) { + b := make([]byte, 256) + _, err := rand.Read(b) + if err != nil { + return "", err + } + s := base64.RawStdEncoding.EncodeToString(b) + + s = s[:32] + + return s, nil +} diff --git a/server/configuration_test.go b/server/configuration_test.go index ec69a86b..dd85d1ea 100644 --- a/server/configuration_test.go +++ b/server/configuration_test.go @@ -61,3 +61,116 @@ func TestIsValid(t *testing.T) { }) } } + +func TestSetDefaults(t *testing.T) { + for _, testCase := range []struct { + description string + isCloud bool + config configuration + + shouldChange bool + outputCheck func(*testing.T, *configuration) + errMsg string + }{ + { + description: "noop", + config: configuration{ + EncryptionKey: "abcd", + WebhookSecret: "efgh", + }, + shouldChange: false, + outputCheck: func(t *testing.T, c *configuration) { + assert.Equal(t, "abcd", c.EncryptionKey) + assert.Equal(t, "efgh", c.WebhookSecret) + }, + }, { + description: "set encryption key", + config: configuration{ + EncryptionKey: "", + }, + shouldChange: true, + outputCheck: func(t *testing.T, c *configuration) { + assert.Len(t, c.EncryptionKey, 32) + }, + }, { + description: "set webhook key", + config: configuration{ + WebhookSecret: "", + }, + shouldChange: true, + outputCheck: func(t *testing.T, c *configuration) { + assert.Len(t, c.WebhookSecret, 32) + }, + }, { + description: "set webhook and encryption key", + config: configuration{ + EncryptionKey: "", + WebhookSecret: "", + }, + shouldChange: true, + outputCheck: func(t *testing.T, c *configuration) { + assert.Len(t, c.EncryptionKey, 32) + assert.Len(t, c.WebhookSecret, 32) + }, + }, { + description: "Should not set UsePreregisteredApplication in on-prem", + isCloud: false, + config: configuration{ + EncryptionKey: "abcd", + WebhookSecret: "efgh", + UsePreregisteredApplication: false, + }, + shouldChange: false, + outputCheck: func(t *testing.T, c *configuration) { + assert.Equal(t, "abcd", c.EncryptionKey) + assert.Equal(t, "efgh", c.WebhookSecret) + }, + }, { + description: "Should set UsePreregisteredApplication in cloud if no OAuth secret is configured", + isCloud: true, + config: configuration{ + EncryptionKey: "abcd", + WebhookSecret: "efgh", + UsePreregisteredApplication: false, + }, + shouldChange: true, + outputCheck: func(t *testing.T, c *configuration) { + assert.Equal(t, "abcd", c.EncryptionKey) + assert.Equal(t, "efgh", c.WebhookSecret) + + assert.True(t, c.UsePreregisteredApplication) + }, + }, { + description: "Should set not UsePreregisteredApplication in cloud if OAuth secret is configured", + isCloud: true, + config: configuration{ + EncryptionKey: "abcd", + WebhookSecret: "efgh", + UsePreregisteredApplication: false, + GitlabOAuthClientID: "some id", + GitlabOAuthClientSecret: "some secret", + }, + shouldChange: false, + outputCheck: func(t *testing.T, c *configuration) { + assert.Equal(t, "abcd", c.EncryptionKey) + assert.Equal(t, "efgh", c.WebhookSecret) + + assert.False(t, c.UsePreregisteredApplication) + }, + }, + } { + t.Run(testCase.description, func(t *testing.T) { + changed, err := testCase.config.setDefaults(testCase.isCloud) + + assert.Equal(t, testCase.shouldChange, changed) + testCase.outputCheck(t, &testCase.config) + + if testCase.errMsg != "" { + require.Error(t, err) + assert.Equal(t, testCase.errMsg, err.Error()) + } else { + require.NoError(t, err) + } + }) + } +} diff --git a/server/flow.go b/server/flow.go new file mode 100644 index 00000000..c0845b9b --- /dev/null +++ b/server/flow.go @@ -0,0 +1,829 @@ +package main + +import ( + "context" + "fmt" + "strings" + "time" + + "github.com/gorilla/mux" + pluginapi "github.com/mattermost/mattermost-plugin-api" + "github.com/mattermost/mattermost-plugin-api/experimental/flow" + "github.com/mattermost/mattermost-plugin-api/experimental/telemetry" + "github.com/mattermost/mattermost-server/v6/model" + "github.com/pkg/errors" + + "github.com/mattermost/mattermost-plugin-gitlab/server/gitlab" +) + +type FlowManager struct { + client *pluginapi.Client + pluginURL string + botUserID string + router *mux.Router + getConfiguration func() *configuration + getGitlabUserInfoByMattermostID func(userID string) (*gitlab.UserInfo, *APIErrorResponse) + getGitlabClient func() gitlab.Gitlab + + tracker telemetry.Tracker + + setupFlow *flow.Flow + oauthFlow *flow.Flow + webhokFlow *flow.Flow + announcementFlow *flow.Flow +} + +func (p *Plugin) NewFlowManager() *FlowManager { + fm := &FlowManager{ + client: p.client, + pluginURL: *p.client.Configuration.GetConfig().ServiceSettings.SiteURL + "/" + "plugins" + "/" + manifest.Id, + botUserID: p.BotUserID, + router: p.router, + getConfiguration: p.getConfiguration, + getGitlabUserInfoByMattermostID: p.getGitlabUserInfoByMattermostID, + getGitlabClient: p.getGitlabClient, + + tracker: p.tracker, + } + + fm.setupFlow = fm.newFlow("setup").WithSteps( + fm.stepWelcome(), + + fm.stepDelegateQuestion(), + fm.stepDelegateConfirmation(), + fm.stepDelegateComplete(), + + fm.stepInstanceURL(), + fm.stepOAuthInfo(), + fm.stepOAuthInput(), + fm.stepOAuthConnect(), + + fm.stepWebhookQuestion(), + fm.stepWebhookWarning(), + fm.stepWebhookConfirmation(), + + fm.stepAnnouncementQuestion(), + fm.stepAnnouncementConfirmation(), + + fm.doneStep(), + + fm.stepCancel("setup"), + ) + + fm.oauthFlow = fm.newFlow("oauth").WithSteps( + fm.stepInstanceURL(), + fm.stepOAuthInfo(), + fm.stepOAuthInfo(), + fm.stepOAuthInput(), + fm.stepOAuthConnect().Terminal(), + + fm.stepCancel("setup oauth"), + ) + fm.webhokFlow = fm.newFlow("webhook").WithSteps( + fm.stepWebhookQuestion(), + flow.NewStep(stepWebhookConfirmation). + WithText("Use `/gitlab subscriptions add` to subscribe any Mattermost channel to your GitLab repository. [Learn more](https://mattermost.gitbook.io/plugin-gitlab/feature-summary#subscribe-to-unsubscribe-from-a-repository)"). + Terminal(), + + fm.stepCancel("setup webhook"), + ) + fm.announcementFlow = fm.newFlow("announcement").WithSteps( + fm.stepAnnouncementQuestion(), + fm.stepAnnouncementConfirmation().Terminal(), + + fm.stepCancel("setup announcement"), + ) + + return fm +} + +func (fm *FlowManager) doneStep() flow.Step { + return flow.NewStep(stepDone). + WithText(":tada: You successfully installed GitLab."). + OnRender(fm.onDone).Terminal() +} + +func (fm *FlowManager) onDone(f *flow.Flow) { + fm.trackCompleteSetupWizard(f.UserID) + + delegatedFrom := f.GetState().GetString(keyDelegatedFrom) + if delegatedFrom != "" { + err := fm.setupFlow.ForUser(delegatedFrom).Go(stepDelegateComplete) + fm.client.Log.Warn("failed start configuration wizard for delegate", "error", err) + } +} + +func (fm *FlowManager) newFlow(name flow.Name) *flow.Flow { + flow := flow.NewFlow( + name, + fm.client, + fm.pluginURL, + fm.botUserID, + ) + + flow.InitHTTP(fm.router) + + return flow +} + +const ( + // Delegate Steps + + stepDelegateQuestion flow.Name = "delegate-question" + stepDelegateConfirmation flow.Name = "delegate-confirmation" + stepDelegateComplete flow.Name = "delegate-complete" + + // OAuth steps + + stepGitlabURL flow.Name = "gitlab-url" + stepOAuthInfo flow.Name = "oauth-info" + stepOAuthInput flow.Name = "oauth-input" + stepOAuthConnect flow.Name = "oauth-connect" + + // Webhook steps + + stepWebhookQuestion flow.Name = "webhook-question" + stepWebhookWarning flow.Name = "webhook-warning" + stepWebhookConfirmation flow.Name = "webhook-confirmation" + + // Announcement steps + + stepAnnouncementQuestion flow.Name = "announcement-question" + stepAnnouncementConfirmation flow.Name = "announcement-confirmation" + + // Miscellaneous Steps + + stepWelcome flow.Name = "welcome" + stepDone flow.Name = "done" + stepCancel flow.Name = "cancel" + + keyDelegatedFrom = "DelegatedFrom" + keyDelegatedTo = "DelegatedTo" + keyGitlabURL = "GitlabURL" + keyUsePreregisteredApplication = "UsePreregisteredApplication" + keyIsOAuthConfigured = "IsOAuthConfigured" +) + +func cancelButton() flow.Button { + return flow.Button{ + Name: "Cancel setup", + Color: flow.ColorDanger, + OnClick: flow.Goto(stepCancel), + } +} + +func (fm *FlowManager) stepCancel(command string) flow.Step { + return flow.NewStep(stepCancel). + Terminal(). + WithText(fmt.Sprintf("Gitlab integration setup has stopped. Restart setup later by running `/gitlab %s`. Learn more about the plugin [here](https://mattermost.gitbook.io/plugin-gitlab/).", command)). + WithColor(flow.ColorDanger) +} + +func continueButtonF(f func(f *flow.Flow) (flow.Name, flow.State, error)) flow.Button { + return flow.Button{ + Name: "Continue", + Color: flow.ColorPrimary, + OnClick: f, + } +} + +func continueButton(next flow.Name) flow.Button { + return continueButtonF(flow.Goto(next)) +} + +func (fm *FlowManager) getBaseState() flow.State { + config := fm.getConfiguration() + isOAuthConfigured := config.GitlabOAuthClientID != "" || config.GitlabOAuthClientSecret != "" + return flow.State{ + keyGitlabURL: config.GitlabURL, + keyUsePreregisteredApplication: config.UsePreregisteredApplication, + keyIsOAuthConfigured: isOAuthConfigured, + } +} + +func (fm *FlowManager) StartSetupWizard(userID string, delegatedFrom string) error { + state := fm.getBaseState() + state[keyDelegatedFrom] = delegatedFrom + + err := fm.setupFlow.ForUser(userID).Start(state) + if err != nil { + return err + } + + fm.trackStartSetupWizard(userID, delegatedFrom != "") + + return nil +} + +func (fm *FlowManager) trackStartSetupWizard(userID string, fromInvite bool) { + _ = fm.tracker.TrackUserEvent("setup_wizard_start", userID, map[string]interface{}{ + "from_invite": fromInvite, + "time": model.GetMillis(), + }) +} + +func (fm *FlowManager) trackCompleteSetupWizard(userID string) { + _ = fm.tracker.TrackUserEvent("setup_wizard_complete", userID, map[string]interface{}{ + "time": model.GetMillis(), + }) +} + +func (fm *FlowManager) StartOauthWizard(userID string) error { + state := fm.getBaseState() + + err := fm.oauthFlow.ForUser(userID).Start(state) + if err != nil { + return err + } + + fm.trackStartOauthWizard(userID) + + return nil +} + +func (fm *FlowManager) trackStartOauthWizard(userID string) { + _ = fm.tracker.TrackUserEvent("oauth_wizard_start", userID, map[string]interface{}{ + "time": model.GetMillis(), + }) +} + +func (fm *FlowManager) trackCompleteOauthWizard(userID string) { + _ = fm.tracker.TrackUserEvent("oauth_wizard_complete", userID, map[string]interface{}{ + "time": model.GetMillis(), + }) +} + +func (fm *FlowManager) stepWelcome() flow.Step { + welcomePretext := ":wave: Welcome to your GitLab integration! [Learn more](https://mattermost.gitbook.io/plugin-gitlab/)" + + welcomeText := ` +{{- if .UsePreregisteredApplication -}} +Just a few configuration steps to go! +- **Step 1:** Connect your GiLab account +- **Step 2:** Create a webhook in GitLab +{{- else -}} +Just a few configuration steps to go! +- **Step 1:** Register an OAuth application in GitLab and enter OAuth values. +- **Step 2:** Connect your GitLab account +- **Step 3:** Create a webhook in GitLab +{{- end -}}` + + return flow.NewStep(stepWelcome). + WithText(welcomeText). + WithPretext(welcomePretext). + WithButton(continueButton("")) +} + +func (fm *FlowManager) stepDelegateQuestion() flow.Step { + delegateQuestionText := "Are you setting this GitLab integration up, or is someone else?" + return flow.NewStep(stepDelegateQuestion). + WithText(delegateQuestionText). + WithButton(flow.Button{ + Name: "I'll do it myself", + Color: flow.ColorPrimary, + OnClick: func(f *flow.Flow) (flow.Name, flow.State, error) { + if f.GetState().GetBool(keyUsePreregisteredApplication) { + return stepOAuthConnect, nil, nil + } + + return stepGitlabURL, nil, nil + }, + }). + WithButton(flow.Button{ + Name: "I need someone else", + Color: flow.ColorDefault, + Dialog: &model.Dialog{ + Title: "Send instructions", + SubmitLabel: "Send", + Elements: []model.DialogElement{ + { + DisplayName: "To", + Name: "delegate", + Type: "select", + DataSource: "users", + Placeholder: "Search for people", + }, + }, + }, + OnDialogSubmit: fm.submitDelegateSelection, + }) +} + +func (fm *FlowManager) submitDelegateSelection(f *flow.Flow, submitted map[string]interface{}) (flow.Name, flow.State, map[string]string, error) { + delegateIDRaw, ok := submitted["delegate"] + if !ok { + return "", nil, nil, errors.New("delegate missing") + } + delegateID, ok := delegateIDRaw.(string) + if !ok { + return "", nil, nil, errors.New("delegate is not a string") + } + + delegate, err := fm.client.User.Get(delegateID) + if err != nil { + return "", nil, nil, errors.Wrap(err, "failed get user") + } + + err = fm.StartSetupWizard(delegate.Id, f.UserID) + if err != nil { + return "", nil, nil, errors.Wrap(err, "failed start configuration wizard") + } + + return stepDelegateConfirmation, flow.State{ + keyDelegatedTo: delegate.Username, + }, nil, nil +} + +func (fm *FlowManager) stepDelegateConfirmation() flow.Step { + return flow.NewStep(stepDelegateConfirmation). + WithText("GitLab integration setup details have been sent to @{{ .DelegatedTo }}"). + WithButton(flow.Button{ + Name: "Waiting for @{{ .DelegatedTo }}...", + Color: flow.ColorDefault, + Disabled: true, + }). + WithButton(cancelButton()) +} + +func (fm *FlowManager) stepDelegateComplete() flow.Step { + return flow.NewStep(stepDelegateComplete). + WithText("@{{ .DelegatedTo }} completed configuring the integration."). + Next(stepDone) +} + +func (fm *FlowManager) stepInstanceURL() flow.Step { + enterpriseText := "Are you using `gitlab.com`?" + return flow.NewStep(stepGitlabURL). + WithText(enterpriseText). + WithButton(flow.Button{ + Name: "Yes", + Color: flow.ColorDefault, + OnClick: func(f *flow.Flow) (flow.Name, flow.State, error) { + err := fm.setGitlabURL(gitlab.Gitlabdotcom) + if err != nil { + return "", nil, err + } + + return stepOAuthInfo, nil, nil + }, + }). + WithButton(flow.Button{ + Name: "No", + Color: flow.ColorPrimary, + Dialog: &model.Dialog{ + Title: "GitLab URL", + IntroductionText: "Enter the **GitLab URL** of your GitLab instance (Example: https://gitlab.example.com).", + SubmitLabel: "Save & continue", + Elements: []model.DialogElement{ + { + + DisplayName: "GitLab URL", + Name: "gitlab_url", + Type: "text", + SubType: "url", + Placeholder: "Enter GitLab URL", + }, + }, + }, + OnDialogSubmit: fm.submitGitlabURL, + }). + WithButton(cancelButton()) +} + +func (fm *FlowManager) submitGitlabURL(f *flow.Flow, submitted map[string]interface{}) (flow.Name, flow.State, map[string]string, error) { + errorList := map[string]string{} + + gitlabURLRaw, ok := submitted["gitlab_url"] + if !ok { + return "", nil, nil, errors.New("gitlab_url missing") + } + gitlabURL, ok := gitlabURLRaw.(string) + if !ok { + return "", nil, nil, errors.New("gitlab_url is not a string") + } + + err := isValidURL(gitlabURL) + if err != nil { + errorList["gitlab_url"] = err.Error() + } + + if len(errorList) != 0 { + return "", nil, errorList, nil + } + + config := fm.getConfiguration() + config.GitlabURL = gitlabURL + config.sanitize() + + configMap, err := config.ToMap() + if err != nil { + return "", nil, nil, err + } + + err = fm.client.Configuration.SavePluginConfig(configMap) + if err != nil { + return "", nil, nil, errors.Wrap(err, "failed to save plugin config") + } + + return "", flow.State{ + keyGitlabURL: config.GitlabURL, + }, nil, nil +} + +func (fm *FlowManager) stepOAuthInfo() flow.Step { + oauthPretext := ` +##### :white_check_mark: Step 1: Register an OAuth Application in GitLab +You must first register the Mattermost GitLab Plugin as an authorized OAuth app.` + oauthMessage := fmt.Sprintf(""+ + "1. In a browser, go to {{ .GitlabURL }}/-/profile/applications.\n"+ + "2. Set the following values:\n"+ + " - Name: `Mattermost GitLab Plugin - `\n"+ + " - Redirect URI: `%s/oauth/complete`\n"+ + "3. Unselect **Expire access tokens**.\n"+ + "4. Select `api` and `read_user` in Scopes.\n"+ + "5. Select **Save application**\n", + fm.pluginURL, + ) + + return flow.NewStep(stepOAuthInfo). + WithPretext(oauthPretext). + WithText(oauthMessage). + WithImage("public/new-oauth-application.png"). + WithButton(continueButton("")). + WithButton(cancelButton()) +} + +func (fm *FlowManager) stepOAuthInput() flow.Step { + return flow.NewStep(stepOAuthInput). + WithText("Click the Continue button below to open a dialog to enter the **Application ID** and **Secret**."). + WithButton(flow.Button{ + Name: "Continue", + Color: flow.ColorPrimary, + Dialog: &model.Dialog{ + Title: "GitLab OAuth values", + IntroductionText: "Please enter the **Application ID** and **Secret** you copied in a previous step.{{ if .IsOAuthConfigured }}\n\n**Any existing OAuth configuration will be overwritten.**{{end}}", + SubmitLabel: "Save & continue", + Elements: []model.DialogElement{ + { + DisplayName: "GitLab OAuth Application ID", + Name: "client_id", + Type: "text", + SubType: "text", + Placeholder: "Enter GitLab OAuth Application ID", + }, + { + DisplayName: "GitLab OAuth Secret", + Name: "client_secret", + Type: "text", + SubType: "text", + Placeholder: "Enter GitLab OAuth Secret", + }, + }, + }, + OnDialogSubmit: fm.submitOAuthConfig, + }). + WithButton(cancelButton()) +} + +func (fm *FlowManager) submitOAuthConfig(f *flow.Flow, submitted map[string]interface{}) (flow.Name, flow.State, map[string]string, error) { + errorList := map[string]string{} + + clientIDRaw, ok := submitted["client_id"] + if !ok { + return "", nil, nil, errors.New("client_id missing") + } + clientID, ok := clientIDRaw.(string) + if !ok { + return "", nil, nil, errors.New("client_id is not a string") + } + + clientID = strings.TrimSpace(clientID) + + if len(clientID) != 64 { + errorList["client_id"] = "Client ID should be 64 characters long" + } + + clientSecretRaw, ok := submitted["client_secret"] + if !ok { + return "", nil, nil, errors.New("client_secret missing") + } + clientSecret, ok := clientSecretRaw.(string) + if !ok { + return "", nil, nil, errors.New("client_secret is not a string") + } + + clientSecret = strings.TrimSpace(clientSecret) + + if len(clientSecret) != 64 { + errorList["client_secret"] = "Client Secret should be 64 characters long" + } + + if len(errorList) != 0 { + return "", nil, errorList, nil + } + + config := fm.getConfiguration() + config.GitlabOAuthClientID = clientID + config.GitlabOAuthClientSecret = clientSecret + + configMap, err := config.ToMap() + if err != nil { + return "", nil, nil, err + } + + err = fm.client.Configuration.SavePluginConfig(configMap) + if err != nil { + return "", nil, nil, errors.Wrap(err, "failed to save plugin config") + } + + return "", nil, nil, nil +} + +func (fm *FlowManager) stepOAuthConnect() flow.Step { + connectPretext := "##### :white_check_mark: Step {{ if .UsePreregisteredApplication }}1{{ else }}2{{ end }}: Connect your GitLab account" + connectURL := fmt.Sprintf("%s/oauth/connect", fm.pluginURL) + connectText := fmt.Sprintf("Go [here](%s) to connect your account.", connectURL) + return flow.NewStep(stepOAuthConnect). + WithText(connectText). + WithPretext(connectPretext). + OnRender(func(f *flow.Flow) { fm.trackCompleteOauthWizard(f.UserID) }) + // The API handler will advance to the next step and complete the flow +} + +func (fm *FlowManager) StartWebhookWizard(userID string) error { + state := fm.getBaseState() + + err := fm.webhokFlow.ForUser(userID).Start(state) + if err != nil { + return err + } + + fm.trackStartWebhookWizard(userID) + + return nil +} + +func (fm *FlowManager) trackStartWebhookWizard(userID string) { + _ = fm.tracker.TrackUserEvent("webhook_wizard_start", userID, map[string]interface{}{ + "time": model.GetMillis(), + }) +} + +func (fm *FlowManager) trackCompleteWebhookWizard(userID string) { + _ = fm.tracker.TrackUserEvent("webhook_wizard_complete", userID, map[string]interface{}{ + "time": model.GetMillis(), + }) +} + +func (fm *FlowManager) stepWebhookQuestion() flow.Step { + questionPretext := `##### :white_check_mark: Step {{ if .UsePreregisteredApplication }}2{{ else }}3{{ end }}: Create a Webhook in GitLab +The final setup step requires a Mattermost System Admin to create a webhook for each GitLab group or project to receive notifications for, or want to subscribe to.` + return flow.NewStep(stepWebhookQuestion). + WithText("Do you want to create a webhook?"). + WithPretext(questionPretext). + WithButton(flow.Button{ + Name: "Yes", + Color: flow.ColorPrimary, + Dialog: &model.Dialog{ + Title: "Create webhook", + SubmitLabel: "Create", + Elements: []model.DialogElement{ + { + + DisplayName: "Gitlab project or group name", + Name: "namespace", + Type: "text", + SubType: "text", + Placeholder: "Enter GitLab project or group name", + HelpText: "Specify the GitLab project or group to connect to Mattermost. For example, mattermost/mattermost-server.", + }, + }, + }, + OnDialogSubmit: fm.submitWebhook, + }). + WithButton(flow.Button{ + Name: "No", + Color: flow.ColorDefault, + OnClick: flow.Goto(stepWebhookWarning), + }) +} + +func (fm *FlowManager) submitWebhook(f *flow.Flow, submitted map[string]interface{}) (flow.Name, flow.State, map[string]string, error) { + namespaceRaw, ok := submitted["namespace"] + if !ok { + return "", nil, nil, errors.New("namespace missing") + } + namespace, ok := namespaceRaw.(string) + if !ok { + return "", nil, nil, errors.New("namespace is not a string") + } + + config := fm.getConfiguration() + + info, apiErr := fm.getGitlabUserInfoByMattermostID(f.UserID) + if apiErr != nil { + return "", nil, nil, apiErr + } + + ctx, cancel := context.WithTimeout(context.Background(), 28*time.Second) // HTTP request times out after 30 seconds + defer cancel() + + gitlabClient := fm.getGitlabClient() + + group, project, err := gitlabClient.ResolveNamespaceAndProject(ctx, info, namespace, config.EnablePrivateRepo) + if err != nil { + if errors.Is(err, gitlab.ErrNotFound) { + return "", nil, nil, errors.New("project or group was not found") + } + + return "", nil, nil, gitlab.PrettyError(err) + } + + hookOptions := &gitlab.AddWebhookOptions{ + URL: fmt.Sprintf("%s/webhook", fm.pluginURL), + ConfidentialNoteEvents: true, + PushEvents: true, + IssuesEvents: true, + ConfidentialIssuesEvents: true, + MergeRequestsEvents: true, + TagPushEvents: true, + NoteEvents: true, + JobEvents: true, + PipelineEvents: true, + WikiPageEvents: true, + EnableSSLVerification: true, + Token: config.WebhookSecret, + } + + var fullName string + var repoOrGroup string + + if group == "" { + fullName = group + repoOrGroup = "group" + } else { + fullName = group + "/" + project + repoOrGroup = "repository" + } + + _, err = CreateHook(ctx, gitlabClient, info, group, project, hookOptions) + if err != nil { + if errors.Is(err, gitlab.ErrNotFound) { + return "", nil, nil, errors.New("project or group was not found") + } + if errors.Is(err, gitlab.ErrForbidden) { + err = errors.Errorf("It seems like you don't have privileges to create webhooks in %s. Ask an admin of that %s to run /gitlab setup webhook for you.", fullName, repoOrGroup) + return "", nil, nil, err + } + + return "", nil, nil, errors.Wrap(gitlab.PrettyError(err), "failed to create hook") + } + + return stepWebhookConfirmation, nil, nil, nil +} + +func (fm *FlowManager) stepWebhookWarning() flow.Step { + warnText := "The GitLab plugin uses a webhook to connect a GitLab account to Mattermost to listen for incoming GitLab events. " + + "You can't subscribe a channel to a repository for notifications until webhooks are configured.\n" + + "Restart setup later by running `/gitab setup webhook`" + + return flow.NewStep(stepWebhookWarning). + WithText(warnText). + WithColor(flow.ColorDanger). + Next("") +} + +func (fm *FlowManager) stepWebhookConfirmation() flow.Step { + return flow.NewStep(stepWebhookConfirmation). + WithTitle("Success! :tada: You've successfully set up your Mattermost GitLab integration! "). + WithText("Use `/gitlab subscriptions add` to subscribe any Mattermost channel to your GitLab repository. [Learn more](https://mattermost.gitbook.io/plugin-gitlab/feature-summary#subscribe-to-unsubscribe-from-a-repository)"). + OnRender(func(f *flow.Flow) { fm.trackCompleteWebhookWizard(f.UserID) }). + Next("") +} + +func (fm *FlowManager) StartAnnouncementWizard(userID string) error { + state := fm.getBaseState() + + err := fm.announcementFlow.ForUser(userID).Start(state) + if err != nil { + return err + } + + fm.trackStartAnnouncementWizard(userID) + + return nil +} + +func (fm *FlowManager) trackStartAnnouncementWizard(userID string) { + _ = fm.tracker.TrackUserEvent("announcement_wizard_start", userID, map[string]interface{}{ + "time": model.GetMillis(), + }) +} + +func (fm *FlowManager) trackCompletAnnouncementWizard(userID string) { + _ = fm.tracker.TrackUserEvent("announcement_wizard_complete", userID, map[string]interface{}{ + "time": model.GetMillis(), + }) +} + +func (fm *FlowManager) stepAnnouncementQuestion() flow.Step { + defaultMessage := "Hi team,\n" + + "\n" + + "We've set up the Mattermost Gitlab plugin to enable notifications from Gitlab in Mattermost. To get started, run the `/gitlab connect` slash command from any channel within Mattermost to connect that channel with GitLab. See the [documentation](https://mattermost.gitbook.io/plugin-gitlab/) for details on using the GitLab plugin." + + return flow.NewStep(stepAnnouncementQuestion). + WithText("Want to let your team know?"). + WithButton(flow.Button{ + Name: "Send Message", + Color: flow.ColorPrimary, + Dialog: &model.Dialog{ + Title: "Notify your team", + SubmitLabel: "Send message", + Elements: []model.DialogElement{ + { + DisplayName: "To", + Name: "channel_id", + Type: "select", + Placeholder: "Select channel", + DataSource: "channels", + }, + { + DisplayName: "Message", + Name: "message", + Type: "textarea", + Default: defaultMessage, + HelpText: "You can edit this message before sending it.", + }, + }, + }, + OnDialogSubmit: fm.submitChannelAnnouncement, + }). + WithButton(flow.Button{ + Name: "Not now", + Color: flow.ColorDefault, + OnClick: flow.Goto(stepDone), + }) +} + +func (fm *FlowManager) stepAnnouncementConfirmation() flow.Step { + return flow.NewStep(stepAnnouncementConfirmation). + WithText("Message to ~{{ .ChannelName }} was sent."). + Next(""). + OnRender(func(f *flow.Flow) { fm.trackCompletAnnouncementWizard(f.UserID) }) +} + +func (fm *FlowManager) submitChannelAnnouncement(f *flow.Flow, submitted map[string]interface{}) (flow.Name, flow.State, map[string]string, error) { + channelIDRaw, ok := submitted["channel_id"] + if !ok { + return "", nil, nil, errors.New("channel_id missing") + } + channelID, ok := channelIDRaw.(string) + if !ok { + return "", nil, nil, errors.New("channel_id is not a string") + } + + channel, err := fm.client.Channel.Get(channelID) + if err != nil { + return "", nil, nil, errors.Wrap(err, "failed to get channel") + } + + messageRaw, ok := submitted["message"] + if !ok { + return "", nil, nil, errors.New("message is not a string") + } + message, ok := messageRaw.(string) + if !ok { + return "", nil, nil, errors.New("message is not a string") + } + + post := &model.Post{ + UserId: f.UserID, + ChannelId: channel.Id, + Message: message, + } + err = fm.client.Post.CreatePost(post) + if err != nil { + return "", nil, nil, errors.Wrap(err, "failed to create announcement post") + } + + return stepAnnouncementConfirmation, flow.State{ + "ChannelName": channel.Name, + }, nil, nil +} + +func (fm *FlowManager) setGitlabURL(gitlabURL string) error { + config := fm.getConfiguration() + config.GitlabURL = gitlabURL + + configMap, err := config.ToMap() + if err != nil { + return err + } + + err = fm.client.Configuration.SavePluginConfig(configMap) + if err != nil { + return errors.Wrap(err, "failed to save plugin config") + } + + return nil +} diff --git a/server/gitlab/api.go b/server/gitlab/api.go index a5a2ee1f..015856b6 100644 --- a/server/gitlab/api.go +++ b/server/gitlab/api.go @@ -17,13 +17,16 @@ const ( ) // NewGroupHook creates a webhook associated with a GitLab group -func (g *gitlab) NewGroupHook(user *UserInfo, groupName string, webhookOptions *AddWebhookOptions) (*WebhookInfo, error) { +func (g *gitlab) NewGroupHook(ctx context.Context, user *UserInfo, groupName string, webhookOptions *AddWebhookOptions) (*WebhookInfo, error) { client, err := g.gitlabConnect(*user.Token) if err != nil { return nil, err } - group, _, err := client.Groups.GetGroup(groupName) + group, resp, err := client.Groups.GetGroup(groupName, nil, internGitlab.WithContext(ctx)) + if respErr := checkResponse(resp); respErr != nil { + return nil, respErr + } if err != nil { return nil, err } @@ -44,8 +47,12 @@ func (g *gitlab) NewGroupHook(user *UserInfo, groupName string, webhookOptions * Token: &webhookOptions.Token, } - groupHook, _, err := client.Groups.AddGroupHook(group.ID, &groupHookOptions) + groupHook, resp, err := client.Groups.AddGroupHook(group.ID, &groupHookOptions, internGitlab.WithContext(ctx)) if err != nil { + if resp.StatusCode == http.StatusForbidden { + return nil, ErrForbidden + } + return nil, err } @@ -55,7 +62,7 @@ func (g *gitlab) NewGroupHook(user *UserInfo, groupName string, webhookOptions * } // NewProjectHook creates a webhook associated with a GitLab project -func (g *gitlab) NewProjectHook(user *UserInfo, projectID interface{}, webhookOptions *AddWebhookOptions) (*WebhookInfo, error) { +func (g *gitlab) NewProjectHook(ctx context.Context, user *UserInfo, projectID interface{}, webhookOptions *AddWebhookOptions) (*WebhookInfo, error) { client, err := g.gitlabConnect(*user.Token) if err != nil { return nil, err @@ -77,7 +84,10 @@ func (g *gitlab) NewProjectHook(user *UserInfo, projectID interface{}, webhookOp Token: &webhookOptions.Token, } - projectHook, _, err := client.Projects.AddProjectHook(projectID, &projectHookOptions) + projectHook, resp, err := client.Projects.AddProjectHook(projectID, &projectHookOptions, internGitlab.WithContext(ctx)) + if respErr := checkResponse(resp); respErr != nil { + return nil, respErr + } if err != nil { return nil, err } @@ -88,13 +98,16 @@ func (g *gitlab) NewProjectHook(user *UserInfo, projectID interface{}, webhookOp } // GetGroupHooks gathers all the group level hooks for a GitLab group. -func (g *gitlab) GetGroupHooks(user *UserInfo, owner string) ([]*WebhookInfo, error) { +func (g *gitlab) GetGroupHooks(ctx context.Context, user *UserInfo, owner string) ([]*WebhookInfo, error) { client, err := g.gitlabConnect(*user.Token) if err != nil { return nil, err } - hooks, _, err := client.Groups.ListGroupHooks(owner) + hooks, resp, err := client.Groups.ListGroupHooks(owner, internGitlab.WithContext(ctx)) + if respErr := checkResponse(resp); respErr != nil { + return nil, respErr + } if err != nil { return nil, err } @@ -192,14 +205,17 @@ func getGroupHookInfo(hook *internGitlab.GroupHook) *WebhookInfo { } // GetProjectHooks gathers all the project level hooks from a single GitLab project. -func (g *gitlab) GetProjectHooks(user *UserInfo, owner string, repo string) ([]*WebhookInfo, error) { +func (g *gitlab) GetProjectHooks(ctx context.Context, user *UserInfo, owner string, repo string) ([]*WebhookInfo, error) { client, err := g.gitlabConnect(*user.Token) if err != nil { return nil, err } projectPath := fmt.Sprintf("%s/%s", owner, repo) - projectHooks, _, err := client.Projects.ListProjectHooks(projectPath, nil) + projectHooks, resp, err := client.Projects.ListProjectHooks(projectPath, nil, internGitlab.WithContext(ctx)) + if respErr := checkResponse(resp); respErr != nil { + return nil, respErr + } if err != nil { return nil, err } @@ -207,20 +223,30 @@ func (g *gitlab) GetProjectHooks(user *UserInfo, owner string, repo string) ([]* for _, hook := range projectHooks { webhooks = append(webhooks, getProjectHookInfo(hook)) } - return webhooks, err + return webhooks, nil } -func (g *gitlab) GetProject(user *UserInfo, owner, repo string) (*internGitlab.Project, error) { +func (g *gitlab) GetProject(ctx context.Context, user *UserInfo, owner, repo string) (*internGitlab.Project, error) { client, err := g.gitlabConnect(*user.Token) if err != nil { return nil, err } - result, _, err := client.Projects.GetProject(fmt.Sprintf("%s/%s", owner, repo), &internGitlab.GetProjectOptions{}) - return result, err + result, resp, err := client.Projects.GetProject(fmt.Sprintf("%s/%s", owner, repo), + &internGitlab.GetProjectOptions{}, + internGitlab.WithContext(ctx), + ) + if respErr := checkResponse(resp); respErr != nil { + return nil, respErr + } + if err != nil { + return nil, err + } + + return result, nil } -func (g *gitlab) GetReviews(user *UserInfo) ([]*internGitlab.MergeRequest, error) { +func (g *gitlab) GetReviews(ctx context.Context, user *UserInfo) ([]*internGitlab.MergeRequest, error) { client, err := g.gitlabConnect(*user.Token) if err != nil { return nil, err @@ -230,26 +256,29 @@ func (g *gitlab) GetReviews(user *UserInfo) ([]*internGitlab.MergeRequest, error scope := scopeAll var result []*internGitlab.MergeRequest - var errRequest error if g.gitlabGroup == "" { - result, _, errRequest = client.MergeRequests.ListMergeRequests(&internGitlab.ListMergeRequestsOptions{ - AssigneeID: &user.GitlabUserID, + result, _, err = client.MergeRequests.ListMergeRequests(&internGitlab.ListMergeRequestsOptions{ + AssigneeID: internGitlab.AssigneeID(user.GitlabUserID), State: &opened, Scope: &scope, - }) + }, + internGitlab.WithContext(ctx), + ) } else { - result, _, errRequest = client.MergeRequests.ListGroupMergeRequests(g.gitlabGroup, &internGitlab.ListGroupMergeRequestsOptions{ - AssigneeID: &user.GitlabUserID, + result, _, err = client.MergeRequests.ListGroupMergeRequests(g.gitlabGroup, &internGitlab.ListGroupMergeRequestsOptions{ + AssigneeID: internGitlab.AssigneeID(user.GitlabUserID), State: &opened, Scope: &scope, - }) + }, + internGitlab.WithContext(ctx), + ) } - return result, errRequest + return result, err } -func (g *gitlab) GetYourPrs(user *UserInfo) ([]*internGitlab.MergeRequest, error) { +func (g *gitlab) GetYourPrs(ctx context.Context, user *UserInfo) ([]*internGitlab.MergeRequest, error) { client, err := g.gitlabConnect(*user.Token) if err != nil { return nil, err @@ -259,26 +288,36 @@ func (g *gitlab) GetYourPrs(user *UserInfo) ([]*internGitlab.MergeRequest, error scope := scopeAll var result []*internGitlab.MergeRequest - var errRequest error + var resp *internGitlab.Response if g.gitlabGroup == "" { - result, _, errRequest = client.MergeRequests.ListMergeRequests(&internGitlab.ListMergeRequestsOptions{ + result, resp, err = client.MergeRequests.ListMergeRequests(&internGitlab.ListMergeRequestsOptions{ AuthorID: &user.GitlabUserID, State: &opened, Scope: &scope, - }) + }, + internGitlab.WithContext(ctx), + ) } else { - result, _, errRequest = client.MergeRequests.ListGroupMergeRequests(g.gitlabGroup, &internGitlab.ListGroupMergeRequestsOptions{ + result, resp, err = client.MergeRequests.ListGroupMergeRequests(g.gitlabGroup, &internGitlab.ListGroupMergeRequestsOptions{ AuthorID: &user.GitlabUserID, State: &opened, Scope: &scope, - }) + }, + internGitlab.WithContext(ctx), + ) + } + if respErr := checkResponse(resp); respErr != nil { + return nil, respErr + } + if err != nil { + return nil, err } - return result, errRequest + return result, nil } -func (g *gitlab) GetYourAssignments(user *UserInfo) ([]*internGitlab.Issue, error) { +func (g *gitlab) GetYourAssignments(ctx context.Context, user *UserInfo) ([]*internGitlab.Issue, error) { client, err := g.gitlabConnect(*user.Token) if err != nil { return nil, err @@ -288,32 +327,48 @@ func (g *gitlab) GetYourAssignments(user *UserInfo) ([]*internGitlab.Issue, erro scope := scopeAll var result []*internGitlab.Issue - var errRequest error + var resp *internGitlab.Response if g.gitlabGroup == "" { - result, _, errRequest = client.Issues.ListIssues(&internGitlab.ListIssuesOptions{ + result, resp, err = client.Issues.ListIssues(&internGitlab.ListIssuesOptions{ AssigneeID: &user.GitlabUserID, State: &opened, Scope: &scope, - }) + }, + internGitlab.WithContext(ctx), + ) } else { - result, _, errRequest = client.Issues.ListGroupIssues(g.gitlabGroup, &internGitlab.ListGroupIssuesOptions{ + result, resp, err = client.Issues.ListGroupIssues(g.gitlabGroup, &internGitlab.ListGroupIssuesOptions{ AssigneeID: &user.GitlabUserID, State: &opened, Scope: &scope, - }) + }, + internGitlab.WithContext(ctx), + ) + } + if respErr := checkResponse(resp); respErr != nil { + return nil, respErr + } + if err != nil { + return nil, err } - return result, errRequest + return result, nil } -func (g *gitlab) GetUnreads(user *UserInfo) ([]*internGitlab.Todo, error) { +func (g *gitlab) GetUnreads(ctx context.Context, user *UserInfo) ([]*internGitlab.Todo, error) { client, err := g.gitlabConnect(*user.Token) if err != nil { return nil, err } - result, _, err := client.Todos.ListTodos(&internGitlab.ListTodosOptions{}) + result, resp, err := client.Todos.ListTodos( + &internGitlab.ListTodosOptions{}, + internGitlab.WithContext(ctx), + ) + if respErr := checkResponse(resp); respErr != nil { + return nil, respErr + } if err != nil { return nil, errors.Wrap(err, "can't list todo in GitLab api") } @@ -325,10 +380,11 @@ func (g *gitlab) GetUnreads(user *UserInfo) ([]*internGitlab.Todo, error) { notifications = append(notifications, todo) } - return notifications, err + return notifications, nil } func (g *gitlab) ResolveNamespaceAndProject( + ctx context.Context, userInfo *UserInfo, fullPath string, allowPrivate bool, @@ -339,26 +395,33 @@ func (g *gitlab) ResolveNamespaceAndProject( return "", "", err } + fullPath = strings.TrimPrefix(fullPath, g.gitlabURL) + fullPath = strings.Trim(fullPath, "/") + // Search for matching user, group and project concurrently // // Note: Calls to Users and Groups could be replaced with a single call to Namespaces. // However, Namespaces endpoint will not return Group visibility, so we will have to make additional call anyway. // Making this extra call here should reduce overall latency. var ( - user *internGitlab.User - group *internGitlab.Group - project *internGitlab.Project - ctx, ctxCancel = context.WithTimeout(context.Background(), DefaultRequestTimeout) + user *internGitlab.User + group *internGitlab.Group + project *internGitlab.Project ) - defer ctxCancel() - errGroup, _ := errgroup.WithContext(ctx) + + errGroup, ctx := errgroup.WithContext(ctx) if strings.Count(fullPath, "/") == 0 { // This request only makes sense for single path component errGroup.Go(func() error { - users, _, err := client.Users.ListUsers(&internGitlab.ListUsersOptions{ + users, resp, err := client.Users.ListUsers(&internGitlab.ListUsersOptions{ Username: &fullPath, - }) + }, + internGitlab.WithContext(ctx), + ) + if respErr := checkResponse(resp); respErr != nil { + return respErr + } if err != nil { - return fmt.Errorf("failed to search users by username: %w", err) + return errors.Wrap(err, "failed to search users by username") } if len(users) == 1 { user = users[0] @@ -367,17 +430,17 @@ func (g *gitlab) ResolveNamespaceAndProject( }) } errGroup.Go(func() error { - gr, response, err := client.Groups.GetGroup(fullPath) - if err != nil && response != nil && response.StatusCode != http.StatusNotFound { - return fmt.Errorf("failed to retrieve group by path: %w", err) + gr, resp, err := client.Groups.GetGroup(fullPath, nil, internGitlab.WithContext(ctx)) + if err != nil && resp != nil && resp.StatusCode != http.StatusNotFound { + return errors.Wrap(err, "failed to retrieve group by path") } group = gr return nil }) errGroup.Go(func() error { - p, response, err := client.Projects.GetProject(fullPath, nil, nil) - if err != nil && response != nil && response.StatusCode != http.StatusNotFound { - return fmt.Errorf("failed to retrieve project by path: %w", err) + p, resp, err := client.Projects.GetProject(fullPath, nil, internGitlab.WithContext(ctx)) + if err != nil && resp != nil && resp.StatusCode != http.StatusNotFound { + return errors.Wrap(err, "failed to retrieve project by path") } project = p return nil @@ -393,9 +456,8 @@ func (g *gitlab) ResolveNamespaceAndProject( if group != nil { if !allowPrivate && group.Visibility != internGitlab.PublicVisibility { - return "", "", fmt.Errorf( - "you can't add a private group on this Mattermost instance: %w", - ErrPrivateResource, + return "", "", errors.Wrap(ErrPrivateResource, + "You can't add a private group on this Mattermost instance. Please enable private repositories in the System Console.", ) } return group.FullPath, "", nil @@ -403,9 +465,8 @@ func (g *gitlab) ResolveNamespaceAndProject( if project != nil { if !allowPrivate && project.Visibility != internGitlab.PublicVisibility { - return "", "", fmt.Errorf( - "you can't add a private project on this Mattermost instance: %w", - ErrPrivateResource, + return "", "", errors.Wrap(ErrPrivateResource, + "You can't add a private group on this Mattermost instance. Please enable private repositories in the System Console.", ) } return project.Namespace.FullPath, project.Path, nil diff --git a/server/gitlab/gitlab.go b/server/gitlab/gitlab.go index 9b992912..b5ed7b17 100644 --- a/server/gitlab/gitlab.go +++ b/server/gitlab/gitlab.go @@ -1,44 +1,44 @@ package gitlab import ( - "errors" + "context" + "net/http" "strings" - "time" + "github.com/pkg/errors" internGitlab "github.com/xanzy/go-gitlab" "golang.org/x/oauth2" ) -// DefaultRequestTimeout specifies default value for request timeouts. -const DefaultRequestTimeout = 5 * time.Second - -const gitlabdotcom = "https://gitlab.com" +const Gitlabdotcom = "https://gitlab.com" // Errors returned by this package. var ( ErrNotFound = errors.New("not found") + ErrForbidden = errors.New("access forbidden") ErrPrivateResource = errors.New("private resource") ) // Gitlab is a client to call GitLab api see New() to build one type Gitlab interface { - GetCurrentUser(userID string, token oauth2.Token) (*UserInfo, error) - GetUserDetails(user *UserInfo) (*internGitlab.User, error) - GetProject(user *UserInfo, owner, repo string) (*internGitlab.Project, error) - GetReviews(user *UserInfo) ([]*internGitlab.MergeRequest, error) - GetYourPrs(user *UserInfo) ([]*internGitlab.MergeRequest, error) - GetYourAssignments(user *UserInfo) ([]*internGitlab.Issue, error) - GetUnreads(user *UserInfo) ([]*internGitlab.Todo, error) - GetProjectHooks(user *UserInfo, owner string, repo string) ([]*WebhookInfo, error) - GetGroupHooks(user *UserInfo, owner string) ([]*WebhookInfo, error) - NewProjectHook(user *UserInfo, projectID interface{}, projectHookOptions *AddWebhookOptions) (*WebhookInfo, error) - NewGroupHook(user *UserInfo, groupName string, groupHookOptions *AddWebhookOptions) (*WebhookInfo, error) + GetCurrentUser(ctx context.Context, userID string, token oauth2.Token) (*UserInfo, error) + GetUserDetails(ctx context.Context, user *UserInfo) (*internGitlab.User, error) + GetProject(ctx context.Context, user *UserInfo, owner, repo string) (*internGitlab.Project, error) + GetReviews(ctx context.Context, user *UserInfo) ([]*internGitlab.MergeRequest, error) + GetYourPrs(ctx context.Context, user *UserInfo) ([]*internGitlab.MergeRequest, error) + GetYourAssignments(ctx context.Context, user *UserInfo) ([]*internGitlab.Issue, error) + GetUnreads(ctx context.Context, user *UserInfo) ([]*internGitlab.Todo, error) + GetProjectHooks(ctx context.Context, user *UserInfo, owner string, repo string) ([]*WebhookInfo, error) + GetGroupHooks(ctx context.Context, user *UserInfo, owner string) ([]*WebhookInfo, error) + NewProjectHook(ctx context.Context, user *UserInfo, projectID interface{}, projectHookOptions *AddWebhookOptions) (*WebhookInfo, error) + NewGroupHook(ctx context.Context, user *UserInfo, groupName string, groupHookOptions *AddWebhookOptions) (*WebhookInfo, error) // ResolveNamespaceAndProject accepts full path to User, Group or namespaced Project and returns corresponding // namespace and project name. // // ErrNotFound will be returned if no resource can be found. // If allowPrivate is set to false, and resolved group/project is private, ErrPrivateResource will be returned. ResolveNamespaceAndProject( + ctx context.Context, userInfo *UserInfo, fullPath string, allowPrivate bool, @@ -46,9 +46,9 @@ type Gitlab interface { } type gitlab struct { - enterpriseBaseURL string - gitlabGroup string - checkGroup func(projectNameWithGroup string) error + gitlabURL string + gitlabGroup string + checkGroup func(projectNameWithGroup string) error } // Scope identifies the scope of a webhook @@ -66,14 +66,43 @@ func (s Scope) String() string { } // New return a client to call GitLab API -func New(enterpriseBaseURL string, gitlabGroup string, checkGroup func(projectNameWithGroup string) error) Gitlab { - return &gitlab{enterpriseBaseURL: enterpriseBaseURL, gitlabGroup: gitlabGroup, checkGroup: checkGroup} +func New(gitlabURL string, gitlabGroup string, checkGroup func(projectNameWithGroup string) error) Gitlab { + if gitlabURL == "" { + gitlabURL = Gitlabdotcom + } + return &gitlab{gitlabURL: gitlabURL, gitlabGroup: gitlabGroup, checkGroup: checkGroup} } func (g *gitlab) gitlabConnect(token oauth2.Token) (*internGitlab.Client, error) { - if len(g.enterpriseBaseURL) == 0 || strings.EqualFold(g.enterpriseBaseURL, gitlabdotcom) { + if g.gitlabURL == "" || strings.EqualFold(g.gitlabURL, Gitlabdotcom) { return internGitlab.NewOAuthClient(token.AccessToken) } - return internGitlab.NewOAuthClient(token.AccessToken, internGitlab.WithBaseURL(g.enterpriseBaseURL)) + return internGitlab.NewOAuthClient(token.AccessToken, internGitlab.WithBaseURL(g.gitlabURL)) +} + +// checkResponse returns known errors based on the http status code. +func checkResponse(resp *internGitlab.Response) error { + if resp == nil { + return nil + } + + switch resp.StatusCode { + case http.StatusForbidden: + return ErrForbidden + case http.StatusNotFound: + return ErrNotFound + default: + return nil + } +} + +// PrettyError returns an err in a better readable way. +func PrettyError(err error) error { + var errResp *internGitlab.ErrorResponse + if errors.As(err, &errResp) { + return errors.New(errResp.Message) + } + + return err } diff --git a/server/gitlab/mocks/mock_gitlab.go b/server/gitlab/mocks/mock_gitlab.go index 85efafd2..65eb996a 100644 --- a/server/gitlab/mocks/mock_gitlab.go +++ b/server/gitlab/mocks/mock_gitlab.go @@ -1,219 +1,219 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: gitlab/gitlab.go +// Source: github.com/mattermost/mattermost-plugin-gitlab/server/gitlab (interfaces: Gitlab) // Package mock_gitlab is a generated GoMock package. package mock_gitlab import ( + context "context" reflect "reflect" gomock "github.com/golang/mock/gomock" + gitlab "github.com/mattermost/mattermost-plugin-gitlab/server/gitlab" gitlab0 "github.com/xanzy/go-gitlab" oauth2 "golang.org/x/oauth2" - - gitlab "github.com/mattermost/mattermost-plugin-gitlab/server/gitlab" ) -// MockGitlab is a mock of Gitlab interface +// MockGitlab is a mock of Gitlab interface. type MockGitlab struct { ctrl *gomock.Controller recorder *MockGitlabMockRecorder } -// MockGitlabMockRecorder is the mock recorder for MockGitlab +// MockGitlabMockRecorder is the mock recorder for MockGitlab. type MockGitlabMockRecorder struct { mock *MockGitlab } -// NewMockGitlab creates a new mock instance +// NewMockGitlab creates a new mock instance. func NewMockGitlab(ctrl *gomock.Controller) *MockGitlab { mock := &MockGitlab{ctrl: ctrl} mock.recorder = &MockGitlabMockRecorder{mock} return mock } -// EXPECT returns an object that allows the caller to indicate expected use +// EXPECT returns an object that allows the caller to indicate expected use. func (m *MockGitlab) EXPECT() *MockGitlabMockRecorder { return m.recorder } -// GetCurrentUser mocks base method -func (m *MockGitlab) GetCurrentUser(userID string, token oauth2.Token) (*gitlab.UserInfo, error) { +// GetCurrentUser mocks base method. +func (m *MockGitlab) GetCurrentUser(arg0 context.Context, arg1 string, arg2 oauth2.Token) (*gitlab.UserInfo, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetCurrentUser", userID, token) + ret := m.ctrl.Call(m, "GetCurrentUser", arg0, arg1, arg2) ret0, _ := ret[0].(*gitlab.UserInfo) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetCurrentUser indicates an expected call of GetCurrentUser -func (mr *MockGitlabMockRecorder) GetCurrentUser(userID, token interface{}) *gomock.Call { +// GetCurrentUser indicates an expected call of GetCurrentUser. +func (mr *MockGitlabMockRecorder) GetCurrentUser(arg0, arg1, arg2 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCurrentUser", reflect.TypeOf((*MockGitlab)(nil).GetCurrentUser), userID, token) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCurrentUser", reflect.TypeOf((*MockGitlab)(nil).GetCurrentUser), arg0, arg1, arg2) } -// GetUserDetails mocks base method -func (m *MockGitlab) GetUserDetails(user *gitlab.UserInfo) (*gitlab0.User, error) { +// GetGroupHooks mocks base method. +func (m *MockGitlab) GetGroupHooks(arg0 context.Context, arg1 *gitlab.UserInfo, arg2 string) ([]*gitlab.WebhookInfo, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetUserDetails", user) - ret0, _ := ret[0].(*gitlab0.User) + ret := m.ctrl.Call(m, "GetGroupHooks", arg0, arg1, arg2) + ret0, _ := ret[0].([]*gitlab.WebhookInfo) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetUserDetails indicates an expected call of GetUserDetails -func (mr *MockGitlabMockRecorder) GetUserDetails(user interface{}) *gomock.Call { +// GetGroupHooks indicates an expected call of GetGroupHooks. +func (mr *MockGitlabMockRecorder) GetGroupHooks(arg0, arg1, arg2 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUserDetails", reflect.TypeOf((*MockGitlab)(nil).GetUserDetails), user) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetGroupHooks", reflect.TypeOf((*MockGitlab)(nil).GetGroupHooks), arg0, arg1, arg2) } -// GetProject mocks base method -func (m *MockGitlab) GetProject(user *gitlab.UserInfo, owner, repo string) (*gitlab0.Project, error) { +// GetProject mocks base method. +func (m *MockGitlab) GetProject(arg0 context.Context, arg1 *gitlab.UserInfo, arg2, arg3 string) (*gitlab0.Project, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetProject", user, owner, repo) + ret := m.ctrl.Call(m, "GetProject", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(*gitlab0.Project) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetProject indicates an expected call of GetProject -func (mr *MockGitlabMockRecorder) GetProject(user, owner, repo interface{}) *gomock.Call { +// GetProject indicates an expected call of GetProject. +func (mr *MockGitlabMockRecorder) GetProject(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetProject", reflect.TypeOf((*MockGitlab)(nil).GetProject), user, owner, repo) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetProject", reflect.TypeOf((*MockGitlab)(nil).GetProject), arg0, arg1, arg2, arg3) } -// GetReviews mocks base method -func (m *MockGitlab) GetReviews(user *gitlab.UserInfo) ([]*gitlab0.MergeRequest, error) { +// GetProjectHooks mocks base method. +func (m *MockGitlab) GetProjectHooks(arg0 context.Context, arg1 *gitlab.UserInfo, arg2, arg3 string) ([]*gitlab.WebhookInfo, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetReviews", user) - ret0, _ := ret[0].([]*gitlab0.MergeRequest) + ret := m.ctrl.Call(m, "GetProjectHooks", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].([]*gitlab.WebhookInfo) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetReviews indicates an expected call of GetReviews -func (mr *MockGitlabMockRecorder) GetReviews(user interface{}) *gomock.Call { +// GetProjectHooks indicates an expected call of GetProjectHooks. +func (mr *MockGitlabMockRecorder) GetProjectHooks(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetReviews", reflect.TypeOf((*MockGitlab)(nil).GetReviews), user) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetProjectHooks", reflect.TypeOf((*MockGitlab)(nil).GetProjectHooks), arg0, arg1, arg2, arg3) } -// GetYourPrs mocks base method -func (m *MockGitlab) GetYourPrs(user *gitlab.UserInfo) ([]*gitlab0.MergeRequest, error) { +// GetReviews mocks base method. +func (m *MockGitlab) GetReviews(arg0 context.Context, arg1 *gitlab.UserInfo) ([]*gitlab0.MergeRequest, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetYourPrs", user) + ret := m.ctrl.Call(m, "GetReviews", arg0, arg1) ret0, _ := ret[0].([]*gitlab0.MergeRequest) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetYourPrs indicates an expected call of GetYourPrs -func (mr *MockGitlabMockRecorder) GetYourPrs(user interface{}) *gomock.Call { +// GetReviews indicates an expected call of GetReviews. +func (mr *MockGitlabMockRecorder) GetReviews(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetYourPrs", reflect.TypeOf((*MockGitlab)(nil).GetYourPrs), user) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetReviews", reflect.TypeOf((*MockGitlab)(nil).GetReviews), arg0, arg1) } -// GetYourAssignments mocks base method -func (m *MockGitlab) GetYourAssignments(user *gitlab.UserInfo) ([]*gitlab0.Issue, error) { +// GetUnreads mocks base method. +func (m *MockGitlab) GetUnreads(arg0 context.Context, arg1 *gitlab.UserInfo) ([]*gitlab0.Todo, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetYourAssignments", user) - ret0, _ := ret[0].([]*gitlab0.Issue) + ret := m.ctrl.Call(m, "GetUnreads", arg0, arg1) + ret0, _ := ret[0].([]*gitlab0.Todo) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetYourAssignments indicates an expected call of GetYourAssignments -func (mr *MockGitlabMockRecorder) GetYourAssignments(user interface{}) *gomock.Call { +// GetUnreads indicates an expected call of GetUnreads. +func (mr *MockGitlabMockRecorder) GetUnreads(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetYourAssignments", reflect.TypeOf((*MockGitlab)(nil).GetYourAssignments), user) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUnreads", reflect.TypeOf((*MockGitlab)(nil).GetUnreads), arg0, arg1) } -// GetUnreads mocks base method -func (m *MockGitlab) GetUnreads(user *gitlab.UserInfo) ([]*gitlab0.Todo, error) { +// GetUserDetails mocks base method. +func (m *MockGitlab) GetUserDetails(arg0 context.Context, arg1 *gitlab.UserInfo) (*gitlab0.User, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetUnreads", user) - ret0, _ := ret[0].([]*gitlab0.Todo) + ret := m.ctrl.Call(m, "GetUserDetails", arg0, arg1) + ret0, _ := ret[0].(*gitlab0.User) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetUnreads indicates an expected call of GetUnreads -func (mr *MockGitlabMockRecorder) GetUnreads(user interface{}) *gomock.Call { +// GetUserDetails indicates an expected call of GetUserDetails. +func (mr *MockGitlabMockRecorder) GetUserDetails(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUnreads", reflect.TypeOf((*MockGitlab)(nil).GetUnreads), user) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUserDetails", reflect.TypeOf((*MockGitlab)(nil).GetUserDetails), arg0, arg1) } -// GetProjectHooks mocks base method -func (m *MockGitlab) GetProjectHooks(user *gitlab.UserInfo, owner, repo string) ([]*gitlab.WebhookInfo, error) { +// GetYourAssignments mocks base method. +func (m *MockGitlab) GetYourAssignments(arg0 context.Context, arg1 *gitlab.UserInfo) ([]*gitlab0.Issue, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetProjectHooks", user, owner, repo) - ret0, _ := ret[0].([]*gitlab.WebhookInfo) + ret := m.ctrl.Call(m, "GetYourAssignments", arg0, arg1) + ret0, _ := ret[0].([]*gitlab0.Issue) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetProjectHooks indicates an expected call of GetProjectHooks -func (mr *MockGitlabMockRecorder) GetProjectHooks(user, owner, repo interface{}) *gomock.Call { +// GetYourAssignments indicates an expected call of GetYourAssignments. +func (mr *MockGitlabMockRecorder) GetYourAssignments(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetProjectHooks", reflect.TypeOf((*MockGitlab)(nil).GetProjectHooks), user, owner, repo) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetYourAssignments", reflect.TypeOf((*MockGitlab)(nil).GetYourAssignments), arg0, arg1) } -// GetGroupHooks mocks base method -func (m *MockGitlab) GetGroupHooks(user *gitlab.UserInfo, owner string) ([]*gitlab.WebhookInfo, error) { +// GetYourPrs mocks base method. +func (m *MockGitlab) GetYourPrs(arg0 context.Context, arg1 *gitlab.UserInfo) ([]*gitlab0.MergeRequest, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetGroupHooks", user, owner) - ret0, _ := ret[0].([]*gitlab.WebhookInfo) + ret := m.ctrl.Call(m, "GetYourPrs", arg0, arg1) + ret0, _ := ret[0].([]*gitlab0.MergeRequest) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetGroupHooks indicates an expected call of GetGroupHooks -func (mr *MockGitlabMockRecorder) GetGroupHooks(user, owner interface{}) *gomock.Call { +// GetYourPrs indicates an expected call of GetYourPrs. +func (mr *MockGitlabMockRecorder) GetYourPrs(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetGroupHooks", reflect.TypeOf((*MockGitlab)(nil).GetGroupHooks), user, owner) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetYourPrs", reflect.TypeOf((*MockGitlab)(nil).GetYourPrs), arg0, arg1) } -// NewProjectHook mocks base method -func (m *MockGitlab) NewProjectHook(user *gitlab.UserInfo, projectID interface{}, projectHookOptions *gitlab.AddWebhookOptions) (*gitlab.WebhookInfo, error) { +// NewGroupHook mocks base method. +func (m *MockGitlab) NewGroupHook(arg0 context.Context, arg1 *gitlab.UserInfo, arg2 string, arg3 *gitlab.AddWebhookOptions) (*gitlab.WebhookInfo, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "NewProjectHook", user, projectID, projectHookOptions) + ret := m.ctrl.Call(m, "NewGroupHook", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(*gitlab.WebhookInfo) ret1, _ := ret[1].(error) return ret0, ret1 } -// NewProjectHook indicates an expected call of NewProjectHook -func (mr *MockGitlabMockRecorder) NewProjectHook(user, projectID, projectHookOptions interface{}) *gomock.Call { +// NewGroupHook indicates an expected call of NewGroupHook. +func (mr *MockGitlabMockRecorder) NewGroupHook(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewProjectHook", reflect.TypeOf((*MockGitlab)(nil).NewProjectHook), user, projectID, projectHookOptions) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewGroupHook", reflect.TypeOf((*MockGitlab)(nil).NewGroupHook), arg0, arg1, arg2, arg3) } -// NewGroupHook mocks base method -func (m *MockGitlab) NewGroupHook(user *gitlab.UserInfo, groupName string, groupHookOptions *gitlab.AddWebhookOptions) (*gitlab.WebhookInfo, error) { +// NewProjectHook mocks base method. +func (m *MockGitlab) NewProjectHook(arg0 context.Context, arg1 *gitlab.UserInfo, arg2 interface{}, arg3 *gitlab.AddWebhookOptions) (*gitlab.WebhookInfo, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "NewGroupHook", user, groupName, groupHookOptions) + ret := m.ctrl.Call(m, "NewProjectHook", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(*gitlab.WebhookInfo) ret1, _ := ret[1].(error) return ret0, ret1 } -// NewGroupHook indicates an expected call of NewGroupHook -func (mr *MockGitlabMockRecorder) NewGroupHook(user, groupName, groupHookOptions interface{}) *gomock.Call { +// NewProjectHook indicates an expected call of NewProjectHook. +func (mr *MockGitlabMockRecorder) NewProjectHook(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewGroupHook", reflect.TypeOf((*MockGitlab)(nil).NewGroupHook), user, groupName, groupHookOptions) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewProjectHook", reflect.TypeOf((*MockGitlab)(nil).NewProjectHook), arg0, arg1, arg2, arg3) } -// ResolveNamespaceAndProject mocks base method -func (m *MockGitlab) ResolveNamespaceAndProject(userInfo *gitlab.UserInfo, fullPath string, allowPrivate bool) (string, string, error) { +// ResolveNamespaceAndProject mocks base method. +func (m *MockGitlab) ResolveNamespaceAndProject(arg0 context.Context, arg1 *gitlab.UserInfo, arg2 string, arg3 bool) (string, string, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ResolveNamespaceAndProject", userInfo, fullPath, allowPrivate) + ret := m.ctrl.Call(m, "ResolveNamespaceAndProject", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(string) ret1, _ := ret[1].(string) ret2, _ := ret[2].(error) return ret0, ret1, ret2 } -// ResolveNamespaceAndProject indicates an expected call of ResolveNamespaceAndProject -func (mr *MockGitlabMockRecorder) ResolveNamespaceAndProject(userInfo, fullPath, allowPrivate interface{}) *gomock.Call { +// ResolveNamespaceAndProject indicates an expected call of ResolveNamespaceAndProject. +func (mr *MockGitlabMockRecorder) ResolveNamespaceAndProject(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResolveNamespaceAndProject", reflect.TypeOf((*MockGitlab)(nil).ResolveNamespaceAndProject), userInfo, fullPath, allowPrivate) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResolveNamespaceAndProject", reflect.TypeOf((*MockGitlab)(nil).ResolveNamespaceAndProject), arg0, arg1, arg2, arg3) } diff --git a/server/gitlab/user.go b/server/gitlab/user.go index b24c5894..9793c769 100644 --- a/server/gitlab/user.go +++ b/server/gitlab/user.go @@ -1,6 +1,8 @@ package gitlab import ( + "context" + "github.com/mattermost/mattermost-server/v6/model" internGitlab "github.com/xanzy/go-gitlab" "golang.org/x/oauth2" @@ -24,13 +26,16 @@ type UserSettings struct { Notifications bool `json:"notifications"` } -func (g *gitlab) GetCurrentUser(userID string, token oauth2.Token) (*UserInfo, error) { +func (g *gitlab) GetCurrentUser(ctx context.Context, userID string, token oauth2.Token) (*UserInfo, error) { client, err := g.gitlabConnect(token) if err != nil { return nil, err } - gitUser, _, err := client.Users.CurrentUser() + gitUser, resp, err := client.Users.CurrentUser(internGitlab.WithContext(ctx)) + if respErr := checkResponse(resp); respErr != nil { + return nil, respErr + } if err != nil { return nil, err } @@ -49,12 +54,19 @@ func (g *gitlab) GetCurrentUser(userID string, token oauth2.Token) (*UserInfo, e }, nil } -func (g *gitlab) GetUserDetails(user *UserInfo) (*internGitlab.User, error) { +func (g *gitlab) GetUserDetails(ctx context.Context, user *UserInfo) (*internGitlab.User, error) { client, err := g.gitlabConnect(*user.Token) if err != nil { return nil, err } - gitUser, _, err := client.Users.CurrentUser() - return gitUser, err + gitUser, resp, err := client.Users.CurrentUser(internGitlab.WithContext(ctx)) + if respErr := checkResponse(resp); respErr != nil { + return nil, respErr + } + if err != nil { + return nil, err + } + + return gitUser, nil } diff --git a/server/gitlab/webhook.go b/server/gitlab/webhook.go index 2f25fbaa..859f7b48 100644 --- a/server/gitlab/webhook.go +++ b/server/gitlab/webhook.go @@ -1,6 +1,8 @@ package gitlab -import "time" +import ( + "time" +) // WebhookInfo Provides information about group or project hooks. type WebhookInfo struct { diff --git a/server/manifest.go b/server/manifest.go deleted file mode 100644 index 44e8ffaa..00000000 --- a/server/manifest.go +++ /dev/null @@ -1,12 +0,0 @@ -// This file is automatically generated. Do not modify it manually. -// Code generated .* DO NOT EDIT. - -package main - -var manifest = struct { - ID string - Version string -}{ - ID: "com.github.manland.mattermost-plugin-gitlab", - Version: "1.4.0", -} diff --git a/server/mocks/mock_gitlab.go b/server/mocks/mock_gitlab.go index e2469e3b..65eb996a 100644 --- a/server/mocks/mock_gitlab.go +++ b/server/mocks/mock_gitlab.go @@ -1,204 +1,219 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: gitlab/gitlab.go +// Source: github.com/mattermost/mattermost-plugin-gitlab/server/gitlab (interfaces: Gitlab) // Package mock_gitlab is a generated GoMock package. package mock_gitlab import ( + context "context" reflect "reflect" gomock "github.com/golang/mock/gomock" + gitlab "github.com/mattermost/mattermost-plugin-gitlab/server/gitlab" gitlab0 "github.com/xanzy/go-gitlab" oauth2 "golang.org/x/oauth2" - - gitlab "github.com/mattermost/mattermost-plugin-gitlab/server/gitlab" ) -// MockGitlab is a mock of Gitlab interface +// MockGitlab is a mock of Gitlab interface. type MockGitlab struct { ctrl *gomock.Controller recorder *MockGitlabMockRecorder } -// MockGitlabMockRecorder is the mock recorder for MockGitlab +// MockGitlabMockRecorder is the mock recorder for MockGitlab. type MockGitlabMockRecorder struct { mock *MockGitlab } -// NewMockGitlab creates a new mock instance +// NewMockGitlab creates a new mock instance. func NewMockGitlab(ctrl *gomock.Controller) *MockGitlab { mock := &MockGitlab{ctrl: ctrl} mock.recorder = &MockGitlabMockRecorder{mock} return mock } -// EXPECT returns an object that allows the caller to indicate expected use +// EXPECT returns an object that allows the caller to indicate expected use. func (m *MockGitlab) EXPECT() *MockGitlabMockRecorder { return m.recorder } -// GetCurrentUser mocks base method -func (m *MockGitlab) GetCurrentUser(userID string, token oauth2.Token) (*gitlab.UserInfo, error) { +// GetCurrentUser mocks base method. +func (m *MockGitlab) GetCurrentUser(arg0 context.Context, arg1 string, arg2 oauth2.Token) (*gitlab.UserInfo, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetCurrentUser", userID, token) + ret := m.ctrl.Call(m, "GetCurrentUser", arg0, arg1, arg2) ret0, _ := ret[0].(*gitlab.UserInfo) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetCurrentUser indicates an expected call of GetCurrentUser -func (mr *MockGitlabMockRecorder) GetCurrentUser(userID, token interface{}) *gomock.Call { +// GetCurrentUser indicates an expected call of GetCurrentUser. +func (mr *MockGitlabMockRecorder) GetCurrentUser(arg0, arg1, arg2 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCurrentUser", reflect.TypeOf((*MockGitlab)(nil).GetCurrentUser), userID, token) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCurrentUser", reflect.TypeOf((*MockGitlab)(nil).GetCurrentUser), arg0, arg1, arg2) } -// GetUserDetails mocks base method -func (m *MockGitlab) GetUserDetails(user *gitlab.UserInfo) (*gitlab0.User, error) { +// GetGroupHooks mocks base method. +func (m *MockGitlab) GetGroupHooks(arg0 context.Context, arg1 *gitlab.UserInfo, arg2 string) ([]*gitlab.WebhookInfo, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetUserDetails", user) - ret0, _ := ret[0].(*gitlab0.User) + ret := m.ctrl.Call(m, "GetGroupHooks", arg0, arg1, arg2) + ret0, _ := ret[0].([]*gitlab.WebhookInfo) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetUserDetails indicates an expected call of GetUserDetails -func (mr *MockGitlabMockRecorder) GetUserDetails(user interface{}) *gomock.Call { +// GetGroupHooks indicates an expected call of GetGroupHooks. +func (mr *MockGitlabMockRecorder) GetGroupHooks(arg0, arg1, arg2 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUserDetails", reflect.TypeOf((*MockGitlab)(nil).GetUserDetails), user) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetGroupHooks", reflect.TypeOf((*MockGitlab)(nil).GetGroupHooks), arg0, arg1, arg2) } -// GetProject mocks base method -func (m *MockGitlab) GetProject(user *gitlab.UserInfo, owner, repo string) (*gitlab0.Project, error) { +// GetProject mocks base method. +func (m *MockGitlab) GetProject(arg0 context.Context, arg1 *gitlab.UserInfo, arg2, arg3 string) (*gitlab0.Project, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetProject", user, owner, repo) + ret := m.ctrl.Call(m, "GetProject", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(*gitlab0.Project) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetProject indicates an expected call of GetProject -func (mr *MockGitlabMockRecorder) GetProject(user, owner, repo interface{}) *gomock.Call { +// GetProject indicates an expected call of GetProject. +func (mr *MockGitlabMockRecorder) GetProject(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetProject", reflect.TypeOf((*MockGitlab)(nil).GetProject), user, owner, repo) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetProject", reflect.TypeOf((*MockGitlab)(nil).GetProject), arg0, arg1, arg2, arg3) } -// GetReviews mocks base method -func (m *MockGitlab) GetReviews(user *gitlab.UserInfo) ([]*gitlab0.MergeRequest, error) { +// GetProjectHooks mocks base method. +func (m *MockGitlab) GetProjectHooks(arg0 context.Context, arg1 *gitlab.UserInfo, arg2, arg3 string) ([]*gitlab.WebhookInfo, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetReviews", user) - ret0, _ := ret[0].([]*gitlab0.MergeRequest) + ret := m.ctrl.Call(m, "GetProjectHooks", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].([]*gitlab.WebhookInfo) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetReviews indicates an expected call of GetReviews -func (mr *MockGitlabMockRecorder) GetReviews(user interface{}) *gomock.Call { +// GetProjectHooks indicates an expected call of GetProjectHooks. +func (mr *MockGitlabMockRecorder) GetProjectHooks(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetReviews", reflect.TypeOf((*MockGitlab)(nil).GetReviews), user) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetProjectHooks", reflect.TypeOf((*MockGitlab)(nil).GetProjectHooks), arg0, arg1, arg2, arg3) } -// GetYourPrs mocks base method -func (m *MockGitlab) GetYourPrs(user *gitlab.UserInfo) ([]*gitlab0.MergeRequest, error) { +// GetReviews mocks base method. +func (m *MockGitlab) GetReviews(arg0 context.Context, arg1 *gitlab.UserInfo) ([]*gitlab0.MergeRequest, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetYourPrs", user) + ret := m.ctrl.Call(m, "GetReviews", arg0, arg1) ret0, _ := ret[0].([]*gitlab0.MergeRequest) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetYourPrs indicates an expected call of GetYourPrs -func (mr *MockGitlabMockRecorder) GetYourPrs(user interface{}) *gomock.Call { +// GetReviews indicates an expected call of GetReviews. +func (mr *MockGitlabMockRecorder) GetReviews(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetYourPrs", reflect.TypeOf((*MockGitlab)(nil).GetYourPrs), user) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetReviews", reflect.TypeOf((*MockGitlab)(nil).GetReviews), arg0, arg1) } -// GetYourAssignments mocks base method -func (m *MockGitlab) GetYourAssignments(user *gitlab.UserInfo) ([]*gitlab0.Issue, error) { +// GetUnreads mocks base method. +func (m *MockGitlab) GetUnreads(arg0 context.Context, arg1 *gitlab.UserInfo) ([]*gitlab0.Todo, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetYourAssignments", user) - ret0, _ := ret[0].([]*gitlab0.Issue) + ret := m.ctrl.Call(m, "GetUnreads", arg0, arg1) + ret0, _ := ret[0].([]*gitlab0.Todo) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetYourAssignments indicates an expected call of GetYourAssignments -func (mr *MockGitlabMockRecorder) GetYourAssignments(user interface{}) *gomock.Call { +// GetUnreads indicates an expected call of GetUnreads. +func (mr *MockGitlabMockRecorder) GetUnreads(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetYourAssignments", reflect.TypeOf((*MockGitlab)(nil).GetYourAssignments), user) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUnreads", reflect.TypeOf((*MockGitlab)(nil).GetUnreads), arg0, arg1) } -// GetUnreads mocks base method -func (m *MockGitlab) GetUnreads(user *gitlab.UserInfo) ([]*gitlab0.Todo, error) { +// GetUserDetails mocks base method. +func (m *MockGitlab) GetUserDetails(arg0 context.Context, arg1 *gitlab.UserInfo) (*gitlab0.User, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetUnreads", user) - ret0, _ := ret[0].([]*gitlab0.Todo) + ret := m.ctrl.Call(m, "GetUserDetails", arg0, arg1) + ret0, _ := ret[0].(*gitlab0.User) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetUnreads indicates an expected call of GetUnreads -func (mr *MockGitlabMockRecorder) GetUnreads(user interface{}) *gomock.Call { +// GetUserDetails indicates an expected call of GetUserDetails. +func (mr *MockGitlabMockRecorder) GetUserDetails(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUnreads", reflect.TypeOf((*MockGitlab)(nil).GetUnreads), user) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUserDetails", reflect.TypeOf((*MockGitlab)(nil).GetUserDetails), arg0, arg1) } -// GetProjectHooks mocks base method -func (m *MockGitlab) GetProjectHooks(user *gitlab.UserInfo, owner, repo string) ([]*gitlab.WebhookInfo, error) { +// GetYourAssignments mocks base method. +func (m *MockGitlab) GetYourAssignments(arg0 context.Context, arg1 *gitlab.UserInfo) ([]*gitlab0.Issue, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetProjectHooks", user, owner, repo) - ret0, _ := ret[0].([]*gitlab.WebhookInfo) + ret := m.ctrl.Call(m, "GetYourAssignments", arg0, arg1) + ret0, _ := ret[0].([]*gitlab0.Issue) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetProjectHooks indicates an expected call of GetProjectHooks -func (mr *MockGitlabMockRecorder) GetProjectHooks(user, owner, repo interface{}) *gomock.Call { +// GetYourAssignments indicates an expected call of GetYourAssignments. +func (mr *MockGitlabMockRecorder) GetYourAssignments(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetProjectHooks", reflect.TypeOf((*MockGitlab)(nil).GetProjectHooks), user, owner, repo) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetYourAssignments", reflect.TypeOf((*MockGitlab)(nil).GetYourAssignments), arg0, arg1) } -// GetGroupHooks mocks base method -func (m *MockGitlab) GetGroupHooks(user *gitlab.UserInfo, owner string) ([]*gitlab.WebhookInfo, error) { +// GetYourPrs mocks base method. +func (m *MockGitlab) GetYourPrs(arg0 context.Context, arg1 *gitlab.UserInfo) ([]*gitlab0.MergeRequest, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetGroupHooks", user, owner) - ret0, _ := ret[0].([]*gitlab.WebhookInfo) + ret := m.ctrl.Call(m, "GetYourPrs", arg0, arg1) + ret0, _ := ret[0].([]*gitlab0.MergeRequest) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetYourPrs indicates an expected call of GetYourPrs. +func (mr *MockGitlabMockRecorder) GetYourPrs(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetYourPrs", reflect.TypeOf((*MockGitlab)(nil).GetYourPrs), arg0, arg1) +} + +// NewGroupHook mocks base method. +func (m *MockGitlab) NewGroupHook(arg0 context.Context, arg1 *gitlab.UserInfo, arg2 string, arg3 *gitlab.AddWebhookOptions) (*gitlab.WebhookInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NewGroupHook", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*gitlab.WebhookInfo) ret1, _ := ret[1].(error) return ret0, ret1 } -// GetGroupHooks indicates an expected call of GetGroupHooks -func (mr *MockGitlabMockRecorder) GetGroupHooks(user, owner interface{}) *gomock.Call { +// NewGroupHook indicates an expected call of NewGroupHook. +func (mr *MockGitlabMockRecorder) NewGroupHook(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetGroupHooks", reflect.TypeOf((*MockGitlab)(nil).GetGroupHooks), user, owner) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewGroupHook", reflect.TypeOf((*MockGitlab)(nil).NewGroupHook), arg0, arg1, arg2, arg3) } -// NewProjectHook mocks base method -func (m *MockGitlab) NewProjectHook(user *gitlab.UserInfo, projectID interface{}, projectHookOptions *gitlab0.AddProjectHookOptions) (*gitlab0.ProjectHook, error) { +// NewProjectHook mocks base method. +func (m *MockGitlab) NewProjectHook(arg0 context.Context, arg1 *gitlab.UserInfo, arg2 interface{}, arg3 *gitlab.AddWebhookOptions) (*gitlab.WebhookInfo, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "NewProjectHook", user, projectID, projectHookOptions) - ret0, _ := ret[0].(*gitlab0.ProjectHook) + ret := m.ctrl.Call(m, "NewProjectHook", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*gitlab.WebhookInfo) ret1, _ := ret[1].(error) return ret0, ret1 } -// NewProjectHook indicates an expected call of NewProjectHook -func (mr *MockGitlabMockRecorder) NewProjectHook(user, projectID, projectHookOptions interface{}) *gomock.Call { +// NewProjectHook indicates an expected call of NewProjectHook. +func (mr *MockGitlabMockRecorder) NewProjectHook(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewProjectHook", reflect.TypeOf((*MockGitlab)(nil).NewProjectHook), user, projectID, projectHookOptions) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewProjectHook", reflect.TypeOf((*MockGitlab)(nil).NewProjectHook), arg0, arg1, arg2, arg3) } -// ResolveNamespaceAndProject mocks base method -func (m *MockGitlab) ResolveNamespaceAndProject(userInfo *gitlab.UserInfo, fullPath string, allowPrivate bool) (string, string, error) { +// ResolveNamespaceAndProject mocks base method. +func (m *MockGitlab) ResolveNamespaceAndProject(arg0 context.Context, arg1 *gitlab.UserInfo, arg2 string, arg3 bool) (string, string, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ResolveNamespaceAndProject", userInfo, fullPath, allowPrivate) + ret := m.ctrl.Call(m, "ResolveNamespaceAndProject", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(string) ret1, _ := ret[1].(string) ret2, _ := ret[2].(error) return ret0, ret1, ret2 } -// ResolveNamespaceAndProject indicates an expected call of ResolveNamespaceAndProject -func (mr *MockGitlabMockRecorder) ResolveNamespaceAndProject(userInfo, fullPath, allowPrivate interface{}) *gomock.Call { +// ResolveNamespaceAndProject indicates an expected call of ResolveNamespaceAndProject. +func (mr *MockGitlabMockRecorder) ResolveNamespaceAndProject(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResolveNamespaceAndProject", reflect.TypeOf((*MockGitlab)(nil).ResolveNamespaceAndProject), userInfo, fullPath, allowPrivate) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResolveNamespaceAndProject", reflect.TypeOf((*MockGitlab)(nil).ResolveNamespaceAndProject), arg0, arg1, arg2, arg3) } diff --git a/server/oauth.go b/server/oauth.go new file mode 100644 index 00000000..97145b74 --- /dev/null +++ b/server/oauth.go @@ -0,0 +1,87 @@ +package main + +import ( + "sync" +) + +type OAuthCompleteEvent struct { + UserID string + Err error +} + +type OAuthBroker struct { + sendOAuthCompleteEvent func(event OAuthCompleteEvent) + + lock sync.RWMutex // Protects closed and pingSubs + closed bool + oauthCompleteSubs map[string][]chan error + mapCreate sync.Once +} + +func NewOAuthBroker(sendOAuthCompleteEvent func(event OAuthCompleteEvent)) *OAuthBroker { + return &OAuthBroker{ + sendOAuthCompleteEvent: sendOAuthCompleteEvent, + } +} + +func (ob *OAuthBroker) SubscribeOAuthComplete(userID string) <-chan error { + ob.lock.Lock() + defer ob.lock.Unlock() + + ob.mapCreate.Do(func() { + ob.oauthCompleteSubs = make(map[string][]chan error) + }) + + ch := make(chan error, 1) + ob.oauthCompleteSubs[userID] = append(ob.oauthCompleteSubs[userID], ch) + + return ch +} + +func (ob *OAuthBroker) UnsubscribeOAuthComplete(userID string, ch <-chan error) { + ob.lock.Lock() + defer ob.lock.Unlock() + + for i, sub := range ob.oauthCompleteSubs[userID] { + if sub == ch { + ob.oauthCompleteSubs[userID] = append(ob.oauthCompleteSubs[userID][:i], ob.oauthCompleteSubs[userID][i+1:]...) + break + } + } +} + +func (ob *OAuthBroker) publishOAuthComplete(userID string, err error, fromCluster bool) { + ob.lock.Lock() + defer ob.lock.Unlock() + + if ob.closed { + return + } + + for _, userSubs := range ob.oauthCompleteSubs[userID] { + // non-blocking send + select { + case userSubs <- err: + default: + } + } + + if !fromCluster { + ob.sendOAuthCompleteEvent(OAuthCompleteEvent{UserID: userID, Err: err}) + } +} + +func (ob *OAuthBroker) Close() { + ob.lock.Lock() + defer ob.lock.Unlock() + + if !ob.closed { + ob.closed = true + + for _, userSubs := range ob.oauthCompleteSubs { + for _, sub := range userSubs { + close(sub) + } + } + } +} diff --git a/server/plugin.go b/server/plugin.go index a0c0b826..676fbb68 100644 --- a/server/plugin.go +++ b/server/plugin.go @@ -1,9 +1,9 @@ package main import ( + "context" "encoding/json" "fmt" - "io/ioutil" "net/http" "net/url" "os" @@ -12,12 +12,17 @@ import ( "strings" "sync" + "github.com/gorilla/mux" pluginapi "github.com/mattermost/mattermost-plugin-api" + "github.com/mattermost/mattermost-plugin-api/experimental/bot/poster" + "github.com/mattermost/mattermost-plugin-api/experimental/telemetry" "github.com/mattermost/mattermost-server/v6/model" "github.com/mattermost/mattermost-server/v6/plugin" "github.com/pkg/errors" "golang.org/x/oauth2" + "golang.org/x/sync/errgroup" + root "github.com/mattermost/mattermost-plugin-gitlab" "github.com/mattermost/mattermost-plugin-gitlab/server/gitlab" "github.com/mattermost/mattermost-plugin-gitlab/server/webhook" ) @@ -37,16 +42,14 @@ const ( chimeraGitLabAppIdentifier = "plugin-gitlab" ) -var errEmptySiteURL = errors.New("siteURL is not set. Please set it and restart the plugin") +var ( + manifest model.Manifest = root.Manifest +) type Plugin struct { plugin.MattermostPlugin client *pluginapi.Client - BotUserID string - WebhookHandler webhook.Webhook - GitlabClient gitlab.Gitlab - // configurationLock synchronizes access to the configuration. configurationLock sync.RWMutex @@ -55,40 +58,58 @@ type Plugin struct { configuration *configuration chimeraURL string + + router *mux.Router + + telemetryClient telemetry.Client + tracker telemetry.Tracker + + BotUserID string + poster poster.Poster + flowManager *FlowManager + + oauthBroker *OAuthBroker + + WebhookHandler webhook.Webhook + GitlabClient gitlab.Gitlab } func (p *Plugin) OnActivate() error { p.client = pluginapi.NewClient(p.API, p.Driver) - config := p.getConfiguration() - if err := config.IsValid(); err != nil { - return err + siteURL := p.API.GetConfig().ServiceSettings.SiteURL + if siteURL == nil || *siteURL == "" { + return errors.New("siteURL is not set. Please set it and restart the plugin") + } + + err := p.setDefaultConfiguration() + if err != nil { + return errors.Wrap(err, "failed to set default configuration") } p.registerChimeraURL() - if config.UsePreregisteredApplication && p.chimeraURL == "" { + if p.getConfiguration().UsePreregisteredApplication && p.chimeraURL == "" { return errors.New("cannot use pre-registered application if Chimera URL is not set or empty. " + "For now using pre-registered application is intended for Cloud instances only. " + "If you are running on-prem disable the setting and use a custom application, otherwise set PluginSettings.ChimeraOAuthProxyURL " + "or MM_PLUGINSETTINGS_CHIMERAOAUTHPROXYURL environment variable") } - command, err := p.getCommand() - if err != nil { - return errors.Wrap(err, "failed to get command") - } + p.initializeAPI() - err = p.API.RegisterCommand(command) + p.telemetryClient, err = telemetry.NewRudderClient() if err != nil { - return errors.Wrap(err, "failed to register command") + p.API.LogWarn("Telemetry client not started", "error", err.Error()) } + p.oauthBroker = NewOAuthBroker(p.sendOAuthCompleteEvent) + botID, err := p.client.Bot.EnsureBot(&model.Bot{ Username: "gitlab", DisplayName: "GitLab Plugin", Description: "A bot account created by the plugin GitLab.", - }) + }, pluginapi.ProfileImagePath(filepath.Join("assets", "profile.png"))) if err != nil { return errors.Wrap(err, "can't ensure bot") } @@ -96,31 +117,67 @@ func (p *Plugin) OnActivate() error { p.WebhookHandler = webhook.NewWebhook(&gitlabRetreiver{p: p}) - bundlePath, err := p.API.GetBundlePath() - if err != nil { - return errors.Wrap(err, "can't retrieve bundle path") + p.poster = poster.NewPoster(&p.client.Post, p.BotUserID) + p.flowManager = p.NewFlowManager() + + return nil +} + +func (p *Plugin) OnDeactivate() error { + p.oauthBroker.Close() + + return nil +} + +func (p *Plugin) OnInstall(c *plugin.Context, event model.OnInstallEvent) error { + // Don't start wizard if OAuth is configured + if p.getConfiguration().IsOAuthConfigured() { + return nil } - profileImage, err := ioutil.ReadFile(filepath.Join(bundlePath, "assets", "profile.png")) + + return p.flowManager.StartSetupWizard(event.UserId, "") +} + +func (p *Plugin) OnSendDailyTelemetry() { + p.SendDailyTelemetry() +} + +func (p *Plugin) OnPluginClusterEvent(c *plugin.Context, ev model.PluginClusterEvent) { + p.HandleClusterEvent(ev) +} + +func (p *Plugin) setDefaultConfiguration() error { + config := p.getConfiguration() + + changed, err := config.setDefaults(pluginapi.IsCloud(p.API.GetLicense())) if err != nil { - return errors.Wrap(err, "failed to read profile image") - } - if appErr := p.API.SetProfileImage(botID, profileImage); appErr != nil { - return errors.Wrap(err, "failed to set profile image") + return err } - siteURL := p.API.GetConfig().ServiceSettings.SiteURL - if siteURL == nil || *siteURL == "" { - return errEmptySiteURL + if changed { + configMap, err := config.ToMap() + if err != nil { + return err + } + + appErr := p.API.SavePluginConfig(configMap) + if appErr != nil { + return appErr + } } return nil } +func (p *Plugin) getGitlabClient() gitlab.Gitlab { + return p.GitlabClient +} + func (p *Plugin) getOAuthConfig() *oauth2.Config { config := p.getConfiguration() scopes := []string{"api", "read_user"} - redirectURL := fmt.Sprintf("%s/plugins/%s/oauth/complete", *p.API.GetConfig().ServiceSettings.SiteURL, manifest.ID) + redirectURL := fmt.Sprintf("%s/plugins/%s/oauth/complete", *p.API.GetConfig().ServiceSettings.SiteURL, manifest.Id) if config.UsePreregisteredApplication { p.API.LogDebug("Using Chimera Proxy OAuth configuration") @@ -190,7 +247,7 @@ func (p *Plugin) storeGitlabUserInfo(info *gitlab.UserInfo) error { func (p *Plugin) deleteGitlabUserInfo(userID string) error { if err := p.API.KVDelete(userID + GitlabTokenKey); err != nil { - return fmt.Errorf("encountered error deleting GitLab user info: %w", err) + return errors.Wrap(err, "encountered error deleting GitLab user info") } return nil } @@ -219,28 +276,28 @@ func (p *Plugin) getGitlabUserInfoByMattermostID(userID string) (*gitlab.UserInf func (p *Plugin) storeGitlabToUserIDMapping(gitlabUsername, userID string) error { if err := p.API.KVSet(gitlabUsername+GitlabUsernameKey, []byte(userID)); err != nil { - return fmt.Errorf("encountered error saving GitLab username mapping: %w", err) + return errors.Wrap(err, "encountered error saving GitLab username mapping") } return nil } func (p *Plugin) storeGitlabIDToUserIDMapping(gitlabUsername string, gitlabID int) error { if err := p.API.KVSet(fmt.Sprintf("%d%s", gitlabID, GitlabIDUsernameKey), []byte(gitlabUsername)); err != nil { - return fmt.Errorf("encountered error saving GitLab id mapping: %w", err) + return errors.Wrap(err, "encountered error saving GitLab id mapping") } return nil } func (p *Plugin) deleteGitlabToUserIDMapping(gitlabUsername string) error { if err := p.API.KVDelete(gitlabUsername + GitlabUsernameKey); err != nil { - return fmt.Errorf("encountered error deleting GitLab username mapping: %w", err) + return errors.Wrap(err, "encountered error deleting GitLab username mapping") } return nil } func (p *Plugin) deleteGitlabIDToUserIDMapping(gitlabID int) error { if err := p.API.KVDelete(fmt.Sprintf("%d%s", gitlabID, GitlabIDUsernameKey)); err != nil { - return fmt.Errorf("encountered error deleting GitLab id mapping: %w", err) + return errors.Wrap(err, "encountered error deleting GitLab id mapping") } return nil } @@ -329,8 +386,8 @@ func (p *Plugin) CreateBotDMPost(userID, message, postType string) *model.AppErr return nil } -func (p *Plugin) PostToDo(info *gitlab.UserInfo) { - hasTodo, text, err := p.GetToDo(info) +func (p *Plugin) PostToDo(ctx context.Context, info *gitlab.UserInfo) { + hasTodo, text, err := p.GetToDo(ctx, info) if err != nil { p.API.LogError("can't post todo", "err", err.Error()) return @@ -344,99 +401,130 @@ func (p *Plugin) PostToDo(info *gitlab.UserInfo) { } } -func (p *Plugin) GetToDo(user *gitlab.UserInfo) (bool, string, error) { - var hasTodo bool +func (p *Plugin) GetToDo(ctx context.Context, user *gitlab.UserInfo) (bool, string, error) { + hasTodo := false - unreads, err := p.GitlabClient.GetUnreads(user) - if err != nil { - return false, "", err - } + g, ctx := errgroup.WithContext(ctx) - yourAssignments, err := p.GitlabClient.GetYourAssignments(user) - if err != nil { - return false, "", err - } + notificationText := "" + g.Go(func() error { + unreads, err := p.GitlabClient.GetUnreads(ctx, user) + if err != nil { + return err + } - yourMergeRequests, err := p.GitlabClient.GetYourPrs(user) - if err != nil { - return false, "", err - } + notificationCount := 0 + notificationContent := "" - reviews, err := p.GitlabClient.GetReviews(user) - if err != nil { - return false, "", err - } + for _, n := range unreads { + if p.isNamespaceAllowed(n.Project.NameWithNamespace) != nil { + continue + } + notificationCount++ + notificationContent += fmt.Sprintf("* %v : [%v](%v)\n", n.ActionName, n.Target.Title, n.TargetURL) + } - text := "##### Unread Messages\n" + if notificationCount == 0 { + notificationText += "You don't have any unread messages.\n" + } else { + notificationText += fmt.Sprintf("You have %v unread messages:\n", notificationCount) + notificationText += notificationContent - notificationCount := 0 - notificationContent := "" - for _, n := range unreads { - if p.isNamespaceAllowed(n.Project.NameWithNamespace) != nil { - continue + hasTodo = true } - notificationCount++ - notificationContent += fmt.Sprintf("* %v : [%v](%v)\n", n.ActionName, n.Target.Title, n.TargetURL) - } - if notificationCount == 0 { - text += "You don't have any unread messages.\n" - } else { - text += fmt.Sprintf("You have %v unread messages:\n", notificationCount) - text += notificationContent + return nil + }) - hasTodo = true - } + reviewText := "" + g.Go(func() error { + reviews, err := p.GitlabClient.GetReviews(ctx, user) + if err != nil { + return err + } - text += "##### Review Requests\n" + if len(reviews) == 0 { + reviewText += "You don't have any merge requests awaiting your review.\n" + } else { + reviewText += fmt.Sprintf("You have %v merge requests awaiting your review:\n", len(reviews)) - if len(reviews) == 0 { - text += "You don't have any merge requests awaiting your review.\n" - } else { - text += fmt.Sprintf("You have %v merge requests awaiting your review:\n", len(reviews)) + for _, pr := range reviews { + reviewText += fmt.Sprintf("* [%v](%v)\n", pr.Title, pr.WebURL) + } - for _, pr := range reviews { - text += fmt.Sprintf("* [%v](%v)\n", pr.Title, pr.WebURL) + hasTodo = true } - hasTodo = true - } + return nil + }) - text += "##### Assignments\n" + assignmentText := "" + g.Go(func() error { + yourAssignments, err := p.GitlabClient.GetYourAssignments(ctx, user) + if err != nil { + return err + } + + if len(yourAssignments) == 0 { + assignmentText += "You don't have any issues awaiting your dev.\n" + } else { + assignmentText += fmt.Sprintf("You have %v issues awaiting dev:\n", len(yourAssignments)) - if len(yourAssignments) == 0 { - text += "You don't have any issues awaiting your dev.\n" - } else { - text += fmt.Sprintf("You have %v issues awaiting dev:\n", len(yourAssignments)) + for _, pr := range yourAssignments { + assignmentText += fmt.Sprintf("* [%v](%v)\n", pr.Title, pr.WebURL) + } - for _, pr := range yourAssignments { - text += fmt.Sprintf("* [%v](%v)\n", pr.Title, pr.WebURL) + hasTodo = true } - hasTodo = true - } + return nil + }) - text += "##### Your Open Merge Requests\n" + mergeRequestText := "" + g.Go(func() error { + mergeRequests, err := p.GitlabClient.GetYourPrs(ctx, user) + if err != nil { + return err + } + + if len(mergeRequests) == 0 { + mergeRequestText += "You don't have any open merge requests.\n" + } else { + mergeRequestText += fmt.Sprintf("You have %v open merge requests:\n", len(mergeRequests)) - if len(yourMergeRequests) == 0 { - text += "You don't have any open merge requests.\n" - } else { - text += fmt.Sprintf("You have %v open merge requests:\n", len(yourMergeRequests)) + for _, pr := range mergeRequests { + mergeRequestText += fmt.Sprintf("* [%v](%v)\n", pr.Title, pr.WebURL) + } - for _, pr := range yourMergeRequests { - text += fmt.Sprintf("* [%v](%v)\n", pr.Title, pr.WebURL) + hasTodo = true } - hasTodo = true + return nil + }) + + if err := g.Wait(); err != nil { + return false, "", err } + text := "##### Unread Messages\n" + text += notificationText + + text += "##### Review Requests\n" + text += reviewText + + text += "##### Assignments\n" + text += assignmentText + + text += "##### Your Open Merge Requests\n" + text += mergeRequestText + return hasTodo, text, nil } func (p *Plugin) isNamespaceAllowed(namespace string) error { allowedNamespace := strings.TrimSpace(p.getConfiguration().GitlabGroup) if allowedNamespace != "" && allowedNamespace != namespace && !strings.HasPrefix(namespace, allowedNamespace) { - return fmt.Errorf("only repositories in the %s namespace are allowed", allowedNamespace) + return errors.Errorf("only repositories in the %s namespace are allowed", allowedNamespace) } return nil @@ -452,14 +540,14 @@ func (p *Plugin) sendRefreshEvent(userID string) { // HasProjectHook checks if the subscribed GitLab Project or its parrent Group has a webhook // with a URL that matches the Mattermost Site URL. -func (p *Plugin) HasProjectHook(user *gitlab.UserInfo, namespace string, project string) (bool, error) { - hooks, err := p.GitlabClient.GetProjectHooks(user, namespace, project) +func (p *Plugin) HasProjectHook(ctx context.Context, user *gitlab.UserInfo, namespace string, project string) (bool, error) { + hooks, err := p.GitlabClient.GetProjectHooks(ctx, user, namespace, project) if err != nil { return false, errors.New("unable to connect to GitLab") } // ignore error because many project won't be part of groups - hasGroupHook, _ := p.HasGroupHook(user, namespace) + hasGroupHook, _ := p.HasGroupHook(ctx, user, namespace) if hasGroupHook { return true, err @@ -478,8 +566,8 @@ func (p *Plugin) HasProjectHook(user *gitlab.UserInfo, namespace string, project // HasGroupHook checks if the subscribed GitLab Group has a webhook // with a URL that matches the Mattermost Site URL. -func (p *Plugin) HasGroupHook(user *gitlab.UserInfo, namespace string) (bool, error) { - hooks, err := p.GitlabClient.GetGroupHooks(user, namespace) +func (p *Plugin) HasGroupHook(ctx context.Context, user *gitlab.UserInfo, namespace string) (bool, error) { + hooks, err := p.GitlabClient.GetGroupHooks(ctx, user, namespace) if err != nil { return false, errors.New("unable to connect to GitLab") } diff --git a/server/subscription/subscription.go b/server/subscription/subscription.go index 1f6eea62..a67adbfb 100644 --- a/server/subscription/subscription.go +++ b/server/subscription/subscription.go @@ -1,9 +1,9 @@ package subscription import ( - "errors" - "fmt" "strings" + + "github.com/pkg/errors" ) var allFeatures = map[string]bool{ @@ -40,7 +40,7 @@ func New(channelID, creatorID, features, repository string) (*Subscription, erro } } if len(badFeatures) > 0 { - return nil, fmt.Errorf("unknown features %s", strings.Join(badFeatures, ",")) + return nil, errors.Errorf("unknown features %s", strings.Join(badFeatures, ",")) } return &Subscription{ ChannelID: channelID, diff --git a/server/subscriptions.go b/server/subscriptions.go index 241cee05..a4ba19a1 100644 --- a/server/subscriptions.go +++ b/server/subscriptions.go @@ -2,8 +2,10 @@ package main import ( "bytes" + "context" "encoding/json" - "errors" + + "github.com/pkg/errors" "github.com/mattermost/mattermost-plugin-gitlab/server/gitlab" "github.com/mattermost/mattermost-plugin-gitlab/server/subscription" @@ -111,6 +113,7 @@ func (p *Plugin) StoreSubscriptions(s *Subscriptions) error { } func (p *Plugin) GetSubscribedChannelsForProject( + ctx context.Context, namespace string, project string, isPublicVisibility bool, @@ -141,7 +144,7 @@ func (p *Plugin) GetSubscribedChannelsForProject( subsToReturn := make([]*subscription.Subscription, 0, len(subsForRepo)) for _, sub := range subsForRepo { - if !isPublicVisibility && !p.permissionToProject(sub.CreatorID, namespace, project) { + if !isPublicVisibility && !p.permissionToProject(ctx, sub.CreatorID, namespace, project) { continue } subsToReturn = append(subsToReturn, sub) diff --git a/server/telemetry.go b/server/telemetry.go new file mode 100644 index 00000000..8f98b913 --- /dev/null +++ b/server/telemetry.go @@ -0,0 +1,53 @@ +package main + +import ( + "strings" + + pluginapi "github.com/mattermost/mattermost-plugin-api" + "github.com/pkg/errors" +) + +const ( + keysPerPage = 1000 +) + +func (p *Plugin) SendDailyTelemetry() { + config := p.getConfiguration() + + connectedUserCount, err := p.getConnectedUserCount() + if err != nil { + p.API.LogWarn("Failed to get the number of connected users for telemetry", "error", err) + } + + _ = p.tracker.TrackEvent("stats", map[string]interface{}{ + "connected_user_count": connectedUserCount, + "is_oauth_configured": config.IsOAuthConfigured(), + "is_sass": config.IsSASS(), + "is_group_locked": config.GitlabGroup != "", + "enable_private_repo": config.EnablePrivateRepo, + "Use_preregistered_application": config.UsePreregisteredApplication, + }) +} + +func (p *Plugin) getConnectedUserCount() (int64, error) { + checker := func(key string) (keep bool, err error) { + return strings.HasSuffix(key, GitlabTokenKey), nil + } + + var count int64 + + for i := 0; ; i++ { + keys, err := p.client.KV.ListKeys(i, keysPerPage, pluginapi.WithChecker(checker)) + if err != nil { + return 0, errors.Wrapf(err, "failed to list keys - page, %d", i) + } + + count += int64(len(keys)) + + if len(keys) < keysPerPage { + break + } + } + + return count, nil +} diff --git a/server/utils.go b/server/utils.go index 89c83c70..82380a3a 100644 --- a/server/utils.go +++ b/server/utils.go @@ -6,11 +6,13 @@ import ( "crypto/cipher" "crypto/rand" "encoding/base64" - "errors" "fmt" "io" + "net/url" "strings" "unicode" + + "github.com/pkg/errors" ) func pad(src []byte) []byte { @@ -121,3 +123,21 @@ func parseGitlabUsernamesFromText(text string) []string { func fullPathFromNamespaceAndProject(namespace, project string) string { return fmt.Sprintf("%s/%s", namespace, project) } + +// isValidURL checks if a given URL is a valid URL with a host and a http or http scheme. +func isValidURL(rawURL string) error { + u, err := url.ParseRequestURI(rawURL) + if err != nil { + return err + } + + if u.Scheme != "http" && u.Scheme != "https" { + return errors.Errorf("URL schema must either be %q or %q", "http", "https") + } + + if u.Host == "" { + return errors.New("URL must contain a host") + } + + return nil +} diff --git a/server/webhook.go b/server/webhook.go index 66ec36c3..637702ab 100644 --- a/server/webhook.go +++ b/server/webhook.go @@ -1,18 +1,25 @@ package main import ( + "context" "fmt" - "io/ioutil" + "io" "net/http" + "time" gitlabLib "github.com/xanzy/go-gitlab" + "github.com/mattermost/mattermost-plugin-gitlab/server/gitlab" "github.com/mattermost/mattermost-plugin-gitlab/server/subscription" "github.com/mattermost/mattermost-plugin-gitlab/server/webhook" "github.com/mattermost/mattermost-server/v6/model" ) +const ( + webhookTimeout = 10 * time.Second +) + type gitlabRetreiver struct { p *Plugin } @@ -36,36 +43,39 @@ func (g *gitlabRetreiver) ParseGitlabUsernamesFromText(text string) []string { } func (g *gitlabRetreiver) GetSubscribedChannelsForProject( + ctx context.Context, namespace string, project string, isPublicVisibility bool, ) []*subscription.Subscription { - return g.p.GetSubscribedChannelsForProject(namespace, project, isPublicVisibility) + return g.p.GetSubscribedChannelsForProject(ctx, namespace, project, isPublicVisibility) } func (p *Plugin) handleWebhook(w http.ResponseWriter, r *http.Request) { config := p.getConfiguration() signature := r.Header.Get("X-Gitlab-Token") - - body, err := ioutil.ReadAll(r.Body) - if err != nil { - http.Error(w, "Bad request body", http.StatusBadRequest) + if config.WebhookSecret != signature { + http.Error(w, "Not authorized", http.StatusUnauthorized) return } - if config.WebhookSecret != signature { - http.Error(w, "Not authorized", http.StatusUnauthorized) + body, err := io.ReadAll(r.Body) + if err != nil { + http.Error(w, "Bad request body", http.StatusBadRequest) return } event, err := gitlabLib.ParseWebhook(gitlabLib.WebhookEventType(r), body) if err != nil { - p.API.LogError("can't parse webhook", "err", err.Error(), "header", r.Header.Get("X-Gitlab-Event"), "event", string(body)) + p.API.LogDebug("Can't parse webhook", "err", err.Error(), "header", r.Header.Get("X-Gitlab-Event"), "event", string(body)) http.Error(w, "Unable to handle request", http.StatusBadRequest) return } + ctx, cancel := context.WithTimeout(context.Background(), webhookTimeout) + defer cancel() + var repoPrivate bool var pathWithNamespace string var handlers []*webhook.HandleWebhook @@ -77,39 +87,39 @@ func (p *Plugin) handleWebhook(w http.ResponseWriter, r *http.Request) { repoPrivate = event.Project.Visibility == gitlabLib.PrivateVisibility pathWithNamespace = event.Project.PathWithNamespace fromUser = event.User.Username - handlers, errHandler = p.WebhookHandler.HandleMergeRequest(event) + handlers, errHandler = p.WebhookHandler.HandleMergeRequest(ctx, event) case *gitlabLib.IssueEvent: repoPrivate = event.Project.Visibility == gitlabLib.PrivateVisibility pathWithNamespace = event.Project.PathWithNamespace fromUser = event.User.Username - handlers, errHandler = p.WebhookHandler.HandleIssue(event) + handlers, errHandler = p.WebhookHandler.HandleIssue(ctx, event) case *gitlabLib.IssueCommentEvent: repoPrivate = event.Project.Visibility == gitlabLib.PrivateVisibility pathWithNamespace = event.Project.PathWithNamespace fromUser = event.User.Username - handlers, errHandler = p.WebhookHandler.HandleIssueComment(event) + handlers, errHandler = p.WebhookHandler.HandleIssueComment(ctx, event) case *gitlabLib.MergeCommentEvent: repoPrivate = event.Project.Visibility == gitlabLib.PrivateVisibility pathWithNamespace = event.Project.PathWithNamespace fromUser = event.User.Username - handlers, errHandler = p.WebhookHandler.HandleMergeRequestComment(event) + handlers, errHandler = p.WebhookHandler.HandleMergeRequestComment(ctx, event) case *gitlabLib.PushEvent: repoPrivate = event.Project.Visibility == gitlabLib.PrivateVisibility pathWithNamespace = event.Project.PathWithNamespace fromUser = event.UserName - handlers, errHandler = p.WebhookHandler.HandlePush(event) + handlers, errHandler = p.WebhookHandler.HandlePush(ctx, event) case *gitlabLib.PipelineEvent: repoPrivate = event.Project.Visibility == gitlabLib.PrivateVisibility pathWithNamespace = event.Project.PathWithNamespace fromUser = event.User.Username - handlers, errHandler = p.WebhookHandler.HandlePipeline(event) + handlers, errHandler = p.WebhookHandler.HandlePipeline(ctx, event) case *gitlabLib.TagEvent: repoPrivate = event.Project.Visibility == gitlabLib.PrivateVisibility pathWithNamespace = event.Project.PathWithNamespace fromUser = event.UserName - handlers, errHandler = p.WebhookHandler.HandleTag(event) + handlers, errHandler = p.WebhookHandler.HandleTag(ctx, event) default: - p.API.LogWarn("event type not implemented", "type", string(gitlabLib.WebhookEventType(r))) + p.API.LogDebug("Event type not implemented", "type", string(gitlabLib.WebhookEventType(r))) return } @@ -117,12 +127,12 @@ func (p *Plugin) handleWebhook(w http.ResponseWriter, r *http.Request) { return } - if errCheckGroup := p.isNamespaceAllowed(pathWithNamespace); errCheckGroup != nil { + if err = p.isNamespaceAllowed(pathWithNamespace); err != nil { return } if errHandler != nil { - p.API.LogError("error handler when building webhook notif", "err", err) + p.API.LogDebug("Error when handling webhook event", "err", err) return } @@ -173,7 +183,7 @@ func (p *Plugin) sendRefreshIfNotAlreadySent(alreadySentRefresh map[string]bool, return userMattermostID } -func (p *Plugin) permissionToProject(userID, namespace, project string) bool { +func (p *Plugin) permissionToProject(ctx context.Context, userID, namespace, project string) bool { if userID == "" { return false } @@ -187,7 +197,7 @@ func (p *Plugin) permissionToProject(userID, namespace, project string) bool { return false } - if result, err := p.GitlabClient.GetProject(info, namespace, project); result == nil || err != nil { + if result, err := p.GitlabClient.GetProject(ctx, info, namespace, project); result == nil || err != nil { if err != nil { p.API.LogError("can't get project in webhook", "err", err.Error(), "project", namespace+"/"+project) } @@ -195,3 +205,26 @@ func (p *Plugin) permissionToProject(userID, namespace, project string) bool { } return true } + +func CreateHook(ctx context.Context, gitlabClient gitlab.Gitlab, info *gitlab.UserInfo, group, project string, hookOptions *gitlab.AddWebhookOptions) (*gitlab.WebhookInfo, error) { + // If project scope + if project != "" { + project, err := gitlabClient.GetProject(ctx, info, group, project) + if err != nil { + return nil, err + } + newWebhook, err := gitlabClient.NewProjectHook(ctx, info, project.ID, hookOptions) + if err != nil { + return nil, err + } + return newWebhook, nil + } + + // If webhook is group scoped + newWebhook, err := gitlabClient.NewGroupHook(ctx, info, group, hookOptions) + if err != nil { + return nil, err + } + + return newWebhook, nil +} diff --git a/server/webhook/issue.go b/server/webhook/issue.go index 1bbd8ef5..341a9ee1 100644 --- a/server/webhook/issue.go +++ b/server/webhook/issue.go @@ -1,17 +1,18 @@ package webhook import ( + "context" "fmt" "github.com/xanzy/go-gitlab" ) -func (w *webhook) HandleIssue(event *gitlab.IssueEvent) ([]*HandleWebhook, error) { +func (w *webhook) HandleIssue(ctx context.Context, event *gitlab.IssueEvent) ([]*HandleWebhook, error) { handlers, err := w.handleDMIssue(event) if err != nil { return nil, err } - handlers2, err := w.handleChannelIssue(event) + handlers2, err := w.handleChannelIssue(ctx, event) if err != nil { return nil, err } @@ -26,7 +27,7 @@ func (w *webhook) handleDMIssue(event *gitlab.IssueEvent) ([]*HandleWebhook, err switch event.ObjectAttributes.Action { case actionOpen: - if len(event.Assignees) > 0 { + if event.Assignees != nil && len(*event.Assignees) > 0 { message = fmt.Sprintf("[%s](%s) assigned you to issue [%s#%v](%s)", senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername), event.Project.PathWithNamespace, event.ObjectAttributes.IID, event.ObjectAttributes.URL) } case actionClose: @@ -35,12 +36,14 @@ func (w *webhook) handleDMIssue(event *gitlab.IssueEvent) ([]*HandleWebhook, err message = fmt.Sprintf("[%s](%s) reopened your issue [%s#%v](%s)", senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername), event.Project.PathWithNamespace, event.ObjectAttributes.IID, event.ObjectAttributes.URL) } - if len(message) > 0 { - toUsers := make([]string, len(event.Assignees)+1) - for index, assignee := range event.Assignees { - toUsers[index] = assignee.Username + if message != "" { + toUsers := []string{} + if event.Assignees != nil { + for _, assignee := range *event.Assignees { + toUsers = append(toUsers, assignee.Username) + } } - toUsers[len(toUsers)-1] = authorGitlabUsername + toUsers = append(toUsers, authorGitlabUsername) handlers := []*HandleWebhook{{ Message: message, @@ -62,7 +65,7 @@ func (w *webhook) handleDMIssue(event *gitlab.IssueEvent) ([]*HandleWebhook, err return []*HandleWebhook{}, nil } -func (w *webhook) handleChannelIssue(event *gitlab.IssueEvent) ([]*HandleWebhook, error) { +func (w *webhook) handleChannelIssue(ctx context.Context, event *gitlab.IssueEvent) ([]*HandleWebhook, error) { issue := event.ObjectAttributes senderGitlabUsername := event.User.Username repo := event.Project @@ -79,7 +82,7 @@ func (w *webhook) handleChannelIssue(event *gitlab.IssueEvent) ([]*HandleWebhook message = fmt.Sprintf("[%s] Issue [%s](%s) reopened by [%s](%s)", repo.PathWithNamespace, issue.Title, issue.URL, senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername)) case actionUpdate: if len(event.Changes.Labels.Current) > 0 && !sameLabels(event.Changes.Labels.Current, event.Changes.Labels.Previous) { - message = fmt.Sprintf("#### %s\n##### [%s#%v](%s)\n###### issue labeled `%s` by [%s](%s) on [%s](%s)\n\n%s", issue.Title, repo.PathWithNamespace, issue.IID, issue.URL, labelToString(event.Changes.Labels.Current), event.User.Username, event.User.WebsiteURL, issue.UpdatedAt, issue.URL, sanitizeDescription(issue.Description)) + message = fmt.Sprintf("#### %s\n##### [%s#%v](%s)\n###### issue labeled `%s` by [%s](%s) on [%s](%s)\n\n%s", issue.Title, repo.PathWithNamespace, issue.IID, issue.URL, labelToString(event.Changes.Labels.Current), event.User.Username, w.gitlabRetreiver.GetUserURL(event.User.Username), issue.UpdatedAt, issue.URL, sanitizeDescription(issue.Description)) } } @@ -87,7 +90,7 @@ func (w *webhook) handleChannelIssue(event *gitlab.IssueEvent) ([]*HandleWebhook toChannels := make([]string, 0) namespace, project := normalizeNamespacedProject(repo.PathWithNamespace) subs := w.gitlabRetreiver.GetSubscribedChannelsForProject( - namespace, project, + ctx, namespace, project, repo.Visibility == gitlab.PublicVisibility, ) for _, sub := range subs { diff --git a/server/webhook/issue_test.go b/server/webhook/issue_test.go index 45f4bba3..cd0a9be5 100644 --- a/server/webhook/issue_test.go +++ b/server/webhook/issue_test.go @@ -1,6 +1,7 @@ package webhook import ( + "context" "encoding/json" "strings" "testing" @@ -110,7 +111,7 @@ func TestIssueWebhook(t *testing.T) { if err := json.Unmarshal([]byte(test.fixture), issueEvent); err != nil { assert.Fail(t, "can't unmarshal fixture") } - res, err := w.HandleIssue(issueEvent) + res, err := w.HandleIssue(context.Background(), issueEvent) assert.Empty(t, err) assert.Equal(t, len(test.res), len(res)) for index := range res { diff --git a/server/webhook/merge_request.go b/server/webhook/merge_request.go index ce26691b..3802eb2a 100644 --- a/server/webhook/merge_request.go +++ b/server/webhook/merge_request.go @@ -1,17 +1,18 @@ package webhook import ( + "context" "fmt" "github.com/xanzy/go-gitlab" ) -func (w *webhook) HandleMergeRequest(event *gitlab.MergeEvent) ([]*HandleWebhook, error) { +func (w *webhook) HandleMergeRequest(ctx context.Context, event *gitlab.MergeEvent) ([]*HandleWebhook, error) { handlers, err := w.handleDMMergeRequest(event) if err != nil { return nil, err } - handlers2, err := w.handleChannelMergeRequest(event) + handlers2, err := w.handleChannelMergeRequest(ctx, event) if err != nil { return nil, err } @@ -65,7 +66,7 @@ func (w *webhook) handleDMMergeRequest(event *gitlab.MergeEvent) ([]*HandleWebho return []*HandleWebhook{{From: senderGitlabUsername}}, nil } -func (w *webhook) handleChannelMergeRequest(event *gitlab.MergeEvent) ([]*HandleWebhook, error) { +func (w *webhook) handleChannelMergeRequest(ctx context.Context, event *gitlab.MergeEvent) ([]*HandleWebhook, error) { senderGitlabUsername := event.User.Username pr := event.ObjectAttributes repo := event.Project @@ -88,7 +89,7 @@ func (w *webhook) handleChannelMergeRequest(event *gitlab.MergeEvent) ([]*Handle toChannels := make([]string, 0) namespace, project := normalizeNamespacedProject(repo.PathWithNamespace) subs := w.gitlabRetreiver.GetSubscribedChannelsForProject( - namespace, project, + ctx, namespace, project, repo.Visibility == gitlab.PublicVisibility, ) for _, sub := range subs { @@ -96,7 +97,7 @@ func (w *webhook) handleChannelMergeRequest(event *gitlab.MergeEvent) ([]*Handle continue } - if sub.Label() != "" && !containsLabel(event.Labels, sub.Label()) { + if sub.Label() != "" && !containsLabelPointer(event.Labels, sub.Label()) { continue } diff --git a/server/webhook/merge_request_test.go b/server/webhook/merge_request_test.go index 70dac52f..306d17b2 100644 --- a/server/webhook/merge_request_test.go +++ b/server/webhook/merge_request_test.go @@ -1,6 +1,7 @@ package webhook import ( + "context" "encoding/json" "strings" "testing" @@ -155,7 +156,7 @@ func TestMergeRequestWebhook(t *testing.T) { if err := json.Unmarshal([]byte(test.fixture), mergeEvent); err != nil { assert.Fail(t, "can't unmarshal fixture") } - res, err := w.HandleMergeRequest(mergeEvent) + res, err := w.HandleMergeRequest(context.Background(), mergeEvent) assert.Empty(t, err) assert.Equal(t, len(test.res), len(res)) for index := range res { diff --git a/server/webhook/note.go b/server/webhook/note.go index fb7d71f0..d188bd62 100644 --- a/server/webhook/note.go +++ b/server/webhook/note.go @@ -1,17 +1,18 @@ package webhook import ( + "context" "fmt" "github.com/xanzy/go-gitlab" ) -func (w *webhook) HandleIssueComment(event *gitlab.IssueCommentEvent) ([]*HandleWebhook, error) { +func (w *webhook) HandleIssueComment(ctx context.Context, event *gitlab.IssueCommentEvent) ([]*HandleWebhook, error) { handlers, err := w.handleDMIssueComment(event) if err != nil { return nil, err } - handlers2, err := w.handleChannelIssueComment(event) + handlers2, err := w.handleChannelIssueComment(ctx, event) if err != nil { return nil, err } @@ -49,7 +50,7 @@ func (w *webhook) handleDMIssueComment(event *gitlab.IssueCommentEvent) ([]*Hand return handlers, nil } -func (w *webhook) handleChannelIssueComment(event *gitlab.IssueCommentEvent) ([]*HandleWebhook, error) { +func (w *webhook) handleChannelIssueComment(ctx context.Context, event *gitlab.IssueCommentEvent) ([]*HandleWebhook, error) { senderGitlabUsername := event.User.Username repo := event.Project body := event.ObjectAttributes.Note @@ -60,7 +61,7 @@ func (w *webhook) handleChannelIssueComment(event *gitlab.IssueCommentEvent) ([] toChannels := make([]string, 0) namespace, project := normalizeNamespacedProject(repo.PathWithNamespace) subs := w.gitlabRetreiver.GetSubscribedChannelsForProject( - namespace, project, + ctx, namespace, project, repo.Visibility == gitlab.PublicVisibility, ) for _, sub := range subs { @@ -85,12 +86,12 @@ func (w *webhook) handleChannelIssueComment(event *gitlab.IssueCommentEvent) ([] return res, nil } -func (w *webhook) HandleMergeRequestComment(event *gitlab.MergeCommentEvent) ([]*HandleWebhook, error) { +func (w *webhook) HandleMergeRequestComment(ctx context.Context, event *gitlab.MergeCommentEvent) ([]*HandleWebhook, error) { handlers, err := w.handleDMMergeRequestComment(event) if err != nil { return nil, err } - handlers2, err := w.handleChannelMergeRequestComment(event) + handlers2, err := w.handleChannelMergeRequestComment(ctx, event) if err != nil { return nil, err } @@ -119,7 +120,7 @@ func (w *webhook) handleDMMergeRequestComment(event *gitlab.MergeCommentEvent) ( return handlers, nil } -func (w *webhook) handleChannelMergeRequestComment(event *gitlab.MergeCommentEvent) ([]*HandleWebhook, error) { +func (w *webhook) handleChannelMergeRequestComment(ctx context.Context, event *gitlab.MergeCommentEvent) ([]*HandleWebhook, error) { senderGitlabUsername := event.User.Username repo := event.Project body := event.ObjectAttributes.Note @@ -130,7 +131,7 @@ func (w *webhook) handleChannelMergeRequestComment(event *gitlab.MergeCommentEve toChannels := make([]string, 0) namespace, project := normalizeNamespacedProject(repo.PathWithNamespace) subs := w.gitlabRetreiver.GetSubscribedChannelsForProject( - namespace, project, + ctx, namespace, project, repo.Visibility == gitlab.PublicVisibility, ) for _, sub := range subs { diff --git a/server/webhook/note_test.go b/server/webhook/note_test.go index 75ff60c9..ef24392c 100644 --- a/server/webhook/note_test.go +++ b/server/webhook/note_test.go @@ -1,6 +1,7 @@ package webhook import ( + "context" "encoding/json" "strings" "testing" @@ -89,13 +90,13 @@ func TestNoteWebhook(t *testing.T) { if err = json.Unmarshal([]byte(test.fixture), issueCommentEvent); err != nil { assert.Fail(t, "can't unmarshal fixture") } - res, err = w.HandleIssueComment(issueCommentEvent) + res, err = w.HandleIssueComment(context.Background(), issueCommentEvent) } else { mergeCommentEvent := &gitlab.MergeCommentEvent{} if err = json.Unmarshal([]byte(test.fixture), mergeCommentEvent); err != nil { assert.Fail(t, "can't unmarshal fixture") } - res, err = w.HandleMergeRequestComment(mergeCommentEvent) + res, err = w.HandleMergeRequestComment(context.Background(), mergeCommentEvent) } assert.Empty(t, err) assert.Equal(t, len(test.res), len(res)) diff --git a/server/webhook/pipeline.go b/server/webhook/pipeline.go index 4a8c813f..0b076869 100644 --- a/server/webhook/pipeline.go +++ b/server/webhook/pipeline.go @@ -1,17 +1,18 @@ package webhook import ( + "context" "fmt" "github.com/xanzy/go-gitlab" ) -func (w *webhook) HandlePipeline(event *gitlab.PipelineEvent) ([]*HandleWebhook, error) { +func (w *webhook) HandlePipeline(ctx context.Context, event *gitlab.PipelineEvent) ([]*HandleWebhook, error) { handlers, err := w.handleDMPipeline(event) if err != nil { return nil, err } - handlers2, err := w.handleChannelPipeline(event) + handlers2, err := w.handleChannelPipeline(ctx, event) if err != nil { return nil, err } @@ -47,7 +48,7 @@ func (w *webhook) handleDMPipeline(event *gitlab.PipelineEvent) ([]*HandleWebhoo return handlers, nil } -func (w *webhook) handleChannelPipeline(event *gitlab.PipelineEvent) ([]*HandleWebhook, error) { +func (w *webhook) handleChannelPipeline(ctx context.Context, event *gitlab.PipelineEvent) ([]*HandleWebhook, error) { senderGitlabUsername := event.User.Username repo := event.Project res := []*HandleWebhook{} @@ -67,7 +68,7 @@ func (w *webhook) handleChannelPipeline(event *gitlab.PipelineEvent) ([]*HandleW toChannels := make([]string, 0) namespace, project := normalizeNamespacedProject(repo.PathWithNamespace) subs := w.gitlabRetreiver.GetSubscribedChannelsForProject( - namespace, project, + ctx, namespace, project, repo.Visibility == gitlab.PublicVisibility, ) for _, sub := range subs { diff --git a/server/webhook/pipeline_test.go b/server/webhook/pipeline_test.go index 351ec937..3b25641a 100644 --- a/server/webhook/pipeline_test.go +++ b/server/webhook/pipeline_test.go @@ -1,6 +1,7 @@ package webhook import ( + "context" "encoding/json" "strings" "testing" @@ -91,7 +92,7 @@ func TestPipelineWebhook(t *testing.T) { if err := json.Unmarshal([]byte(test.fixture), pipelineEvent); err != nil { assert.Fail(t, "can't unmarshal fixture") } - res, err := w.HandlePipeline(pipelineEvent) + res, err := w.HandlePipeline(context.Background(), pipelineEvent) assert.Empty(t, err) assert.Equal(t, len(test.res), len(res)) for index := range res { diff --git a/server/webhook/push.go b/server/webhook/push.go index 934e1113..a9737e38 100644 --- a/server/webhook/push.go +++ b/server/webhook/push.go @@ -1,17 +1,18 @@ package webhook import ( + "context" "fmt" "github.com/xanzy/go-gitlab" ) -func (w *webhook) HandlePush(event *gitlab.PushEvent) ([]*HandleWebhook, error) { +func (w *webhook) HandlePush(ctx context.Context, event *gitlab.PushEvent) ([]*HandleWebhook, error) { handlers, err := w.handleDMPush(event) if err != nil { return nil, err } - handlers2, err := w.handleChannelPush(event) + handlers2, err := w.handleChannelPush(ctx, event) if err != nil { return nil, err } @@ -37,7 +38,7 @@ func (w *webhook) handleDMPush(event *gitlab.PushEvent) ([]*HandleWebhook, error return handlers, nil } -func (w *webhook) handleChannelPush(event *gitlab.PushEvent) ([]*HandleWebhook, error) { +func (w *webhook) handleChannelPush(ctx context.Context, event *gitlab.PushEvent) ([]*HandleWebhook, error) { senderGitlabUsername := event.UserUsername repo := event.Project res := []*HandleWebhook{} @@ -46,13 +47,13 @@ func (w *webhook) handleChannelPush(event *gitlab.PushEvent) ([]*HandleWebhook, return nil, nil } - var plural string = "commits" + plural := "commits" if event.TotalCommitsCount == 1 { plural = "commit" } - var message string = fmt.Sprintf("[%s](%s) has pushed %d %s to [%s](%s)", senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername), event.TotalCommitsCount, plural, event.Project.PathWithNamespace, event.Project.WebURL) + message := fmt.Sprintf("[%s](%s) has pushed %d %s to [%s](%s)", senderGitlabUsername, w.gitlabRetreiver.GetUserURL(senderGitlabUsername), event.TotalCommitsCount, plural, event.Project.PathWithNamespace, event.Project.WebURL) for _, commit := range event.Commits { message += fmt.Sprintf("\n%s [%s](%s)", commit.Message, "View Commit", commit.URL) @@ -61,7 +62,7 @@ func (w *webhook) handleChannelPush(event *gitlab.PushEvent) ([]*HandleWebhook, toChannels := make([]string, 0) namespace, project := normalizeNamespacedProject(repo.PathWithNamespace) subs := w.gitlabRetreiver.GetSubscribedChannelsForProject( - namespace, project, + ctx, namespace, project, repo.Visibility == gitlab.PublicVisibility, ) for _, sub := range subs { diff --git a/server/webhook/push_test.go b/server/webhook/push_test.go index aa216fa6..17dedbd1 100644 --- a/server/webhook/push_test.go +++ b/server/webhook/push_test.go @@ -1,6 +1,7 @@ package webhook import ( + "context" "encoding/json" "strings" "testing" @@ -78,7 +79,7 @@ func TestPushWebhook(t *testing.T) { if err := json.Unmarshal([]byte(test.fixture), pushEvent); err != nil { assert.Fail(t, "can't unmarshal fixture") } - res, err := w.HandlePush(pushEvent) + res, err := w.HandlePush(context.Background(), pushEvent) assert.Empty(t, err) assert.Equal(t, len(test.res), len(res)) for index := range res { diff --git a/server/webhook/tag.go b/server/webhook/tag.go index c565251e..7f057908 100644 --- a/server/webhook/tag.go +++ b/server/webhook/tag.go @@ -1,18 +1,19 @@ package webhook import ( + "context" "fmt" "strings" "github.com/xanzy/go-gitlab" ) -func (w *webhook) HandleTag(event *gitlab.TagEvent) ([]*HandleWebhook, error) { +func (w *webhook) HandleTag(ctx context.Context, event *gitlab.TagEvent) ([]*HandleWebhook, error) { handlers, err := w.handleDMTag(event) if err != nil { return nil, err } - handlers2, err := w.handleChannelTag(event) + handlers2, err := w.handleChannelTag(ctx, event) if err != nil { return nil, err } @@ -39,7 +40,7 @@ func (w *webhook) handleDMTag(event *gitlab.TagEvent) ([]*HandleWebhook, error) return handlers, nil } -func (w *webhook) handleChannelTag(event *gitlab.TagEvent) ([]*HandleWebhook, error) { +func (w *webhook) handleChannelTag(ctx context.Context, event *gitlab.TagEvent) ([]*HandleWebhook, error) { senderGitlabUsername := w.gitlabRetreiver.GetUsernameByID(event.UserID) repo := event.Project tagNames := strings.Split(event.Ref, "/") @@ -52,7 +53,7 @@ func (w *webhook) handleChannelTag(event *gitlab.TagEvent) ([]*HandleWebhook, er toChannels := make([]string, 0) namespace, project := normalizeNamespacedProject(repo.PathWithNamespace) subs := w.gitlabRetreiver.GetSubscribedChannelsForProject( - namespace, project, + ctx, namespace, project, repo.Visibility == gitlab.PublicVisibility, ) for _, sub := range subs { diff --git a/server/webhook/tag_test.go b/server/webhook/tag_test.go index 9547114b..3316d4ca 100644 --- a/server/webhook/tag_test.go +++ b/server/webhook/tag_test.go @@ -1,6 +1,7 @@ package webhook import ( + "context" "encoding/json" "strings" "testing" @@ -56,7 +57,7 @@ func TestTagWebhook(t *testing.T) { if err := json.Unmarshal([]byte(test.fixture), tagEvent); err != nil { assert.Fail(t, "can't unmarshal fixture") } - res, err := w.HandleTag(tagEvent) + res, err := w.HandleTag(context.Background(), tagEvent) assert.Empty(t, err) assert.Equal(t, len(test.res), len(res)) for index := range res { diff --git a/server/webhook/webhook.go b/server/webhook/webhook.go index 3e2706c9..7481c46f 100644 --- a/server/webhook/webhook.go +++ b/server/webhook/webhook.go @@ -1,6 +1,7 @@ package webhook import ( + "context" "fmt" "strings" @@ -21,7 +22,7 @@ type GitlabRetreiver interface { // ParseGitlabUsernamesFromText from a text return an array of username ParseGitlabUsernamesFromText(text string) []string // GetSubscribedChannelsForProject returns all subscriptions for given project. - GetSubscribedChannelsForProject(namespace, project string, isPublicVisibility bool) []*subscription.Subscription + GetSubscribedChannelsForProject(ctx context.Context, namespace, project string, isPublicVisibility bool) []*subscription.Subscription } type HandleWebhook struct { @@ -32,13 +33,13 @@ type HandleWebhook struct { } type Webhook interface { - HandleIssue(event *gitlab.IssueEvent) ([]*HandleWebhook, error) - HandleMergeRequest(event *gitlab.MergeEvent) ([]*HandleWebhook, error) - HandleIssueComment(event *gitlab.IssueCommentEvent) ([]*HandleWebhook, error) - HandleMergeRequestComment(event *gitlab.MergeCommentEvent) ([]*HandleWebhook, error) - HandlePipeline(event *gitlab.PipelineEvent) ([]*HandleWebhook, error) - HandleTag(event *gitlab.TagEvent) ([]*HandleWebhook, error) - HandlePush(event *gitlab.PushEvent) ([]*HandleWebhook, error) + HandleIssue(ctx context.Context, event *gitlab.IssueEvent) ([]*HandleWebhook, error) + HandleMergeRequest(ctx context.Context, event *gitlab.MergeEvent) ([]*HandleWebhook, error) + HandleIssueComment(ctx context.Context, event *gitlab.IssueCommentEvent) ([]*HandleWebhook, error) + HandleMergeRequestComment(ctx context.Context, event *gitlab.MergeCommentEvent) ([]*HandleWebhook, error) + HandlePipeline(ctx context.Context, event *gitlab.PipelineEvent) ([]*HandleWebhook, error) + HandleTag(ctx context.Context, event *gitlab.TagEvent) ([]*HandleWebhook, error) + HandlePush(ctx context.Context, event *gitlab.PushEvent) ([]*HandleWebhook, error) } type webhook struct { @@ -120,6 +121,15 @@ func sameLabels(a []gitlab.Label, b []gitlab.Label) bool { return true } +func containsLabelPointer(a []*gitlab.Label, labelName string) bool { + for _, l := range a { + if l != nil && l.Name == labelName { + return true + } + } + return false +} + func containsLabel(a []gitlab.Label, labelName string) bool { for _, l := range a { if l.Name == labelName { diff --git a/server/webhook/webhook_test.go b/server/webhook/webhook_test.go index 2756d4bc..065ab8cf 100644 --- a/server/webhook/webhook_test.go +++ b/server/webhook/webhook_test.go @@ -1,6 +1,7 @@ package webhook import ( + "context" "fmt" "testing" @@ -42,7 +43,7 @@ func (*fakeWebhook) ParseGitlabUsernamesFromText(body string) []string { return []string{} } -func (f *fakeWebhook) GetSubscribedChannelsForProject(namespace, project string, isPublicVisibility bool) []*subscription.Subscription { +func (f *fakeWebhook) GetSubscribedChannelsForProject(ctx context.Context, namespace, project string, isPublicVisibility bool) []*subscription.Subscription { return f.subs } diff --git a/server/webhook_test.go b/server/webhook_test.go index 941fed4f..103b1eab 100644 --- a/server/webhook_test.go +++ b/server/webhook_test.go @@ -2,6 +2,7 @@ package main import ( "bytes" + "context" "net/http" "net/http/httptest" "testing" @@ -16,33 +17,33 @@ import ( type fakeWebhookHandler struct{} -func (fakeWebhookHandler) HandleIssue(event *gitlabLib.IssueEvent) ([]*webhook.HandleWebhook, error) { +func (fakeWebhookHandler) HandleIssue(_ context.Context, _ *gitlabLib.IssueEvent) ([]*webhook.HandleWebhook, error) { return []*webhook.HandleWebhook{{ Message: "hello", From: "test", ToUsers: []string{"unknown"}, }}, nil } -func (fakeWebhookHandler) HandleMergeRequest(event *gitlabLib.MergeEvent) ([]*webhook.HandleWebhook, error) { +func (fakeWebhookHandler) HandleMergeRequest(_ context.Context, _ *gitlabLib.MergeEvent) ([]*webhook.HandleWebhook, error) { return []*webhook.HandleWebhook{{ Message: "hello", From: "test", ToChannels: []string{"town-square"}, }}, nil } -func (fakeWebhookHandler) HandleIssueComment(event *gitlabLib.IssueCommentEvent) ([]*webhook.HandleWebhook, error) { +func (fakeWebhookHandler) HandleIssueComment(_ context.Context, _ *gitlabLib.IssueCommentEvent) ([]*webhook.HandleWebhook, error) { return nil, nil } -func (fakeWebhookHandler) HandleMergeRequestComment(event *gitlabLib.MergeCommentEvent) ([]*webhook.HandleWebhook, error) { +func (fakeWebhookHandler) HandleMergeRequestComment(_ context.Context, _ *gitlabLib.MergeCommentEvent) ([]*webhook.HandleWebhook, error) { return nil, nil } -func (fakeWebhookHandler) HandlePipeline(event *gitlabLib.PipelineEvent) ([]*webhook.HandleWebhook, error) { +func (fakeWebhookHandler) HandlePipeline(_ context.Context, _ *gitlabLib.PipelineEvent) ([]*webhook.HandleWebhook, error) { return nil, nil } -func (fakeWebhookHandler) HandleTag(event *gitlabLib.TagEvent) ([]*webhook.HandleWebhook, error) { +func (fakeWebhookHandler) HandleTag(_ context.Context, _ *gitlabLib.TagEvent) ([]*webhook.HandleWebhook, error) { return nil, nil } -func (fakeWebhookHandler) HandlePush(event *gitlabLib.PushEvent) ([]*webhook.HandleWebhook, error) { +func (fakeWebhookHandler) HandlePush(_ context.Context, _ *gitlabLib.PushEvent) ([]*webhook.HandleWebhook, error) { return nil, nil } @@ -59,7 +60,7 @@ func TestHandleWebhookBadSecret(t *testing.T) { func TestHandleWebhookBadBody(t *testing.T) { p := &Plugin{configuration: &configuration{WebhookSecret: "secret"}, WebhookHandler: fakeWebhookHandler{}} mock := &plugintest.API{} - mock.On("LogError", "can't parse webhook", "err", "unexpected event type: ", "header", "", "event", "{}").Return(nil) + mock.On("LogDebug", "Can't parse webhook", "err", "unexpected event type: ", "header", "", "event", "{}").Return(nil) p.SetAPI(mock) req := httptest.NewRequest("POST", "/", bytes.NewBufferString(`{}`)) req.Header.Add("X-Gitlab-Token", "secret") @@ -67,7 +68,7 @@ func TestHandleWebhookBadBody(t *testing.T) { p.handleWebhook(w, req) resp := w.Result() assert.Equal(t, http.StatusBadRequest, resp.StatusCode) - mock.AssertCalled(t, "LogError", "can't parse webhook", "err", "unexpected event type: ", "header", "", "event", "{}") + mock.AssertCalled(t, "LogDebug", "Can't parse webhook", "err", "unexpected event type: ", "header", "", "event", "{}") } func TestHandleWebhookWithKnowAuthorButUnknowToUser(t *testing.T) { diff --git a/webapp/src/manifest.js b/webapp/src/manifest.js index 48b91cf3..5e14f599 100644 --- a/webapp/src/manifest.js +++ b/webapp/src/manifest.js @@ -1,5 +1,5 @@ -// This file is automatically generated. Do not modify it manually. -// Code generated .* DO NOT EDIT. +import manifest from '../../plugin.json'; -export const id = 'com.github.manland.mattermost-plugin-gitlab'; -export const version = '1.4.0'; +export default manifest; +export const id = manifest.id; +export const version = manifest.version; From fc8708183ae7ddf7443f1de3ec7acb9628fdcd92 Mon Sep 17 00:00:00 2001 From: sibasankarnayak Date: Mon, 2 May 2022 17:17:20 +0000 Subject: [PATCH 8/8] fix lint issues --- go.sum | 1 - 1 file changed, 1 deletion(-) diff --git a/go.sum b/go.sum index ebc358b4..50ad2d82 100644 --- a/go.sum +++ b/go.sum @@ -999,7 +999,6 @@ github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182aff github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/mholt/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= -github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/microcosm-cc/bluemonday v1.0.18 h1:6HcxvXDAi3ARt3slx6nTesbvorIc3QeTzBNRvWktHBo= github.com/microcosm-cc/bluemonday v1.0.18/go.mod h1:Z0r70sCuXHig8YpBzCc5eGHAap2K7e/u082ZUpDRRqM=