From a7845dbd4a84da35b066838d12cb60518a638081 Mon Sep 17 00:00:00 2001 From: satori Date: Sun, 17 Nov 2024 13:59:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=81=8F=E5=A5=BD=E6=8E=A8=E8=8D=90=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 2 +- README.md | 11 ++++- api/gorse.go | 109 +++++++++++++++++++++++++++++++++++++++++++++++++ api/graphql.go | 6 +++ api/struct.go | 11 ++++- bin/main.go | 7 +++- go.mod | 24 +++++++---- go.sum | 29 +++++++++++++ 8 files changed, 185 insertions(+), 14 deletions(-) create mode 100644 api/gorse.go diff --git a/Makefile b/Makefile index 8fbfebd..6dc1dd0 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ dev: wait link: - ssh -NCPf ai -L 3306:localhost:3306 -L 19530:localhost:19530 -L 4080:localhost:4080 -L 5002:localhost:5002 -L 4306:localhost:4306 + ssh -NCPf ai -L 3306:localhost:3306 -L 19530:localhost:19530 -L 4080:localhost:4080 -L 5002:localhost:5002 -L 4306:localhost:4306 -L 8088:localhost:8088 -L 8087:localhost:8087 # 编译项目 build: diff --git a/README.md b/README.md index d405042..4d28519 100644 --- a/README.md +++ b/README.md @@ -9,10 +9,16 @@ - [ ] 静态原始图像 - [ ] 异地备份 - [ ] 视频流媒体 +- [ ] 上传图像接口 + +# 偏好推荐 +- [ ] 收集用户访问记录点赞记录 +- [ ] 收集用户推荐反馈 +- [ ] 调整偏好推荐 # OCR - [ ] 脚本统计各关键词总量 -- [ ] 筛选条件支持多选 颜色,风格 | 类型,主题,功能,材质图案(多选逗号分隔) +- [x] 筛选条件支持多选 颜色,风格 | 类型,主题,功能,材质图案(多选逗号分隔) - [x] 按颜色筛选, 周期性脚本自动补全三色 @@ -38,6 +44,9 @@ CREATE FULLTEXT INDEX idx_images_desc ON web_images (images_desc); CREATE FULLTEXT INDEX idx_tags ON web_images (tags); CREATE FULLTEXT INDEX idx_tags ON web_article (tags); +-- 同步收藏 +ALTER TABLE web_praise ADD COLUMN gorse TINYINT UNSIGNED; + ``` ```bash diff --git a/api/gorse.go b/api/gorse.go new file mode 100644 index 0000000..5cee3d6 --- /dev/null +++ b/api/gorse.go @@ -0,0 +1,109 @@ +package api + +import ( + "context" + "fmt" + "strconv" + "strings" + "time" + + "github.com/zhenghaoz/gorse/client" +) + +var gorse *client.GorseClient + +func gorseInit(host string, port int) { + gorse = client.NewGorseClient(fmt.Sprintf("http://%s:%d", host, port), "") +} + +// 同步图片数据 +func PutImages(page int) error { + var ctx context.Context = context.Background() + + for i := 0; i < page; i++ { + var items []client.Item + var data []Image + + if err := db.Table("web_images").Select("id", "tags", "create_time").Limit(100).Offset(i * 100).Scan(&data).Error; err != nil { + fmt.Println("获取图像记录失败", err) + return err + } + + for _, item := range data { + fmt.Println(item.ID, item.Tags, item.CreateTime) + items = append(items, client.Item{ + ItemId: fmt.Sprintf("%d", item.ID), + Timestamp: item.CreateTime.Format("2006-01-02 15:04:05"), + Labels: strings.Split(item.Tags, ", "), + Comment: fmt.Sprintf("%d", item.Content), + }) + } + + if _, err := gorse.InsertItems(ctx, items); err != nil { + fmt.Println("写入图像记录失败", err) + return err + } + } + + fmt.Println("写入图像记录结束..", page*100) + return nil +} + +// 同步点赞数据 +func PutPraises(page int) error { + var ctx context.Context = context.Background() + + for i := 0; i < page; i++ { + var feedbacks []client.Feedback + var data []struct { + ID int + PraiseID int + UserID int + CreateTime time.Time + } + + if err := db.Table("web_praises").Select("id", "praise_id", "user_id", "create_time").Where("type = ?", 4).Limit(100).Offset(i * 100).Scan(&data).Error; err != nil { + fmt.Println("获取点赞记录失败", err) + return err + } + + for _, item := range data { + fmt.Println(item.ID, item.UserID, item.PraiseID, item.CreateTime) + feedbacks = append(feedbacks, client.Feedback{ + FeedbackType: "like", + UserId: fmt.Sprintf("%d", item.UserID), + ItemId: fmt.Sprintf("%d", item.PraiseID), + Timestamp: item.CreateTime.Format("2006-01-02 15:04:05"), + }) + } + + if _, err := gorse.InsertFeedback(ctx, feedbacks); err != nil { + fmt.Println("写入点赞记录失败", err) + return err + } + } + + fmt.Println("写入点赞记录结束..", page*100) + return nil +} + +// 同步收藏数据 + +// 获取推荐ID +func GetRecommend(user_id int, category string) ([]int, error) { + var ctx context.Context = context.Background() + + data, err := gorse.GetItemLatestWithCategory(ctx, fmt.Sprintf("%d", user_id), category, 100, 0) + if err != nil { + fmt.Println("获取推荐失败", err) + return nil, err + } + + var ids []int + for _, item := range data { + id, _ := strconv.Atoi(item.Id) + ids = append(ids, id) + } + + return ids, nil +} diff --git a/api/graphql.go b/api/graphql.go index de356f4..67cdacb 100644 --- a/api/graphql.go +++ b/api/graphql.go @@ -197,6 +197,12 @@ func NewSchema(config Config) (graphql.Schema, error) { go checkColorNullRows() } + // 定时检查点赞收藏记录 + if config.Gorse.Open { + fmt.Println("开启用户偏好收集") + gorseInit(config.Gorse.Host, config.Gorse.Port) + } + // 用户的可选字段 user := graphql.NewObject(graphql.ObjectConfig{ Name: "User", diff --git a/api/struct.go b/api/struct.go index c5eac71..a70905c 100644 --- a/api/struct.go +++ b/api/struct.go @@ -147,7 +147,7 @@ func (Category) TableName() string { } // 输入配置 -type ConfigMysql struct { +type MysqlConfig struct { Host string Port int Database string @@ -159,7 +159,14 @@ type Oss struct { Local bool } +type GorseConfig struct { + Host string + Port int + Open bool +} + type Config struct { - Mysql ConfigMysql + Mysql MysqlConfig + Gorse GorseConfig Oss } diff --git a/bin/main.go b/bin/main.go index d382b1d..f7beeb1 100644 --- a/bin/main.go +++ b/bin/main.go @@ -240,7 +240,7 @@ func main() { // graphql Schema schema, err := api.NewSchema(api.Config{ - Mysql: api.ConfigMysql{ + Mysql: api.MysqlConfig{ Host: config.GetString("mysql.host"), Port: config.GetInt("mysql.port"), Database: config.GetString("mysql.database"), @@ -250,6 +250,11 @@ func main() { Oss: api.Oss{ Local: config.GetBool("oss.local"), }, + Gorse: api.GorseConfig{ + Host: config.GetString("gorse.host"), + Port: config.GetInt("gorse.port"), + Open: config.GetBool("gorse.open"), + }, }) if err != nil { log.Fatalf("failed to create new schema, error: %v", err) diff --git a/go.mod b/go.mod index 8e4e083..a776815 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,6 @@ module git.satori.love/gameui/webp -go 1.23 - -toolchain go1.23.2 +go 1.23.3 require ( github.com/alibabacloud-go/darabonba-openapi v0.1.18 @@ -32,7 +30,10 @@ require ( github.com/alibabacloud-go/tea-xml v1.1.2 // indirect github.com/aliyun/credentials-go v1.1.2 // indirect github.com/clbanning/mxj/v2 v2.7.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect @@ -55,13 +56,18 @@ require ( github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.4.2 // indirect github.com/tjfoc/gmsm v1.3.2 // indirect - golang.org/x/net v0.28.0 // indirect - golang.org/x/sys v0.25.0 // indirect - golang.org/x/text v0.18.0 // indirect + github.com/zhenghaoz/gorse v0.5.0-alpha.1.0.20241116140254-a323b179f5e4 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 // indirect + go.opentelemetry.io/otel v1.31.0 // indirect + go.opentelemetry.io/otel/metric v1.31.0 // indirect + go.opentelemetry.io/otel/trace v1.31.0 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/sys v0.26.0 // indirect + golang.org/x/text v0.19.0 // indirect golang.org/x/time v0.6.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 // indirect - google.golang.org/grpc v1.65.0 // indirect - google.golang.org/protobuf v1.34.2 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect + google.golang.org/grpc v1.67.1 // indirect + google.golang.org/protobuf v1.35.1 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 0fc35ac..02fd17c 100644 --- a/go.sum +++ b/go.sum @@ -54,12 +54,19 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= @@ -184,6 +191,16 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zhenghaoz/gorse v0.5.0-alpha.1.0.20241116140254-a323b179f5e4 h1:l9J7zrPXlJjOusTqw5wh0XQNsDHZj4BbxxjaC33xT4s= +github.com/zhenghaoz/gorse v0.5.0-alpha.1.0.20241116140254-a323b179f5e4/go.mod h1:cPJh4IEuHS4JGuv3VSN/QvUwtGl9qxM05O+2jO/MTIE= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 h1:ZIg3ZT/aQ7AfKqdwp7ECpOK6vHqquXXuyTjIO8ZdmPs= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0/go.mod h1:DQAwmETtZV00skUwgD6+0U89g80NKsJE3DCKeLLPQMI= +go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= +go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= +go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= +go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= +go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= +go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= @@ -223,6 +240,8 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -248,6 +267,8 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -262,6 +283,8 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -287,6 +310,8 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 h1:V71AcdLZr2p8dC9dbOIMCpqi4EmRl8wUwnJzXXLmbmc= google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= @@ -294,10 +319,14 @@ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= google.golang.org/grpc/examples v0.0.0-20220617181431-3e7b97febc7f h1:rqzndB2lIQGivcXdTuY3Y9NBvr70X+y77woofSRluec= google.golang.org/grpc/examples v0.0.0-20220617181431-3e7b97febc7f/go.mod h1:gxndsbNG1n4TZcHGgsYEfVGnTxqfEdfiDv6/DADXX9o= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=