├── .gitattributes ├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── conf └── config.json ├── go.mod ├── go.sum ├── hrefs.cn.sql ├── main.go ├── public ├── favicon.ico ├── list.png ├── payme.jpg ├── placeholder.jpg ├── stat.js ├── styles │ └── site.css ├── yc.png └── zz.png ├── src ├── api │ └── router.go ├── cli │ └── cli.go ├── controller │ ├── account.go │ ├── article.go │ ├── auth.go │ ├── cuslinks.go │ ├── helpers.go │ ├── index.go │ ├── link.go │ └── linkcat.go ├── domain │ ├── account.go │ ├── articles.go │ ├── cuslinks.go │ ├── init.go │ ├── linkcat.go │ └── links.go ├── init.go ├── middleware │ ├── check_login.go │ └── monitor.go ├── model │ └── types.go ├── mosaic │ └── mosaic.go ├── redis │ └── redis.go ├── srv │ ├── api.go │ ├── run.go │ └── web.go ├── utils │ ├── code.go │ ├── config.go │ ├── errors.go │ ├── file.go │ ├── init.go │ ├── mysql.go │ └── redis.go └── web │ └── router.go └── views ├── articles.html ├── choose.html ├── cuslinks.html ├── detail.html ├── index.html ├── links.html ├── mosaic.html ├── payme.html └── shared ├── _articles.html ├── _common.html ├── _cuslinks.html ├── _footer.html ├── _group.html ├── _info.html ├── _toper.html └── layout.html /.gitattributes: -------------------------------------------------------------------------------- 1 | *.html linguist-language=go -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Binaries for programs and plugins 2 | *.exe 3 | *.exe~ 4 | *.dll 5 | *.so 6 | *.dylib 7 | .idea/ 8 | public/images/ 9 | public/upload/ 10 | public/tiles/ 11 | server 12 | logs/ 13 | # Test binary, built with `go test -c` 14 | *.test 15 | 16 | # Output of the go coverage tool, specifically when used with LiteIDE 17 | *.out 18 | 19 | # Dependency directories (remove the comment below to include it) 20 | # vendor/ 21 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine 2 | COPY ./server /server 3 | EXPOSE 80/tcp 4 | VOLUME ["/public", "/views"] 5 | ENTRYPOINT ["/server"] -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 何敏 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### 简介 2 | 一个由Go语言写的程序员网址导航,聚合go生态比较热门的技术栈。 3 | 4 | ## 星星增长趋势 5 | [![Stargazers over time](https://starchart.cc/iissy/goweb.svg)](https://starchart.cc/iissy/goweb) 6 | 7 | #### asy 2.1.2 Released 2021年02月11日 8 | + 仓库更新到最新的 go-micro 9 | + 将微服务改成 gRPC 10 | + 完成 iris、gin、go-micro 技术大升级 11 | + iris 显示内容渲染,gin 实现接口,go-micro 微服务 12 | + 一个应用启用三个端口,web、api、srv各占一个 13 | + 内容管理项目移入另一个独立仓库 14 | + 内容管理仓库(https://github.com/iissy/hrefs.cn) 15 | + 内容管理项目用到的接口在此项目 16 | + 内容展示这个项目可以独立跑 17 | + 旧代码见 old 分支 18 | 19 | ### 技术栈 20 | + go iris 网页 / go gin 接口 21 | + go-micro (内置gRPC)微服务框架 22 | + consul 服务注册发现 23 | + 分组路由 24 | + 中间件实现授权访问 25 | + redis 管理登陆会话 26 | + 日志错误管理 27 | + ORM 框架引入 gorp 28 | + 图片上传,google.uuid 生成文件名 29 | + 使用 Go Module 方式开发 30 | 31 | ### 内容包含 32 | + 技术原创文章 33 | + 优秀技术网摘 34 | + 程序员常用网址 35 | 36 | ## 安装说明 37 | 1. 安装 mysql 38 | 2. 使用 hrefs.cn.sql 初始化数据库以及数据 39 | 3. 安装 redis(不启用内容管理可以不装) 40 | 4. 修改配置(conf/config.json) 41 | 5. 内容管理代码仓库:https://github.com/iissy/hrefs.cn 42 | 43 | ## 组件下载配置 44 | 由于大陆网络无法下载google的包,使用七牛公司的代理,下载包前执行命令 45 | 1. go env -w GOPROXY=https://goproxy.cn,direct 46 | 47 | ## 使用说明 48 | + 请确保 80 端口没有被别的服务(比如iis)占用,然后在浏览器中输入:http://localhost 49 | + 如果需要添加修改数据,必须搭建内容管理项目,见安装说明 50 | 51 | ## 官方产品 52 | + https://iissy.com 爱斯园 - 弘扬中华传统文化 53 | + https://jitask.com 吉塔斯 - Jitask任务管理系统 -------------------------------------------------------------------------------- /conf/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "mysql": { 3 | "hrefs": "root:123456@tcp(192.168.111.151:3306)/hrefsdb?charset=utf8", 4 | "MaxIdleConns": 5, 5 | "MaxOpenConns": 50, 6 | "gorp": { 7 | "trace-on": false 8 | } 9 | }, 10 | "redis": { 11 | "host": "192.168.111.151", 12 | "port": 6379 13 | }, 14 | "consul": [{ 15 | "host": "192.168.111.151", 16 | "port": 8500 17 | }], 18 | "srv": "micro.hrefs.srv", 19 | "domain": "localhost" 20 | } -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/iissy/goweb 2 | 3 | go 1.16 4 | 5 | require ( 6 | github.com/ajg/form v1.5.1 // indirect 7 | github.com/asim/go-micro/plugins/client/grpc/v3 v3.0.0-20210604091730-a1e9b88495a1 8 | github.com/asim/go-micro/plugins/registry/consul/v3 v3.0.0-20210604091730-a1e9b88495a1 9 | github.com/asim/go-micro/plugins/server/grpc/v3 v3.0.0-20210604091730-a1e9b88495a1 10 | github.com/asim/go-micro/v3 v3.5.1 11 | github.com/gin-gonic/gin v1.7.2 12 | github.com/go-gorp/gorp/v3 v3.0.2 13 | github.com/go-sql-driver/mysql v1.6.0 14 | github.com/gomodule/redigo v1.8.4 15 | github.com/google/uuid v1.2.0 16 | github.com/gorilla/securecookie v1.1.1 17 | github.com/imkira/go-interpol v1.1.0 // indirect 18 | github.com/juju/errors v0.0.0-20200330140219-3fe23663418f 19 | github.com/juju/testing v0.0.0-20210324180055-18c50b0c2098 // indirect 20 | github.com/kataras/iris/v12 v12.1.8 21 | github.com/moul/http2curl v1.0.0 // indirect 22 | github.com/sirupsen/logrus v1.8.1 23 | github.com/valyala/fasthttp v1.26.0 // indirect 24 | github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 // indirect 25 | github.com/yudai/gojsondiff v1.0.0 // indirect 26 | github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect 27 | ) 28 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 2 | cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 3 | cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 4 | cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= 5 | cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= 6 | cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= 7 | cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= 8 | cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= 9 | cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= 10 | cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= 11 | cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= 12 | cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= 13 | cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= 14 | cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= 15 | contrib.go.opencensus.io/exporter/ocagent v0.4.12/go.mod h1:450APlNTSR6FrvC3CTRqYosuDstRB9un7SOx2k/9ckA= 16 | dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= 17 | dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= 18 | dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= 19 | dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= 20 | dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= 21 | git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= 22 | github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= 23 | github.com/Azure/azure-sdk-for-go v32.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= 24 | github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= 25 | github.com/Azure/go-autorest/autorest v0.1.0/go.mod h1:AKyIcETwSUFxIcs/Wnq/C+kwCtlEYGUVd7FPNb2slmg= 26 | github.com/Azure/go-autorest/autorest v0.5.0/go.mod h1:9HLKlQjVBH6U3oDfsXOeVc56THsLPw1L03yban4xThw= 27 | github.com/Azure/go-autorest/autorest/adal v0.1.0/go.mod h1:MeS4XhScH55IST095THyTxElntu7WqB7pNbZo8Q5G3E= 28 | github.com/Azure/go-autorest/autorest/adal v0.2.0/go.mod h1:MeS4XhScH55IST095THyTxElntu7WqB7pNbZo8Q5G3E= 29 | github.com/Azure/go-autorest/autorest/azure/auth v0.1.0/go.mod h1:Gf7/i2FUpyb/sGBLIFxTBzrNzBo7aPXXE3ZVeDRwdpM= 30 | github.com/Azure/go-autorest/autorest/azure/cli v0.1.0/go.mod h1:Dk8CUAt/b/PzkfeRsWzVG9Yj3ps8mS8ECztu43rdU8U= 31 | github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= 32 | github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= 33 | github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= 34 | github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= 35 | github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= 36 | github.com/Azure/go-autorest/tracing v0.1.0/go.mod h1:ROEEAFwXycQw7Sn3DXNtEedEvdeRAgDr0izn4z5Ij88= 37 | github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= 38 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 39 | github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= 40 | github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c= 41 | github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= 42 | github.com/CloudyKit/jet/v3 v3.0.0 h1:1PwO5w5VCtlUUl+KTOBsTGZlhjWkcybsGaAau52tOy8= 43 | github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= 44 | github.com/Joker/hpp v1.0.0 h1:65+iuJYdRXv/XyN62C1uEmmOx3432rNG/rKlX6V7Kkc= 45 | github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= 46 | github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= 47 | github.com/Microsoft/hcsshim v0.8.7-0.20191101173118-65519b62243c/go.mod h1:7xhjOwRV2+0HXGmM0jxaEu+ZiXJFoVZOTfL/dmqbrD8= 48 | github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87/go.mod h1:iGLljf5n9GjT6kc0HBvyI1nOKnGQbNB66VzSNbK5iks= 49 | github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398 h1:WDC6ySpJzbxGWFh4aMxFFC28wwGp5pEuoTtvA4q/qQ4= 50 | github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= 51 | github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= 52 | github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= 53 | github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= 54 | github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= 55 | github.com/akamai/AkamaiOPEN-edgegrid-golang v0.9.0/go.mod h1:zpDJeKyp9ScW4NNrbdr+Eyxvry3ilGPewKoXw3XGN1k= 56 | github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= 57 | github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= 58 | github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 59 | github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 60 | github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190808125512-07798873deee/go.mod h1:myCDvQSzCW+wB1WAlocEru4wMGJxy+vlxHdhegi1CDQ= 61 | github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190307165228-86c17b95fcd5/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= 62 | github.com/andybalholm/brotli v1.0.2 h1:JKnhI/XQ75uFBTiuzXpzFrUriDPiZjlOSzh6wXogP0E= 63 | github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= 64 | github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= 65 | github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= 66 | github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= 67 | github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= 68 | github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= 69 | github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I= 70 | github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= 71 | github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= 72 | github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= 73 | github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= 74 | github.com/asim/go-micro/plugins/broker/memory/v3 v3.0.0-20210202145831-070250155285 h1:DUDMXvS9LfkgDYBRnKEJh7yPfV+tXOvLqIszqNg4DYc= 75 | github.com/asim/go-micro/plugins/broker/memory/v3 v3.0.0-20210202145831-070250155285/go.mod h1:IJrBUDk0XAbi0iDg+sKgkY588m311TkSoEAjU9xu/mc= 76 | github.com/asim/go-micro/plugins/client/grpc/v3 v3.0.0-20210205090925-e8167a8b79ed/go.mod h1:Mx1EwGdIq7wl5IkKLaGbHtoIC4yvqUNxJtZu6wxsqiU= 77 | github.com/asim/go-micro/plugins/client/grpc/v3 v3.0.0-20210604091730-a1e9b88495a1 h1:xqjRfvvcbzgg/DLmWitti/3jbfM3kWBIqc14c8Unlrs= 78 | github.com/asim/go-micro/plugins/client/grpc/v3 v3.0.0-20210604091730-a1e9b88495a1/go.mod h1:Mx1EwGdIq7wl5IkKLaGbHtoIC4yvqUNxJtZu6wxsqiU= 79 | github.com/asim/go-micro/plugins/registry/consul/v3 v3.0.0-20210604091730-a1e9b88495a1 h1:CDBffnsEBPuQjwpE0O4c2nZokBcuq1kHAFDLpKz6Qig= 80 | github.com/asim/go-micro/plugins/registry/consul/v3 v3.0.0-20210604091730-a1e9b88495a1/go.mod h1:U4QtFMj/uR3On1CRAAAOkEn47kFHa+T2VdO1vijtBEw= 81 | github.com/asim/go-micro/plugins/registry/memory/v3 v3.0.0-20210202145831-070250155285 h1:zgDzypD412DKHoXIXW1JwIOWoGcjxzI1iF6JmwtyqHw= 82 | github.com/asim/go-micro/plugins/registry/memory/v3 v3.0.0-20210202145831-070250155285/go.mod h1:AU0vyZvsO1lpuQr/DUG4CnNRvITXqQcJRRAzBATR6Jo= 83 | github.com/asim/go-micro/plugins/server/grpc/v3 v3.0.0-20210604091730-a1e9b88495a1 h1:VVoa8JfUPaa5KQL0Hi51AhoCPaVeWzqi6VPZdT0TBR8= 84 | github.com/asim/go-micro/plugins/server/grpc/v3 v3.0.0-20210604091730-a1e9b88495a1/go.mod h1:4cS4mKqylPAybKUO8/mdjTGlBImeAL1RWA2rV/mObPQ= 85 | github.com/asim/go-micro/plugins/transport/grpc/v3 v3.0.0-20210202145831-070250155285 h1:3YQx0EQbHNYpp1FwnHrgU0oRFISjZvBGL7UhpA8/Nas= 86 | github.com/asim/go-micro/plugins/transport/grpc/v3 v3.0.0-20210202145831-070250155285/go.mod h1:FXWwzJ74gGEIY/gOdDHJqCQuago+tLSkcUPayf9daGM= 87 | github.com/asim/go-micro/v3 v3.0.0-20210120135431-d94936f6c97c/go.mod h1:fAeb2KUnD3z4XwtQ91XFxw5zgGKhoTsLc6Ie81QdER4= 88 | github.com/asim/go-micro/v3 v3.5.0/go.mod h1:PR/RCuFk1F7aPnK6pc8Ca9rHOZzfg1x7+fvTygQa55g= 89 | github.com/asim/go-micro/v3 v3.5.1 h1:OthybEX1VmfBE1EVYWz7aAcJR96myYyR5oNA99e8UmQ= 90 | github.com/asim/go-micro/v3 v3.5.1/go.mod h1:OJ5DnUQmoEVQTNbKRstR7/krtYJI+QaBe/XeN5MZkqE= 91 | github.com/aws/aws-sdk-go v1.23.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= 92 | github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible h1:Ppm0npCCsmuR9oQaBtRuZcmILVE74aXE+AmrJj8L2ns= 93 | github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= 94 | github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= 95 | github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= 96 | github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 97 | github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= 98 | github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= 99 | github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= 100 | github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= 101 | github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= 102 | github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= 103 | github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= 104 | github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= 105 | github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= 106 | github.com/cenkalti/backoff/v4 v4.0.0/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= 107 | github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= 108 | github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= 109 | github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= 110 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 111 | github.com/cloudflare/cloudflare-go v0.10.2/go.mod h1:qhVI5MKwBGhdNU89ZRz2plgYutcJ5PCekLxXn56w6SY= 112 | github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= 113 | github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= 114 | github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= 115 | github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= 116 | github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= 117 | github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= 118 | github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= 119 | github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= 120 | github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= 121 | github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= 122 | github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= 123 | github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= 124 | github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= 125 | github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= 126 | github.com/cpu/goacmedns v0.0.1/go.mod h1:sesf/pNnCYwUevQEQfEwY0Y3DydlQWSGZbaMElOWxok= 127 | github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= 128 | github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= 129 | github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= 130 | github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= 131 | github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 132 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 133 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 134 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 135 | github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= 136 | github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= 137 | github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= 138 | github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= 139 | github.com/dnaeon/go-vcr v0.0.0-20180814043457-aafff18a5cc2/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= 140 | github.com/dnsimple/dnsimple-go v0.30.0/go.mod h1:O5TJ0/U6r7AfT8niYNlmohpLbCSG+c71tQlGr9SeGrg= 141 | github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= 142 | github.com/docker/docker v1.4.2-0.20191101170500-ac7306503d23/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= 143 | github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= 144 | github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= 145 | github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 146 | github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= 147 | github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= 148 | github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= 149 | github.com/ef-ds/deque v1.0.4-0.20190904040645-54cb57c252a1/go.mod h1:HvODWzv6Y6kBf3Ah2WzN1bHjDUezGLaAhwuWVwfpEJs= 150 | github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= 151 | github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= 152 | github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= 153 | github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= 154 | github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 155 | github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= 156 | github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= 157 | github.com/evanphx/json-patch/v5 v5.0.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= 158 | github.com/exoscale/egoscale v0.18.1/go.mod h1:Z7OOdzzTOz1Q1PjQXumlz9Wn/CddH0zSYdCF3rnBKXE= 159 | github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= 160 | github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= 161 | github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= 162 | github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= 163 | github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= 164 | github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= 165 | github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= 166 | github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= 167 | github.com/fsouza/go-dockerclient v1.6.0/go.mod h1:YWwtNPuL4XTX1SKJQk86cWPmmqwx+4np9qfPbb+znGc= 168 | github.com/gavv/httpexpect v2.0.0+incompatible h1:1X9kcRshkSKEjNJJxX9Y9mQ5BRfbxU5kORdjhlA1yX8= 169 | github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= 170 | github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 171 | github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= 172 | github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= 173 | github.com/gin-gonic/gin v1.7.2 h1:Tg03T9yM2xa8j6I3Z3oqLaQRSmKvxPd6g/2HJ6zICFA= 174 | github.com/gin-gonic/gin v1.7.2/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= 175 | github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= 176 | github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= 177 | github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= 178 | github.com/go-acme/lego/v3 v3.4.0/go.mod h1:xYbLDuxq3Hy4bMUT1t9JIuz6GWIWb3m5X+TeTHYaT7M= 179 | github.com/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= 180 | github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= 181 | github.com/go-cmd/cmd v1.0.5/go.mod h1:y8q8qlK5wQibcw63djSl/ntiHUHXHGdCkPk0j4QeW4s= 182 | github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= 183 | github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= 184 | github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= 185 | github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agRrHM= 186 | github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= 187 | github.com/go-git/go-git-fixtures/v4 v4.0.1 h1:q+IFMfLx200Q3scvt2hN79JsEzy4AmBTp/pqnefH+Bc= 188 | github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= 189 | github.com/go-git/go-git/v5 v5.1.0 h1:HxJn9g/E7eYvKW3Fm7Jt4ee8LXfPOm/H1cdDu8vEssk= 190 | github.com/go-git/go-git/v5 v5.1.0/go.mod h1:ZKfuPUoY1ZqIG4QG9BDBh3G4gLM5zvPuSJAozQrZuyM= 191 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= 192 | github.com/go-gorp/gorp/v3 v3.0.2 h1:ULqJXIekoqMx29FI5ekXXFoH1dT2Vc8UhnRzBg+Emz4= 193 | github.com/go-gorp/gorp/v3 v3.0.2/go.mod h1:BJ3q1ejpV8cVALtcXvXaXyTOlMmJhWDxTmncaR6rwBY= 194 | github.com/go-ini/ini v1.44.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= 195 | github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 196 | github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= 197 | github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= 198 | github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= 199 | github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= 200 | github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= 201 | github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= 202 | github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= 203 | github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= 204 | github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= 205 | github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= 206 | github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= 207 | github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= 208 | github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= 209 | github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= 210 | github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= 211 | github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= 212 | github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= 213 | github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= 214 | github.com/gobwas/ws v1.0.3/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= 215 | github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= 216 | github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= 217 | github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= 218 | github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= 219 | github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= 220 | github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= 221 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= 222 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= 223 | github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 224 | github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 225 | github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= 226 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 227 | github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 228 | github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= 229 | github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= 230 | github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= 231 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 232 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 233 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 234 | github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= 235 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= 236 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= 237 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= 238 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= 239 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 240 | github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= 241 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 242 | github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= 243 | github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 244 | github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 245 | github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 246 | github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= 247 | github.com/gomodule/redigo v1.8.4 h1:Z5JUg94HMTR1XpwBaSH4vq3+PNSIykBLxMdglbw10gg= 248 | github.com/gomodule/redigo v1.8.4/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0= 249 | github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 250 | github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= 251 | github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 252 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 253 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 254 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 255 | github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= 256 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 257 | github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= 258 | github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= 259 | github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= 260 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 261 | github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= 262 | github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 263 | github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 264 | github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 265 | github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 266 | github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 267 | github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 268 | github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= 269 | github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 270 | github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= 271 | github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= 272 | github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= 273 | github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= 274 | github.com/gophercloud/gophercloud v0.3.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= 275 | github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= 276 | github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= 277 | github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= 278 | github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= 279 | github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= 280 | github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= 281 | github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= 282 | github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= 283 | github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= 284 | github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 285 | github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= 286 | github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= 287 | github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= 288 | github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= 289 | github.com/hashicorp/consul/api v1.3.0 h1:HXNYlRkkM/t+Y/Yhxtwcy02dlYwIaoxzvxPnS+cqy78= 290 | github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= 291 | github.com/hashicorp/consul/sdk v0.3.0 h1:UOxjlb4xVNF93jak1mzzoBatyFju9nrkxpVwIp/QqxQ= 292 | github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= 293 | github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= 294 | github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= 295 | github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= 296 | github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= 297 | github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= 298 | github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0= 299 | github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= 300 | github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4= 301 | github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= 302 | github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= 303 | github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= 304 | github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= 305 | github.com/hashicorp/go-rootcerts v1.0.0 h1:Rqb66Oo1X/eSV1x66xbDccZjhJigjg0+e82kpwzSwCI= 306 | github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= 307 | github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= 308 | github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= 309 | github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= 310 | github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 311 | github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= 312 | github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 313 | github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 314 | github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= 315 | github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 316 | github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 317 | github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk= 318 | github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= 319 | github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= 320 | github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= 321 | github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= 322 | github.com/hashicorp/memberlist v0.1.3 h1:EmmoJme1matNzb+hMpDuR/0sbJSUisxyqBGG676r31M= 323 | github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= 324 | github.com/hashicorp/serf v0.8.2 h1:YZ7UKsJv+hKjqGVUUbtE3HNj79Eln2oQ75tniF6iPt0= 325 | github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= 326 | github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= 327 | github.com/iij/doapi v0.0.0-20190504054126-0bbf12d6d7df/go.mod h1:QMZY7/J/KSQEhKWFeDesPjMj+wCHReeknARU3wqlyN4= 328 | github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg= 329 | github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= 330 | github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= 331 | github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= 332 | github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= 333 | github.com/iris-contrib/blackfriday v2.0.0+incompatible h1:o5sHQHHm0ToHUlAJSTjW9UWicjJSDDauOOQ2AHuIVp4= 334 | github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= 335 | github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= 336 | github.com/iris-contrib/jade v1.1.3 h1:p7J/50I0cjo0wq/VWVCDFd8taPJbuFC+bq23SniRFX0= 337 | github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= 338 | github.com/iris-contrib/pongo2 v0.0.1 h1:zGP7pW51oi5eQZMIlGA3I+FHY9/HOQWDB+572yin0to= 339 | github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= 340 | github.com/iris-contrib/schema v0.0.1 h1:10g/WnoRR+U+XXHWKBHeNy/+tZmM2kcAVGLOsz+yaDA= 341 | github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= 342 | github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= 343 | github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= 344 | github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= 345 | github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= 346 | github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= 347 | github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= 348 | github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= 349 | github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 350 | github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= 351 | github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 352 | github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= 353 | github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= 354 | github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= 355 | github.com/juju/ansiterm v0.0.0-20160907234532-b99631de12cf/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU= 356 | github.com/juju/clock v0.0.0-20190205081909-9c5c9712527c/go.mod h1:nD0vlnrUjcjJhqN5WuCWZyzfd5AHZAC9/ajvbSx69xA= 357 | github.com/juju/cmd v0.0.0-20171107070456-e74f39857ca0/go.mod h1:yWJQHl73rdSX4DHVKGqkAip+huBslxRwS8m9CrOLq18= 358 | github.com/juju/collections v0.0.0-20200605021417-0d0ec82b7271/go.mod h1:5XgO71dV1JClcOJE+4dzdn4HrI5LiyKd7PlVG6eZYhY= 359 | github.com/juju/errors v0.0.0-20150916125642-1b5e39b83d18/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= 360 | github.com/juju/errors v0.0.0-20200330140219-3fe23663418f h1:MCOvExGLpaSIzLYB4iQXEHP4jYVU6vmzLNQPdMVrxnM= 361 | github.com/juju/errors v0.0.0-20200330140219-3fe23663418f/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= 362 | github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= 363 | github.com/juju/httpprof v0.0.0-20141217160036-14bf14c30767/go.mod h1:+MaLYz4PumRkkyHYeXJ2G5g5cIW0sli2bOfpmbaMV/g= 364 | github.com/juju/loggo v0.0.0-20170605014607-8232ab8918d9/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= 365 | github.com/juju/loggo v0.0.0-20200526014432-9ce3a2e09b5e h1:FdDd7bdI6cjq5vaoYlK1mfQYfF9sF2VZw8VEZMsl5t8= 366 | github.com/juju/loggo v0.0.0-20200526014432-9ce3a2e09b5e/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= 367 | github.com/juju/mgo/v2 v2.0.0-20210302023703-70d5d206e208 h1:/WiCm+Vpj87e4QWuWwPD/bNE9kDrWCLvPBHOQNcG2+A= 368 | github.com/juju/mgo/v2 v2.0.0-20210302023703-70d5d206e208/go.mod h1:0OChplkvPTZ174D2FYZXg4IB9hbEwyHkD+zT+/eK+Fg= 369 | github.com/juju/mutex v0.0.0-20171110020013-1fe2a4bf0a3a/go.mod h1:Y3oOzHH8CQ0Ppt0oCKJ2JFO81/EsWenH5AEqigLH+yY= 370 | github.com/juju/retry v0.0.0-20151029024821-62c620325291/go.mod h1:OohPQGsr4pnxwD5YljhQ+TZnuVRYpa5irjugL1Yuif4= 371 | github.com/juju/retry v0.0.0-20180821225755-9058e192b216/go.mod h1:OohPQGsr4pnxwD5YljhQ+TZnuVRYpa5irjugL1Yuif4= 372 | github.com/juju/testing v0.0.0-20180402130637-44801989f0f7/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= 373 | github.com/juju/testing v0.0.0-20190723135506-ce30eb24acd2/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= 374 | github.com/juju/testing v0.0.0-20210324180055-18c50b0c2098 h1:yrhek184cGp0IRyHg0uV1khLaorNg6GtDLkry4oNNjE= 375 | github.com/juju/testing v0.0.0-20210324180055-18c50b0c2098/go.mod h1:7lxZW0B50+xdGFkvhAb8bwAGt6IU87JB1H9w4t8MNVM= 376 | github.com/juju/utils v0.0.0-20180424094159-2000ea4ff043/go.mod h1:6/KLg8Wz/y2KVGWEpkK9vMNGkOnu4k/cqs8Z1fKjTOk= 377 | github.com/juju/utils v0.0.0-20200116185830-d40c2fe10647/go.mod h1:6/KLg8Wz/y2KVGWEpkK9vMNGkOnu4k/cqs8Z1fKjTOk= 378 | github.com/juju/utils/v2 v2.0.0-20200923005554-4646bfea2ef1/go.mod h1:fdlDtQlzundleLLz/ggoYinEt/LmnrpNKcNTABQATNI= 379 | github.com/juju/version v0.0.0-20161031051906-1f41e27e54f2/go.mod h1:kE8gK5X0CImdr7qpSKl3xB2PmpySSmfj7zVbkZFs81U= 380 | github.com/juju/version v0.0.0-20180108022336-b64dbd566305/go.mod h1:kE8gK5X0CImdr7qpSKl3xB2PmpySSmfj7zVbkZFs81U= 381 | github.com/juju/version v0.0.0-20191219164919-81c1be00b9a6/go.mod h1:kE8gK5X0CImdr7qpSKl3xB2PmpySSmfj7zVbkZFs81U= 382 | github.com/julienschmidt/httprouter v1.1.1-0.20151013225520-77a895ad01eb/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 383 | github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 384 | github.com/kataras/golog v0.0.10 h1:vRDRUmwacco/pmBAm8geLn8rHEdc+9Z4NAr5Sh7TG/4= 385 | github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= 386 | github.com/kataras/iris/v12 v12.1.8 h1:O3gJasjm7ZxpxwTH8tApZsvf274scSGQAUpNe47c37U= 387 | github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= 388 | github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= 389 | github.com/kataras/pio v0.0.2 h1:6NAi+uPJ/Zuid6mrAKlgpbI11/zK/lV4B2rxWaJN98Y= 390 | github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= 391 | github.com/kataras/sitemap v0.0.5 h1:4HCONX5RLgVy6G4RkYOV3vKNcma9p236LdGOipJsaFE= 392 | github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= 393 | github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY= 394 | github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= 395 | github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= 396 | github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= 397 | github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= 398 | github.com/klauspost/compress v1.12.2 h1:2KCfW3I9M7nSc5wOqXAlW2v2U6v+w6cbjvbfp+OykW8= 399 | github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= 400 | github.com/kolo/xmlrpc v0.0.0-20190717152603-07c4ee3fd181/go.mod h1:o03bZfuBwAXHetKXuInt4S7omeXUu62/A845kiycsSQ= 401 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 402 | github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 403 | github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= 404 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 405 | github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= 406 | github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= 407 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 408 | github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 409 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 410 | github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= 411 | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 412 | github.com/labbsr0x/bindman-dns-webhook v1.0.2/go.mod h1:p6b+VCXIR8NYKpDr8/dg1HKfQoRHCdcsROXKvmoehKA= 413 | github.com/labbsr0x/goh v1.0.1/go.mod h1:8K2UhVoaWXcCU7Lxoa2omWnC8gyW8px7/lmO61c027w= 414 | github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= 415 | github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= 416 | github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= 417 | github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= 418 | github.com/linode/linodego v0.10.0/go.mod h1:cziNP7pbvE3mXIPneHj0oRY8L1WtGEIKlZ8LANE4eXA= 419 | github.com/liquidweb/liquidweb-go v1.6.0/go.mod h1:UDcVnAMDkZxpw4Y7NOHkqoeiGacVLEIG/i5J9cyixzQ= 420 | github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= 421 | github.com/lunixbochs/vtclean v0.0.0-20160125035106-4fbf7632a2c6/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= 422 | github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= 423 | github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= 424 | github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 425 | github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= 426 | github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= 427 | github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= 428 | github.com/masterzen/azure-sdk-for-go v3.2.0-beta.0.20161014135628-ee4f0065d00c+incompatible/go.mod h1:mf8fjOu33zCqxUjuiU3I8S1lJMyEAlH+0F2+M5xl3hE= 429 | github.com/masterzen/simplexml v0.0.0-20160608183007-4572e39b1ab9/go.mod h1:kCEbxUJlNDEBNbdQMkPSp6yaKcRXVI6f4ddk8Riv4bc= 430 | github.com/masterzen/winrm v0.0.0-20161014151040-7a535cd943fc/go.mod h1:CfZSN7zwz5gJiFhZJz49Uzk7mEBHIceWmbFmYx7Hf7E= 431 | github.com/masterzen/xmlpath v0.0.0-20140218185901-13f4951698ad/go.mod h1:A0zPC53iKKKcXYxr4ROjpQRQ5FgJXtelNdSmHHuq/tY= 432 | github.com/mattn/go-colorable v0.0.6/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= 433 | github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= 434 | github.com/mattn/go-isatty v0.0.0-20160806122752-66b8e73f3f5c/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= 435 | github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= 436 | github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= 437 | github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= 438 | github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= 439 | github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= 440 | github.com/mattn/go-sqlite3 v1.11.0 h1:LDdKkqtYlom37fkvqs8rMPFKAMe8+SgjbwZ6ex1/A/Q= 441 | github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= 442 | github.com/mattn/go-tty v0.0.0-20180219170247-931426f7535a/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= 443 | github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= 444 | github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 445 | github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= 446 | github.com/micro/cli/v2 v2.1.2 h1:43J1lChg/rZCC1rvdqZNFSQDrGT7qfMrtp6/ztpIkEM= 447 | github.com/micro/cli/v2 v2.1.2/go.mod h1:EguNh6DAoWKm9nmk+k/Rg0H3lQnDxqzu5x5srOtGtYg= 448 | github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= 449 | github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= 450 | github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= 451 | github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= 452 | github.com/miekg/dns v1.1.15/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= 453 | github.com/miekg/dns v1.1.27 h1:aEH/kqUzUxGJ/UHcEKdJY+ugH6WEzsEBBSPa8zuy1aM= 454 | github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= 455 | github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= 456 | github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 457 | github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= 458 | github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 459 | github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= 460 | github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= 461 | github.com/mitchellh/go-vnc v0.0.0-20150629162542-723ed9867aed/go.mod h1:3rdaFaCv4AyBgu5ALFM0+tSuHrBh6v692nyQe3ikrq0= 462 | github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= 463 | github.com/mitchellh/hashstructure v1.0.0 h1:ZkRJX1CyOoTkar7p/mLS5TZU4nJ1Rn/F8u9dGS02Q3Y= 464 | github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= 465 | github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= 466 | github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= 467 | github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= 468 | github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= 469 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 470 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= 471 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 472 | github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 473 | github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= 474 | github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 475 | github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= 476 | github.com/moul/http2curl v1.0.0 h1:dRMWoAtb+ePxMlLkrCbAqh4TlPHXvoGUSQ323/9Zahs= 477 | github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= 478 | github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 479 | github.com/namedotcom/go v0.0.0-20180403034216-08470befbe04/go.mod h1:5sN+Lt1CaY4wsPvgQH/jsuJi4XO2ssZbdsIizr4CVC8= 480 | github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= 481 | github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= 482 | github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= 483 | github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= 484 | github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= 485 | github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= 486 | github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= 487 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= 488 | github.com/nrdcg/auroradns v1.0.0/go.mod h1:6JPXKzIRzZzMqtTDgueIhTi6rFf1QvYE/HzqidhOhjw= 489 | github.com/nrdcg/dnspod-go v0.4.0/go.mod h1:vZSoFSFeQVm2gWLMkyX61LZ8HI3BaqtHZWgPTGKr6KQ= 490 | github.com/nrdcg/goinwx v0.6.1/go.mod h1:XPiut7enlbEdntAqalBIqcYcTEVhpv/dKWgDCX2SwKQ= 491 | github.com/nrdcg/namesilo v0.2.1/go.mod h1:lwMvfQTyYq+BbjJd30ylEG4GPSS6PII0Tia4rRpRiyw= 492 | github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U= 493 | github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= 494 | github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= 495 | github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= 496 | github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 497 | github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 498 | github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= 499 | github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= 500 | github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= 501 | github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= 502 | github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= 503 | github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= 504 | github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= 505 | github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= 506 | github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= 507 | github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= 508 | github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= 509 | github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= 510 | github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= 511 | github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= 512 | github.com/oracle/oci-go-sdk v7.0.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888= 513 | github.com/ovh/go-ovh v0.0.0-20181109152953-ba5adb4cf014/go.mod h1:joRatxRJaZBsY3JAOEMcoOp05CnZzsx4scTxi95DHyQ= 514 | github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c h1:rp5dCmg/yLR3mgFuSOe4oEnDDmGLROTvMragMUXpTQw= 515 | github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c/go.mod h1:X07ZCGwUbLaax7L0S3Tw4hpejzu63ZrrQiUe6W0hcy0= 516 | github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs= 517 | github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= 518 | github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= 519 | github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= 520 | github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= 521 | github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= 522 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 523 | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 524 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 525 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 526 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 527 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 528 | github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= 529 | github.com/poy/onpar v0.0.0-20190519213022-ee068f8ea4d1 h1:oL4IBbcqwhhNWh31bjOX8C/OCy0zs9906d/VUru+bqg= 530 | github.com/poy/onpar v0.0.0-20190519213022-ee068f8ea4d1/go.mod h1:nSbFQvMj97ZyhFRSJYtut+msi4sOY6zJDGCdSc+/rZU= 531 | github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 532 | github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 533 | github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= 534 | github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= 535 | github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= 536 | github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= 537 | github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= 538 | github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 539 | github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 540 | github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= 541 | github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 542 | github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 543 | github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= 544 | github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 545 | github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 546 | github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 547 | github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= 548 | github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= 549 | github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= 550 | github.com/rainycape/memcache v0.0.0-20150622160815-1031fa0ce2f2/go.mod h1:7tZKcyumwBO6qip7RNQ5r77yrssm9bfCowcLEBcU5IA= 551 | github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= 552 | github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= 553 | github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 554 | github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= 555 | github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= 556 | github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= 557 | github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 558 | github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= 559 | github.com/ryanuber/columnize v2.1.0+incompatible h1:j1Wcmh8OrK4Q7GXY+V7SVSY8nUWQxHW5TkBe7YUl+2s= 560 | github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= 561 | github.com/sacloud/libsacloud v1.26.1/go.mod h1:79ZwATmHLIFZIMd7sxA3LwzVy/B77uj3LDoToVTxDoQ= 562 | github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= 563 | github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiyyjYS17cCYRqP13/SHk= 564 | github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= 565 | github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= 566 | github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= 567 | github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= 568 | github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= 569 | github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= 570 | github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= 571 | github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= 572 | github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= 573 | github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= 574 | github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= 575 | github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= 576 | github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= 577 | github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= 578 | github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= 579 | github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= 580 | github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= 581 | github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= 582 | github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= 583 | github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= 584 | github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= 585 | github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= 586 | github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= 587 | github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= 588 | github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= 589 | github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= 590 | github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= 591 | github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= 592 | github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= 593 | github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= 594 | github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 595 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= 596 | github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= 597 | github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= 598 | github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= 599 | github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= 600 | github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= 601 | github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= 602 | github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a h1:pa8hGb/2YqsZKovtsgrwcDH1RZhVbTKCjLp47XpqCDs= 603 | github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= 604 | github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= 605 | github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= 606 | github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= 607 | github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= 608 | github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= 609 | github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= 610 | github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 611 | github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= 612 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 613 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 614 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 615 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 616 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 617 | github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= 618 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= 619 | github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= 620 | github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= 621 | github.com/timewasted/linode v0.0.0-20160829202747-37e84520dcf7/go.mod h1:imsgLplxEC/etjIhdr3dNzV3JeT27LbVu5pYWm0JCBY= 622 | github.com/transip/gotransip v0.0.0-20190812104329-6d8d9179b66f/go.mod h1:i0f4R4o2HM0m3DZYQWsj6/MEowD57VzoH0v3d7igeFY= 623 | github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= 624 | github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= 625 | github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= 626 | github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= 627 | github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= 628 | github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= 629 | github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= 630 | github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= 631 | github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= 632 | github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= 633 | github.com/valyala/fasthttp v1.26.0 h1:k5Tooi31zPG/g8yS6o2RffRO2C9B9Kah9SY8j/S7058= 634 | github.com/valyala/fasthttp v1.26.0/go.mod h1:cmWIqlu99AO/RKcp1HWaViTqc57FswJOfYYdPJBl8BA= 635 | github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= 636 | github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= 637 | github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= 638 | github.com/vultr/govultr v0.1.4/go.mod h1:9H008Uxr/C4vFNGLqKx232C206GL0PBHzOP0809bGNA= 639 | github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= 640 | github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= 641 | github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= 642 | github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= 643 | github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= 644 | github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= 645 | github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= 646 | github.com/xeipuuv/gojsonschema v1.1.0 h1:ngVtJC9TY/lg0AA/1k48FYhBrhRoFlEmWzsehpNAaZg= 647 | github.com/xeipuuv/gojsonschema v1.1.0/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= 648 | github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= 649 | github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= 650 | github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= 651 | github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= 652 | github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= 653 | github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= 654 | github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= 655 | github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= 656 | github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= 657 | go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= 658 | go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= 659 | go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= 660 | go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= 661 | go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= 662 | go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 663 | go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= 664 | go.uber.org/ratelimit v0.0.0-20180316092928-c15da0234277/go.mod h1:2X8KaoNd1J0lZV+PxJk/5+DGbO/tpwLR1m++a7FnB/Y= 665 | go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= 666 | golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= 667 | golang.org/x/crypto v0.0.0-20180214000028-650f4a345ab4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 668 | golang.org/x/crypto v0.0.0-20180621125126-a49355c7e3f8/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 669 | golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 670 | golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 671 | golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 672 | golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 673 | golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 674 | golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 675 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 676 | golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 677 | golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= 678 | golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 679 | golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 680 | golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 681 | golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 682 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 683 | golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 684 | golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 685 | golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 686 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 687 | golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 688 | golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a h1:kr2P4QFmQr29mSLA43kwrOcgcReGTfbE9N577tCTuBc= 689 | golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= 690 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 691 | golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 692 | golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= 693 | golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= 694 | golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 695 | golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= 696 | golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= 697 | golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 698 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 699 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= 700 | golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 701 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 702 | golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 703 | golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 704 | golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= 705 | golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= 706 | golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= 707 | golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= 708 | golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= 709 | golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 710 | golang.org/x/net v0.0.0-20180406214816-61147c48b25b/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 711 | golang.org/x/net v0.0.0-20180611182652-db08ff08e862/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 712 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 713 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 714 | golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 715 | golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 716 | golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 717 | golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 718 | golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 719 | golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 720 | golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 721 | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 722 | golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 723 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 724 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 725 | golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 726 | golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 727 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 728 | golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 729 | golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 730 | golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= 731 | golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 732 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 733 | golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 734 | golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 735 | golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 736 | golang.org/x/net v0.0.0-20191027093000-83d349e8ac1a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 737 | golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 738 | golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 739 | golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 740 | golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 741 | golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 742 | golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 743 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 744 | golang.org/x/net v0.0.0-20210510120150-4163338589ed h1:p9UgmWI9wKpfYmgaV/IZKGdXc5qEK45tDwwwDyjS26I= 745 | golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 746 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 747 | golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 748 | golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 749 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 750 | golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 751 | golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= 752 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 753 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 754 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 755 | golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 756 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 757 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 758 | golang.org/x/sync v0.0.0-20201207232520-09787c993a3a h1:DcqTD9SDLc+1P/r1EmRBwnVsrOwW+kk2vWf9n+1sGhs= 759 | golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 760 | golang.org/x/sys v0.0.0-20180622082034-63fc586f45fe/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 761 | golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 762 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 763 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 764 | golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 765 | golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 766 | golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 767 | golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 768 | golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 769 | golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 770 | golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 771 | golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 772 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 773 | golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 774 | golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 775 | golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 776 | golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 777 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 778 | golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 779 | golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 780 | golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 781 | golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 782 | golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 783 | golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 784 | golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 785 | golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 786 | golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 787 | golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 788 | golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 789 | golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 790 | golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 791 | golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 792 | golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 793 | golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 794 | golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 795 | golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 796 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 797 | golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 798 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 799 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 800 | golang.org/x/sys v0.0.0-20210514084401-e8d321eab015 h1:hZR0X1kPW+nwyJ9xRxqZk1vx5RUObAPBdKVvXPDUH/E= 801 | golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 802 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= 803 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 804 | golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 805 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 806 | golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 807 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 808 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 809 | golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= 810 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 811 | golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 812 | golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 813 | golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 814 | golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 815 | golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 816 | golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 817 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 818 | golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 819 | golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 820 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 821 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= 822 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 823 | golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 824 | golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 825 | golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 826 | golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 827 | golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 828 | golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 829 | golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 830 | golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 831 | golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 832 | golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 833 | golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 834 | golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 835 | golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 836 | golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 837 | golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 838 | golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 839 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 840 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 841 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= 842 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 843 | google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= 844 | google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= 845 | google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= 846 | google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= 847 | google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= 848 | google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= 849 | google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= 850 | google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= 851 | google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 852 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 853 | google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 854 | google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 855 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 856 | google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 857 | google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= 858 | google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 859 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 860 | google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 861 | google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 862 | google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= 863 | google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 864 | google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 865 | google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 866 | google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 867 | google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 868 | google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 869 | google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 870 | google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= 871 | google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 872 | google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= 873 | google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d h1:HV9Z9qMhQEsdlvxNFELgQ11RkMzO3CMkjEySjCtuLes= 874 | google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 875 | google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= 876 | google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= 877 | google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= 878 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 879 | google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 880 | google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= 881 | google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= 882 | google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 883 | google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 884 | google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 885 | google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg= 886 | google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 887 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= 888 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= 889 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= 890 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= 891 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= 892 | google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 893 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 894 | google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 895 | google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA= 896 | google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= 897 | gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 898 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 899 | gopkg.in/check.v1 v1.0.0-20160105164936-4f90aeace3a2/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 900 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 901 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 902 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 903 | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= 904 | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= 905 | gopkg.in/errgo.v1 v1.0.0-20161222125816-442357a80af5/go.mod h1:u0ALmqvLRxLI95fkdCEWrE6mhWYZW1aMOJHp5YXLHTg= 906 | gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= 907 | gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= 908 | gopkg.in/h2non/gock.v1 v1.0.15/go.mod h1:sX4zAkdYX1TRGJ2JY156cFspQn4yRWn6p9EMdODlynE= 909 | gopkg.in/httprequest.v1 v1.1.1/go.mod h1:/CkavNL+g3qLOrpFHVrEx4NKepeqR4XTZWNj4sGGjz0= 910 | gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= 911 | gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= 912 | gopkg.in/ini.v1 v1.44.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= 913 | gopkg.in/ini.v1 v1.51.1 h1:GyboHr4UqMiLUybYjd22ZjQIKEJEpgtLXtuGbR21Oho= 914 | gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= 915 | gopkg.in/mgo.v2 v2.0.0-20160818015218-f2b6f6c918c4/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= 916 | gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= 917 | gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= 918 | gopkg.in/ns1/ns1-go.v2 v2.0.0-20190730140822-b51389932cbc/go.mod h1:VV+3haRsgDiVLxyifmMBrBIuCWFBPYKbRssXB9z67Hw= 919 | gopkg.in/resty.v1 v1.9.1/go.mod h1:vo52Hzryw9PnPHcJfPsBiFW62XhNx5OczbV9y+IMpgc= 920 | gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= 921 | gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= 922 | gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= 923 | gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= 924 | gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637/go.mod h1:BHsqpu/nsuzkT5BpiH1EMZPLyqSMM8JbIavyFACoFNk= 925 | gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= 926 | gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= 927 | gopkg.in/yaml.v2 v2.0.0-20170712054546-1be3d31502d6/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= 928 | gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= 929 | gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 930 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 931 | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 932 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 933 | gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 934 | gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 935 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 936 | gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2 h1:XZx7nhd5GMaZpmDaEHFVafUZC7ya0fuo7cSJ3UCKYmM= 937 | gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 938 | gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= 939 | grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= 940 | honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 941 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 942 | honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 943 | honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 944 | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 945 | honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= 946 | k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= 947 | launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= 948 | launchpad.net/xmlpath v0.0.0-20130614043138-000000000004/go.mod h1:vqyExLOM3qBx7mvYRkoxjSCF945s0mbe7YynlKYXtsA= 949 | rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= 950 | rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= 951 | rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= 952 | sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= 953 | sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= 954 | -------------------------------------------------------------------------------- /hrefs.cn.sql: -------------------------------------------------------------------------------- 1 | CREATE SCHEMA `hrefsdb` ; 2 | 3 | use hrefsdb; 4 | 5 | CREATE TABLE `account` ( 6 | `id` int(11) NOT NULL AUTO_INCREMENT, 7 | `userid` varchar(30) NOT NULL, 8 | `username` varchar(30) NOT NULL, 9 | `password` varchar(36) NOT NULL, 10 | `regdate` datetime NOT NULL, 11 | `lastlogindate` datetime DEFAULT NULL, 12 | `status` tinyint(4) NOT NULL DEFAULT '0', 13 | PRIMARY KEY (`id`) 14 | ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 15 | 16 | INSERT INTO `account` VALUES (1,'jimmy','jimmy','e10adc3949ba59abbe56e057f20f883e','2019-01-07 09:01:19','2020-02-18 09:47:16',0); 17 | 18 | CREATE TABLE `article` ( 19 | `id` varchar(100) NOT NULL, 20 | `title` varchar(100) NOT NULL, 21 | `icon` varchar(200) NOT NULL, 22 | `visited` int(11) NOT NULL DEFAULT '0', 23 | `brief` varchar(500) NOT NULL, 24 | `body` text NOT NULL, 25 | `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, 26 | PRIMARY KEY (`id`) 27 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 28 | 29 | CREATE TABLE `cuslink` ( 30 | `id` int(11) NOT NULL AUTO_INCREMENT, 31 | `title` varchar(50) NOT NULL, 32 | `url` varchar(100) NOT NULL, 33 | `status` int(11) NOT NULL, 34 | `catid` varchar(50) DEFAULT NULL, 35 | `visited` int(11) DEFAULT '0', 36 | `linktype` varchar(50) DEFAULT NULL, 37 | `adddate` datetime NOT NULL, 38 | `updatedate` datetime DEFAULT CURRENT_TIMESTAMP, 39 | PRIMARY KEY (`id`) 40 | ) ENGINE=InnoDB AUTO_INCREMENT=69 DEFAULT CHARSET=utf8; 41 | 42 | CREATE TABLE `link` ( 43 | `id` varchar(50) NOT NULL, 44 | `icon` varchar(200) DEFAULT NULL, 45 | `linktype` varchar(50) NOT NULL, 46 | `catid` varchar(50) DEFAULT NULL, 47 | `url` varchar(200) NOT NULL, 48 | `title` varchar(100) NOT NULL, 49 | `brief` varchar(1000) NOT NULL, 50 | `createtime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, 51 | `visited` int(11) NOT NULL DEFAULT '0', 52 | PRIMARY KEY (`id`) 53 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 54 | 55 | CREATE TABLE `linkcat` ( 56 | `id` varchar(50) NOT NULL, 57 | `catname` varchar(50) DEFAULT NULL, 58 | PRIMARY KEY (`id`) 59 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 60 | 61 | INSERT INTO `linkcat` VALUES ('ae45b8c6-f0ed-11e9-81b7-0242ac120004','人工智能'),('ae45baa0-f0ed-11e9-81b7-0242ac120004','JQuery'),('ae45bae8-f0ed-11e9-81b7-0242ac120004','NodeJS'),('ae45bcb1-f0ed-11e9-81b7-0242ac120004','其他'),('ae45bce3-f0ed-11e9-81b7-0242ac120004','教程'),('ae45bd16-f0ed-11e9-81b7-0242ac120004','PHP'),('ae45bd20-f0ed-11e9-81b7-0242ac120004','前端框架'),('ae45bd3e-f0ed-11e9-81b7-0242ac120004','运维工具'),('ae45bd82-f0ed-11e9-81b7-0242ac120004','Vue'),('ae45bd8d-f0ed-11e9-81b7-0242ac120004','数据库'),('ae45bd97-f0ed-11e9-81b7-0242ac120004','协同工具'),('ae45bdac-f0ed-11e9-81b7-0242ac120004','大数据'),('ae45bdd8-f0ed-11e9-81b7-0242ac120004','区块链'),('ae45bdf7-f0ed-11e9-81b7-0242ac120004','Charts'),('ae45be34-f0ed-11e9-81b7-0242ac120004','软件'),('ae45be3e-f0ed-11e9-81b7-0242ac120004','富文本编辑器'),('ae45be5d-f0ed-11e9-81b7-0242ac120004','Python'),('ae45be67-f0ed-11e9-81b7-0242ac120004','Java'),('ae45be7c-f0ed-11e9-81b7-0242ac120004','DotNet'),('ae45be91-f0ed-11e9-81b7-0242ac120004','打包构建'),('ae45bea6-f0ed-11e9-81b7-0242ac120004','CSS'),('ae45beba-f0ed-11e9-81b7-0242ac120004','Golang'),('ae45becf-f0ed-11e9-81b7-0242ac120004','架构师'),('ae45bee3-f0ed-11e9-81b7-0242ac120004','实用工具'),('ae45beed-f0ed-11e9-81b7-0242ac120004','公共'),('ae45bef7-f0ed-11e9-81b7-0242ac120004','资讯'); -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | _ "github.com/iissy/goweb/src" 5 | "github.com/iissy/goweb/src/api" 6 | "github.com/iissy/goweb/src/srv" 7 | "github.com/iissy/goweb/src/web" 8 | ) 9 | 10 | func main() { 11 | go api.Start() 12 | go web.Start() 13 | srv.Start() 14 | } 15 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iissy/goweb/ded64756c6ee1598261d8f38f1e47afcbf236b15/public/favicon.ico -------------------------------------------------------------------------------- /public/list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iissy/goweb/ded64756c6ee1598261d8f38f1e47afcbf236b15/public/list.png -------------------------------------------------------------------------------- /public/payme.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iissy/goweb/ded64756c6ee1598261d8f38f1e47afcbf236b15/public/payme.jpg -------------------------------------------------------------------------------- /public/placeholder.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iissy/goweb/ded64756c6ee1598261d8f38f1e47afcbf236b15/public/placeholder.jpg -------------------------------------------------------------------------------- /public/stat.js: -------------------------------------------------------------------------------- 1 | var _hmt = _hmt || []; 2 | (function() { 3 | var hm = document.createElement("script"); 4 | hm.src = "https://hm.baidu.com/hm.js?e9709dab1cfab975e4418ce852e4f9c2"; 5 | var s = document.getElementsByTagName("script")[0]; 6 | s.parentNode.insertBefore(hm, s); 7 | })(); -------------------------------------------------------------------------------- /public/styles/site.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #f2f4f7; 3 | margin: 0; 4 | font-size: 14px; 5 | color: #000000; 6 | font-family: "Microsoft YaHei","微软雅黑","Arial",sans-serif; 7 | outline:none; 8 | font-weight:300; 9 | } 10 | 11 | a:link { 12 | color: #000000; 13 | text-decoration: none; 14 | } 15 | a:visited { 16 | color: #000000; 17 | text-decoration: none; 18 | } 19 | a:active { 20 | color: #000000; 21 | text-decoration: none; 22 | } 23 | 24 | a:hover { 25 | color: #e47911; 26 | text-decoration: none; 27 | } 28 | 29 | html, 30 | blockquote, 31 | div, 32 | h3, 33 | td, 34 | p, 35 | fieldset, 36 | legend, 37 | span, 38 | img, 39 | a { 40 | margin: 0; 41 | padding: 0; 42 | } 43 | 44 | #app { 45 | margin: 0 auto 0 auto; 46 | } 47 | 48 | #header { 49 | background-color: #fefefe; 50 | padding: 0; 51 | text-align: center; 52 | overflow: hidden; 53 | border-bottom: 1px solid #dee3eb; 54 | margin-bottom: 10px; 55 | } 56 | 57 | #main { 58 | margin: 0 auto 0 auto; 59 | max-width: 1300px; 60 | overflow: hidden; 61 | min-height: 700px; 62 | } 63 | 64 | .body { 65 | word-wrap: break-word; 66 | word-break: break-all; 67 | letter-spacing: 1px; 68 | padding: 10px 20px 10px 20px; 69 | line-height: 188%; 70 | font-size: 15px; 71 | } 72 | 73 | .body img { 74 | max-width: 100% !important; 75 | } 76 | 77 | .cke_contents_ltr .body figure.table { 78 | background-color: #ffffff; 79 | width: inherit; 80 | margin: 10px; 81 | padding: 0; 82 | border: none; 83 | } 84 | 85 | .cke_contents_ltr .body table, 86 | .cke_contents_ltr .body th, 87 | .cke_contents_ltr .body td { 88 | border-collapse:collapse; 89 | border:1px solid #cccccc; 90 | } 91 | 92 | .body dl, ol, ul { 93 | margin-bottom: 0; 94 | } 95 | 96 | #footer { 97 | margin: 10px auto 0 auto; 98 | padding: 20px 0 20px 0; 99 | text-align: center; 100 | background-color: #fefefe; 101 | clear: both; 102 | max-width: 1300px; 103 | } 104 | 105 | .site-hd { 106 | position: relative; 107 | padding: 2px 0 4px 32px; 108 | } 109 | 110 | .site-hd-item { 111 | position: relative; 112 | display: inline-block; 113 | vertical-align: top; 114 | margin-right: 4px; 115 | padding: 6px 0 4px; 116 | width: 120px; 117 | line-height: 20px; 118 | font-size: 14px; 119 | color: #000; 120 | } 121 | 122 | .site-item { 123 | position: relative; 124 | display: inline-block; 125 | vertical-align: middle; 126 | margin: 0; 127 | padding: 0; 128 | height: 30px; 129 | line-height: 30px; 130 | font-size: 14px; 131 | color: #000; 132 | text-align: left; 133 | text-overflow: ellipsis; 134 | overflow: hidden; 135 | white-space: nowrap; 136 | width: 177px; 137 | } 138 | 139 | .site-hd-item a img { height: 20px;vertical-align: middle; } 140 | 141 | .non-item { 142 | width: 150px; 143 | } 144 | 145 | .pay-item { 146 | position: relative; 147 | display: inline-block; 148 | vertical-align: top; 149 | padding: 0 0 8px; 150 | line-height: 20px; 151 | } 152 | 153 | #hot, #frontend, #backend, #common, #article, #other, #soft { 154 | margin-top: 10px; 155 | background-color: #ffffff; 156 | } 157 | #info, #pay { 158 | background-color: #ffffff; 159 | } 160 | #hot, #frontend, #backend, #other { 161 | padding-bottom: 10px; 162 | padding-top: 5px; 163 | padding-left: 30px; 164 | padding-right: 30px; 165 | } 166 | #detail { overflow: hidden;background-color: #ffffff; } 167 | .title { 168 | font-size: 20px !important; 169 | font-weight: bold; 170 | border-bottom: 1px solid #eeeeee; 171 | color: #C32528; 172 | font-family: 'museo-1', 'museo-2', Verdana; 173 | letter-spacing: 1px; 174 | text-shadow: #EEE 1px 1px 1px; 175 | margin: 0 0 0 0; 176 | padding: 15px 5px 15px 5px; 177 | text-align: center; 178 | } 179 | 180 | .origin { 181 | padding: 0 20px 5px 0; 182 | float: right; 183 | color: #888888; 184 | letter-spacing: 2px; 185 | } 186 | 187 | .cke_contents_ltr blockquote { 188 | background-color: #f8f8f8; 189 | font-style: normal; 190 | margin: 10px 0 10px 0; 191 | font-family: "Microsoft YaHei","微软雅黑","Arial",sans-serif; 192 | padding: 10px 10px 10px 20px; 193 | } 194 | 195 | .h3, h3 { 196 | font-size: 1.17em; 197 | } 198 | 199 | .cke_contents_ltr .body dl, .cke_contents_ltr .body ol, .cke_contents_ltr .body ul { 200 | background-color: #f8f8f8; 201 | margin: 10px 0 10px 0; 202 | padding: 10px 10px 10px 40px; 203 | color: rgb(106, 115, 125); 204 | } 205 | 206 | .cke_contents_ltr .body .todo-list { 207 | list-style: none; 208 | padding: 10px 10px 10px 20px; 209 | } 210 | 211 | .cke_contents_ltr .body .todo-list span { margin-left: 5px; } 212 | .cke_contents_ltr .body a { color: #0782C1 } 213 | 214 | .cke_contents_ltr .body pre { 215 | margin: 10px 0 10px 0; 216 | position: relative; 217 | box-sizing: border-box; 218 | font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, monospace; 219 | font-size: 14px; 220 | overflow-wrap: normal; 221 | padding: 10px 15px 10px 15px; 222 | overflow: auto; 223 | line-height: 1.45; 224 | background-color: rgb(246, 248, 250); 225 | border-radius: 3px; 226 | word-break: normal; 227 | color: rgb(36, 41, 46); 228 | font-style: normal; 229 | font-variant-ligatures: normal; 230 | font-variant-caps: normal; 231 | font-weight: 400; 232 | letter-spacing: normal; 233 | orphans: 2; 234 | text-align: start; 235 | text-indent: 0px; 236 | text-transform: none; 237 | widows: 2; 238 | word-spacing: 0px; 239 | -webkit-text-stroke-width: 0px; 240 | text-decoration-style: initial; 241 | text-decoration-color: initial; 242 | } 243 | 244 | .cke_contents_ltr .body pre code { 245 | box-sizing: border-box; 246 | color: rgb(106, 115, 125); 247 | } 248 | .cke_contents_ltr .body pre[data-language]:after { 249 | top: -1px; 250 | right: 10px; 251 | background: #757575; 252 | font-size: 10px; 253 | line-height: 16px; 254 | padding: 1px 4px 1px 4px; 255 | color: #fff; 256 | white-space: nowrap; 257 | content: attr(data-language); 258 | position: absolute; 259 | font-family: Helvetica,Arial,Tahoma,Verdana,Sans-Serif; 260 | } 261 | 262 | .cke_contents_ltr .body hr { 263 | margin-top: 5px; 264 | } -------------------------------------------------------------------------------- /public/yc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iissy/goweb/ded64756c6ee1598261d8f38f1e47afcbf236b15/public/yc.png -------------------------------------------------------------------------------- /public/zz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iissy/goweb/ded64756c6ee1598261d8f38f1e47afcbf236b15/public/zz.png -------------------------------------------------------------------------------- /src/api/router.go: -------------------------------------------------------------------------------- 1 | package api 2 | 3 | import ( 4 | "github.com/gin-gonic/gin" 5 | "github.com/iissy/goweb/src/controller" 6 | "github.com/iissy/goweb/src/middleware" 7 | ) 8 | 9 | func Start() { 10 | app := gin.New() 11 | app.Use(gin.Recovery()) 12 | app.Use(middleware.TraceApi) 13 | app.POST("/login", controller.Login) 14 | api := app.Group("/api") 15 | api.Use(middleware.CheckLogin) 16 | api.POST("/upload", controller.Upload) 17 | 18 | article := api.Group("/article") 19 | { 20 | article.POST("/save", controller.SaveArticle) 21 | article.POST("/list/:size/:page", controller.GetArticleList) 22 | article.GET("/get/:id", controller.GetArticle) 23 | article.GET("/delete/:id", controller.DeleteArticle) 24 | } 25 | 26 | account := api.Group("/account") 27 | { 28 | account.POST("/list/:size/:page", controller.GetAccountList) 29 | account.GET("/get/:id", controller.GetAccount) 30 | } 31 | 32 | link := api.Group("/link") 33 | { 34 | link.POST("/save", controller.SaveLink) 35 | link.POST("/list/:size/:page", controller.GetLinkList) 36 | link.GET("/get/:id", controller.GetLink) 37 | link.GET("/cat/list", controller.GetCatOptions) 38 | link.GET("/delete/:id", controller.DeleteLink) 39 | } 40 | 41 | cuslink := api.Group("/cuslink") 42 | { 43 | cuslink.POST("/save", controller.SaveCusLink) 44 | cuslink.POST("/list/:size/:page", controller.GetCusLinkList) 45 | cuslink.GET("/get/:id", controller.GetCusLink) 46 | cuslink.GET("/delete/:id", controller.DeleteCusLink) 47 | } 48 | 49 | app.Run(":81") 50 | } 51 | -------------------------------------------------------------------------------- /src/cli/cli.go: -------------------------------------------------------------------------------- 1 | package cli 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | 7 | "github.com/asim/go-micro/v3/client" 8 | "github.com/asim/go-micro/v3/config" 9 | ) 10 | 11 | var name string 12 | 13 | func init() { 14 | name = config.Get("srv").String("micro.hrefs.srv") 15 | } 16 | 17 | func Call(method string, req interface{}, rsp interface{}) error { 18 | request := client.NewRequest(name, fmt.Sprintf("Hrefs.%s", method), req, client.WithContentType("application/json")) 19 | 20 | if err := client.Call(context.TODO(), request, &rsp); err != nil { 21 | fmt.Println(err) 22 | return err 23 | } 24 | 25 | return nil 26 | } 27 | -------------------------------------------------------------------------------- /src/controller/account.go: -------------------------------------------------------------------------------- 1 | package controller 2 | 3 | import ( 4 | "fmt" 5 | "github.com/gin-gonic/gin" 6 | "github.com/iissy/goweb/src/cli" 7 | "github.com/iissy/goweb/src/model" 8 | "github.com/iissy/goweb/src/utils" 9 | "strconv" 10 | ) 11 | 12 | func GetAccount(ctx *gin.Context) { 13 | id, err := strconv.Atoi(ctx.Param("id")) 14 | if ok := utils.WriteErrorLog(ctx.FullPath(), err); ok { 15 | fmt.Print(0) 16 | } 17 | 18 | result := new(model.Account) 19 | err = cli.Call("GetAccount", id, result) 20 | utils.WriteErrorLog(ctx.FullPath(), err) 21 | 22 | ctx.JSON(200, result) 23 | } 24 | 25 | func GetAccountList(ctx *gin.Context) { 26 | size, err := strconv.Atoi(ctx.Param("size")) 27 | if err != nil { 28 | size = 10 29 | } 30 | 31 | page, err := strconv.Atoi(ctx.Param("page")) 32 | if err != nil { 33 | page = 1 34 | } 35 | 36 | result := new(model.AccountList) 37 | req := model.Pager{Page: page, Size: size} 38 | err = cli.Call("GetAccountList", req, result) 39 | utils.WriteErrorLog(ctx.FullPath(), err) 40 | 41 | ctx.JSON(200, result) 42 | } 43 | -------------------------------------------------------------------------------- /src/controller/article.go: -------------------------------------------------------------------------------- 1 | package controller 2 | 3 | import ( 4 | "fmt" 5 | "regexp" 6 | "strconv" 7 | "strings" 8 | "time" 9 | 10 | "github.com/gin-gonic/gin" 11 | "github.com/iissy/goweb/src/cli" 12 | "github.com/iissy/goweb/src/model" 13 | "github.com/iissy/goweb/src/utils" 14 | ) 15 | 16 | func GetArticle(ctx *gin.Context) { 17 | id := ctx.Param("id") 18 | result := new(model.Article) 19 | err := cli.Call("GetArticle", id, result) 20 | utils.WriteErrorLog(ctx.FullPath(), err) 21 | 22 | ctx.JSON(200, result) 23 | } 24 | 25 | func GetArticleList(ctx *gin.Context) { 26 | size, err := strconv.Atoi(ctx.Param("size")) 27 | if err != nil { 28 | size = 10 29 | } 30 | 31 | page, err := strconv.Atoi(ctx.Param("page")) 32 | if err != nil { 33 | page = 1 34 | } 35 | 36 | search := new(model.Search) 37 | err = ctx.BindJSON(&search) 38 | utils.WriteErrorLog(ctx.FullPath(), err) 39 | 40 | req := model.SearchPager{Pager: model.Pager{Page: page, Size: size}, Search: search} 41 | result := new(model.ArticleList) 42 | err = cli.Call("GetArticleList", req, result) 43 | utils.WriteErrorLog(ctx.FullPath(), err) 44 | 45 | ctx.JSON(200, result) 46 | } 47 | 48 | func DeleteArticle(ctx *gin.Context) { 49 | id := ctx.Param("id") 50 | 51 | result := new(int64) 52 | err := cli.Call("DeleteArticle", id, result) 53 | utils.WriteErrorLog(ctx.FullPath(), err) 54 | 55 | ctx.JSON(200, result) 56 | } 57 | 58 | func SaveArticle(ctx *gin.Context) { 59 | article := new(model.Article) 60 | err := ctx.BindJSON(&article) 61 | if ok := utils.WriteErrorLog(ctx.FullPath(), err); ok { 62 | fmt.Print(0) 63 | } 64 | 65 | //将HTML标签全转换成小写 66 | brief := string(article.Body) 67 | re, _ := regexp.Compile("\\<[\\S\\s]+?\\>") 68 | brief = re.ReplaceAllStringFunc(brief, strings.ToLower) 69 | //去除STYLE 70 | re, _ = regexp.Compile("\\") 71 | brief = re.ReplaceAllString(brief, "") 72 | //去除SCRIPT 73 | re, _ = regexp.Compile("\\") 74 | brief = re.ReplaceAllString(brief, "") 75 | //去除所有尖括号内的HTML代码,并换成换行符 76 | re, _ = regexp.Compile("\\<[\\S\\s]+?\\>") 77 | brief = re.ReplaceAllString(brief, "\n") 78 | //去除连续的换行符 79 | re, _ = regexp.Compile("\\s{2,}") 80 | brief = re.ReplaceAllString(brief, "\n") 81 | article.Brief = brief 82 | 83 | article.CreateTime = time.Now() 84 | 85 | result := new(int64) 86 | err = cli.Call("SaveArticle", article, result) 87 | utils.WriteErrorLog(ctx.FullPath(), err) 88 | 89 | ctx.JSON(200, result) 90 | } 91 | -------------------------------------------------------------------------------- /src/controller/auth.go: -------------------------------------------------------------------------------- 1 | package controller 2 | 3 | import ( 4 | "fmt" 5 | "github.com/gin-gonic/gin" 6 | "github.com/iissy/goweb/src/cli" 7 | "github.com/iissy/goweb/src/model" 8 | "github.com/iissy/goweb/src/utils" 9 | "github.com/asim/go-micro/v3/config" 10 | "time" 11 | ) 12 | 13 | func Login(ctx *gin.Context) { 14 | user := new(model.Account) 15 | err := ctx.BindJSON(&user) 16 | if ok := utils.WriteErrorLog(ctx.FullPath(), err); ok { 17 | fmt.Print(0) 18 | } 19 | 20 | user.Password = utils.GetMd5String(user.Password) 21 | user.LastLoginDate = time.Now().Format("2006-01-02 15:04:05") 22 | result := new(model.Account) 23 | err = cli.Call("Login", user, result) 24 | if ok := utils.WriteErrorLog(ctx.FullPath(), err); ok { 25 | fmt.Print(0) 26 | } 27 | 28 | if result.ID > 0 { 29 | token := utils.Random62String(64) 30 | ctx.Header(utils.ASYUSERID, result.UserId) 31 | ctx.Header(utils.ASYTOKEN, token) 32 | ctx.SetCookie(utils.ASYUSERID, result.UserId, 3600, "/", config.Get("domain").String("localhost"), false, true) 33 | ctx.SetCookie(utils.ASYTOKEN, token, 3600, "/", config.Get("domain").String("localhost"), false, true) 34 | req := new(model.Token) 35 | req.UserId = result.UserId 36 | req.Code = token 37 | err = cli.Call("SetToken", req, true) 38 | utils.WriteErrorLog(ctx.FullPath(), err) 39 | } 40 | 41 | ctx.JSON(200, result) 42 | } 43 | -------------------------------------------------------------------------------- /src/controller/cuslinks.go: -------------------------------------------------------------------------------- 1 | package controller 2 | 3 | import ( 4 | "fmt" 5 | "github.com/gin-gonic/gin" 6 | "github.com/iissy/goweb/src/cli" 7 | "github.com/iissy/goweb/src/model" 8 | "github.com/iissy/goweb/src/utils" 9 | "strconv" 10 | "time" 11 | ) 12 | 13 | func GetCusLink(ctx *gin.Context) { 14 | id, err := strconv.Atoi(ctx.Param("id")) 15 | if ok := utils.WriteErrorLog(ctx.FullPath(), err); ok { 16 | fmt.Print(0) 17 | } 18 | 19 | result := new(model.CusLink) 20 | err = cli.Call("GetCusLink", id, result) 21 | utils.WriteErrorLog(ctx.FullPath(), err) 22 | 23 | ctx.JSON(200, result) 24 | } 25 | 26 | func GetCusLinkList(ctx *gin.Context) { 27 | size, err := strconv.Atoi(ctx.Param("size")) 28 | if err != nil { 29 | size = 10 30 | } 31 | 32 | page, err := strconv.Atoi(ctx.Param("page")) 33 | if err != nil { 34 | page = 1 35 | } 36 | 37 | search := new(model.Search) 38 | err = ctx.BindJSON(&search) 39 | utils.WriteErrorLog(ctx.FullPath(), err) 40 | 41 | result := new(model.CusLinkList) 42 | req := model.SearchPager{Pager: model.Pager{Page: page, Size: size}, Search: search} 43 | err = cli.Call("GetCusLinkList", req, result) 44 | utils.WriteErrorLog(ctx.FullPath(), err) 45 | 46 | ctx.JSON(200, result) 47 | } 48 | 49 | func DeleteCusLink(ctx *gin.Context) { 50 | id, err := strconv.Atoi(ctx.Param("id")) 51 | utils.WriteErrorLog(ctx.FullPath(), err) 52 | 53 | result := new(int64) 54 | err = cli.Call("DeleteCusLink", id, result) 55 | utils.WriteErrorLog(ctx.FullPath(), err) 56 | 57 | ctx.JSON(200, result) 58 | } 59 | 60 | func SaveCusLink(ctx *gin.Context) { 61 | cuslink := new(model.CusLink) 62 | err := ctx.BindJSON(&cuslink) 63 | if ok := utils.WriteErrorLog(ctx.FullPath(), err); ok { 64 | fmt.Print(0) 65 | } 66 | 67 | cat := new(model.LinkCat) 68 | err = cli.Call("GetLinkCat", cuslink.Catid, cat) 69 | utils.WriteErrorLog(ctx.FullPath(), err) 70 | 71 | cuslink.LinkType = cat.CatName 72 | cuslink.Adddate = time.Now().Format("2006-01-02 15:04:05") 73 | cuslink.Updatedate = time.Now().Format("2006-01-02 15:04:05") 74 | 75 | result := new(int64) 76 | err = cli.Call("SaveCusLink", cuslink, result) 77 | utils.WriteErrorLog(ctx.FullPath(), err) 78 | 79 | ctx.JSON(200, result) 80 | } 81 | -------------------------------------------------------------------------------- /src/controller/helpers.go: -------------------------------------------------------------------------------- 1 | package controller 2 | 3 | import ( 4 | "github.com/gin-gonic/gin" 5 | "github.com/google/uuid" 6 | "github.com/sirupsen/logrus" 7 | "os" 8 | "path" 9 | "strings" 10 | "time" 11 | ) 12 | 13 | func Upload(ctx *gin.Context) { 14 | result := struct { 15 | Message string `json:"msg"` 16 | Uploaded int `json:"uploaded"` 17 | Url string `json:"url"` 18 | }{"", 0, ""} 19 | 20 | file, err := ctx.FormFile("upload") 21 | if err != nil { 22 | logrus.Error(err) 23 | ctx.JSON(500, result) 24 | } 25 | 26 | dir := "/upload/" + time.Now().Format("20060102") + "/" 27 | err = os.MkdirAll("./public"+dir, os.ModePerm) 28 | if err != nil { 29 | logrus.Error(err) 30 | ctx.JSON(500, result) 31 | } 32 | 33 | url := dir + uuid.New().String() + strings.ToLower(path.Ext(file.Filename)) 34 | 35 | dst := "./public/" + url 36 | err = ctx.SaveUploadedFile(file, dst) 37 | if err != nil { 38 | logrus.Error(err) 39 | ctx.JSON(500, result) 40 | } 41 | 42 | result.Uploaded = 1 43 | result.Url = url 44 | ctx.JSON(200, result) 45 | } 46 | -------------------------------------------------------------------------------- /src/controller/index.go: -------------------------------------------------------------------------------- 1 | package controller 2 | 3 | import ( 4 | "bytes" 5 | "encoding/base64" 6 | "fmt" 7 | "github.com/iissy/goweb/src/cli" 8 | "github.com/iissy/goweb/src/model" 9 | "github.com/iissy/goweb/src/mosaic" 10 | "github.com/iissy/goweb/src/utils" 11 | "github.com/kataras/iris/v12" 12 | "image" 13 | "image/jpeg" 14 | "math" 15 | "sort" 16 | "strconv" 17 | "time" 18 | ) 19 | 20 | func Index(ctx iris.Context) { 21 | l := make(chan []*model.Link) 22 | a := make(chan []*model.Article) 23 | c := make(chan []*model.CusLink) 24 | 25 | go func() { 26 | rsp := new(model.LinkList) 27 | err := cli.Call("IndexLinks", true, rsp) 28 | utils.WriteErrorLog(ctx.Path(), err) 29 | l <- rsp.List 30 | }() 31 | 32 | go func() { 33 | rsp := new(model.ArticleList) 34 | err := cli.Call("TopArticles", true, rsp) 35 | utils.WriteErrorLog(ctx.Path(), err) 36 | a <- rsp.List 37 | }() 38 | 39 | go func() { 40 | rsp := new(model.CusLinkList) 41 | err := cli.Call("TopCusLinks", true, rsp) 42 | utils.WriteErrorLog(ctx.Path(), err) 43 | c <- rsp.List 44 | }() 45 | 46 | result := new(model.Index) 47 | linkMap := make(map[string][]*model.Link) 48 | linkCountMap := make(map[string]int) 49 | catMap := make(map[string]string) 50 | 51 | links := <-l 52 | for _, link := range links { 53 | linkMap[link.LinkType] = append(linkMap[link.LinkType], link) 54 | linkCountMap[link.LinkType] = len(linkMap[link.LinkType]) 55 | catMap[link.LinkType] = link.Catid 56 | } 57 | 58 | groups := make(model.OneGroups, 0) 59 | for key, val := range catMap { 60 | item := new(model.OneGroup) 61 | item.CatId = val 62 | item.Name = key 63 | item.Size = linkCountMap[key] 64 | item.Items = linkMap[key] 65 | groups = append(groups, item) 66 | } 67 | sort.Sort(groups) 68 | 69 | result.Common = linkMap["公共"] 70 | result.Info = linkMap["资讯"] 71 | result.Articles = <-a 72 | result.CusLinks = <-c 73 | 74 | result.Other = setter([]string{"实用工具", "软件", "教程"}, groups) 75 | result.Backend = setter([]string{"NodeJS", "PHP", "DotNet", "Golang", "Java", "Python", "其他"}, groups) 76 | result.Frontend = setter([]string{"CSS", "JQuery", "Charts", "Vue", "前端框架", "富文本编辑器", "打包构建"}, groups) 77 | result.Hot = setter([]string{"架构师", "人工智能", "区块链", "大数据", "数据库", "运维工具", "协同工具"}, groups) 78 | 79 | ctx.ViewLayout(iris.NoLayout) 80 | ctx.ViewData("body", result) 81 | ctx.View("index.html") 82 | } 83 | 84 | func setter(list []string, groups model.OneGroups) *model.LinkGroup { 85 | result := new(model.LinkGroup) 86 | newGroups := make(model.OneGroups, 0) 87 | for _, g := range groups { 88 | for _, l := range list { 89 | if l == g.Name { 90 | newGroups = append(newGroups, g) 91 | break 92 | } 93 | } 94 | } 95 | 96 | if len(newGroups) > 0 { 97 | result.Active = newGroups[0] 98 | result.Rests = newGroups[1:] 99 | } 100 | 101 | return result 102 | } 103 | 104 | func ListLinks(ctx iris.Context) { 105 | id := ctx.Params().Get("id") 106 | rspl := new(model.LinkList) 107 | err := cli.Call("ListLinks", id, rspl) 108 | utils.WriteErrorLog(ctx.Path(), err) 109 | links := rspl.List 110 | 111 | rspc := new(model.CusLinkList) 112 | err = cli.Call("ListCusLinksByCatId", id, rspc) 113 | utils.WriteErrorLog(ctx.Path(), err) 114 | cuslinks := rspc.List 115 | 116 | if links == nil || len(links) == 0 { 117 | ctx.NotFound() 118 | } else { 119 | ctx.ViewData("title", links[0].LinkType+" - 网址大全") 120 | ctx.ViewData("links", links) 121 | ctx.ViewData("cuslinks", cuslinks) 122 | ctx.View("links.html") 123 | } 124 | } 125 | 126 | func ListCusLinks(ctx iris.Context) { 127 | rsp := new(model.CusLinkList) 128 | err := cli.Call("ListCusLinks", true, rsp) 129 | utils.WriteErrorLog(ctx.Path(), err) 130 | result := rsp.List 131 | 132 | ctx.ViewData("title", "网络文摘") 133 | ctx.ViewData("body", result) 134 | ctx.View("cuslinks.html") 135 | } 136 | 137 | func ListArticles(ctx iris.Context) { 138 | rsp := new(model.ArticleList) 139 | err := cli.Call("ListArticles", true, rsp) 140 | utils.WriteErrorLog(ctx.Path(), err) 141 | result := rsp.List 142 | 143 | ctx.ViewData("title", "文章列表") 144 | ctx.ViewData("body", result) 145 | ctx.View("articles.html") 146 | } 147 | 148 | func Detail(ctx iris.Context) { 149 | id := ctx.Params().Get("id") 150 | result := new(model.Article) 151 | err := cli.Call("GetArticle", id, result) 152 | if ok := utils.WriteErrorLog(ctx.Path(), err); ok { 153 | ctx.NotFound() 154 | return 155 | } 156 | 157 | if result == nil { 158 | ctx.NotFound() 159 | return 160 | } 161 | 162 | go cli.Call("UpdateArticleVisited", id, true) 163 | ctx.ViewData("title", result.Title) 164 | ctx.ViewData("body", result) 165 | ctx.View("detail.html") 166 | } 167 | 168 | func Payme(ctx iris.Context) { 169 | result := new(int64) 170 | err := cli.Call("LinkVisitedCount", true, result) 171 | utils.WriteErrorLog(ctx.Path(), err) 172 | 173 | ctx.ViewData("title", "打赏站长") 174 | ctx.ViewData("body", result) 175 | ctx.View("payme.html") 176 | } 177 | 178 | func GetLinkUrl(ctx iris.Context) { 179 | id := ctx.Params().Get("id") 180 | url := new(string) 181 | err := cli.Call("GetLinkUrl", id, url) 182 | utils.WriteErrorLog(ctx.Path(), err) 183 | 184 | if len(*url) > 0 { 185 | go cli.Call("UpdateLinkVisited", id, true) 186 | ctx.Redirect(*url) 187 | } else { 188 | ctx.NotFound() 189 | } 190 | } 191 | 192 | func GetCusLinkUrl(ctx iris.Context) { 193 | id, err := strconv.Atoi(ctx.Params().Get("id")) 194 | utils.WriteErrorLog(ctx.Path(), err) 195 | 196 | url := new(string) 197 | err = cli.Call("GetCusLinkUrl", id, url) 198 | utils.WriteErrorLog(ctx.Path(), err) 199 | 200 | if len(*url) > 0 { 201 | go cli.Call("UpdateCusLinkVisited", id, true) 202 | ctx.Redirect(*url) 203 | } else { 204 | ctx.NotFound() 205 | } 206 | } 207 | 208 | func Choose(ctx iris.Context) { 209 | ctx.ViewData("title", "选择图片") 210 | ctx.View("choose.html") 211 | } 212 | 213 | func Mosaic(ctx iris.Context) { 214 | t0 := time.Now() 215 | file, _, _ := ctx.FormFile("image") 216 | defer file.Close() 217 | 218 | original, _, _ := image.Decode(file) 219 | bounds := original.Bounds() 220 | db := mosaic.CloneTilesDB() 221 | tileSize := int(math.Ceil(math.Sqrt(float64(bounds.Max.X) * float64(bounds.Max.Y) / 3333.0))) 222 | // fan-out 223 | c1 := mosaic.Cut(original, &db, tileSize, bounds.Min.X, bounds.Min.Y, bounds.Max.X/2, bounds.Max.Y/2) 224 | c2 := mosaic.Cut(original, &db, tileSize, bounds.Max.X/2, bounds.Min.Y, bounds.Max.X, bounds.Max.Y/2) 225 | c3 := mosaic.Cut(original, &db, tileSize, bounds.Min.X, bounds.Max.Y/2, bounds.Max.X/2, bounds.Max.Y) 226 | c4 := mosaic.Cut(original, &db, tileSize, bounds.Max.X/2, bounds.Max.Y/2, bounds.Max.X, bounds.Max.Y) 227 | // fan-in 228 | c := mosaic.Combine(bounds, c1, c2, c3, c4) 229 | buf1 := new(bytes.Buffer) 230 | jpeg.Encode(buf1, original, nil) 231 | originalStr := base64.StdEncoding.EncodeToString(buf1.Bytes()) 232 | 233 | t1 := time.Now() 234 | images := map[string]string{ 235 | "original": originalStr, 236 | "mosaic": <-c, 237 | "duration": fmt.Sprintf("%v ", t1.Sub(t0)), 238 | } 239 | 240 | ctx.ViewData("title", "图片打马赛克") 241 | ctx.ViewData("body", images) 242 | ctx.View("mosaic.html") 243 | } 244 | -------------------------------------------------------------------------------- /src/controller/link.go: -------------------------------------------------------------------------------- 1 | package controller 2 | 3 | import ( 4 | "fmt" 5 | "github.com/gin-gonic/gin" 6 | "github.com/google/uuid" 7 | "github.com/iissy/goweb/src/cli" 8 | "github.com/iissy/goweb/src/model" 9 | "github.com/iissy/goweb/src/utils" 10 | "strconv" 11 | "time" 12 | ) 13 | 14 | func GetLink(ctx *gin.Context) { 15 | id := ctx.Param("id") 16 | 17 | result := new(model.Link) 18 | err := cli.Call("GetLink", id, result) 19 | utils.WriteErrorLog(ctx.FullPath(), err) 20 | 21 | ctx.JSON(200, result) 22 | } 23 | 24 | func GetLinkList(ctx *gin.Context) { 25 | size, err := strconv.Atoi(ctx.Param("size")) 26 | if err != nil { 27 | size = 10 28 | } 29 | 30 | page, err := strconv.Atoi(ctx.Param("page")) 31 | if err != nil { 32 | page = 1 33 | } 34 | 35 | search := new(model.Search) 36 | err = ctx.BindJSON(&search) 37 | utils.WriteErrorLog(ctx.FullPath(), err) 38 | 39 | result := new(model.LinkList) 40 | req := model.SearchPager{Pager: model.Pager{Page: page, Size: size}, Search: search} 41 | err = cli.Call("GetLinkList", req, result) 42 | utils.WriteErrorLog(ctx.FullPath(), err) 43 | 44 | ctx.JSON(200, result) 45 | } 46 | 47 | func DeleteLink(ctx *gin.Context) { 48 | id := ctx.Param("id") 49 | 50 | result := new(int64) 51 | err := cli.Call("DeleteLink", id, result) 52 | utils.WriteErrorLog(ctx.FullPath(), err) 53 | 54 | ctx.JSON(200, result) 55 | } 56 | 57 | func SaveLink(ctx *gin.Context) { 58 | link := new(model.Link) 59 | err := ctx.BindJSON(&link) 60 | if ok := utils.WriteErrorLog(ctx.FullPath(), err); ok { 61 | fmt.Print(0) 62 | } 63 | 64 | cat := new(model.LinkCat) 65 | err = cli.Call("GetLinkCat", link.Catid, cat) 66 | utils.WriteErrorLog(ctx.FullPath(), err) 67 | 68 | if len(link.Id) < 10 { 69 | link.Id = uuid.New().String() 70 | } 71 | link.LinkType = cat.CatName 72 | link.CreateTime = time.Now().Format("2006-01-02 15:04:05") 73 | 74 | result := new(int64) 75 | err = cli.Call("SaveLink", link, result) 76 | utils.WriteErrorLog(ctx.FullPath(), err) 77 | 78 | ctx.JSON(200, result) 79 | } 80 | -------------------------------------------------------------------------------- /src/controller/linkcat.go: -------------------------------------------------------------------------------- 1 | package controller 2 | 3 | import ( 4 | "github.com/gin-gonic/gin" 5 | "github.com/iissy/goweb/src/cli" 6 | "github.com/iissy/goweb/src/model" 7 | "github.com/iissy/goweb/src/utils" 8 | ) 9 | 10 | func GetCatOptions(ctx *gin.Context) { 11 | result := new(model.LinkCatList) 12 | err := cli.Call("GetCatOptions", true, result) 13 | utils.WriteErrorLog(ctx.FullPath(), err) 14 | 15 | ctx.JSON(200, result.List) 16 | } 17 | -------------------------------------------------------------------------------- /src/domain/account.go: -------------------------------------------------------------------------------- 1 | package domain 2 | 3 | import ( 4 | "github.com/iissy/goweb/src/model" 5 | "github.com/juju/errors" 6 | ) 7 | 8 | func Login(user *model.Account) (*model.Account, error) { 9 | result := new(model.Account) 10 | sql := "select id,userid,username,regdate from account where UserId = ? and Password = ?" 11 | err := dbMap.SelectOne(&result, sql, user.UserId, user.Password) 12 | if err != nil { 13 | return nil, errors.Trace(err) 14 | } 15 | 16 | sql = "update account set lastlogindate = ? where id = ?" 17 | dbMap.Exec(sql, user.LastLoginDate, result.ID) 18 | 19 | return result, err 20 | } 21 | 22 | func GetAccount(id int) (*model.Account, error) { 23 | result := new(model.Account) 24 | sql := "select id,userid,username,regdate from account where id = ?" 25 | err := dbMap.SelectOne(&result, sql, id) 26 | if err != nil { 27 | return nil, errors.Trace(err) 28 | } 29 | 30 | return result, err 31 | } 32 | 33 | func GetAccountList(page int, size int) (*model.AccountList, error) { 34 | result := new(model.AccountList) 35 | list := make([]*model.Account, 0) 36 | sql := "select id,userid,username,regdate,lastlogindate from account order by regdate desc limit ?, ?" 37 | _, err := dbMap.Select(&list, sql, (page-1)*size, size) 38 | if err != nil { 39 | return nil, errors.Trace(err) 40 | } 41 | 42 | total, err := dbMap.SelectInt("select count(*) from account") 43 | if err != nil { 44 | return nil, errors.Trace(err) 45 | } 46 | 47 | result.List = list 48 | result.Total = total 49 | return result, nil 50 | } 51 | -------------------------------------------------------------------------------- /src/domain/articles.go: -------------------------------------------------------------------------------- 1 | package domain 2 | 3 | import ( 4 | "fmt" 5 | "github.com/iissy/goweb/src/model" 6 | "github.com/iissy/goweb/src/utils" 7 | "github.com/juju/errors" 8 | ) 9 | 10 | func ListArticles() ([]*model.Article, error) { 11 | result := make([]*model.Article, 0) 12 | sql := "select id,title,icon,brief,createTime from article ORDER BY createTime desc" 13 | _, err := dbMap.Select(&result, sql) 14 | if err != nil { 15 | return nil, errors.Trace(err) 16 | } 17 | 18 | return result, err 19 | } 20 | 21 | func TopArticles() ([]*model.Article, error) { 22 | result := make([]*model.Article, 0) 23 | sql := "select id,title from article ORDER BY createTime desc limit 3" 24 | _, err := dbMap.Select(&result, sql) 25 | if err != nil { 26 | return nil, errors.Trace(err) 27 | } 28 | 29 | return result, err 30 | } 31 | 32 | func GetArticle(id string) (*model.Article, error) { 33 | result := new(model.Article) 34 | sql := "select id,title,body,icon,brief,createTime from article where id = ?" 35 | err := dbMap.SelectOne(&result, sql, id) 36 | if err != nil { 37 | return nil, errors.Trace(err) 38 | } 39 | 40 | return result, err 41 | } 42 | 43 | func GetArticleList(page int, size int, search *model.Search) (*model.ArticleList, error) { 44 | result := new(model.ArticleList) 45 | list := make([]*model.Article, 0) 46 | params := make([]string, 0) 47 | where := "where 1=1" 48 | if search != nil && len(search.Id) > 0 { 49 | where = "where id = ?" 50 | params = append(params, search.Id) 51 | } 52 | 53 | if search != nil && len(search.Title) > 0 { 54 | where += " and title like ?" 55 | params = append(params, "%"+search.Title+"%") 56 | } 57 | sql := "select id,title,icon,brief,createTime,visited from article %s order by createTime desc limit ?, ?" 58 | sql = fmt.Sprintf(sql, where) 59 | args, _ := utils.BuildSqlArgs(params, (page-1)*size, size) 60 | _, err := dbMap.Select(&list, sql, args...) 61 | if err != nil { 62 | return nil, errors.Trace(err) 63 | } 64 | 65 | sql = "select count(*) from article %s" 66 | sql = fmt.Sprintf(sql, where) 67 | args, _ = utils.BuildSqlArgs(params) 68 | total, err := dbMap.SelectInt(sql, args...) 69 | if err != nil { 70 | return nil, errors.Trace(err) 71 | } 72 | 73 | result.List = list 74 | result.Total = total 75 | return result, nil 76 | } 77 | 78 | func DeleteArticle(id string) (int64, error) { 79 | sql := "delete from article where id = ?" 80 | result, err := dbMap.Exec(sql, id) 81 | if err != nil { 82 | return 0, errors.Trace(err) 83 | } 84 | 85 | return result.RowsAffected() 86 | } 87 | 88 | func SaveArticle(article *model.Article) (int64, error) { 89 | sql := "INSERT INTO article(id,icon,title,brief,body,createTime) values (?,?,?,?,?,?) ON DUPLICATE KEY UPDATE icon = ?, title = ?, brief = ?, body = ?;" 90 | result, err := dbMap.Exec(sql, article.Id, article.Icon, article.Title, article.Brief, article.Body, article.CreateTime, article.Icon, article.Title, article.Brief, article.Body) 91 | if err != nil { 92 | return 0, errors.Trace(err) 93 | } 94 | 95 | return result.RowsAffected() 96 | } 97 | 98 | func UpdateArticleVisited(id string) error { 99 | sql := "update article set visited = visited + 1 where id = ?" 100 | _, err := dbMap.Exec(sql, id) 101 | if err != nil { 102 | return errors.Trace(err) 103 | } 104 | 105 | return nil 106 | } 107 | -------------------------------------------------------------------------------- /src/domain/cuslinks.go: -------------------------------------------------------------------------------- 1 | package domain 2 | 3 | import ( 4 | "fmt" 5 | "github.com/iissy/goweb/src/model" 6 | "github.com/iissy/goweb/src/utils" 7 | "github.com/juju/errors" 8 | ) 9 | 10 | func ListCusLinks() ([]*model.CusLink, error) { 11 | result := make([]*model.CusLink, 0) 12 | sql := "select id,title,url,linktype from cuslink ORDER BY id desc" 13 | _, err := dbMap.Select(&result, sql) 14 | if err != nil { 15 | return nil, errors.Trace(err) 16 | } 17 | 18 | return result, err 19 | } 20 | 21 | func ListCusLinksByCatId(catid string) ([]*model.CusLink, error) { 22 | result := make([]*model.CusLink, 0) 23 | sql := "select id,title from cuslink where catid = ? ORDER BY id desc" 24 | _, err := dbMap.Select(&result, sql, catid) 25 | if err != nil { 26 | return nil, errors.Trace(err) 27 | } 28 | 29 | return result, err 30 | } 31 | 32 | func TopCusLinks() ([]*model.CusLink, error) { 33 | result := make([]*model.CusLink, 0) 34 | sql := "select id,title from cuslink ORDER BY id desc limit 15" 35 | _, err := dbMap.Select(&result, sql) 36 | if err != nil { 37 | return nil, errors.Trace(err) 38 | } 39 | 40 | return result, err 41 | } 42 | 43 | func GetCusLinkUrl(id int) (string, error) { 44 | sql := "select url FROM cuslink where id = ?" 45 | result, err := dbMap.SelectStr(sql, id) 46 | if err != nil { 47 | return "", errors.Trace(err) 48 | } 49 | 50 | return result, err 51 | } 52 | 53 | func GetCusLink(id int) (*model.CusLink, error) { 54 | result := new(model.CusLink) 55 | sql := "select id,title,url,linktype,catid from cuslink where id = ?" 56 | err := dbMap.SelectOne(&result, sql, id) 57 | if err != nil { 58 | return nil, errors.Trace(err) 59 | } 60 | 61 | return result, err 62 | } 63 | 64 | func GetCusLinkList(page int, size int, search *model.Search) (*model.CusLinkList, error) { 65 | result := new(model.CusLinkList) 66 | list := make([]*model.CusLink, 0) 67 | params := make([]string, 0) 68 | where := "where 1=1" 69 | if search != nil && len(search.CatId) > 0 { 70 | where = "where catid = ?" 71 | params = append(params, search.CatId) 72 | } 73 | if search != nil && len(search.Title) > 0 { 74 | where += " and title like ?" 75 | params = append(params, "%"+search.Title+"%") 76 | } 77 | if search != nil && len(search.Url) > 0 { 78 | where += " and url like ?" 79 | params = append(params, "%"+search.Url+"%") 80 | } 81 | sql := "select id,title,url,linktype,visited,adddate,updatedate from cuslink %s order by id desc limit ?, ?" 82 | sql = fmt.Sprintf(sql, where) 83 | args, _ := utils.BuildSqlArgs(params, (page-1)*size, size) 84 | _, err := dbMap.Select(&list, sql, args...) 85 | if err != nil { 86 | return nil, errors.Trace(err) 87 | } 88 | 89 | sql = "select count(*) from cuslink %s" 90 | sql = fmt.Sprintf(sql, where) 91 | args, _ = utils.BuildSqlArgs(params) 92 | total, err := dbMap.SelectInt(sql, args...) 93 | if err != nil { 94 | return nil, errors.Trace(err) 95 | } 96 | 97 | result.List = list 98 | result.Total = total 99 | return result, nil 100 | } 101 | 102 | func DeleteCusLink(id int) (int64, error) { 103 | sql := "delete from cuslink where id = ?" 104 | result, err := dbMap.Exec(sql, id) 105 | if err != nil { 106 | return 0, errors.Trace(err) 107 | } 108 | 109 | return result.RowsAffected() 110 | } 111 | 112 | func SaveCusLink(cuslink *model.CusLink) (int64, error) { 113 | sql := "INSERT INTO cuslink(id, title,url,status,catid,linktype,adddate) values (?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE title = ?, url = ?, catid = ?, linktype = ?, updatedate = ?;" 114 | result, err := dbMap.Exec(sql, cuslink.Id, cuslink.Title, cuslink.Url, cuslink.Status, cuslink.Catid, cuslink.LinkType, cuslink.Adddate, 115 | cuslink.Title, cuslink.Url, cuslink.Catid, cuslink.LinkType, cuslink.Updatedate) 116 | if err != nil { 117 | return 0, errors.Trace(err) 118 | } 119 | 120 | return result.RowsAffected() 121 | } 122 | 123 | func UpdateCusLinkVisited(id int) error { 124 | sql := "update cuslink set visited = visited + 1 where id = ?" 125 | _, err := dbMap.Exec(sql, id) 126 | if err != nil { 127 | return errors.Trace(err) 128 | } 129 | 130 | return nil 131 | } 132 | -------------------------------------------------------------------------------- /src/domain/init.go: -------------------------------------------------------------------------------- 1 | package domain 2 | 3 | import ( 4 | "github.com/go-gorp/gorp/v3" 5 | "github.com/iissy/goweb/src/utils" 6 | ) 7 | 8 | var dbMap *gorp.DbMap 9 | 10 | func InitDb() { 11 | dbMap = utils.InitDb() 12 | } 13 | -------------------------------------------------------------------------------- /src/domain/linkcat.go: -------------------------------------------------------------------------------- 1 | package domain 2 | 3 | import ( 4 | "github.com/iissy/goweb/src/model" 5 | "github.com/juju/errors" 6 | ) 7 | 8 | func GetCatOptions() ([]*model.LinkCat, error) { 9 | result := make([]*model.LinkCat, 0) 10 | sql := "SELECT id,catname FROM linkcat ORDER BY id desc" 11 | _, err := dbMap.Select(&result, sql) 12 | if err != nil { 13 | return nil, errors.Trace(err) 14 | } 15 | 16 | return result, nil 17 | } 18 | 19 | func GetLinkCat(id string) (*model.LinkCat, error) { 20 | result := new(model.LinkCat) 21 | sql := "SELECT id,catname FROM linkcat where id = ?" 22 | err := dbMap.SelectOne(&result, sql, id) 23 | if err != nil { 24 | return nil, errors.Trace(err) 25 | } 26 | 27 | return result, nil 28 | } 29 | -------------------------------------------------------------------------------- /src/domain/links.go: -------------------------------------------------------------------------------- 1 | package domain 2 | 3 | import ( 4 | "fmt" 5 | "github.com/iissy/goweb/src/model" 6 | "github.com/iissy/goweb/src/utils" 7 | "github.com/juju/errors" 8 | ) 9 | 10 | func ListLinks(cat_id string) ([]*model.Link, error) { 11 | result := make([]*model.Link, 0) 12 | sql := "select id,title,visited,brief,linktype from link where catid = ? ORDER BY visited desc" 13 | _, err := dbMap.Select(&result, sql, cat_id) 14 | if err != nil { 15 | return nil, errors.Trace(err) 16 | } 17 | 18 | return result, err 19 | } 20 | 21 | func IndexLinks() ([]*model.Link, error) { 22 | result := make([]*model.Link, 0) 23 | sql := "select icon,title,id,catid,linkType,brief FROM link ORDER BY linkType asc,visited desc" 24 | _, err := dbMap.Select(&result, sql) 25 | if err != nil { 26 | return nil, errors.Trace(err) 27 | } 28 | 29 | return result, err 30 | } 31 | 32 | func GetLinkUrl(id string) (string, error) { 33 | sql := "select url FROM link where id = ?" 34 | result, err := dbMap.SelectStr(sql, id) 35 | if err != nil { 36 | return "", errors.Trace(err) 37 | } 38 | 39 | return result, err 40 | } 41 | 42 | func LinkVisitedCount() (int64, error) { 43 | sql := "select sum(visited) from link" 44 | result, err := dbMap.SelectInt(sql) 45 | if err != nil { 46 | return 0, errors.Trace(err) 47 | } 48 | 49 | return result, err 50 | } 51 | 52 | func GetLink(id string) (*model.Link, error) { 53 | result := new(model.Link) 54 | sql := "select id,title,visited,brief,linktype,icon,catid,url from link where id = ?" 55 | err := dbMap.SelectOne(&result, sql, id) 56 | if err != nil { 57 | return nil, errors.Trace(err) 58 | } 59 | 60 | return result, err 61 | } 62 | 63 | func GetLinkList(page int, size int, search *model.Search) (*model.LinkList, error) { 64 | result := new(model.LinkList) 65 | list := make([]*model.Link, 0) 66 | params := make([]string, 0) 67 | where := "where 1=1" 68 | if search != nil && len(search.CatId) > 0 { 69 | where = "where catid = ?" 70 | params = append(params, search.CatId) 71 | } 72 | if search != nil && len(search.Title) > 0 { 73 | where += " and title like ?" 74 | params = append(params, "%"+search.Title+"%") 75 | } 76 | if search != nil && len(search.Url) > 0 { 77 | where += " and url like ?" 78 | params = append(params, "%"+search.Url+"%") 79 | } 80 | sql := "select id,title,visited,brief,linktype,icon,catid,url,createtime from link %s order by createtime desc limit ?, ?" 81 | sql = fmt.Sprintf(sql, where) 82 | args, _ := utils.BuildSqlArgs(params, (page-1)*size, size) 83 | _, err := dbMap.Select(&list, sql, args...) 84 | if err != nil { 85 | return nil, errors.Trace(err) 86 | } 87 | 88 | sql = "select count(*) from link %s" 89 | sql = fmt.Sprintf(sql, where) 90 | args, _ = utils.BuildSqlArgs(params) 91 | total, err := dbMap.SelectInt(sql, args...) 92 | if err != nil { 93 | return nil, errors.Trace(err) 94 | } 95 | 96 | result.List = list 97 | result.Total = total 98 | return result, nil 99 | } 100 | 101 | func DeleteLink(id string) (int64, error) { 102 | sql := "delete from link where id = ?" 103 | result, err := dbMap.Exec(sql, id) 104 | if err != nil { 105 | return 0, errors.Trace(err) 106 | } 107 | 108 | return result.RowsAffected() 109 | } 110 | 111 | func SaveLink(link *model.Link) (int64, error) { 112 | sql := "INSERT INTO link(id,icon,catid,linktype,title,url,brief) values (?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE icon = ?, catid = ?, linktype = ?, title = ?, url = ?, brief = ?;" 113 | result, err := dbMap.Exec(sql, link.Id, link.Icon, link.Catid, link.LinkType, link.Title, link.Url, link.Brief, link.Icon, link.Catid, link.LinkType, link.Title, link.Url, link.Brief) 114 | if err != nil { 115 | return 0, errors.Trace(err) 116 | } 117 | 118 | return result.RowsAffected() 119 | } 120 | 121 | func UpdateLinkVisited(id string) error { 122 | sql := "update link set visited = visited + 1 where id = ?" 123 | _, err := dbMap.Exec(sql, id) 124 | if err != nil { 125 | return errors.Trace(err) 126 | } 127 | 128 | return nil 129 | } 130 | -------------------------------------------------------------------------------- /src/init.go: -------------------------------------------------------------------------------- 1 | package src 2 | 3 | import ( 4 | "github.com/iissy/goweb/src/domain" 5 | "github.com/iissy/goweb/src/redis" 6 | "github.com/iissy/goweb/src/utils" 7 | "github.com/asim/go-micro/v3/config" 8 | "github.com/asim/go-micro/v3/config/source/file" 9 | "log" 10 | ) 11 | 12 | const ( 13 | defaultConfigPath = "conf/config.json" 14 | ) 15 | 16 | func init() { 17 | loadConfig() 18 | utils.InitLog() 19 | domain.InitDb() 20 | redis.InitDb() 21 | } 22 | 23 | func loadConfig() { 24 | if err := config.Load(file.NewSource( 25 | file.WithPath(defaultConfigPath), 26 | )); err != nil { 27 | log.Panic(err) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/middleware/check_login.go: -------------------------------------------------------------------------------- 1 | package middleware 2 | 3 | import ( 4 | "github.com/gin-gonic/gin" 5 | "github.com/iissy/goweb/src/cli" 6 | "github.com/iissy/goweb/src/utils" 7 | "github.com/juju/errors" 8 | "github.com/sirupsen/logrus" 9 | ) 10 | 11 | func CheckLogin(ctx *gin.Context) { 12 | id := ParseHeadOrCookie(ctx, utils.ASYUSERID) 13 | token := ParseHeadOrCookie(ctx, utils.ASYTOKEN) 14 | 15 | if len(id) <= 0 || len(token) <= 0 { 16 | logrus.Error("miss id or token") 17 | ctx.Abort() 18 | return 19 | } 20 | 21 | v := new(string) 22 | err := cli.Call("GetToken", id, v) 23 | if err != nil { 24 | logrus.Error(errors.ErrorStack(err)) 25 | ctx.Abort() 26 | return 27 | } 28 | 29 | if *v != token { 30 | ctx.Abort() 31 | } 32 | } 33 | 34 | func ParseHeadOrCookie(ctx *gin.Context, k string) string { 35 | v := ctx.GetHeader(k) 36 | if len(v) == 0 { 37 | v, _ = ctx.Cookie(k) 38 | } 39 | return v 40 | } 41 | -------------------------------------------------------------------------------- /src/middleware/monitor.go: -------------------------------------------------------------------------------- 1 | package middleware 2 | 3 | import ( 4 | "github.com/gin-gonic/gin" 5 | "github.com/kataras/iris/v12" 6 | "github.com/sirupsen/logrus" 7 | "time" 8 | ) 9 | 10 | func TraceWeb(ctx iris.Context) { 11 | defer trace(ctx.Path())() 12 | ctx.Next() 13 | } 14 | 15 | func TraceApi(ctx *gin.Context) { 16 | defer trace(ctx.Request.URL.Path)() 17 | ctx.Next() 18 | } 19 | 20 | func trace(path string) func() { 21 | start := time.Now() 22 | return func() { 23 | logrus.Infof("%s %s", time.Since(start), path) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/model/types.go: -------------------------------------------------------------------------------- 1 | package model 2 | 3 | import ( 4 | "html/template" 5 | "time" 6 | ) 7 | 8 | type LinkCat struct { 9 | ID string `json:"id"` 10 | CatName string `json:"cat_name"` 11 | } 12 | 13 | type Article struct { 14 | Id string `json:"id"` 15 | Title string `json:"title"` 16 | Icon string `json:"icon"` 17 | Brief string `json:"brief"` 18 | Body template.HTML `json:"body"` 19 | UserID int `json:"user_id"` 20 | NickName string `json:"nick_name"` 21 | Origin string `json:"origin"` 22 | CreateTime time.Time `json:"create_time"` 23 | Visited int `json:"visited"` 24 | Catalog string `json:"catalog"` 25 | } 26 | 27 | type AccountList struct { 28 | List []*Account `json:"list"` 29 | Total int64 `json:"total"` 30 | } 31 | 32 | type ArticleList struct { 33 | List []*Article `json:"list"` 34 | Total int64 `json:"total"` 35 | } 36 | 37 | type LinkList struct { 38 | List []*Link `json:"list"` 39 | Total int64 `json:"total"` 40 | } 41 | 42 | type CusLinkList struct { 43 | List []*CusLink `json:"list"` 44 | Total int64 `json:"total"` 45 | } 46 | 47 | type LinkCatList struct{ List []*LinkCat } 48 | 49 | type CusLink struct { 50 | Id int `json:"id"` 51 | Title string `json:"title"` 52 | Url string `json:"url"` 53 | Status int `json:"status"` 54 | LinkType string `json:"link_type"` 55 | Catid string `json:"cat_id"` 56 | Adddate string `json:"add_date"` 57 | Updatedate string `json:"update_date"` 58 | Visited int `json:"visited"` 59 | } 60 | 61 | type Link struct { 62 | Id string `json:"id"` 63 | Title string `json:"title"` 64 | Icon string `json:"icon"` 65 | Catid string `json:"cat_id"` 66 | LinkType string `json:"link_type"` 67 | Visited int `json:"visited"` 68 | Brief template.HTML `json:"brief"` 69 | Url string `json:"url"` 70 | CreateTime string `json:"create_time"` 71 | } 72 | 73 | type LinkGroup struct { 74 | Active *OneGroup 75 | Rests []*OneGroup 76 | } 77 | 78 | type Index struct { 79 | Common []*Link 80 | Info []*Link 81 | CusLinks []*CusLink 82 | Articles []*Article 83 | Other *LinkGroup 84 | Backend *LinkGroup 85 | Frontend *LinkGroup 86 | Hot *LinkGroup 87 | } 88 | 89 | type Account struct { 90 | ID int `json:"id"` 91 | UserId string `json:"userid"` 92 | Password string `json:"password"` 93 | UserName string `json:"user_name"` 94 | RegDate string `json:"reg_date"` 95 | LastLoginDate string `json:"last_login_date"` 96 | Status int `json:"status"` 97 | } 98 | 99 | type OneGroup struct { 100 | CatId string 101 | Name string 102 | Items []*Link 103 | Size int 104 | } 105 | 106 | type Search struct { 107 | Id string `json:"id"` 108 | Title string `json:"title"` 109 | CatId string `json:"cat_id"` 110 | Url string `json:"url"` 111 | } 112 | 113 | type Pager struct { 114 | Page int 115 | Size int 116 | } 117 | 118 | type SearchPager struct { 119 | Pager 120 | *Search 121 | } 122 | 123 | type Token struct { 124 | UserId string 125 | Code string 126 | } 127 | 128 | type OneGroups []*OneGroup 129 | 130 | func (s OneGroups) Len() int { return len(s) } 131 | func (s OneGroups) Swap(i, j int) { s[i], s[j] = s[j], s[i] } 132 | func (s OneGroups) Less(i, j int) bool { return s[i].Size > s[j].Size } 133 | -------------------------------------------------------------------------------- /src/mosaic/mosaic.go: -------------------------------------------------------------------------------- 1 | package mosaic 2 | 3 | import ( 4 | "bytes" 5 | "encoding/base64" 6 | "fmt" 7 | "image" 8 | "image/color" 9 | "image/draw" 10 | "image/jpeg" 11 | "io/ioutil" 12 | "math" 13 | "os" 14 | "path/filepath" 15 | "sync" 16 | ) 17 | 18 | //func init() { 19 | // TILESDB = tilesDB() 20 | //} 21 | 22 | type DB struct { 23 | mutex *sync.Mutex 24 | store map[string][3]float64 25 | } 26 | 27 | func (db *DB) nearest(target [3]float64) string { 28 | var filename string 29 | db.mutex.Lock() 30 | smallest := 1000000.0 31 | for k, v := range db.store { 32 | dist := distance(target, v) 33 | if dist < smallest { 34 | filename, smallest = k, dist 35 | } 36 | } 37 | delete(db.store, filename) 38 | db.mutex.Unlock() 39 | return filename 40 | } 41 | 42 | // resize an image by its ratio e.g. ratio 2 means reduce the size by 1/2, 10 means reduce the size by 1/10 43 | func resize(in image.Image, newWidth int) image.NRGBA { 44 | bounds := in.Bounds() 45 | width := bounds.Dx() 46 | ratio := width / newWidth 47 | out := image.NewNRGBA(image.Rect(bounds.Min.X/ratio, bounds.Min.X/ratio, bounds.Max.X/ratio, bounds.Max.Y/ratio)) 48 | for y, j := bounds.Min.Y, bounds.Min.Y; y < bounds.Max.Y; y, j = y+ratio, j+1 { 49 | for x, i := bounds.Min.X, bounds.Min.X; x < bounds.Max.X; x, i = x+ratio, i+1 { 50 | r, g, b, a := in.At(x, y).RGBA() 51 | out.SetNRGBA(i, j, color.NRGBA{uint8(r >> 8), uint8(g >> 8), uint8(b >> 8), uint8(a >> 8)}) 52 | } 53 | } 54 | return *out 55 | } 56 | 57 | // find the average color of the picture 58 | func averageColor(img image.Image) [3]float64 { 59 | bounds := img.Bounds() 60 | r, g, b := 0.0, 0.0, 0.0 61 | for y := bounds.Min.Y; y < bounds.Max.Y; y++ { 62 | for x := bounds.Min.X; x < bounds.Max.X; x++ { 63 | r1, g1, b1, _ := img.At(x, y).RGBA() 64 | r, g, b = r+float64(r1), g+float64(g1), b+float64(b1) 65 | } 66 | } 67 | totalPixels := float64(bounds.Max.X * bounds.Max.Y) 68 | return [3]float64{r / totalPixels, g / totalPixels, b / totalPixels} 69 | } 70 | 71 | var TILESDB map[string][3]float64 72 | 73 | func CloneTilesDB() DB { 74 | db := make(map[string][3]float64) 75 | for k, v := range TILESDB { 76 | db[k] = v 77 | } 78 | tiles := DB{ 79 | store: db, 80 | mutex: &sync.Mutex{}, 81 | } 82 | return tiles 83 | } 84 | 85 | // populate a tiles database in memory 86 | func tilesDB() map[string][3]float64 { 87 | fmt.Println("Start populating tiles db ...") 88 | db := make(map[string][3]float64) 89 | files, _ := ioutil.ReadDir("public/tiles") 90 | for _, f := range files { 91 | name := filepath.Join("public/tiles", f.Name()) 92 | file, err := os.Open(name) 93 | if err == nil { 94 | img, _, err := image.Decode(file) 95 | if err == nil { 96 | db[name] = averageColor(img) 97 | } else { 98 | fmt.Println("error in populating tiles db:", err, name) 99 | } 100 | } else { 101 | fmt.Println("cannot open file", name, "when populating tiles db:", err) 102 | } 103 | file.Close() 104 | } 105 | fmt.Println("Finished populating tiles db.") 106 | return db 107 | } 108 | 109 | // find the Eucleadian distance between 2 points 110 | func distance(p1 [3]float64, p2 [3]float64) float64 { 111 | return math.Sqrt(sq(p2[0]-p1[0]) + sq(p2[1]-p1[1]) + sq(p2[2]-p1[2])) 112 | } 113 | 114 | // find the square 115 | func sq(n float64) float64 { 116 | return n * n 117 | } 118 | 119 | // cut out the image and return individual channels with image.Image 120 | // no encoding of JPEG 121 | func Cut(original image.Image, db *DB, tileSize, x1, y1, x2, y2 int) <-chan image.Image { 122 | c := make(chan image.Image) 123 | sp := image.Point{0, 0} 124 | go func() { 125 | newimage := image.NewNRGBA(image.Rect(x1, y1, x2, y2)) 126 | for y := y1; y < y2; y = y + tileSize { 127 | for x := x1; x < x2; x = x + tileSize { 128 | r, g, b, _ := original.At(x, y).RGBA() 129 | color := [3]float64{float64(r), float64(g), float64(b)} 130 | nearest := db.nearest(color) 131 | file, err := os.Open(nearest) 132 | if err == nil { 133 | img, _, err := image.Decode(file) 134 | if err == nil { 135 | t := resize(img, tileSize) 136 | tile := t.SubImage(t.Bounds()) 137 | tileBounds := image.Rect(x, y, x+tileSize, y+tileSize) 138 | draw.Draw(newimage, tileBounds, tile, sp, draw.Src) 139 | } else { 140 | fmt.Println("error in decoding nearest", err, nearest) 141 | } 142 | } else { 143 | fmt.Println("error opening file when creating mosaic:", nearest) 144 | } 145 | file.Close() 146 | } 147 | } 148 | c <- newimage.SubImage(newimage.Rect) 149 | }() 150 | 151 | return c 152 | } 153 | 154 | // combine the images and return the encoding string 155 | func Combine(r image.Rectangle, c1, c2, c3, c4 <-chan image.Image) <-chan string { 156 | c := make(chan string) 157 | // start a goroutine 158 | go func() { 159 | var wg sync.WaitGroup 160 | newimage := image.NewNRGBA(r) 161 | copy := func(dst draw.Image, r image.Rectangle, src image.Image, sp image.Point) { 162 | draw.Draw(dst, r, src, sp, draw.Src) 163 | wg.Done() 164 | } 165 | wg.Add(4) 166 | var s1, s2, s3, s4 image.Image 167 | var ok1, ok2, ok3, ok4 bool 168 | for { 169 | select { 170 | case s1, ok1 = <-c1: 171 | go copy(newimage, s1.Bounds(), s1, image.Point{r.Min.X, r.Min.Y}) 172 | case s2, ok2 = <-c2: 173 | go copy(newimage, s2.Bounds(), s2, image.Point{r.Max.X / 2, r.Min.Y}) 174 | case s3, ok3 = <-c3: 175 | go copy(newimage, s3.Bounds(), s3, image.Point{r.Min.X, r.Max.Y / 2}) 176 | case s4, ok4 = <-c4: 177 | go copy(newimage, s4.Bounds(), s4, image.Point{r.Max.X / 2, r.Max.Y / 2}) 178 | } 179 | if ok1 && ok2 && ok3 && ok4 { 180 | break 181 | } 182 | } 183 | // wait till all copy goroutines are complete 184 | wg.Wait() 185 | buf2 := new(bytes.Buffer) 186 | jpeg.Encode(buf2, newimage, nil) 187 | c <- base64.StdEncoding.EncodeToString(buf2.Bytes()) 188 | }() 189 | return c 190 | } 191 | -------------------------------------------------------------------------------- /src/redis/redis.go: -------------------------------------------------------------------------------- 1 | package redis 2 | 3 | import ( 4 | "github.com/gomodule/redigo/redis" 5 | "github.com/iissy/goweb/src/utils" 6 | "github.com/juju/errors" 7 | ) 8 | 9 | var pool *redis.Pool 10 | 11 | func InitDb() { 12 | pool = utils.InitRedisPool() 13 | } 14 | 15 | func Get(key string) (string, error) { 16 | conn := pool.Get() 17 | defer conn.Close() 18 | result, err := redis.String(conn.Do("GET", key)) 19 | if err != nil { 20 | return "", errors.Trace(err) 21 | } 22 | 23 | return result, nil 24 | } 25 | 26 | func Set(key string, value string) error { 27 | conn := pool.Get() 28 | defer conn.Close() 29 | err := conn.Send("SET", key, value) 30 | if err != nil { 31 | return errors.Trace(err) 32 | } 33 | 34 | expireTime := 60 * 60 * 6 35 | err = conn.Send("EXPIRE", key, expireTime) 36 | if err != nil { 37 | return errors.Trace(err) 38 | } 39 | 40 | err = conn.Flush() 41 | if err != nil { 42 | return errors.Trace(err) 43 | } 44 | 45 | return nil 46 | } 47 | -------------------------------------------------------------------------------- /src/srv/api.go: -------------------------------------------------------------------------------- 1 | package srv 2 | 3 | import ( 4 | "context" 5 | "github.com/iissy/goweb/src/domain" 6 | "github.com/iissy/goweb/src/model" 7 | "github.com/iissy/goweb/src/redis" 8 | ) 9 | 10 | func (s *Hrefs) GetToken(ctx context.Context, req string, rsp *string) error { 11 | result, err := redis.Get(req) 12 | *rsp = result 13 | return err 14 | } 15 | 16 | func (s *Hrefs) SetToken(ctx context.Context, req *model.Token, rsp *bool) error { 17 | err := redis.Set(req.UserId, req.Code) 18 | return err 19 | } 20 | 21 | func (s *Hrefs) GetAccount(ctx context.Context, req int, rsp *model.Account) error { 22 | result, err := domain.GetAccount(req) 23 | *rsp = *result 24 | return err 25 | } 26 | 27 | func (s *Hrefs) GetAccountList(ctx context.Context, req *model.Pager, rsp *model.AccountList) error { 28 | result, err := domain.GetAccountList(req.Page, req.Size) 29 | rsp.List = result.List 30 | rsp.Total = result.Total 31 | return err 32 | } 33 | 34 | func (s *Hrefs) GetArticleList(ctx context.Context, req *model.SearchPager, rsp *model.ArticleList) error { 35 | result, err := domain.GetArticleList(req.Page, req.Size, req.Search) 36 | rsp.List = result.List 37 | rsp.Total = result.Total 38 | return err 39 | } 40 | 41 | func (s *Hrefs) DeleteArticle(ctx context.Context, req string, rsp *int64) error { 42 | result, err := domain.DeleteArticle(req) 43 | *rsp = result 44 | return err 45 | } 46 | 47 | func (s *Hrefs) SaveArticle(ctx context.Context, req *model.Article, rsp *int64) error { 48 | result, err := domain.SaveArticle(req) 49 | *rsp = result 50 | return err 51 | } 52 | 53 | func (s *Hrefs) Login(ctx context.Context, req *model.Account, rsp *model.Account) error { 54 | result, err := domain.Login(req) 55 | *rsp = *result 56 | return err 57 | } 58 | 59 | func (s *Hrefs) GetCusLink(ctx context.Context, req int, rsp *model.CusLink) error { 60 | result, err := domain.GetCusLink(req) 61 | *rsp = *result 62 | return err 63 | } 64 | 65 | func (s *Hrefs) GetCusLinkList(ctx context.Context, req *model.SearchPager, rsp *model.CusLinkList) error { 66 | result, err := domain.GetCusLinkList(req.Page, req.Size, req.Search) 67 | rsp.List = result.List 68 | rsp.Total = result.Total 69 | return err 70 | } 71 | 72 | func (s *Hrefs) DeleteCusLink(ctx context.Context, req int, rsp *int64) error { 73 | result, err := domain.DeleteCusLink(req) 74 | *rsp = result 75 | return err 76 | } 77 | 78 | func (s *Hrefs) SaveCusLink(ctx context.Context, req *model.CusLink, rsp *int64) error { 79 | result, err := domain.SaveCusLink(req) 80 | *rsp = result 81 | return err 82 | } 83 | 84 | func (s *Hrefs) GetLinkCat(ctx context.Context, req string, rsp *model.LinkCat) error { 85 | result, err := domain.GetLinkCat(req) 86 | *rsp = *result 87 | return err 88 | } 89 | 90 | func (s *Hrefs) GetLink(ctx context.Context, req string, rsp *model.Link) error { 91 | result, err := domain.GetLink(req) 92 | *rsp = *result 93 | return err 94 | } 95 | 96 | func (s *Hrefs) GetLinkList(ctx context.Context, req *model.SearchPager, rsp *model.LinkList) error { 97 | result, err := domain.GetLinkList(req.Page, req.Size, req.Search) 98 | rsp.List = result.List 99 | rsp.Total = result.Total 100 | return err 101 | } 102 | 103 | func (s *Hrefs) DeleteLink(ctx context.Context, req string, rsp *int64) error { 104 | result, err := domain.DeleteLink(req) 105 | *rsp = result 106 | return err 107 | } 108 | 109 | func (s *Hrefs) SaveLink(ctx context.Context, req *model.Link, rsp *int64) error { 110 | result, err := domain.SaveLink(req) 111 | *rsp = result 112 | return err 113 | } 114 | 115 | func (s *Hrefs) GetCatOptions(ctx context.Context, req bool, rsp *model.LinkCatList) error { 116 | items, err := domain.GetCatOptions() 117 | if err != nil { 118 | return err 119 | } 120 | 121 | rsp.List = items 122 | 123 | return nil 124 | } 125 | -------------------------------------------------------------------------------- /src/srv/run.go: -------------------------------------------------------------------------------- 1 | package srv 2 | 3 | import ( 4 | "context" 5 | "time" 6 | 7 | gCli "github.com/asim/go-micro/plugins/client/grpc/v3" 8 | "github.com/asim/go-micro/plugins/registry/consul/v3" 9 | gSrv "github.com/asim/go-micro/plugins/server/grpc/v3" 10 | "github.com/asim/go-micro/v3" 11 | "github.com/asim/go-micro/v3/client" 12 | "github.com/asim/go-micro/v3/config" 13 | "github.com/asim/go-micro/v3/registry" 14 | "github.com/asim/go-micro/v3/server" 15 | "github.com/iissy/goweb/src/utils" 16 | "github.com/sirupsen/logrus" 17 | ) 18 | 19 | type Hrefs struct{} 20 | 21 | func init() { 22 | urls := utils.GetConsulUrls() 23 | reg := consul.NewRegistry(registry.Addrs(urls...)) 24 | 25 | server.DefaultServer = gSrv.NewServer( 26 | server.Registry(reg), 27 | server.Name(config.Get("srv").String("micro.hrefs.srv")), 28 | ) 29 | 30 | client.DefaultClient = gCli.NewClient( 31 | client.Registry(reg), 32 | ) 33 | } 34 | 35 | func Start() { 36 | service := micro.NewService( 37 | micro.WrapHandler(logWrapper), 38 | ) 39 | 40 | server.Init() 41 | service.Server().Init(server.Wait(nil)) 42 | micro.RegisterHandler(service.Server(), new(Hrefs)) 43 | service.Run() 44 | } 45 | 46 | func logWrapper(fn server.HandlerFunc) server.HandlerFunc { 47 | start := time.Now() 48 | return func(ctx context.Context, req server.Request, rsp interface{}) error { 49 | err := fn(ctx, req, rsp) 50 | utils.WriteErrorLog(req.Endpoint(), err) 51 | 52 | logrus.Infof("%s %s", time.Since(start), req.Endpoint()) 53 | return err 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/srv/web.go: -------------------------------------------------------------------------------- 1 | package srv 2 | 3 | import ( 4 | "context" 5 | "github.com/iissy/goweb/src/domain" 6 | "github.com/iissy/goweb/src/model" 7 | ) 8 | 9 | func (s *Hrefs) IndexLinks(ctx context.Context, req bool, rsp *model.LinkList) error { 10 | items, err := domain.IndexLinks() 11 | if err != nil { 12 | return err 13 | } 14 | 15 | rsp.List = items 16 | 17 | return nil 18 | } 19 | 20 | func (s *Hrefs) TopArticles(ctx context.Context, req bool, rsp *model.ArticleList) error { 21 | items, err := domain.TopArticles() 22 | if err != nil { 23 | return err 24 | } 25 | 26 | rsp.List = items 27 | 28 | return nil 29 | } 30 | 31 | func (s *Hrefs) TopCusLinks(ctx context.Context, req bool, rsp *model.CusLinkList) error { 32 | items, err := domain.TopCusLinks() 33 | if err != nil { 34 | return err 35 | } 36 | 37 | rsp.List = items 38 | 39 | return nil 40 | } 41 | 42 | func (s *Hrefs) ListLinks(ctx context.Context, req string, rsp *model.LinkList) error { 43 | items, err := domain.ListLinks(req) 44 | if err != nil { 45 | return err 46 | } 47 | 48 | rsp.List = items 49 | 50 | return nil 51 | } 52 | 53 | func (s *Hrefs) ListCusLinksByCatId(ctx context.Context, req string, rsp *model.CusLinkList) error { 54 | items, err := domain.ListCusLinksByCatId(req) 55 | if err != nil { 56 | return err 57 | } 58 | 59 | rsp.List = items 60 | 61 | return nil 62 | } 63 | 64 | func (s *Hrefs) ListCusLinks(ctx context.Context, req bool, rsp *model.CusLinkList) error { 65 | items, err := domain.ListCusLinks() 66 | if err != nil { 67 | return err 68 | } 69 | 70 | rsp.List = items 71 | 72 | return nil 73 | } 74 | 75 | func (s *Hrefs) ListArticles(ctx context.Context, req bool, rsp *model.ArticleList) error { 76 | items, err := domain.ListArticles() 77 | if err != nil { 78 | return err 79 | } 80 | 81 | rsp.List = items 82 | 83 | return nil 84 | } 85 | 86 | func (s *Hrefs) GetArticle(ctx context.Context, req string, rsp *model.Article) error { 87 | result, err := domain.GetArticle(req) 88 | *rsp = *result 89 | return err 90 | } 91 | 92 | func (s *Hrefs) UpdateArticleVisited(ctx context.Context, req string, rsp *bool) error { 93 | err := domain.UpdateArticleVisited(req) 94 | return err 95 | } 96 | 97 | func (s *Hrefs) LinkVisitedCount(ctx context.Context, req bool, rsp *int64) error { 98 | result, err := domain.LinkVisitedCount() 99 | *rsp = result 100 | return err 101 | } 102 | 103 | func (s *Hrefs) GetLinkUrl(ctx context.Context, req string, rsp *string) error { 104 | url, err := domain.GetLinkUrl(req) 105 | *rsp = url 106 | return err 107 | } 108 | 109 | func (s *Hrefs) UpdateLinkVisited(ctx context.Context, req string, rsp *bool) error { 110 | err := domain.UpdateLinkVisited(req) 111 | return err 112 | } 113 | 114 | func (s *Hrefs) GetCusLinkUrl(ctx context.Context, req int, rsp *string) error { 115 | url, err := domain.GetCusLinkUrl(req) 116 | *rsp = url 117 | return err 118 | } 119 | 120 | func (s *Hrefs) UpdateCusLinkVisited(ctx context.Context, req int, rsp *bool) error { 121 | err := domain.UpdateCusLinkVisited(req) 122 | return err 123 | } 124 | -------------------------------------------------------------------------------- /src/utils/code.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import ( 4 | "crypto/md5" 5 | "encoding/hex" 6 | "github.com/gorilla/securecookie" 7 | "math/rand" 8 | "time" 9 | ) 10 | 11 | const code = "0123456789ABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyz-*" 12 | 13 | var ( 14 | hashKey = []byte("the-big-and-secret-fash-key-here") 15 | blockKey = []byte("lot-secret-of-characters-big-too") 16 | SC = securecookie.New(hashKey, blockKey) 17 | ASYUSERID = "asy-user-id" 18 | ASYTOKEN = "asy-token" 19 | ) 20 | 21 | func GetMd5String(s string) string { 22 | h := md5.New() 23 | h.Write([]byte(s)) 24 | return hex.EncodeToString(h.Sum(nil)) 25 | } 26 | 27 | func randomString(size int, max int) string { 28 | rand.Seed(time.Now().UnixNano()) 29 | buffer := make([]byte, size, size) 30 | for i := 0; i < size; i++ { 31 | buffer[i] = code[rand.Intn(max)] 32 | } 33 | return string(buffer[:size]) 34 | } 35 | 36 | func Random62String(size int) string { 37 | return randomString(size, 62) 38 | } 39 | -------------------------------------------------------------------------------- /src/utils/config.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import ( 4 | "fmt" 5 | "github.com/asim/go-micro/v3/config" 6 | "log" 7 | ) 8 | 9 | type Address struct { 10 | Host string `json:"host"` 11 | Port int `json:"port"` 12 | } 13 | 14 | var urls []string 15 | 16 | func GetConsulUrls() []string { 17 | addr := make([]Address, 0) 18 | if err := config.Get("consul").Scan(&addr); err != nil { 19 | log.Panic(err) 20 | } 21 | 22 | for _, addr := range addr { 23 | urls = append(urls, fmt.Sprintf("%s:%d", addr.Host, addr.Port)) 24 | } 25 | 26 | return urls 27 | } 28 | -------------------------------------------------------------------------------- /src/utils/errors.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import ( 4 | "github.com/juju/errors" 5 | "github.com/sirupsen/logrus" 6 | ) 7 | 8 | func checkErr(err error, msg string) { 9 | if err != nil { 10 | logrus.Fatalln(msg, err) 11 | } 12 | } 13 | 14 | func WriteErrorLog(path string, err error) bool { 15 | if err != nil { 16 | logrus.Errorf("%s, url = %s", errors.ErrorStack(err), path) 17 | return true 18 | } else { 19 | return false 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/utils/file.go: -------------------------------------------------------------------------------- 1 | package utils 2 | -------------------------------------------------------------------------------- /src/utils/init.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import "github.com/sirupsen/logrus" 4 | 5 | func InitLog() { 6 | logrus.SetLevel(logrus.TraceLevel) 7 | logrus.SetFormatter(&logrus.TextFormatter{ 8 | ForceColors: false, 9 | TimestampFormat: "2006/01/02 15:04:05", 10 | FullTimestamp: true, 11 | }) 12 | } 13 | -------------------------------------------------------------------------------- /src/utils/mysql.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import ( 4 | "database/sql" 5 | "errors" 6 | "github.com/go-gorp/gorp/v3" 7 | _ "github.com/go-sql-driver/mysql" 8 | "github.com/asim/go-micro/v3/config" 9 | "log" 10 | "os" 11 | ) 12 | 13 | func InitDb() *gorp.DbMap { 14 | db, err := sql.Open("mysql", config.Get("mysql", "hrefs").String("")) 15 | checkErr(err, "sql.Open failed") 16 | 17 | db.SetMaxIdleConns(config.Get("mysql", "MaxIdleConns").Int(5)) 18 | db.SetMaxOpenConns(config.Get("mysql", "MaxOpenConns").Int(50)) 19 | dbMap := &gorp.DbMap{Db: db, Dialect: gorp.MySQLDialect{}} 20 | if config.Get("mysql", "gorp", "trace-on").Bool(false) { 21 | dbMap.TraceOn("[gorp]", log.New(os.Stdout, "[SQL]:", log.Lmicroseconds)) 22 | } 23 | 24 | return dbMap 25 | } 26 | 27 | func BuildSqlArgs(args ...interface{}) ([]interface{}, error) { 28 | newArgs := make([]interface{}, 0) 29 | addEleFun := func(ele interface{}) { 30 | newArgs = append(newArgs, ele) 31 | return 32 | } 33 | for _, arg := range args { 34 | switch v := arg.(type) { 35 | case string, int, int32, int64, bool, *string, *int, *int32, *int64: 36 | addEleFun(v) 37 | case []string: 38 | for _, e := range v { 39 | addEleFun(e) 40 | } 41 | case []int: 42 | for _, e := range v { 43 | addEleFun(e) 44 | } 45 | case []int32: 46 | for _, e := range v { 47 | addEleFun(e) 48 | } 49 | case []int64: 50 | for _, e := range v { 51 | addEleFun(e) 52 | } 53 | case []*string: 54 | for _, e := range v { 55 | addEleFun(e) 56 | } 57 | default: 58 | return nil, errors.New("miss type") 59 | } 60 | } 61 | return newArgs, nil 62 | } 63 | -------------------------------------------------------------------------------- /src/utils/redis.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import ( 4 | "fmt" 5 | "github.com/gomodule/redigo/redis" 6 | "github.com/juju/errors" 7 | "github.com/asim/go-micro/v3/config" 8 | "time" 9 | ) 10 | 11 | func InitRedisPool() *redis.Pool { 12 | host := config.Get("redis", "host").String("192.168.111.151") 13 | port := config.Get("redis", "port").Int(6379) 14 | return &redis.Pool{ 15 | MaxIdle: 3, 16 | MaxActive: 20, 17 | IdleTimeout: time.Duration(180) * time.Second, 18 | Dial: func() (redis.Conn, error) { 19 | c, err := redis.Dial("tcp", fmt.Sprintf("%s:%d", host, port)) 20 | if err != nil { 21 | return nil, errors.Trace(err) 22 | } 23 | c.Do("SELECT", 0) 24 | return c, nil 25 | }, 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/web/router.go: -------------------------------------------------------------------------------- 1 | package web 2 | 3 | import ( 4 | "github.com/iissy/goweb/src/controller" 5 | "github.com/iissy/goweb/src/middleware" 6 | "github.com/kataras/iris/v12" 7 | ) 8 | 9 | func Start() { 10 | app := iris.New() 11 | app.Use(iris.LimitRequestBodySize(1024 * 1024)) 12 | app.HandleDir("/", "./public") 13 | tmpl := iris.HTML("./views", ".html") 14 | tmpl.Layout("shared/layout.html") 15 | tmpl.Reload(true) 16 | app.RegisterView(tmpl) 17 | app.Use(middleware.TraceWeb) 18 | 19 | app.Get("/", controller.Index) 20 | app.Get("/links/{id}", controller.ListLinks) 21 | app.Get("/cuslinks", controller.ListCusLinks) 22 | app.Get("/articles", controller.ListArticles) 23 | app.Get("/article/{id}", controller.Detail) 24 | app.Get("/payme", controller.Payme) 25 | app.Get("/link/{id}", controller.GetLinkUrl) 26 | app.Get("/cuslink/{id}", controller.GetCusLinkUrl) 27 | app.Get("/choose", controller.Choose) 28 | //app.Post("/mosaic", controller.Mosaic) 29 | 30 | app.Run( 31 | iris.Addr(":80"), 32 | iris.WithoutBanner, 33 | iris.WithoutServerError(iris.ErrServerClosed), 34 | ) 35 | } 36 | -------------------------------------------------------------------------------- /views/articles.html: -------------------------------------------------------------------------------- 1 | {{ define "articles-title"}} 2 | {{.title}} 3 | {{ end }} 4 | 5 |
6 | {{range .body}} 7 |
8 |
9 | 10 |
11 |
12 |
13 | {{.Title}} 14 |
15 |
16 |
17 | {{.Brief}} 18 |
19 |
20 |
21 |
22 | {{end}} 23 |
24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /views/choose.html: -------------------------------------------------------------------------------- 1 | {{ define "choose-title"}} 2 | {{.title}} 3 | {{ end }} 4 | 5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
文件
13 |
14 | 15 |
16 |
17 |
20 |
21 |
22 |
23 |
24 |
-------------------------------------------------------------------------------- /views/cuslinks.html: -------------------------------------------------------------------------------- 1 | {{ define "cuslinks-title"}} 2 | {{.title}} 3 | {{ end }} 4 | 5 |
6 | {{range .body}} 7 |
8 |
9 |
10 | {{.Title}} 11 |
12 |
13 |
14 | {{.LinkType}} 15 |
16 |
17 |
18 |
19 | {{end}} 20 |
-------------------------------------------------------------------------------- /views/detail.html: -------------------------------------------------------------------------------- 1 | {{ define "detail-title"}} 2 | {{.title}} 3 | {{ end }} 4 | 5 |
6 |
7 |

{{.body.Title}}

8 |
9 |
10 | {{.body.Body}} 11 |
12 |
13 | Posted by 何敏 on {{.body.CreateTime.Format "2006/1/2 15:04:05"}} 14 |
15 |
-------------------------------------------------------------------------------- /views/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 爱斯园 - 中国程序员常用的网址大全,高频使用的程序员网址导航 15 | 16 | 17 | 18 | {{ render "shared/_toper.html"}} 19 |
20 |
21 | {{template "shared/_common.html" .body.Common}} {{template "shared/_info.html" .body.Info}} 22 |
23 |
24 |
25 | {{template "shared/_articles.html" .body.Articles}} {{template "shared/_cuslinks.html" .body.CusLinks}} 26 |
27 |
28 |
29 |
{{template "shared/_group.html" .body.Other}}
30 |
{{template "shared/_group.html" .body.Backend}}
31 |
{{template "shared/_group.html" .body.Frontend}}
32 |
{{template "shared/_group.html" .body.Hot}}
33 |
34 |
35 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /views/links.html: -------------------------------------------------------------------------------- 1 | {{ define "links-title"}} 2 | {{.title}} 3 | {{ end }} 4 | 5 |
6 |
7 | {{range .links}} 8 |
9 | {{.Title}} 10 |
11 |
12 |
13 | {{.Brief}} 14 |
15 |
16 | {{end}} 17 |
18 |
19 |
20 |
21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 |
31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 |
39 |
40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 |
48 |
49 |
50 |
51 | {{range .cuslinks}} 52 | 53 | {{end}} 54 |
55 |
56 |
-------------------------------------------------------------------------------- /views/mosaic.html: -------------------------------------------------------------------------------- 1 | {{ define "mosaic-title"}} 2 | {{.title}} 3 | {{ end }} 4 | 5 |
6 |
7 |
8 |
9 |
10 | 11 |
Original
12 |
13 |
14 | 15 |
Mosaic - {{ .body.duration }}
16 |
17 |
18 |
19 | 20 |
21 |
22 |
23 |
-------------------------------------------------------------------------------- /views/payme.html: -------------------------------------------------------------------------------- 1 | {{ define "payme-title"}} 2 | {{.title}} 3 | {{ end }} 4 | 5 |
6 |
7 | 8 |
9 | 10 |
11 |
12 |
13 | 打赏人 14 |
15 |
16 | 日期 17 |
18 |
19 | 金额(¥) 20 |
21 |
22 |
23 |
24 |
老铁。
25 |
26 |
27 |
2019-04-19
28 |
29 |
30 |
¥0.01元
31 |
32 |
33 |
M*r
34 |
35 |
36 |
2019-05-13
37 |
38 |
39 |
¥1.00元
40 |
41 |
42 |
*
43 |
44 |
45 |
2019-06-13
46 |
47 |
48 |
¥0.10元
49 |
50 |
51 |
*珩
52 |
53 |
54 |
2019-06-18
55 |
56 |
57 |
¥10.00元
58 |
59 |
60 |
*友
61 |
62 |
63 |
2019-07-30
64 |
65 |
66 |
¥1.00元
67 |
68 |
69 |
蒲春平
70 |
71 |
72 |
2019-08-01
73 |
74 |
75 |
¥0.10元
76 |
77 |
78 |
毕苗苗
79 |
80 |
81 |
2019-08-11
82 |
83 |
84 |
¥10.00元
85 |
86 |
87 |
曾义胜
88 |
89 |
90 |
2019-09-16
91 |
92 |
93 |
¥5.00元
94 |
95 |
96 |
*子
97 |
98 |
99 |
2019-12-01
100 |
101 |
102 |
¥0.50元
103 |
104 |
105 |
贺丹丹
106 |
107 |
108 |
2020-02-03
109 |
110 |
111 |
¥10.00元
112 |
113 |
114 |
小酒窝
115 |
116 |
117 |
2020-02-17
118 |
119 |
120 |
¥1.00元
121 |
122 |
123 |
*阳
124 |
125 |
126 |
2020-04-03
127 |
128 |
129 |
¥1.00元
130 |
131 |
132 |
*载
133 |
134 |
135 |
2020-09-20
136 |
137 |
138 |
¥0.01元
139 |
140 |
141 |
*阳
142 |
143 |
144 |
2021-01-13
145 |
146 |
147 |
¥1.00元
148 |
149 |
150 |
151 | 152 |
153 |
爱斯园创立于2014年,前期基于 .Net Core 技术开发,2020年01月更新成 Go iris 框架,使用 mysql 数据库,redis 管理登陆会话,consul 服务注册发现,CentOS 7、Docker-compose 单机部署。
154 |
网站主要提供程序员常用的网址,以及一些技术文章分享。目前已为程序员们提供 155 | {{.body}} 次网址导航服务。
156 |
站长github:https://github.com/iissy
157 |
vue 后台源码:https://github.com/iissy/hrefs.cn
158 |
网站以及接口源码:https://github.com/iissy/goweb
159 |
.Net Core 版源码:https://github.com/iissy/hrefs.cn/tree/dotnet
160 |
161 |
-------------------------------------------------------------------------------- /views/shared/_articles.html: -------------------------------------------------------------------------------- 1 | {{range .}} 2 |
3 |
{{.Title}}
4 |
5 | {{end}} -------------------------------------------------------------------------------- /views/shared/_common.html: -------------------------------------------------------------------------------- 1 |
2 | 5 |
-------------------------------------------------------------------------------- /views/shared/_cuslinks.html: -------------------------------------------------------------------------------- 1 | {{range .}} 2 |
3 |
{{.Title}}
4 |
5 | {{end}} -------------------------------------------------------------------------------- /views/shared/_footer.html: -------------------------------------------------------------------------------- 1 | Copyright ©2018 爱斯园 粤ICP备2020117325号-2 2 | -------------------------------------------------------------------------------- /views/shared/_group.html: -------------------------------------------------------------------------------- 1 | 11 | 12 |
13 |
14 | {{range .Active.Items}}
15 | {{.Title}} 16 |
{{end}} 17 |
18 | 19 | {{range .Rests}} 20 |
21 | {{range .Items}}
22 | {{.Title}} 23 |
{{end}} 24 |
25 | {{end}} 26 |
-------------------------------------------------------------------------------- /views/shared/_info.html: -------------------------------------------------------------------------------- 1 |
2 | 5 |
-------------------------------------------------------------------------------- /views/shared/_toper.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /views/shared/layout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | {{ part "title" }} 13 | 14 | 15 | {{ render "shared/_toper.html"}} 16 |
17 | {{ yield }} 18 |
19 | 22 | 23 | --------------------------------------------------------------------------------