wangchuanjin 9 сар өмнө
commit
0963f5a094
65 өөрчлөгдсөн 9468 нэмэгдсэн , 0 устгасан
  1. 5 0
      README.md
  2. BIN
      api/api.exe
  3. 164 0
      api/common/initconfig.go
  4. 132 0
      api/common/network.go
  5. 53 0
      api/etc/db.yaml
  6. 6 0
      api/etc/logs.yaml
  7. 42 0
      api/etc/networkmanage.yaml
  8. 75 0
      api/internal/config/config.go
  9. 28 0
      api/internal/handler/addorupdatehandler.go
  10. 28 0
      api/internal/handler/allprojecthandler.go
  11. 28 0
      api/internal/handler/associatehandler.go
  12. 28 0
      api/internal/handler/candidatechannellisthandler.go
  13. 28 0
      api/internal/handler/coophistorylisthandler.go
  14. 28 0
      api/internal/handler/ignoreactionhandler.go
  15. 28 0
      api/internal/handler/infodetailhandler.go
  16. 28 0
      api/internal/handler/networklisthandler.go
  17. 28 0
      api/internal/handler/ownercooperatehandler.go
  18. 28 0
      api/internal/handler/ownerlisthandler.go
  19. 28 0
      api/internal/handler/ownerroutehandler.go
  20. 28 0
      api/internal/handler/projecthistoryhandler.go
  21. 28 0
      api/internal/handler/projectlisthandler.go
  22. 28 0
      api/internal/handler/prpnameasshandler.go
  23. 87 0
      api/internal/handler/routes.go
  24. 31 0
      api/internal/logic/addorupdatelogic.go
  25. 31 0
      api/internal/logic/allprojectlogic.go
  26. 31 0
      api/internal/logic/associatelogic.go
  27. 52 0
      api/internal/logic/candidatechannellistlogic.go
  28. 40 0
      api/internal/logic/coophistorylistlogic.go
  29. 89 0
      api/internal/logic/ignoreactionlogic.go
  30. 63 0
      api/internal/logic/infodetaillogic.go
  31. 30 0
      api/internal/logic/networklistlogic.go
  32. 43 0
      api/internal/logic/ownercooperatelogic.go
  33. 52 0
      api/internal/logic/ownerlistlogic.go
  34. 40 0
      api/internal/logic/ownerroutelogic.go
  35. 42 0
      api/internal/logic/projecthistorylogic.go
  36. 38 0
      api/internal/logic/projectlistlogic.go
  37. 46 0
      api/internal/logic/prpnameasslogic.go
  38. 430 0
      api/internal/service/CoopHistoryService.go
  39. 1295 0
      api/internal/service/network.go
  40. 208 0
      api/internal/service/network_test.go
  41. 1283 0
      api/internal/service/owner.go
  42. 453 0
      api/internal/service/plistService.go
  43. 15 0
      api/internal/svc/servicecontext.go
  44. 164 0
      api/internal/types/types.go
  45. 49 0
      api/logs/access.log
  46. 0 0
      api/logs/error.log
  47. 0 0
      api/logs/severe.log
  48. 2 0
      api/logs/slow.log
  49. 0 0
      api/logs/stat.log
  50. 209 0
      api/networkmanage.api
  51. 41 0
      api/networkmanage.go
  52. 192 0
      api/test/test.pb.go
  53. 51 0
      entity/db.go
  54. 9 0
      entity/logx.go
  55. 144 0
      go.mod
  56. 2111 0
      go.sum
  57. 373 0
      service/custom.go
  58. 80 0
      service/ent.go
  59. 48 0
      service/file.go
  60. 40 0
      service/group.go
  61. 241 0
      service/sale_chance.go
  62. 204 0
      service/sale_clue.go
  63. 64 0
      service/sendMsg.go
  64. 48 0
      service/user.go
  65. 130 0
      service/util.go

+ 5 - 0
README.md

@@ -0,0 +1,5 @@
+通用版人脉管理应用程序,只提供api服务
+
+goctl api go -api networkManage.api -dir .
+
+go test -v -coverprofile=coverage go tool cover -html=coverage -o coverage.html

BIN
api/api.exe


+ 164 - 0
api/common/initconfig.go

@@ -0,0 +1,164 @@
+package common
+
+import (
+	"context"
+	"flag"
+	"fmt"
+	"log"
+	"time"
+
+	. "app.yhyue.com/moapp/jybase/es"
+	"app.yhyue.com/moapp/jybase/mongodb"
+	"app.yhyue.com/moapp/jybase/mysql"
+	"app.yhyue.com/moapp/jybase/redis"
+	"app.yhyue.com/moapp/jypkg/middleground"
+	"bp.jydev.jianyu360.cn/BaseService/fileCenter/rpc/filecenter"
+	"bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/usercenter"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/config"
+	"bp.jydev.jianyu360.cn/CRM/application/entity"
+	"bp.jydev.jianyu360.cn/CRM/baseCenter/rpc/basecenter"
+	"bp.jydev.jianyu360.cn/SocialPlatform/socialPlatform/rpc/social/social"
+	"github.com/ClickHouse/clickhouse-go/v2"
+	"github.com/ClickHouse/clickhouse-go/v2/lib/driver"
+	"github.com/zeromicro/go-zero/core/conf"
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+var configFile = flag.String("fs", "etc/crmapplication.yaml", "the config file")
+var C config.Config
+
+var logFile = flag.String("lf", "etc/logs.yaml", "the config file")
+var logc entity.Logc
+
+var dbFile = flag.String("df", "etc/db.yaml", "the db file")
+var DB config.Db
+
+var (
+	MgoBidding        mongodb.MongodbSim
+	MgoEnt            mongodb.MongodbSim
+	MainMysql         *mysql.Mysql
+	BaseMysql         *mysql.Mysql
+	CrmMysql          *mysql.Mysql
+	Mgo               mongodb.MongodbSim
+	UserCenterRpc     usercenter.UserCenter
+	FileCenterRpc     filecenter.FileCenter
+	BaseCenterRpc     basecenter.BaseCenter
+	SocialPlatformRpc social.Social
+	MgoProject        mongodb.MongodbSim
+	NiJian            *mysql.Mysql
+	Middleground      *middleground.Middleground
+	ClickhouseConn    driver.Conn
+)
+
+func InitConf() {
+	conf.MustLoad(*configFile, &C)
+	log.Println("初始化配置") //
+
+	//初始化日志信息
+	conf.MustLoad(*logFile, &logc)
+	if len(logc.Level) > 0 {
+		for _, v := range logc.Level {
+			logx.MustSetup(logx.LogConf{
+				Mode:     logc.Mode,
+				Path:     logc.Path,
+				Level:    v,
+				KeepDays: logc.KeepDays,
+			})
+			logx.Info(v, "--日志记录")
+		}
+	}
+
+	conf.MustLoad(*dbFile, &DB)
+	if DB.Mysql.CrmService.Address != "" {
+		log.Println("--初始化 crm mysql--")
+		CrmMysql = &mysql.Mysql{
+			Address:      DB.Mysql.CrmService.Address,
+			UserName:     DB.Mysql.CrmService.UserName,
+			PassWord:     DB.Mysql.CrmService.Password,
+			DBName:       DB.Mysql.CrmService.DbName,
+			MaxOpenConns: DB.Mysql.CrmService.MaxOpenConns,
+			MaxIdleConns: DB.Mysql.CrmService.MaxIdleConns,
+		}
+		CrmMysql.Init()
+	}
+	if DB.Mongo.Main.Address != "" {
+		logx.Info("--初始化 mongodb--")
+		Mgo = mongodb.MongodbSim{
+			MongodbAddr: DB.Mongo.Main.Address,
+			Size:        DB.Mongo.Main.Size,
+			DbName:      DB.Mongo.Main.DbName,
+		}
+		Mgo.InitPool()
+	}
+	if DB.Mongo.Bidding.Address != "" {
+		logx.Info("--初始化 mongodb Bidding --")
+		MgoBidding = mongodb.MongodbSim{
+			MongodbAddr: DB.Mongo.Bidding.Address,
+			Size:        DB.Mongo.Bidding.Size,
+			DbName:      DB.Mongo.Bidding.DbName,
+			Password:    DB.Mongo.Bidding.Password,
+			UserName:    DB.Mongo.Bidding.UserName,
+		}
+		MgoBidding.InitPool()
+	}
+	if DB.Mongo.Ent.Address != "" {
+		logx.Info("--初始化 mongodb ent --")
+		MgoEnt = mongodb.MongodbSim{
+			MongodbAddr: DB.Mongo.Ent.Address,
+			Size:        DB.Mongo.Ent.Size,
+			DbName:      DB.Mongo.Ent.DbName,
+			Password:    DB.Mongo.Ent.Password,
+			UserName:    DB.Mongo.Ent.UserName,
+		}
+		MgoEnt.InitPool()
+	}
+	if DB.Mongo.Project.Address != "" {
+		logx.Info("--初始化 mongodb ent --")
+		MgoProject = mongodb.MongodbSim{
+			MongodbAddr: DB.Mongo.Project.Address,
+			Size:        DB.Mongo.Project.Size,
+			DbName:      DB.Mongo.Project.DbName,
+			Password:    DB.Mongo.Project.Password,
+			UserName:    DB.Mongo.Project.UserName,
+		}
+		MgoProject.InitPool()
+	}
+	//初始化 elasticsearch
+	if DB.Es.Addr != "" {
+		log.Println("--初始化 elasticsearch--")
+		NewEs(DB.Es.Version, DB.Es.Addr, DB.Es.Size, DB.Es.UserName, DB.Es.Password)
+	}
+	redis.InitRedis(DB.Redis)
+
+	ConnectClickhouse(DB.Clickhouse)
+}
+func ConnectClickhouse(cHouseConfig *config.CHouseConfig) error {
+	var (
+		ctx = context.Background()
+		err error
+	)
+	ClickhouseConn, err = clickhouse.Open(&clickhouse.Options{
+		Addr:         []string{cHouseConfig.Addr},
+		DialTimeout:  10 * time.Second,
+		MaxIdleConns: cHouseConfig.MaxIdleConns,
+		MaxOpenConns: cHouseConfig.MaxOpenConns,
+		Auth: clickhouse.Auth{
+			Database: cHouseConfig.DbName,
+			Username: cHouseConfig.UserName,
+			Password: cHouseConfig.Password,
+		},
+		Debugf: func(format string, v ...interface{}) {
+			fmt.Printf(format, v)
+		},
+	})
+	if err != nil {
+		return err
+	}
+	if err := ClickhouseConn.Ping(ctx); err != nil {
+		if exception, ok := err.(*clickhouse.Exception); ok {
+			fmt.Printf("Exception [%d] %s \n%s\n", exception.Code, exception.Message, exception.StackTrace)
+		}
+		return err
+	}
+	return nil
+}

+ 132 - 0
api/common/network.go

@@ -0,0 +1,132 @@
+package common
+
+import (
+	"context"
+	"fmt"
+	"strings"
+
+	. "app.yhyue.com/moapp/jybase/common"
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+//人脉通公用方法
+var NetworkCom = &networkCom{}
+
+type networkCom struct{}
+
+//
+func (n *networkCom) GetEntIdByName(names []string) map[string]string {
+	result := map[string]string{}
+	if len(names) == 0 {
+		return result
+	}
+	var query = func(values []string) {
+		wh, args := n.WhArgs(values)
+		rows, err := ClickhouseConn.Query(context.Background(), `select id,company_name from information.ent_info where company_name in (`+wh+`)`, args...)
+		if err != nil {
+			logx.Error(err)
+			return
+		}
+		for rows.Next() {
+			var (
+				id           string
+				company_name string
+			)
+			if err := rows.Scan(&id, &company_name); err != nil {
+				logx.Error(err)
+				continue
+			}
+			result[company_name] = id
+		}
+		rows.Close()
+		if err := rows.Err(); err != nil {
+			logx.Error(err)
+		}
+	}
+	values := []string{}
+	for _, v := range names {
+		values = append(values, v)
+		if len(values) == 200 {
+			query(values)
+			values = []string{}
+		}
+	}
+	if len(values) > 0 {
+		query(values)
+	}
+	return result
+}
+
+//根据标签类型获取标签占位
+func (n *networkCom) GetEntTagSeat(labelType int) []string {
+	rows, err := ClickhouseConn.Query(context.Background(), `select bitmap_num from information.ent_label where label_type=?`, labelType)
+	if err != nil {
+		logx.Error(err)
+		return nil
+	}
+	array := []string{}
+	for rows.Next() {
+		var (
+			bitmap_num int8
+		)
+		if err := rows.Scan(&bitmap_num); err != nil {
+			logx.Error(err)
+			continue
+		}
+		array = append(array, fmt.Sprint(bitmap_num))
+	}
+	rows.Close()
+	if err := rows.Err(); err != nil {
+		logx.Error(err)
+	}
+	return array
+}
+
+//获取我的业态
+func (n *networkCom) GetMyProbusfor(entAccoutId int64) []string {
+	datas := CrmMysql.SelectBySql(`select probusfor from crm.config_tenant where account_id=?`, entAccoutId)
+	if datas == nil || len(*datas) == 0 {
+		return nil
+	}
+	probusfor := ObjToString((*datas)[0]["probusfor"])
+	if probusfor == "" {
+		return nil
+	}
+	return strings.Split(probusfor, ",")
+}
+
+//获取总数封装
+func (n *networkCom) Count(query string, args ...interface{}) int64 {
+	row := ClickhouseConn.QueryRow(context.Background(), query, args...)
+	var count uint64
+	if err := row.Scan(&count); err != nil {
+		logx.Error(err)
+		return 0
+	}
+	return int64(count)
+}
+
+//获取我监控的企业
+func (n *networkCom) EntMonitor(userId string) map[string]bool {
+	m := map[string]bool{}
+	list, _ := Mgo.Find("follow_customer", map[string]interface{}{"userId": userId}, nil, `{"_id":0,"name":1}`, false, -1, -1)
+	if list == nil {
+		return m
+	}
+	for _, v := range *list {
+		name, _ := v["name"].(string)
+		m[name] = true
+	}
+	return m
+}
+
+//获取问号占位符数量及对应的参数值
+func (n *networkCom) WhArgs(args []string) (string, []interface{}) {
+	newArgs := make([]interface{}, len(args))
+	wh := make([]string, len(args))
+	for k, v := range args {
+		newArgs[k] = v
+		wh[k] = "?"
+	}
+	return strings.Join(wh, ","), newArgs
+}

+ 53 - 0
api/etc/db.yaml

@@ -0,0 +1,53 @@
+mysql:
+    crmService:
+        dbName: crm
+        address: 192.168.3.14:4000
+        userName: root
+        passWord: =PDT49#80Z!RVv52_z
+        maxOpenConns: 5
+        maxIdleConns: 5
+mongo:
+    main:
+        dbName: qfw
+        size: 5
+        address: 192.168.3.149:27180
+    bidding:
+        address: 192.168.3.149:27102
+        size: 5
+        dbName: qfw_data
+        collection: bidding
+        collection_change: bidding_back
+        userName: jyDevGroup
+        password: jy@DevGroup
+    ent:
+        address: 192.168.3.149:27102
+        size: 5
+        dbName: mixdata
+        replSet: ""
+        collection: qyxy
+        collection_change: qyxy_change
+        userName: jyDevGroup
+        password: jy@DevGroup
+    projectset:
+        address: 192.168.3.149:27102
+        size: 5
+        dbName: qfw_data
+        replSet: ""
+        collection: qyxy
+        collection_change: qyxy_change
+        userName: jyDevGroup
+        password: jy@DevGroup
+es:
+    addr: http://192.168.3.149:9200
+    size: 50
+    version: v7
+    userName: ""
+    password: ""
+clickhouse:
+    Addr: 192.168.3.207:19000
+    UserName: jytop
+    Password: pwdTopJy123
+    DbName: information
+    MaxIdleConns: 5
+    MaxOpenConns: 30
+redis: newother=192.168.3.149:1712

+ 6 - 0
api/etc/logs.yaml

@@ -0,0 +1,6 @@
+Mode: file
+Path: ./logs
+Level:
+  - info
+  - error
+KeepDays: 10

+ 42 - 0
api/etc/networkmanage.yaml

@@ -0,0 +1,42 @@
+Name: wcj_crmApplication
+Host: 0.0.0.0
+Port: 8887
+Timeout: 20000
+Gateway:
+  ServerCode: crmApplication
+  Etcd:
+    - 192.168.3.207:2379
+    - 192.168.3.165:2379
+    - 192.168.3.204:2379
+UserCenterRpc:
+  Etcd:
+    Hosts:
+    - 192.168.3.207:2379
+    - 192.168.3.165:2379
+    - 192.168.3.204:2379
+    Key: usercenter.rpc
+FileCenterRpc:
+  Etcd:
+    Hosts:
+    - 192.168.3.207:2379
+    - 192.168.3.165:2379
+    - 192.168.3.204:2379
+    Key: filecenter.rpc
+ossBucketName: jytest2022
+ossUrl: https://jytest2022.oss-cn-beijing.aliyuncs.com
+BaseCenterRpc:
+  Etcd:
+    Hosts:
+    - 192.168.3.207:2379
+    - 192.168.3.165:2379
+    - 192.168.3.204:2379
+    Key: basecenter.rpc
+NextFollowUpTime: 2
+SocialPlatformRpc:
+  Etcd:
+    Hosts:
+    - 192.168.3.207:2379
+    - 192.168.3.165:2379
+    - 192.168.3.204:2379
+    Key: social.rpc
+ResourceCenterKey: resource.rpc

+ 75 - 0
api/internal/config/config.go

@@ -0,0 +1,75 @@
+package config
+
+import (
+	"bp.jydev.jianyu360.cn/CRM/application/entity"
+	"github.com/zeromicro/go-zero/rest"
+	"github.com/zeromicro/go-zero/zrpc"
+)
+
+type Config struct {
+	rest.RestConf
+	Gateway struct {
+		ServerCode string
+		Etcd       []string
+	}
+	UserCenterRpc     zrpc.RpcClientConf
+	FileCenterRpc     zrpc.RpcClientConf
+	OssBucketName     string
+	OssUrl            string
+	BaseCenterRpc     zrpc.RpcClientConf
+	NextFollowUpTime  int
+	SocialPlatformRpc zrpc.RpcClientConf
+	ResourceCenterKey string
+}
+
+type Db struct {
+	Mysql      entity.Mysql    `json:"mysql"`
+	Mongo      entity.Mongo    `json:"mongo"`
+	Es         entity.EsStruct `json:"es"`
+	Clickhouse *CHouseConfig
+	Redis      string `json:"redis"`
+}
+type CHouseConfig struct {
+	Addr         string
+	UserName     string
+	Password     string
+	DbName       string
+	MaxIdleConns int
+	MaxOpenConns int
+}
+type Push struct {
+	TimeTaskSwitch    bool
+	StationMailHref   string
+	StationMailAction string
+	TestId            string
+	SaleClue          struct {
+		Create Create
+		Due    Due
+	}
+	SaleChance struct {
+		Create Create
+		Due    Due
+	}
+	Custom struct {
+		Create Create
+		Due    Due
+	}
+	PushTime string
+	DueDay   int
+}
+
+type Create struct {
+	Title           string
+	MySelfContent   string
+	TransferContent string
+	MyselfPcHref    string
+	TransferPcHref  string
+	MobileHref      string
+}
+
+type Due struct {
+	Title      string
+	Content    string
+	PcHref     string
+	MobileHref string
+}

+ 28 - 0
api/internal/handler/addorupdatehandler.go

@@ -0,0 +1,28 @@
+package handler
+
+import (
+	"net/http"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/logic"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+	"github.com/zeromicro/go-zero/rest/httpx"
+)
+
+func addOrUpdateHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.AddOrUpdateReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewAddOrUpdateLogic(r.Context(), svcCtx)
+		resp, err := l.AddOrUpdate(&req)
+		if err != nil {
+			httpx.Error(w, err)
+		} else {
+			httpx.OkJson(w, resp)
+		}
+	}
+}

+ 28 - 0
api/internal/handler/allprojecthandler.go

@@ -0,0 +1,28 @@
+package handler
+
+import (
+	"net/http"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/logic"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+	"github.com/zeromicro/go-zero/rest/httpx"
+)
+
+func allProjectHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.AllprojectReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewAllProjectLogic(r.Context(), svcCtx)
+		resp, err := l.AllProject(&req)
+		if err != nil {
+			httpx.Error(w, err)
+		} else {
+			httpx.OkJson(w, resp)
+		}
+	}
+}

+ 28 - 0
api/internal/handler/associatehandler.go

@@ -0,0 +1,28 @@
+package handler
+
+import (
+	"net/http"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/logic"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+	"github.com/zeromicro/go-zero/rest/httpx"
+)
+
+func associateHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.AssociateReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewAssociateLogic(r.Context(), svcCtx)
+		resp, err := l.Associate(&req)
+		if err != nil {
+			httpx.Error(w, err)
+		} else {
+			httpx.OkJson(w, resp)
+		}
+	}
+}

+ 28 - 0
api/internal/handler/candidatechannellisthandler.go

@@ -0,0 +1,28 @@
+package handler
+
+import (
+	"net/http"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/logic"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+	"github.com/zeromicro/go-zero/rest/httpx"
+)
+
+func candidateChannelListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.ChannelListReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+			return
+		}
+
+		l := logic.NewCandidateChannelListLogic(r.Context(), svcCtx)
+		resp, err := l.CandidateChannelList(&req)
+		if err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+		} else {
+			httpx.OkJsonCtx(r.Context(), w, resp)
+		}
+	}
+}

+ 28 - 0
api/internal/handler/coophistorylisthandler.go

@@ -0,0 +1,28 @@
+package handler
+
+import (
+	"net/http"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/logic"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+	"github.com/zeromicro/go-zero/rest/httpx"
+)
+
+func CoopHistoryListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.CoopHistoryReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+			return
+		}
+
+		l := logic.NewCoopHistoryListLogic(r.Context(), svcCtx)
+		resp, err := l.CoopHistoryList(&req)
+		if err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+		} else {
+			httpx.OkJsonCtx(r.Context(), w, resp)
+		}
+	}
+}

+ 28 - 0
api/internal/handler/ignoreactionhandler.go

@@ -0,0 +1,28 @@
+package handler
+
+import (
+	"net/http"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/logic"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+	"github.com/zeromicro/go-zero/rest/httpx"
+)
+
+func ignoreActionHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.IgnoreReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+			return
+		}
+
+		l := logic.NewIgnoreActionLogic(r.Context(), svcCtx)
+		resp, err := l.IgnoreAction(&req)
+		if err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+		} else {
+			httpx.OkJsonCtx(r.Context(), w, resp)
+		}
+	}
+}

+ 28 - 0
api/internal/handler/infodetailhandler.go

@@ -0,0 +1,28 @@
+package handler
+
+import (
+	"net/http"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/logic"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+	"github.com/zeromicro/go-zero/rest/httpx"
+)
+
+func infoDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.InfoDetailReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+			return
+		}
+
+		l := logic.NewInfoDetailLogic(r.Context(), svcCtx)
+		resp, err := l.InfoDetail(&req)
+		if err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+		} else {
+			httpx.OkJsonCtx(r.Context(), w, resp)
+		}
+	}
+}

+ 28 - 0
api/internal/handler/networklisthandler.go

@@ -0,0 +1,28 @@
+package handler
+
+import (
+	"net/http"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/logic"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+	"github.com/zeromicro/go-zero/rest/httpx"
+)
+
+func networkListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.NetWorkListReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewNetworkListLogic(r.Context(), svcCtx)
+		resp, err := l.NetworkList(&req)
+		if err != nil {
+			httpx.Error(w, err)
+		} else {
+			httpx.OkJson(w, resp)
+		}
+	}
+}

+ 28 - 0
api/internal/handler/ownercooperatehandler.go

@@ -0,0 +1,28 @@
+package handler
+
+import (
+	"net/http"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/logic"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+	"github.com/zeromicro/go-zero/rest/httpx"
+)
+
+func ownerCooperateHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.CooperateOwnerListReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+			return
+		}
+
+		l := logic.NewOwnerCooperateLogic(r.Context(), svcCtx)
+		resp, err := l.OwnerCooperate(&req)
+		if err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+		} else {
+			httpx.OkJsonCtx(r.Context(), w, resp)
+		}
+	}
+}

+ 28 - 0
api/internal/handler/ownerlisthandler.go

@@ -0,0 +1,28 @@
+package handler
+
+import (
+	"net/http"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/logic"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+	"github.com/zeromicro/go-zero/rest/httpx"
+)
+
+func ownerListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.OwnerListReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+			return
+		}
+
+		l := logic.NewOwnerListLogic(r.Context(), svcCtx)
+		resp, err := l.OwnerList(&req)
+		if err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+		} else {
+			httpx.OkJsonCtx(r.Context(), w, resp)
+		}
+	}
+}

+ 28 - 0
api/internal/handler/ownerroutehandler.go

@@ -0,0 +1,28 @@
+package handler
+
+import (
+	"net/http"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/logic"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+	"github.com/zeromicro/go-zero/rest/httpx"
+)
+
+func ownerRouteHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.RouteOwnerListReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+			return
+		}
+
+		l := logic.NewOwnerRouteLogic(r.Context(), svcCtx)
+		resp, err := l.OwnerRoute(&req)
+		if err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+		} else {
+			httpx.OkJsonCtx(r.Context(), w, resp)
+		}
+	}
+}

+ 28 - 0
api/internal/handler/projecthistoryhandler.go

@@ -0,0 +1,28 @@
+package handler
+
+import (
+	"net/http"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/logic"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+	"github.com/zeromicro/go-zero/rest/httpx"
+)
+
+func projectHistoryHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.PrjectHistoryReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+			return
+		}
+
+		l := logic.NewProjectHistoryLogic(r.Context(), svcCtx)
+		resp, err := l.ProjectHistory(&req)
+		if err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+		} else {
+			httpx.OkJsonCtx(r.Context(), w, resp)
+		}
+	}
+}

+ 28 - 0
api/internal/handler/projectlisthandler.go

@@ -0,0 +1,28 @@
+package handler
+
+import (
+	"net/http"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/logic"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+	"github.com/zeromicro/go-zero/rest/httpx"
+)
+
+func projectListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.ProjectListReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+			return
+		}
+
+		l := logic.NewProjectListLogic(r.Context(), svcCtx)
+		resp, err := l.ProjectList(&req)
+		if err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+		} else {
+			httpx.OkJsonCtx(r.Context(), w, resp)
+		}
+	}
+}

+ 28 - 0
api/internal/handler/prpnameasshandler.go

@@ -0,0 +1,28 @@
+package handler
+
+import (
+	"net/http"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/logic"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+	"github.com/zeromicro/go-zero/rest/httpx"
+)
+
+func PrPnameAssHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.PnameAssReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+			return
+		}
+
+		l := logic.NewPrPnameAssLogic(r.Context(), svcCtx)
+		resp, err := l.PrPnameAss(&req)
+		if err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+		} else {
+			httpx.OkJsonCtx(r.Context(), w, resp)
+		}
+	}
+}

+ 87 - 0
api/internal/handler/routes.go

@@ -0,0 +1,87 @@
+// Code generated by goctl. DO NOT EDIT.
+package handler
+
+import (
+	"net/http"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+
+	"github.com/zeromicro/go-zero/rest"
+)
+
+func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
+	server.AddRoutes(
+		[]rest.Route{
+			{
+				Method:  http.MethodPost,
+				Path:    "/networkManage/owner/list",
+				Handler: ownerListHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/networkManage/network/project/list",
+				Handler: projectListHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/networkManage/pr/pname/ass",
+				Handler: PrPnameAssHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/networkManage/pr/project/analyse",
+				Handler: CoopHistoryListHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/networkManage/network/addOrUpdate",
+				Handler: addOrUpdateHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/networkManage/network/associate",
+				Handler: associateHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/networkManage/network/allProject",
+				Handler: allProjectHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/networkManage/network/networkList",
+				Handler: networkListHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/networkManage/ignore/action",
+				Handler: ignoreActionHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/networkManage/infomation/detail",
+				Handler: infoDetailHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/networkManage/pr/project/history",
+				Handler: projectHistoryHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/networkManage/owner/route",
+				Handler: ownerRouteHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/networkManage/owner/cooperate",
+				Handler: ownerCooperateHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/networkManage/candidate/channel/list",
+				Handler: candidateChannelListHandler(serverCtx),
+			},
+		},
+	)
+}

+ 31 - 0
api/internal/logic/addorupdatelogic.go

@@ -0,0 +1,31 @@
+package logic
+
+import (
+	"context"
+	"fmt"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/service"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type AddOrUpdateLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewAddOrUpdateLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AddOrUpdateLogic {
+	return &AddOrUpdateLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *AddOrUpdateLogic) AddOrUpdate(req *types.AddOrUpdateReq) (resp *types.Reply, err error) {
+	logx.Info(fmt.Sprintf("%+v", req))
+	resp = service.Network.AddOrUpdate(req)
+	return
+}

+ 31 - 0
api/internal/logic/allprojectlogic.go

@@ -0,0 +1,31 @@
+package logic
+
+import (
+	"context"
+	"fmt"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/service"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type AllProjectLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewAllProjectLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AllProjectLogic {
+	return &AllProjectLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *AllProjectLogic) AllProject(req *types.AllprojectReq) (resp *types.Reply, err error) {
+	logx.Info(fmt.Sprintf("%+v", req))
+	resp = service.Network.AllProject(req)
+	return
+}

+ 31 - 0
api/internal/logic/associatelogic.go

@@ -0,0 +1,31 @@
+package logic
+
+import (
+	"context"
+	"fmt"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/service"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type AssociateLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewAssociateLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AssociateLogic {
+	return &AssociateLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *AssociateLogic) Associate(req *types.AssociateReq) (resp *types.Reply, err error) {
+	logx.Info(fmt.Sprintf("%+v", req))
+	resp = service.Network.Associate(req)
+	return
+}

+ 52 - 0
api/internal/logic/candidatechannellistlogic.go

@@ -0,0 +1,52 @@
+package logic
+
+import (
+	"context"
+	"fmt"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/service"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type CandidateChannelListLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewCandidateChannelListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CandidateChannelListLogic {
+	return &CandidateChannelListLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *CandidateChannelListLogic) CandidateChannelList(req *types.ChannelListReq) (resp *types.Reply, err error) {
+	// todo: add your logic here and delete this line
+	logx.Info(fmt.Sprintf("%+v", req))
+	resp = &types.Reply{}
+	ownerService := &service.OwnerService{
+		PartyA:       req.PartyA,
+		Supplier:     req.Supplier,
+		Intermediary: req.Intermediary,
+		Heterotophy:  req.Heterotophy,
+		Agency:       req.Agency,
+		PositionId:   req.PositionId,
+		EntAccountId: req.EntAccountId,
+		Type:         req.Type,
+	}
+	data, a1, a2, a3, a4 := ownerService.CandidateChannel()
+	resp.Data = map[string]interface{}{
+		"list":  data,
+		"size1": a1,
+		"size3": a2,
+		"size4": a3,
+		"size2": a4,
+	}
+	return
+}

+ 40 - 0
api/internal/logic/coophistorylistlogic.go

@@ -0,0 +1,40 @@
+package logic
+
+import (
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/service"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+	"context"
+	"fmt"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type CoopHistoryListLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewCoopHistoryListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CoopHistoryListLogic {
+	return &CoopHistoryListLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *CoopHistoryListLogic) CoopHistoryList(req *types.CoopHistoryReq) (resp *types.Reply, err error) {
+	logx.Info(fmt.Sprintf("%+v", req))
+	resp = &types.Reply{}
+	result, size1, size2, size3, size4 := service.GetPrList(req)
+	resp.Data = map[string]interface{}{
+		"list":  result,
+		"size1": size1,
+		"size2": size2,
+		"size3": size3,
+		"size4": size4,
+	}
+
+	return
+}

+ 89 - 0
api/internal/logic/ignoreactionlogic.go

@@ -0,0 +1,89 @@
+package logic
+
+import (
+	"app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jypkg/ent/util"
+	T "bp.jydev.jianyu360.cn/CRM/application/api/common"
+	"context"
+	"fmt"
+	"time"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type IgnoreActionLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewIgnoreActionLogic(ctx context.Context, svcCtx *svc.ServiceContext) *IgnoreActionLogic {
+	return &IgnoreActionLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *IgnoreActionLogic) IgnoreAction(req *types.IgnoreReq) (resp *types.Reply, err error) {
+	logx.Info(fmt.Sprintf("%+v", req))
+	resp = &types.Reply{}
+	rid := ""
+	if req.Source == "2" {
+		rid = util.DecodeId(req.RelateId)
+	} else {
+		rid = req.RelateId
+	}
+	query := map[string]interface{}{
+		"position_id": req.PositionId,
+		"itype":       req.Source,
+		"relate_id":   rid,
+	}
+	info := T.CrmMysql.FindOne("connection_status", query, "id", "")
+	if info != nil && len(*info) > 0 {
+		update := map[string]interface{}{
+			"is_ignore": req.Action,
+		}
+		if req.Action == "1" {
+			update["is_handle"] = 0
+		}
+		b := T.CrmMysql.Update("connection_status", query, update)
+		if !b {
+			resp.Error_code = -1
+			resp.Error_msg = "状态更新失败"
+		} else {
+			resp.Error_msg = "更新成功"
+		}
+
+	} else {
+		if req.Action == "1" {
+			save := map[string]interface{}{
+				"position_id": req.PositionId,
+				"ent_id":      req.EntId,
+				"ent_dept_id": req.EntDeptId,
+				"ent_user_id": req.EntUserId,
+				"relate_id":   rid,
+				"itype":       req.Source,
+				"is_handle":   1,
+				"is_ignore":   req.Action,
+				"create_time": time.Now().Format(date.Date_Full_Layout),
+				"update_time": time.Now().Format(date.Date_Full_Layout),
+			}
+			i := T.CrmMysql.Insert("connection_status", save)
+			if i <= 0 {
+				resp.Error_code = -1
+				resp.Error_msg = "插入失败"
+			} else {
+				resp.Data = i
+				resp.Error_msg = "更新成功"
+			}
+		} else {
+			resp.Error_code = -1
+			resp.Error_msg = "未查询到收录信息"
+		}
+	}
+	return
+}

+ 63 - 0
api/internal/logic/infodetaillogic.go

@@ -0,0 +1,63 @@
+package logic
+
+import (
+	"app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	T "bp.jydev.jianyu360.cn/CRM/application/api/common"
+	"context"
+	"fmt"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type InfoDetailLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewInfoDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *InfoDetailLogic {
+	return &InfoDetailLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+type Infomation struct {
+	Title       string `ch:"title"`
+	Summary     string `ch:"summary"`
+	Content     string `ch:"content"`
+	Basis       string `ch:"basis"`
+	Area        string `ch:"area"`
+	City        string `ch:"city"`
+	DataJsonId  string `ch:"datajson_id"`
+	ProjectName string `json:"project_name"`
+	Href        string `json:"href"`
+}
+
+func (l *InfoDetailLogic) InfoDetail(req *types.InfoDetailReq) (resp *types.Reply, err error) {
+	logx.Info(fmt.Sprintf("%+v", req))
+	resp = &types.Reply{}
+	sql := `SELECT title, summary, content, basis, area, city, datajson_id FROM information.information WHERE id = ?`
+	info := Infomation{}
+	row := T.ClickhouseConn.QueryRow(context.TODO(), sql, req.InfoId)
+	err1 := row.ScanStruct(&info)
+	if err1 == nil {
+		info.DataJsonId = encrypt.EncodeArticleId2ByCheck(info.DataJsonId)
+		binfo, b := T.MgoBidding.FindById("bidding", info.DataJsonId, map[string]interface{}{"title": 1, "projectname": 1})
+		if b && binfo != nil && len(*binfo) > 0 {
+			info.ProjectName = common.ObjToString((*binfo)["projectname"])
+			info.Href = fmt.Sprintf("/article/content/%s.html", encrypt.EncodeArticleId2ByCheck(info.DataJsonId))
+		}
+		resp.Data = info
+	} else {
+		resp.Error_code = -1
+		resp.Error_msg = "未查询到情报信息"
+	}
+
+	return
+}

+ 30 - 0
api/internal/logic/networklistlogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/service"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+	"context"
+	"fmt"
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type NetworkListLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewNetworkListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *NetworkListLogic {
+	return &NetworkListLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *NetworkListLogic) NetworkList(req *types.NetWorkListReq) (resp *types.Reply, err error) {
+	logx.Info(fmt.Sprintf("%+v", req))
+	resp = service.Network.List(req)
+	return
+}

+ 43 - 0
api/internal/logic/ownercooperatelogic.go

@@ -0,0 +1,43 @@
+package logic
+
+import (
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/service"
+	"context"
+	"fmt"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type OwnerCooperateLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewOwnerCooperateLogic(ctx context.Context, svcCtx *svc.ServiceContext) *OwnerCooperateLogic {
+	return &OwnerCooperateLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *OwnerCooperateLogic) OwnerCooperate(req *types.CooperateOwnerListReq) (resp *types.Reply, err error) {
+	// todo: add your logic here and delete this line
+	logx.Info(fmt.Sprintf("%+v", req))
+	resp = &types.Reply{}
+	ownerService := &service.OwnerService{
+		BuyerId:       req.BuyerId,
+		BuyerName:     req.BuyerName,
+		WinnerName:    req.WinnerName,
+		WinnerId:      req.WinnerId,
+		CooperateType: req.CooperateType,
+		PositionId:    req.PositionId,
+	}
+	data := ownerService.OwnerCooperate()
+	resp.Data = data
+	return
+}

+ 52 - 0
api/internal/logic/ownerlistlogic.go

@@ -0,0 +1,52 @@
+package logic
+
+import (
+	"context"
+	"fmt"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/service"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type OwnerListLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewOwnerListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *OwnerListLogic {
+	return &OwnerListLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *OwnerListLogic) OwnerList(req *types.OwnerListReq) (resp *types.Reply, err error) {
+	// todo: add your logic here and delete this line
+	logx.Info(fmt.Sprintf("%+v", req))
+	resp = &types.Reply{}
+	ownerService := &service.OwnerService{
+		PartyA:           req.PartyA,
+		Supplier:         req.Supplier,
+		Heterotophy:      req.Heterotophy,
+		Intermediary:     req.Intermediary,
+		Agency:           req.Agency,
+		SearchEntName:    req.SearchEntName,
+		SourceType:       req.SourceType,
+		ProcessingStatus: req.ProcessingStatus,
+		Area:             req.Area,
+		PositionId:       req.PositionId,
+		PageIndex:        req.PageIndex,
+		PageSize:         req.PageSize,
+		ProjectType:      req.ProjectType,
+		EntAccountId:     req.EntAccountId,
+	}
+	data := ownerService.OwnerlList()
+	resp.Data = data
+	return
+}

+ 40 - 0
api/internal/logic/ownerroutelogic.go

@@ -0,0 +1,40 @@
+package logic
+
+import (
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/service"
+	"context"
+	"fmt"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type OwnerRouteLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewOwnerRouteLogic(ctx context.Context, svcCtx *svc.ServiceContext) *OwnerRouteLogic {
+	return &OwnerRouteLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *OwnerRouteLogic) OwnerRoute(req *types.RouteOwnerListReq) (resp *types.Reply, err error) {
+	// todo: add your logic here and delete this line
+	logx.Info(fmt.Sprintf("%+v", req))
+	resp = &types.Reply{}
+	ownerService := &service.OwnerService{
+		BuyerId:    req.BuyerId,
+		BuyerName:  req.BuyerName,
+		PositionId: req.PositionId,
+	}
+	data := ownerService.OwnerRoute()
+	resp.Data = data
+	return
+}

+ 42 - 0
api/internal/logic/projecthistorylogic.go

@@ -0,0 +1,42 @@
+package logic
+
+import (
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/service"
+	"context"
+	"fmt"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type ProjectHistoryLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewProjectHistoryLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ProjectHistoryLogic {
+	return &ProjectHistoryLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *ProjectHistoryLogic) ProjectHistory(req *types.PrjectHistoryReq) (resp *types.Reply, err error) {
+	logx.Info(fmt.Sprintf("%+v", req))
+	resp = &types.Reply{}
+	if req.BuyerId != "" && req.WinnerId != "" {
+		data := service.GetData3(req.Source, req.BuyerId, req.WinnerId)
+		resp.Data = map[string]interface{}{
+			"count": len(data),
+			"list":  data,
+		}
+	} else {
+		resp.Error_code = -1
+		resp.Error_msg = "参数有误"
+	}
+	return
+}

+ 38 - 0
api/internal/logic/projectlistlogic.go

@@ -0,0 +1,38 @@
+package logic
+
+import (
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/service"
+	"context"
+	"fmt"
+
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type ProjectListLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewProjectListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ProjectListLogic {
+	return &ProjectListLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *ProjectListLogic) ProjectList(req *types.ProjectListReq) (resp *types.Reply, err error) {
+	logx.Info(fmt.Sprintf("%+v", req))
+	resp = &types.Reply{}
+	list, hasNextPage, count := service.GetProjectList(req)
+	resp.Data = map[string]interface{}{
+		"list":        list,
+		"total":       count,
+		"hasNextPage": hasNextPage,
+	}
+	return
+}

+ 46 - 0
api/internal/logic/prpnameasslogic.go

@@ -0,0 +1,46 @@
+package logic
+
+import (
+	. "app.yhyue.com/moapp/jybase/es"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+	"context"
+	"fmt"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+var (
+	findfields = `"project_name", "id"`
+)
+
+type PrPnameAssLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewPrPnameAssLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PrPnameAssLogic {
+	return &PrPnameAssLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *PrPnameAssLogic) PrPnameAss(req *types.PnameAssReq) (resp *types.Reply, err error) {
+	logx.Info(fmt.Sprintf("%+v", req))
+	resp = &types.Reply{}
+	if req.ProjectName != "" {
+		esq := `{"query": {"bool": {"must": [{"match": {"project_name.pname": "` + req.ProjectName + `" }}]}}}`
+		binfo := GetAllByNgram("transaction_info", "transaction_info", esq, "", "", findfields, 0, 10, 0, false)
+		if binfo != nil && len(*binfo) > 0 {
+			resp.Error_code = 0
+			resp.Data = *binfo
+		}
+	} else {
+		resp.Error_code = -1
+		resp.Error_msg = "项目名称不能为空"
+	}
+	return
+}

+ 430 - 0
api/internal/service/CoopHistoryService.go

@@ -0,0 +1,430 @@
+package service
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"strings"
+	"time"
+
+	"app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	elastic "app.yhyue.com/moapp/jybase/es"
+	T "bp.jydev.jianyu360.cn/CRM/application/api/common"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+	"github.com/ClickHouse/clickhouse-go/v2/lib/driver"
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+var (
+	INDEX_1   = "transaction_info"
+	sql_2_0   = `SELECT buyer, buyer_id, agency, agency_id, property_form FROM information.transaction_info WHERE project_id = ?`
+	sql_2_1   = `SELECT project_id, project_name, zbtime FROM information.transaction_info WHERE buyer_id = ? AND has(winner, ?) ORDER BY zbtime DESC`
+	sql_2_1_1 = `SELECT project_id, project_name, zbtime FROM information.transaction_info WHERE buyer_id = ? AND agency = ? ORDER BY zbtime DESC`
+	sql_2_2   = `select DISTINCT  b.company_id,b.company_name,a.relate_id,a.relate_name,b.contact_person   from  connection_introduce a  INNER JOIN connection b on  a.position_id= ? and a.connection_id=b.id  and   a.relate_Id = ? and  a.itype =1  and  b.itype=4 and  b.status=1 `
+	sql_2_3   = `select a.a_id as a_id, a.b_id as b_id, a.a_name as a_name, a.b_name as b_name, a.code as code, c.legal_person as c_person, d.legal_person d_person from crm.ent_map_code a left join ent_info c on (a.a_id = ? or a.b_id = ? ) and a.code in('0101', '0201') and a.a_id = c.id left join ent_info d on (a.a_id = ? or a.b_id = ? ) and a.code in('0101', '0201') and a.b_id = d.id where (a.a_id = ? or a.b_id = ? ) and a.code in('0101', '0201')`
+	es_query  = `{"query": {"bool": {"must": [{"terms": {"buyer_id": ["%s"]}},{"exists": {"field": "winner_id"}}],"must_not": {"terms": {"property_form": ["%s"]}}}},"aggs": {"winner_count": {"terms": {"field": "winner","size": 1000,"order": {"_count": "desc"}},"aggs": {"amount_all": {"sum": {"field": "project_money"}},"ent_id": {"terms": {"field": "winner_id"}},"buyer_id": {"terms": {"field": "buyer_id"}}}}},"size": 1}`
+	es_query1 = `{"query": {"bool": {"must": [{"terms": {"buyer_id": ["%s"]}}],"must_not": [{"term": {"agency_id": {"value": ""}}}]}},"aggs": {"agency_count": {"terms": {"field": "agency","size": 1000,"order": {"_count": "desc"}},"aggs": {"amount_all": {"sum": {"field": "project_money"}},"ent_id": {"terms": {"field": "agency_id"}},"buyer_id": {"terms": {"field": "buyer_id"}}}}},"size": 1}`
+)
+
+type ResultData struct {
+	SourceType       string  `json:"SourceType"`
+	EntName          string  `json:"EntName"`
+	EntId            string  `json:"EntId"`
+	EntPerson        string  `json:"EntPerson"`
+	Middleman        string  `json:"Middleman"`
+	ProjectNum       int     `json:"ProjectNum"`
+	TotalAmount      float64 `json:"TotalAmount"`
+	RecentTime       int64   `json:"RecentTime"`
+	NearlyYears      bool    `json:"NearlyYears"`
+	SupEnt           string  `json:"SupEnt"`       // 上级
+	NextEnt          string  `json:"NextEnt"`      // 下级
+	Relationship     string  `json:"Relationship"` // 关系
+	BuyerId          string  `json:"BuyerId"`
+	IsCreateCustomer bool    `json:"isCreateCustomer"`
+	IsIgnore         bool    `json:"isIgnore"`
+	IsMonitor        bool    `json:"isMonitor"`
+}
+
+type ResultDatas []*ResultData
+
+func (n *ResultDatas) Len() int {
+	return len(*n)
+}
+
+func (n *ResultDatas) Less(i, j int) bool {
+	if (*n)[i].RecentTime == (*n)[j].RecentTime {
+		return (*n)[i].EntName < (*n)[j].EntName
+	}
+	return (*n)[i].RecentTime > (*n)[j].RecentTime
+}
+
+func (n *ResultDatas) Swap(i, j int) {
+	(*n)[i], (*n)[j] = (*n)[j], (*n)[i]
+}
+
+type ProjectTmp struct {
+	Buyer        string   `ch:"buyer"`
+	BuyerId      string   `ch:"buyer_id"`
+	Agency       string   `ch:"agency"`
+	AgencyId     string   `ch:"agency_id"`
+	PropertyForm []string `ch:"property_form"`
+}
+
+type Cooperate struct {
+	Near   bool
+	ZbTime int64
+}
+
+func GetPrList(req *types.CoopHistoryReq) (result []*ResultData, size_1, size_2, size_3, size_4 int64) {
+	pTmp := ProjectTmp{}
+	err := T.ClickhouseConn.QueryRow(context.TODO(), sql_2_0, req.Pid).ScanStruct(&pTmp)
+	if err != nil {
+		return nil, 0, 0, 0, 0
+	}
+	propertyForm := T.NetworkCom.GetMyProbusfor(req.EntAccountId)
+	// firstparty:甲方 supplier:供应商 adiffb:同甲异业 middleman:中间人 agency:招标代理机构 sup_sub: 上下级
+	// 1、同甲异业数据/ 3、招标代理机构渠道
+	if pTmp.BuyerId != "" {
+		// 中间人可介绍业主
+		var r3 []map[string]interface{}
+		r3 = FindMiddleman([]string{fmt.Sprintf("'%s'", pTmp.BuyerId)}, req.PositionId, r3)
+		if r3 != nil && len(r3) > 0 {
+			size_4 = int64(len(r3))
+			if req.ChannelType == "0" || req.ChannelType == "4" {
+				for _, m := range r3 {
+					tmp := ResultData{
+						SourceType:   "middleman",
+						EntName:      common.ObjToString(m["b_name"]),
+						EntId:        common.ObjToString(m["b_id"]),
+						EntPerson:    common.ObjToString(m["personName"]),
+						Relationship: "业主的关系人",
+						BuyerId:      pTmp.BuyerId,
+					}
+					result = append(result, &tmp)
+				}
+			}
+		}
+		// 关联单位
+		var r4 []map[string]interface{}
+		r4 = Findfirstparty([]string{fmt.Sprintf("'%s'", pTmp.BuyerId)}, r4)
+		if r4 != nil && len(r4) > 0 {
+			size_2 = int64(len(r4))
+			if req.ChannelType == "0" || req.ChannelType == "2" {
+				for _, m := range r4 {
+					tmp := ResultData{
+						SourceType:   "sup_sub",
+						EntName:      common.ObjToString(m["b_name"]),
+						EntId:        common.ObjToString(m["b_id"]),
+						EntPerson:    common.ObjToString(m["personName"]),
+						Relationship: common.ObjToString(m["relationship"]),
+						BuyerId:      pTmp.BuyerId,
+					}
+					result = append(result, &tmp)
+				}
+			}
+		}
+		rs1, rs2 := GetData(propertyForm, pTmp.BuyerId)
+		r1 := rs1[pTmp.BuyerId]
+		r2 := rs2[pTmp.BuyerId]
+		if r1 != nil && len(r1) > 0 {
+			size_1 = int64(len(r1))
+			if req.ChannelType == "0" || req.ChannelType == "1" {
+				for _, m := range r1 {
+					near, zbtime := LastTimeCoop(pTmp.BuyerId, common.ObjToString(m["name"]), "adiffb")
+					tmp := ResultData{
+						SourceType:  "adiffb",
+						EntName:     common.ObjToString(m["name"]),
+						ProjectNum:  common.IntAll(m["coop_size"]),
+						TotalAmount: common.Float64All(m["coop_amount"]),
+						RecentTime:  zbtime,
+						NearlyYears: near,
+						BuyerId:     pTmp.BuyerId,
+					}
+					result = append(result, &tmp)
+				}
+			}
+		}
+		if r2 != nil && len(r2) > 0 {
+			size_3 = int64(len(r2))
+			if req.ChannelType == "0" || req.ChannelType == "3" {
+				for _, m := range r2 {
+					near, zbtime := LastTimeCoop(pTmp.BuyerId, common.ObjToString(m["name"]), "agency")
+					tmp := ResultData{
+						SourceType:  "agency",
+						EntName:     common.ObjToString(m["name"]),
+						ProjectNum:  common.IntAll(m["coop_size"]),
+						TotalAmount: common.Float64All(m["coop_amount"]),
+						RecentTime:  zbtime,
+						NearlyYears: near,
+						BuyerId:     pTmp.BuyerId,
+					}
+					result = append(result, &tmp)
+				}
+			}
+		}
+	}
+	return
+}
+
+func GetData(propertyForm []string, bid string) (result1, result2 map[string][]map[string]interface{}) {
+	result1, result2 = map[string][]map[string]interface{}{}, map[string][]map[string]interface{}{}
+	type AggStruct struct {
+		Buckets []struct {
+			Key        string `json:"key,omitempty"`
+			Doc_count  int64  `json:"doc_count,omitempty"`
+			Amount_all struct {
+				Value float64 `json:"value,omitempty"`
+			} `json:"amount_all"`
+			EntId struct {
+				Buckets []struct {
+					Key       string `json:"key,omitempty"`
+					Doc_count int64  `json:"doc_count,omitempty"`
+				} `json:"buckets"`
+			} `json:"ent_id"`
+			BuyerId struct {
+				Buckets []struct {
+					Key       string `json:"key,omitempty"`
+					Doc_count int64  `json:"doc_count,omitempty"`
+				} `json:"buckets"`
+			} `json:"buyer_id"`
+		} `json:"buckets"`
+	}
+	m1 := make(map[string]interface{}) //采购单位-中标单位
+	m2 := make(map[string]interface{}) //采购单位-代理机构
+	noIds := []string{}
+	if len(propertyForm) > 0 {
+		//同甲异态 中标企业
+		aggs, _, _ := elastic.GetAggs(INDEX_1, INDEX_1, fmt.Sprintf(es_query, strings.ReplaceAll(bid, ",", `","`), strings.Join(propertyForm, "\",\"")))
+		logx.Info("es聚合查询结果:", fmt.Sprintf(es_query, strings.ReplaceAll(bid, ",", `","`), strings.Join(propertyForm, "\",\"")))
+		var m1Buckets = AggStruct{}
+		if aggs != nil && aggs["winner_count"] != nil {
+			bs, err := aggs["winner_count"].MarshalJSON()
+			if err != nil {
+				logx.Info(err)
+			} else {
+				if len(bs) == 0 {
+					logx.Info(err)
+				} else {
+					err := json.Unmarshal(bs, &m1Buckets)
+					logx.Info(err)
+					if len(m1Buckets.Buckets) > 0 {
+						for _, v := range m1Buckets.Buckets {
+							if v.Key != "" && len(v.EntId.Buckets) > 0 && len(v.BuyerId.Buckets) > 0 {
+								mv := map[string]interface{}{"name": v.Key, "amount": v.Amount_all.Value, "count": v.Doc_count, "buyerId": v.BuyerId.Buckets[0].Key}
+								if len(v.EntId.Buckets) == 1 && v.EntId.Buckets[0].Key != "" {
+									mv["nameId"] = v.EntId.Buckets[0].Key
+								} else {
+									noIds = append(noIds, v.Key)
+								}
+								m1[v.Key] = mv
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+	//代理机构
+	aggs1, _, _ := elastic.GetAggs(INDEX_1, INDEX_1, fmt.Sprintf(es_query1, strings.ReplaceAll(bid, ",", `","`)))
+	var m2Buckets = AggStruct{}
+	if aggs1 != nil && aggs1["agency_count"] != nil {
+		bs, err := aggs1["agency_count"].MarshalJSON()
+		if err != nil {
+			logx.Info(err)
+		} else {
+			if len(bs) == 0 {
+				logx.Info(err)
+			} else {
+				err = json.Unmarshal(bs, &m2Buckets)
+				logx.Info(err)
+				if len(m2Buckets.Buckets) > 0 {
+					for _, v := range m2Buckets.Buckets {
+						if v.Key != "" && len(v.EntId.Buckets) > 0 && len(v.BuyerId.Buckets) > 0 {
+							if v.EntId.Buckets[0].Key == "" {
+								noIds = append(noIds, v.Key)
+							}
+							m2[v.Key] = map[string]interface{}{"name": v.Key, "amount": v.Amount_all.Value, "count": v.Doc_count, "nameId": v.EntId.Buckets[0].Key, "buyerId": v.BuyerId.Buckets[0].Key}
+						}
+					}
+				}
+			}
+		}
+	}
+	idName := T.NetworkCom.GetEntIdByName(noIds)
+	for k, v := range m1 {
+		v1 := v.(map[string]interface{})
+		tmp := make(map[string]interface{})
+		tmp["name"] = k
+		nameId, _ := v1["nameId"].(string)
+		if nameId == "" {
+			nameId = idName[k]
+		}
+		tmp["nameId"] = nameId
+		tmp["coop_size"] = v1["count"]
+		tmp["coop_amount"] = v1["amount"]
+		buyerId, _ := v1["buyerId"].(string)
+		result1[buyerId] = append(result1[buyerId], tmp)
+	}
+	for k, v := range m2 {
+		v1 := v.(map[string]interface{})
+		tmp := make(map[string]interface{})
+		tmp["name"] = k
+		nameId, _ := v1["nameId"].(string)
+		if nameId == "" {
+			nameId = idName[k]
+		}
+		tmp["nameId"] = nameId
+		tmp["coop_size"] = v1["count"]
+		tmp["coop_amount"] = v1["amount"]
+		buyerId, _ := v1["buyerId"].(string)
+		result2[buyerId] = append(result2[buyerId], tmp)
+	}
+	return
+}
+
+type P_History struct {
+	ProjectId   string `ch:"project_id"`
+	ProjectName string `ch:"project_name"`
+	ZbTime      int64  `ch:"zbtime"`
+	Href        string `ch:"href"`
+}
+
+// @Author jianghan
+// @Description 合作历史
+// @Date 2024/4/20
+func GetData3(source string, buyerId, winnerId string) (result []*P_History) {
+	var rows driver.Rows
+	if source == "1" {
+		rows, _ = T.ClickhouseConn.Query(context.TODO(), sql_2_1_1, buyerId, winnerId)
+	} else if source == "2" {
+		rows, _ = T.ClickhouseConn.Query(context.TODO(), sql_2_1, buyerId, winnerId)
+	}
+	for rows.Next() {
+		pHis := P_History{}
+		_ = rows.ScanStruct(&pHis)
+		pHis.Href = fmt.Sprintf("/article/content/%s.html", encrypt.CommonEncodeArticle("content", pHis.ProjectId))
+		result = append(result, &pHis)
+	}
+	return
+}
+
+// @Author jianghan
+// @Description 上次合作时间
+// @Date 2024/4/24
+func LastTimeCoop(buyerId, ent, stype string) (bool, int64) {
+	zbtime := int64(0)
+	near := false
+	if stype == "adiffb" {
+		sql := `SELECT zbtime FROM information.transaction_info WHERE buyer_id = ? AND has(winner, ?) ORDER BY zbtime DESC LIMIT 1`
+		_ = T.ClickhouseConn.QueryRow(context.TODO(), sql, buyerId, ent).Scan(&zbtime)
+	} else if stype == "agency" {
+		sql := `SELECT zbtime FROM information.transaction_info WHERE buyer_id = ? AND agency = ? ORDER BY zbtime DESC LIMIT 1`
+		_ = T.ClickhouseConn.QueryRow(context.TODO(), sql, buyerId, ent).Scan(&zbtime)
+	}
+	timestamp := time.Now().AddDate(-3, 0, 0).Unix()
+	if timestamp <= zbtime {
+		near = true
+	}
+	return near, zbtime
+}
+
+//
+func LastTimeCoopBath(positionId int64, buyerIds, winners, agencys []string) (map[string]map[string]*Cooperate, map[string]map[string]*Cooperate) {
+	if len(buyerIds) > 50 {
+		buyerIds = buyerIds[:50]
+	}
+	if len(winners) > 50 {
+		winners = winners[:50]
+	}
+	if len(agencys) > 10 {
+		agencys = agencys[:50]
+	}
+	adiffb, agency := map[string]map[string]*Cooperate{}, map[string]map[string]*Cooperate{}
+	if len(buyerIds) == 0 {
+		return adiffb, agency
+	}
+	var toSearch = func(tp int, query string, args []interface{}) {
+		logx.Info("LastTimeCoopBath once start ", positionId)
+		defer logx.Info("LastTimeCoopBath once over ", positionId)
+		rows, err := T.ClickhouseConn.Query(context.Background(), query, args...)
+		if err != nil {
+			logx.Error(err)
+			return
+		}
+		for rows.Next() {
+			var (
+				buyer_id string
+				one      string
+				zbtime   int64
+			)
+			if err := rows.Scan(&buyer_id, &one, &zbtime); err != nil {
+				logx.Error(err)
+				continue
+			}
+			c := &Cooperate{
+				ZbTime: zbtime,
+			}
+			timestamp := time.Now().AddDate(-3, 0, 0).Unix()
+			if timestamp <= c.ZbTime {
+				c.Near = true
+			}
+			if tp == 1 {
+				if adiffb[buyer_id] == nil {
+					adiffb[buyer_id] = map[string]*Cooperate{}
+				}
+				adiffb[buyer_id][one] = c
+			} else {
+				if agency[buyer_id] == nil {
+					agency[buyer_id] = map[string]*Cooperate{}
+				}
+				agency[buyer_id][one] = c
+			}
+		}
+		rows.Close()
+		if err := rows.Err(); err != nil {
+			logx.Error(err)
+		}
+	}
+	if len(winners) > 0 {
+		sql := `SELECT buyer_id,winner_one,max(zbtime) FROM information.transaction_info ARRAY JOIN winner AS winner_one WHERE %s group by buyer_id,winner_one`
+		text := `(buyer_id=? AND has(winner,?))`
+		array := []string{}
+		args := []interface{}{}
+		for _, v := range buyerIds {
+			for _, vv := range winners {
+				args = append(args, v, vv)
+				array = append(array, text)
+				if len(array) == 50 {
+					toSearch(1, fmt.Sprintf(sql, strings.Join(array, " or ")), args)
+					array = []string{}
+					args = []interface{}{}
+				}
+			}
+		}
+		if len(array) > 0 {
+			toSearch(1, fmt.Sprintf(sql, strings.Join(array, " or ")), args)
+		}
+	}
+	if len(agencys) > 0 {
+		sql := `SELECT buyer_id,agency,max(zbtime) FROM information.transaction_info WHERE %s group by buyer_id,agency`
+		text := `(buyer_id=? AND agency=?)`
+		array := []string{}
+		args := []interface{}{}
+		for _, v := range buyerIds {
+			for _, vv := range winners {
+				args = append(args, v, vv)
+				array = append(array, text)
+				if len(array) == 50 {
+					toSearch(2, fmt.Sprintf(sql, strings.Join(array, " or ")), args)
+					array = []string{}
+					args = []interface{}{}
+				}
+			}
+		}
+		if len(array) > 0 {
+			toSearch(2, fmt.Sprintf(sql, strings.Join(array, " or ")), args)
+		}
+	}
+	return adiffb, agency
+}

+ 1295 - 0
api/internal/service/network.go

@@ -0,0 +1,1295 @@
+package service
+
+import (
+	"context"
+	"database/sql"
+	"fmt"
+	"math"
+	"sort"
+	"strings"
+	"time"
+
+	"app.yhyue.com/moapp/jybase/redis"
+
+	. "app.yhyue.com/moapp/jybase/common"
+	. "app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	. "app.yhyue.com/moapp/jybase/es"
+	. "app.yhyue.com/moapp/jybase/sort"
+	. "bp.jydev.jianyu360.cn/CRM/application/api/common"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+	"github.com/shopspring/decimal"
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+var Network = &network{}
+
+type network struct {
+}
+type networkTree struct {
+	Count    int64               `json:"count"`
+	Name     string              `json:"name"`
+	Children []*networkTreeChild `json:"children"`
+}
+type networkTreeChild struct {
+	Count       int64  `json:"count"`
+	Id          int64  `json:"id"`
+	CompanyId   string `json:"companyId"`
+	CompanyName string `json:"companyName"`
+	Type        string `json:"type"`
+	CreateTime  string `json:"createTime"`
+}
+
+func (n *networkTree) Len() int {
+	return len(n.Children)
+}
+
+func (n *networkTree) Less(i, j int) bool {
+	if n.Name == "甲方" {
+		return n.Children[i].CompanyName < n.Children[j].CompanyName
+	}
+	it, err1 := time.ParseInLocation(Date_Full_Layout, n.Children[i].CreateTime, time.Local)
+	if err1 != nil {
+		return true
+	}
+	jt, err2 := time.ParseInLocation(Date_Full_Layout, n.Children[j].CreateTime, time.Local)
+	if err2 != nil {
+		return true
+	}
+	return it.Unix() < jt.Unix()
+}
+
+func (n *networkTree) Swap(i, j int) {
+	n.Children[i], n.Children[j] = n.Children[j], n.Children[i]
+}
+
+type projectInfo struct {
+	BuyerCount    int64
+	ProjectCount  int64
+	ProjectAmount float64
+	MonitorCount  int64
+	ExportId      []string
+}
+type firstpartyNetwork struct {
+	CompanyId   string
+	CompanyName string
+	Name        string
+}
+type idName struct {
+	Id   string
+	Name string
+}
+type introduceOwnerProject struct {
+	Networks          []*myNetwork
+	FirstpartyNetwork map[string][]*firstpartyNetwork
+	Firstparty        map[string]*projectInfo
+	Supplier          map[string]*projectInfo
+	Adiffb            map[string]*projectInfo
+	Agency            map[string]*projectInfo
+	Middleman         map[string]*projectInfo
+}
+type myNetwork struct {
+	Id                int64
+	Company_id        string
+	Company_name      string
+	Qyxy_id           string
+	Itype             int64
+	Person            string
+	Phone             string
+	Buyer_count       int64
+	Project_count     int64
+	Relate_buyer_id   string
+	Relate_buyer_name string
+	Relate_project_id string
+	Create_time       string
+}
+
+type nodeTree struct {
+	NAME      string
+	ID        string
+	SZ_PID0   string
+	SZ_PID1   string
+	SZ_PID2   string
+	SZ_PID3   string
+	CODE      string
+	PCODE     string
+	DATACOUNT int64
+	SZ_LEVEL  int
+	SZ_LEAF   int
+	TYPE      string
+	MYID      string
+	MYTYPE    string
+}
+
+type nodeTrees []*nodeTree
+
+func (n *nodeTrees) Len() int {
+	return len(*n)
+}
+
+func (n *nodeTrees) Less(i, j int) bool {
+	if (*n)[i].PCODE == (*n)[j].PCODE {
+		return (*n)[i].CODE < (*n)[j].CODE
+	}
+	return (*n)[i].PCODE < (*n)[j].PCODE
+}
+
+func (n *nodeTrees) Swap(i, j int) {
+	(*n)[i], (*n)[j] = (*n)[j], (*n)[i]
+}
+
+//人脉库-添加/修改人脉
+func (n *network) AddOrUpdate(in *types.AddOrUpdateReq) *types.Reply {
+	reply := &types.Reply{Data: map[string]interface{}{
+		"status": 0,
+	}}
+	if in.Type != "middleman" && in.Company_id == "" {
+		return reply
+	}
+	if in.Company_name == "" {
+		in.Company_name = "未填写"
+	}
+	nowFormat := NowFormat(Date_Full_Layout)
+	var saveIntroduce = func(tx *sql.Tx, cid int64, isUpdate bool) bool {
+		if in.Type != "middleman" {
+			return true
+		} else if in.Introduce_owner_id == "" || in.Introduce_project_id == "" {
+			return false
+		}
+		values := []interface{}{}
+		ioi := strings.Split(in.Introduce_owner_id, ",")
+		ioqi := strings.Split(in.Introduce_owner_qyxy_id, ",")
+		ion := strings.Split(in.Introduce_owner_name, ",")
+		if len(ioi) != len(ion) || len(ioi) != len(ioqi) {
+			return false
+		}
+		for k, v := range ioi {
+			values = append(values, in.PositionId, in.EntId, in.EntDeptId, in.EntUserId, cid, ioqi[k], v, ion[k], 1, nowFormat)
+		}
+		ipi := strings.Split(in.Introduce_project_id, ",")
+		ipn := strings.Split(in.Introduce_project_name, ",")
+		if len(ipi) != len(ipn) {
+			return false
+		}
+		for k, v := range ipi {
+			values = append(values, in.PositionId, in.EntId, in.EntDeptId, in.EntUserId, cid, nil, v, ipn[k], 2, nowFormat)
+		}
+		var r2 int64
+		if isUpdate {
+			r2 = CrmMysql.UpdateOrDeleteBySqlByTx(tx, `delete from crm.connection_introduce where connection_id=? and position_id=?`, in.Id, in.PositionId)
+		}
+		r3, _ := CrmMysql.InsertBatchByTx(tx, "crm.connection_introduce", []string{"position_id", "ent_id", "ent_dept_id", "ent_user_id", "connection_id", "qyxy_id", "relate_id", "relate_name", "itype", "create_time"}, values)
+		return r2 >= 0 && r3 > 0
+	}
+	itype := n.TypeStrConvert(in.Type)
+	if in.Id > 0 {
+		if CrmMysql.ExecTx("更新人脉", func(tx *sql.Tx) bool {
+			if in.Company_id != "" {
+				count := CrmMysql.CountBySql(`select count(1) as count from crm.connection where position_id=? and company_id=? and itype=? and id<>? and status=1`, in.PositionId, in.Company_id, itype, in.Id)
+				if count == -1 {
+					return false
+				} else if count > 0 {
+					reply.Data = map[string]interface{}{
+						"status": -1,
+					}
+					return false
+				}
+			}
+			r1 := CrmMysql.UpdateOrDeleteBySqlByTx(tx, `update crm.connection set company_name=?,company_id=?,contact_person=?,contact_phone=?,update_time=? where id=? and position_id=?`, in.Company_name, in.Company_id, in.Contact_person, in.Contact_phone, nowFormat, in.Id, in.PositionId)
+			return r1 >= 0 && saveIntroduce(tx, in.Id, true)
+		}) {
+			reply.Data = map[string]interface{}{
+				"status": 1,
+			}
+		}
+	} else {
+		if in.Company_id != "" {
+			count := CrmMysql.CountBySql(`select count(1) as count from crm.connection where position_id=? and company_id=? and itype=? and status=1`, in.PositionId, in.Company_id, itype)
+			if count == -1 {
+				return reply
+			} else if count > 0 {
+				reply.Data = map[string]interface{}{
+					"status": -1,
+				}
+				return reply
+			}
+		}
+		var r1 int64
+		if CrmMysql.ExecTx("新增人脉", func(tx *sql.Tx) bool {
+			_, r1 = CrmMysql.InsertBatchByTx(tx, "crm.connection", []string{"position_id", "ent_id", "ent_dept_id", "ent_user_id", "itype", "company_name", "company_id", "qyxy_id", "contact_person", "contact_phone", "status", "create_time", "update_time"}, []interface{}{in.PositionId, in.EntId, in.EntDeptId, in.EntUserId, itype, in.Company_name, in.Company_id, in.Qyxy_id, in.Contact_person, in.Contact_phone, 1, nowFormat, nowFormat})
+			return r1 > 0 && saveIntroduce(tx, r1, false)
+		}) {
+			reply.Data = map[string]interface{}{
+				"status": 1,
+				"id":     r1,
+			}
+		}
+	}
+	return reply
+}
+
+//人脉库-业主名称联想
+func (n *network) Associate(in *types.AssociateReq) (reply *types.Reply) {
+	//类型;firstparty:甲方 supplier:供应商 adiffb:同甲异业 middleman:中间人 middleman_owner:中间人-业主 middleman_project:中间人-项目 agency:招标代理机构
+	res := []map[string]string{}
+	reply = &types.Reply{Data: res}
+	in.Name = strings.TrimSpace(in.Name)
+	if in.Name == "" {
+		return
+	}
+	pageSize := 10
+	if in.Type == "adiffb" {
+		probusfors := NetworkCom.GetMyProbusfor(in.EntAccountId)
+		if len(probusfors) > 0 {
+			args := []interface{}{in.EntName}
+			wh, newArgs := NetworkCom.WhArgs(probusfors)
+			args = append(args, newArgs...)
+			q := `select DISTINCT winner_id,winner from information.transaction_info where buyer_id in (select buyer_id from information.transaction_info where has(winner, ?) and buyer_id<>'') and hasAny(property_form,[` + wh + `])=0 ORDER BY project_id`
+			rows, err := ClickhouseConn.Query(context.Background(), q, args...)
+			if err != nil {
+				logx.Error(err)
+			} else {
+				repeat := map[string]bool{}
+				ids := []string{}
+				for rows.Next() {
+					var (
+						winner_id []string
+						winner    []string
+					)
+					if err := rows.Scan(&winner_id, &winner); err != nil {
+						logx.Error(err)
+						continue
+					}
+					for k, v := range winner {
+						if repeat[v] || !strings.Contains(v, in.Name) {
+							continue
+						}
+						repeat[v] = true
+						if k >= len(winner_id) {
+							continue
+						}
+						ids = append(ids, winner_id[k])
+						res = append(res, map[string]string{
+							"company_name": v,
+							"company_id":   winner_id[k],
+						})
+						if len(res) == pageSize {
+							break
+						}
+					}
+				}
+				rows.Close()
+				if err := rows.Err(); err != nil {
+					logx.Error(err)
+				}
+				qyxyId := n.GetQyxyId(ids)
+				for _, v := range res {
+					v["qyxy_id"] = qyxyId[v["company_id"]]
+				}
+			}
+		}
+	} else {
+		must := []string{fmt.Sprintf(`{"multi_match":{"query":"%s","type":"phrase","fields":["company_name"]}}`, in.Name)}
+		switch in.Type {
+		case "firstparty":
+			must = append(must, fmt.Sprintf(`{"terms":{"company_label":["%s"]}}`, strings.Join(NetworkCom.GetEntTagSeat(2), `","`)))
+			must = append(must, `{"terms":{"company_unit_type":[1,2]}}`)
+		case "supplier":
+			must = append(must, fmt.Sprintf(`{"terms":{"company_label":["%s"]}}`, strings.Join(NetworkCom.GetEntTagSeat(2), `","`)))
+			must = append(must, `{"term":{"company_unit_type":3}}`)
+		case "middleman_owner":
+			must = append(must, `{"terms":{"company_unit_type":[1,2]}}`)
+		case "agency":
+			must = append(must, `{"term":{"company_unit_type":4}}`)
+		}
+		q := fmt.Sprintf(`{"query":{"bool":{"must":[%s]}},"size":%d,"_source":["id","company_id","company_name"]}`, strings.Join(must, ","), pageSize)
+		logx.Info("人脉库-业主名称联想", q)
+		datas := VarEs.Get("ent_info", "ent_info", q)
+		if datas != nil {
+			for _, v := range *datas {
+				res = append(res, map[string]string{
+					"company_name": ObjToString(v["company_name"]),
+					"company_id":   ObjToString(v["id"]),
+					"qyxy_id":      ObjToString(v["company_id"]),
+				})
+			}
+		}
+	}
+	reply.Data = res
+	return
+}
+
+//人脉库-全部人脉项目
+func (n *network) AllProject(in *types.AllprojectReq) (reply *types.Reply) {
+	reply = &types.Reply{}
+	probusfors := NetworkCom.GetMyProbusfor(in.EntAccountId)
+	var count int64
+	var list []*networkTree
+	firstpartyChild := map[string][]*firstpartyNetwork{}
+	if in.Id != "" {
+		if in.Type == "firstparty" {
+			fpn := n.FirstpartyNetwork(in.Name, []string{in.Id})
+			if fpn[in.Id] != nil {
+				firstparty := n.Introduce_Firstparty(fpn, map[string]bool{}, probusfors)
+				nameIndex := map[string]int{}
+				for _, v := range fpn[in.Id] {
+					if _, ok := nameIndex[v.Name]; !ok {
+						nameIndex[v.Name] = len(list)
+						list = append(list, &networkTree{
+							Name: v.Name,
+						})
+					}
+					ntc := &networkTreeChild{
+						CompanyName: v.CompanyName,
+						CompanyId:   v.CompanyId,
+						Type:        "firstparty",
+					}
+					if firstparty[v.CompanyId] != nil {
+						ntc.Count = firstparty[v.CompanyId].ProjectCount
+					}
+					count++
+					list[nameIndex[v.Name]].Count += ntc.Count
+					list[nameIndex[v.Name]].Children = append(list[nameIndex[v.Name]].Children, ntc)
+				}
+			}
+		}
+	} else {
+		args := []interface{}{in.PositionId, in.PositionId, in.PositionId}
+		sqlAppend1 := ""
+		if in.Name != "" {
+			sqlAppend1 += ` and a.company_name like ?`
+			args = append(args, "%"+in.Name+"%")
+		}
+		aio := n.AllIntroduceOwner(sqlAppend1, "", args, true, probusfors, map[string]bool{})
+		firstpartyChild = aio.FirstpartyNetwork
+		list = []*networkTree{
+			&networkTree{
+				Name:     "甲方",
+				Children: []*networkTreeChild{},
+			},
+			&networkTree{
+				Name:     "供应商",
+				Children: []*networkTreeChild{},
+			},
+			&networkTree{
+				Name:     "同甲异业渠道",
+				Children: []*networkTreeChild{},
+			},
+			&networkTree{
+				Name:     "中间人",
+				Children: []*networkTreeChild{},
+			},
+			&networkTree{
+				Name:     "招标代理",
+				Children: []*networkTreeChild{},
+			},
+		}
+		//
+		for _, v := range aio.Networks {
+			if v.Itype <= 0 || v.Itype > int64(len(list)) {
+				return
+			}
+			ntc := &networkTreeChild{
+				Id:          v.Id,
+				CompanyName: v.Company_name,
+				CompanyId:   v.Company_id,
+				Type:        n.TypeIntConvert(v.Itype),
+				CreateTime:  v.Create_time,
+			}
+			switch v.Itype {
+			case 1:
+				if aio.Firstparty[v.Company_id] != nil {
+					ntc.Count = aio.Firstparty[v.Company_id].ProjectCount
+				}
+			case 2:
+				if aio.Supplier[v.Company_id] != nil {
+					ntc.Count = aio.Supplier[v.Company_id].ProjectCount
+				}
+			case 3:
+				if aio.Adiffb[v.Company_id] != nil {
+					ntc.Count = aio.Adiffb[v.Company_id].ProjectCount
+				}
+			case 4:
+				if v.Relate_project_id != "" {
+					for _, v := range strings.Split(v.Relate_project_id, ",") {
+						if aio.Middleman[v] != nil {
+							ntc.Count++
+						}
+					}
+				}
+			case 5:
+				if aio.Agency[v.Company_id] != nil {
+					ntc.Count = aio.Agency[v.Company_id].ProjectCount
+				}
+			}
+			count += ntc.Count
+			list[v.Itype-1].Count += ntc.Count
+			list[v.Itype-1].Children = append(list[v.Itype-1].Children, ntc)
+		}
+	}
+	parentConvList := &nodeTrees{}
+	convList := &nodeTrees{}
+	for _, v := range list {
+		pm := &nodeTree{
+			CODE:      v.Name,
+			NAME:      v.Name,
+			SZ_PID0:   v.Name,
+			SZ_LEVEL:  0,
+			DATACOUNT: 0,
+		}
+		if len(v.Children) > 0 {
+			pm.SZ_LEAF = 0
+		} else {
+			pm.SZ_LEAF = 1
+		}
+		sort.Sort(v)
+		id, pType, pMyType, pMyId := "", "", "", ""
+		for _, vv := range v.Children {
+			myId := vv.CompanyId
+			if vv.Type == "middleman" {
+				myId = fmt.Sprint(vv.Id)
+			}
+			if pMyId != "" {
+				pMyId += ","
+			}
+			pMyId += myId
+			if pMyType != "" {
+				pMyType += ","
+			}
+			pMyType += vv.Type
+			myChildIds, myChildTypes := "", ""
+			if in.Id == "" && v.Name == "甲方" {
+				cccNodes := []*nodeTree{}
+				cccIndexMap := map[string]int{}
+				for _, vvv := range firstpartyChild[vv.CompanyId] {
+					cccIndex, cccOk := cccIndexMap[vvv.Name]
+					if cccOk {
+						cccNodes[cccIndex].ID += "," + vvv.CompanyId
+						cccNodes[cccIndex].MYID += "," + vvv.CompanyId
+						cccNodes[cccIndex].TYPE += ",firstparty"
+						cccNodes[cccIndex].MYTYPE += ",firstparty"
+					} else {
+						cccNodes = append(cccNodes, &nodeTree{
+							NAME:     vvv.Name,
+							ID:       vvv.CompanyId,
+							SZ_PID0:  v.Name,
+							SZ_PID1:  v.Name + ":" + myId,
+							SZ_PID2:  v.Name + ":" + myId + ":" + vvv.Name,
+							CODE:     v.Name + ":" + myId + ":" + vvv.Name,
+							PCODE:    v.Name + ":" + myId,
+							SZ_LEVEL: 2,
+							SZ_LEAF:  0,
+							TYPE:     "firstparty",
+							MYID:     vvv.CompanyId,
+							MYTYPE:   "firstparty",
+						})
+						cccIndexMap[vvv.Name] = len(cccNodes) - 1
+					}
+					if id != "" {
+						id += ","
+					}
+					id += vvv.CompanyId
+					if pType != "" {
+						pType += ","
+					}
+					pType += vv.Type
+					if myChildIds != "" {
+						myChildIds += ","
+					}
+					myChildIds += vvv.CompanyId
+					if myChildTypes != "" {
+						myChildTypes += ","
+					}
+					myChildTypes += vv.Type
+					*convList = append(*convList, &nodeTree{
+						NAME:     vvv.CompanyName,
+						ID:       vvv.CompanyId,
+						SZ_PID0:  v.Name,
+						SZ_PID1:  v.Name + ":" + myId,
+						SZ_PID2:  cccNodes[cccIndex].SZ_PID2,
+						SZ_PID3:  v.Name + ":" + myId + ":" + vvv.Name + ":" + vvv.CompanyId,
+						CODE:     v.Name + ":" + myId + ":" + vvv.Name + ":" + vvv.CompanyId,
+						PCODE:    cccNodes[cccIndex].CODE,
+						SZ_LEVEL: 3,
+						SZ_LEAF:  1,
+						TYPE:     "firstparty",
+						MYID:     vvv.CompanyId,
+						MYTYPE:   "firstparty",
+					})
+				}
+				for _, cccNode := range cccNodes {
+					*convList = append(*convList, cccNode)
+				}
+			} else {
+				if id != "" {
+					id += ","
+				}
+				id += myId
+				if pType != "" {
+					pType += ","
+				}
+				pType += vv.Type
+				myChildIds = myId
+				myChildTypes = vv.Type
+			}
+			cm := &nodeTree{
+				NAME:      vv.CompanyName,
+				ID:        myChildIds,
+				SZ_PID0:   v.Name,
+				SZ_PID1:   v.Name + ":" + myId,
+				CODE:      v.Name + ":" + myId,
+				PCODE:     v.Name,
+				DATACOUNT: vv.Count,
+				SZ_LEVEL:  1,
+				SZ_LEAF:   If(myChildIds == "", 1, 0).(int),
+				TYPE:      myChildTypes,
+				MYID:      myId,
+				MYTYPE:    vv.Type,
+			}
+			*convList = append(*convList, cm)
+		}
+		pm.ID = id
+		pm.TYPE = pType
+		pm.MYTYPE = pMyType
+		pm.MYID = pMyId
+		*parentConvList = append(*parentConvList, pm)
+	}
+	sort.Sort(convList)
+	*parentConvList = append(*parentConvList, *convList...)
+	reply = &types.Reply{
+		Data: map[string]interface{}{
+			"count": count,
+			"list":  parentConvList,
+		},
+	}
+	return reply
+}
+
+//人脉库-列表
+func (n *network) List(in *types.NetWorkListReq) *types.Reply {
+	if in.Page_size <= 0 {
+		in.Page_size = 10
+	}
+	if in.Current_page <= 0 {
+		in.Current_page = 1
+	}
+	dbPaging := in.Buyercount_start == 0 && in.Buyercount_end == 0 && in.Monitor == 0 && in.Monitorcount_start == 0 && in.Monitorcount_end == 0 && in.Project_matchme == 0 && in.Order_amount == 0
+	sqlAppendArgs := []interface{}{}
+	sqlAppend1 := ""
+	if dbPaging && in.Type != "" {
+		sqlAppend1 += ` and a.itype=?`
+		sqlAppendArgs = append(sqlAppendArgs, n.TypeStrConvert(in.Type))
+	}
+	comSqlAppend := ""
+	comSqlArgs := []interface{}{}
+	if in.Starttime != "" {
+		comSqlAppend += ` and a.create_time>=?`
+		comSqlArgs = append(comSqlArgs, in.Starttime+" 00:00:00")
+	}
+	if in.Endtime != "" {
+		comSqlAppend += ` and a.create_time<=?`
+		if in.Starttime == in.Endtime {
+			in.Endtime += " 23:59:59"
+		} else {
+			in.Endtime += " 00:00:00"
+		}
+		comSqlArgs = append(comSqlArgs, in.Endtime)
+	}
+	if in.Name != "" {
+		comSqlAppend += ` and a.company_name like ?`
+		comSqlArgs = append(comSqlArgs, "%"+in.Name+"%")
+	}
+	sqlAppend1 += comSqlAppend
+	sqlAppendArgs = append(sqlAppendArgs, comSqlArgs...)
+	var count int64
+	start := (in.Current_page - 1) * in.Page_size
+	args := []interface{}{in.PositionId, in.PositionId, in.PositionId}
+	args = append(args, sqlAppendArgs...)
+	sqlAppend2 := ""
+	firstparty_count, supplier_count, adiffb_count, middleman_count, agency_count := 0, 0, 0, 0, 0
+	if dbPaging {
+		newArgs := []interface{}{in.PositionId}
+		newArgs = append(newArgs, sqlAppendArgs...)
+		count = CrmMysql.CountBySql(`select count(1) as count from crm.connection a where a.position_id=?`+sqlAppend1, newArgs...)
+		sqlAppend2 = ` limit ?,?`
+		args = append(args, start, in.Page_size)
+		itemArgs := []interface{}{in.PositionId}
+		itemArgs = append(itemArgs, comSqlArgs...)
+		items := CrmMysql.SelectBySql(`SELECT itype,SUM(1) AS sum FROM crm.connection a WHERE a.position_id=?`+comSqlAppend+` GROUP BY a.itype`, itemArgs...)
+		if items != nil {
+			for _, v := range *items {
+				switch Int64All(v["itype"]) {
+				case 1:
+					firstparty_count = IntAll(v["sum"])
+				case 2:
+					supplier_count = IntAll(v["sum"])
+				case 3:
+					adiffb_count = IntAll(v["sum"])
+				case 4:
+					middleman_count = IntAll(v["sum"])
+				case 5:
+					agency_count = IntAll(v["sum"])
+				}
+			}
+		}
+	}
+	//
+	list := []*map[string]interface{}{}
+	isTjProject := true
+	probusfors := []string{}
+	if in.Project_matchme == 1 {
+		probusfors = NetworkCom.GetMyProbusfor(in.EntAccountId)
+		if len(probusfors) == 0 {
+			isTjProject = false
+		}
+	}
+	if isTjProject {
+		entMonitor := NetworkCom.EntMonitor(in.UserId)
+		aio := n.AllIntroduceOwner(sqlAppend1, sqlAppend2, args, isTjProject, probusfors, entMonitor)
+		for _, v := range aio.Networks {
+			itype := ""
+			buyer_count, project_count, expect_amount, monitor_count := int64(0), int64(0), float64(0), int64(0)
+			export_id := []string{}
+			jump_type, jump_id := "", ""
+			switch v.Itype {
+			case 1:
+				itype = "甲方"
+				jump_type = "firstparty"
+				for _, vv := range aio.FirstpartyNetwork[v.Company_id] {
+					if jump_id != "" {
+						jump_id += ","
+					}
+					jump_id += vv.CompanyId
+				}
+				if aio.Firstparty[v.Company_id] != nil {
+					buyer_count = aio.Firstparty[v.Company_id].BuyerCount
+					project_count = aio.Firstparty[v.Company_id].ProjectCount
+					expect_amount = aio.Firstparty[v.Company_id].ProjectAmount
+					monitor_count = aio.Firstparty[v.Company_id].MonitorCount
+					export_id = aio.Firstparty[v.Company_id].ExportId
+				}
+			case 2:
+				itype = "供应商"
+				jump_type = "supplier"
+				jump_id = v.Company_id
+				if aio.Supplier[v.Company_id] != nil {
+					buyer_count = aio.Supplier[v.Company_id].BuyerCount
+					project_count = aio.Supplier[v.Company_id].ProjectCount
+					expect_amount = aio.Supplier[v.Company_id].ProjectAmount
+					monitor_count = aio.Supplier[v.Company_id].MonitorCount
+					export_id = aio.Supplier[v.Company_id].ExportId
+				}
+			case 3:
+				itype = "同甲异业渠道"
+				jump_type = "adiffb"
+				jump_id = v.Company_id
+				if aio.Adiffb[v.Company_id] != nil {
+					buyer_count = aio.Adiffb[v.Company_id].BuyerCount
+					project_count = aio.Adiffb[v.Company_id].ProjectCount
+					expect_amount = aio.Adiffb[v.Company_id].ProjectAmount
+					monitor_count = aio.Adiffb[v.Company_id].MonitorCount
+					export_id = aio.Adiffb[v.Company_id].ExportId
+				}
+			case 4:
+				itype = "中间人"
+				jump_type = "middleman"
+				jump_id = fmt.Sprint(v.Id)
+				buyer_count = v.Buyer_count
+				if v.Relate_buyer_name != "" {
+					for _, v := range strings.Split(v.Relate_buyer_name, ",") {
+						if v == "" {
+							continue
+						}
+						if entMonitor[v] {
+							monitor_count++
+						}
+					}
+				}
+				if v.Relate_project_id != "" {
+					export_id = strings.Split(v.Relate_project_id, ",")
+					for _, v := range export_id {
+						if aio.Middleman[v] != nil {
+							project_count++
+							expect_amount += aio.Middleman[v].ProjectAmount
+						}
+					}
+				}
+			case 5:
+				itype = "招标代理机构"
+				jump_type = "agency"
+				jump_id = v.Company_id
+				if aio.Agency[v.Company_id] != nil {
+					buyer_count = aio.Agency[v.Company_id].BuyerCount
+					project_count = aio.Agency[v.Company_id].ProjectCount
+					expect_amount = aio.Agency[v.Company_id].ProjectAmount
+					monitor_count = aio.Agency[v.Company_id].MonitorCount
+					export_id = aio.Agency[v.Company_id].ExportId
+				}
+			}
+			if buyer_count < in.Buyercount_start {
+				continue
+			} else if in.Buyercount_end > 0 && buyer_count > in.Buyercount_end {
+				continue
+			} else if in.Monitor == 1 && monitor_count <= 0 {
+				continue
+			} else if in.Monitor == -1 && monitor_count > 0 {
+				continue
+			} else if monitor_count < in.Monitorcount_start {
+				continue
+			} else if in.Monitorcount_end > 0 && monitor_count > in.Monitorcount_end {
+				continue
+			} else if in.Project_matchme == 1 && project_count == 0 {
+				continue
+			}
+			if !dbPaging {
+				switch v.Itype {
+				case 1:
+					firstparty_count++
+				case 2:
+					supplier_count++
+				case 3:
+					adiffb_count++
+				case 4:
+					middleman_count++
+				case 5:
+					agency_count++
+				}
+				if in.Type != "" && n.TypeStrConvert(in.Type) != v.Itype {
+					continue
+				}
+			}
+			export_url := ""
+			if len(export_id) > 0 {
+				exportIdRepeat := map[string]bool{}
+				exportId := ""
+				for _, v := range export_id {
+					if exportIdRepeat[v] {
+						continue
+					}
+					exportIdRepeat[v] = true
+					if exportId != "" {
+						exportId += ","
+					}
+					exportId += v
+				}
+				md5Id := GetMd5String(exportId)
+				redis.Put("newother", fmt.Sprintf("network_export_%s", md5Id), exportId, 259200)
+				export_url = "/subscribepay/network/projectExport?export_id=" + md5Id
+			}
+			url := ""
+			if v.Qyxy_id != "" && (jump_type == "supplier" || jump_type == "adiffb") {
+				url = "/swordfish/page_big_pc/ent_portrait/" + encrypt.EncodeArticleId2ByCheck(v.Qyxy_id)
+			} else if jump_type == "firstparty" && v.Company_name != "" {
+				url = "/swordfish/page_big_pc/unit_portrayal/" + v.Company_name
+			}
+			list = append(list, &map[string]interface{}{
+				"company_id":    v.Company_id,
+				"company_name":  v.Company_name,
+				"type":          itype,
+				"jump_type":     jump_type,
+				"jump_id":       jump_id,
+				"person":        v.Person,
+				"phone":         v.Phone,
+				"buyer_count":   buyer_count,
+				"monitor_count": monitor_count,
+				"expect_amount": RetainDecimal(expect_amount/10000, 2),
+				"project_count": project_count,
+				"create_time":   v.Create_time,
+				"export_url":    export_url,
+				"url":           url,
+				"id":            v.Id,
+			})
+		}
+	}
+	csList := &ComSortList{
+		SortKeys: []*ComSortKey{
+			&ComSortKey{
+				Keys:  []string{"expect_amount"},
+				Order: 1,
+				Type:  "float",
+			},
+		},
+		List: list,
+	}
+	if in.Order_amount == -1 {
+		csList.SortKeys[0].Order = -1
+	}
+	if in.Order_amount != 0 {
+		sort.Sort(csList)
+	}
+	finalList := []*map[string]interface{}{}
+	if !dbPaging {
+		count = int64(len(csList.List))
+		if count > 0 && start < count {
+			end := start + in.Page_size
+			if end > count {
+				end = count
+			}
+			finalList = csList.List[start:end]
+		}
+	} else {
+		finalList = csList.List
+	}
+	total_page := int64(math.Ceil(float64(count) / float64(in.Page_size)))
+	return &types.Reply{
+		Data: map[string]interface{}{
+			"count":            count,
+			"total_page":       total_page,
+			"firstparty_count": firstparty_count,
+			"supplier_count":   supplier_count,
+			"adiffb_count":     adiffb_count,
+			"middleman_count":  middleman_count,
+			"agency_count":     agency_count,
+			"list":             finalList,
+		},
+	}
+}
+
+//
+func (n *network) FirstpartyNetwork(name string, values []string) map[string][]*firstpartyNetwork {
+	result := map[string][]*firstpartyNetwork{}
+	if len(values) == 0 {
+		return result
+	}
+	wh, args := NetworkCom.WhArgs(values)
+	q := `select DISTINCT a.a_id,a.b_id as company_id,a.b_name as company_name,b.name from information.ent_map_code a 
+				inner join information.ent_code b on (a.a_id in (` + wh + `) and b.pcode in ('0100','0200') and a.code=b.code)`
+	if name != "" {
+		q += ` where c.company_name like ?`
+		args = append(args, "%"+name+"%")
+	}
+	q += ` order by b.name,a.a_id,a.b_name`
+	rows, err := ClickhouseConn.Query(context.Background(), q, args...)
+	if err != nil {
+		logx.Error(err)
+		return result
+	}
+	for rows.Next() {
+		var (
+			a_id         string
+			company_id   string
+			company_name string
+			name         string
+		)
+		if err := rows.Scan(&a_id, &company_id, &company_name, &name); err != nil {
+			logx.Error(err)
+			continue
+		}
+		if company_id == "" || company_name == "" {
+			continue
+		}
+		result[a_id] = append(result[a_id], &firstpartyNetwork{
+			CompanyId:   company_id,
+			CompanyName: company_name,
+			Name:        name,
+		})
+	}
+	return result
+}
+
+//
+func (n *network) Introduce_Firstparty(fpn map[string][]*firstpartyNetwork, entMonitor map[string]bool, probusfors []string) map[string]*projectInfo {
+	values := []string{}
+	vm := map[string]*projectInfo{}
+	for _, v := range fpn {
+		for _, vv := range v {
+			vm[vv.CompanyId] = &projectInfo{}
+			values = append(values, vv.CompanyId)
+		}
+	}
+	result := map[string]*projectInfo{}
+	if len(values) == 0 {
+		return result
+	}
+	wh, args := NetworkCom.WhArgs(values)
+	q := `select buyer_id,count(project_id) AS project_count,sum(project_money) AS project_amount,groupUniqArray(project_id) from information.transaction_info where buyer_id in (` + wh + `)`
+	if len(probusfors) > 0 {
+		newWh, newArgs := NetworkCom.WhArgs(probusfors)
+		q += ` and hasAny(property_form,[` + newWh + `])`
+		args = append(args, newArgs...)
+	}
+	q += ` and project_bidstatus>1 group by buyer_id`
+	rows, err := ClickhouseConn.Query(context.Background(), q, args...)
+	if err != nil {
+		logx.Error(err)
+		return nil
+	}
+	for rows.Next() {
+		var (
+			buyer_id       string
+			project_count  uint64
+			project_amount decimal.Decimal
+			project_id     []string
+		)
+		if err := rows.Scan(&buyer_id, &project_count, &project_amount, &project_id); err != nil {
+			logx.Error(err)
+			continue
+		}
+		if vm[buyer_id] == nil {
+			continue
+		}
+		vm[buyer_id].ProjectCount += int64(project_count)
+		pf, _ := project_amount.Float64()
+		vm[buyer_id].ProjectAmount += pf
+		vm[buyer_id].ExportId = project_id
+	}
+	rows.Close()
+	if err := rows.Err(); err != nil {
+		logx.Error(err)
+	}
+	for k, v := range fpn {
+		if result[k] == nil {
+			result[k] = &projectInfo{}
+		}
+		result[k].BuyerCount = int64(len(v))
+		for _, vv := range v {
+			if entMonitor[vv.CompanyName] {
+				result[k].MonitorCount++
+			}
+			if vm[vv.CompanyId] == nil {
+				continue
+			}
+			result[k].ProjectCount += vm[vv.CompanyId].ProjectCount
+			result[k].ProjectAmount += vm[vv.CompanyId].ProjectAmount
+			result[k].ExportId = append(result[k].ExportId, vm[vv.CompanyId].ExportId...)
+		}
+	}
+	return result
+}
+
+//
+func (n *network) Introduce_Supplier(values []string, entMonitor map[string]bool, probusfors []string) map[string]*projectInfo {
+	if len(values) == 0 {
+		return map[string]*projectInfo{}
+	}
+	wh, args := NetworkCom.WhArgs(values)
+	vbs := map[string][]*idName{}
+	repeat := map[string]bool{}
+	whRepeat := map[string]map[string]bool{}
+	buyers := []string{}
+	q := `select winner_id,buyer_id,buyer from information.transaction_info where hasAny(winner_id,[` + wh + `]) and project_bidstatus>1`
+	rows, err := ClickhouseConn.Query(context.Background(), q, args...)
+	if err != nil {
+		logx.Error(err)
+	} else {
+		for rows.Next() {
+			var (
+				winner_id []string
+				buyer_id  string
+				buyer     string
+			)
+			if err := rows.Scan(&winner_id, &buyer_id, &buyer); err != nil {
+				logx.Error(err)
+				continue
+			}
+			if buyer_id == "" || buyer == "" {
+				continue
+			}
+			if !repeat[buyer_id] {
+				repeat[buyer_id] = true
+				buyers = append(buyers, buyer_id)
+			}
+			for _, v := range winner_id {
+				if whRepeat[v] != nil && whRepeat[v][buyer_id] {
+					continue
+				}
+				if whRepeat[v] == nil {
+					whRepeat[v] = map[string]bool{}
+				}
+				whRepeat[v][buyer_id] = true
+				vbs[v] = append(vbs[v], &idName{
+					Id:   buyer_id,
+					Name: buyer,
+				})
+			}
+		}
+		rows.Close()
+		if err := rows.Err(); err != nil {
+			logx.Error(err)
+		}
+	}
+	return n.MakeProjectInfo(buyers, vbs, probusfors, entMonitor)
+}
+
+//
+func (n *network) Introduce_Agency(values []string, entMonitor map[string]bool, probusfors []string) map[string]*projectInfo {
+	if len(values) == 0 {
+		return map[string]*projectInfo{}
+	}
+	wh, args := NetworkCom.WhArgs(values)
+	q := `select DISTINCT agency_id,buyer_id,buyer from information.transaction_info where agency_id in (` + wh + `) and project_bidstatus>1`
+	rows, err := ClickhouseConn.Query(context.Background(), q, args...)
+	if err != nil {
+		logx.Error(err)
+		return nil
+	}
+	vbs := map[string][]*idName{}
+	buyers := []string{}
+	repeat := map[string]bool{}
+	for rows.Next() {
+		var (
+			agency_id string
+			buyer_id  string
+			buyer     string
+		)
+		if err := rows.Scan(&agency_id, &buyer_id, &buyer); err != nil {
+			logx.Error(err)
+			continue
+		}
+		if buyer_id == "" || buyer == "" {
+			continue
+		}
+		vbs[agency_id] = append(vbs[agency_id], &idName{
+			Id:   buyer_id,
+			Name: buyer,
+		})
+		if !repeat[buyer_id] {
+			repeat[buyer_id] = true
+			buyers = append(buyers, buyer_id)
+		}
+	}
+	rows.Close()
+	if err := rows.Err(); err != nil {
+		logx.Error(err)
+	}
+	return n.MakeProjectInfo(buyers, vbs, probusfors, entMonitor)
+}
+
+//
+func (n *network) Introduce_Middleman(values []string, entMonitor map[string]bool, probusfors []string) map[string]*projectInfo {
+	result := map[string]*projectInfo{}
+	if len(values) == 0 {
+		return result
+	}
+	wh, args := NetworkCom.WhArgs(values)
+	q := `select DISTINCT project_id,project_money from information.transaction_info where project_id in (` + wh + `) and project_bidstatus>1`
+	if len(probusfors) > 0 {
+		newWh, newArgs := NetworkCom.WhArgs(probusfors)
+		q += ` and hasAny(property_form,[` + newWh + `])`
+		args = append(args, newArgs...)
+	}
+	rows, err := ClickhouseConn.Query(context.Background(), q, args...)
+	if err != nil {
+		logx.Error(err)
+		return nil
+	}
+	for rows.Next() {
+		var (
+			project_id    string
+			project_money decimal.Decimal
+		)
+		if err := rows.Scan(&project_id, &project_money); err != nil {
+			logx.Error(err)
+			continue
+		}
+		pf, _ := project_money.Float64()
+		result[project_id] = &projectInfo{
+			ProjectAmount: pf,
+		}
+	}
+	rows.Close()
+	if err := rows.Err(); err != nil {
+		logx.Error(err)
+	}
+	return result
+}
+
+//
+func (n *network) TypeStrConvert(itype string) int64 {
+	//firstparty:甲方 supplier:供应商 adiffb:同甲异业 middleman:中间人 agency:招标代理机构
+	switch itype {
+	case "firstparty":
+		return 1
+	case "supplier":
+		return 2
+	case "adiffb":
+		return 3
+	case "middleman":
+		return 4
+	case "agency":
+		return 5
+	}
+	return 0
+}
+
+//
+func (n *network) TypeIntConvert(itype int64) string {
+	//firstparty:甲方 supplier:供应商 adiffb:同甲异业 middleman:中间人 agency:招标代理机构
+	switch itype {
+	case 1:
+		return "firstparty"
+	case 2:
+		return "supplier"
+	case 3:
+		return "adiffb"
+	case 4:
+		return "middleman"
+	case 5:
+		return "agency"
+	}
+	return ""
+}
+
+//
+func (n *network) GetQyxyId(ids []string) map[string]string {
+	m := map[string]string{}
+	if len(ids) == 0 {
+		return m
+	}
+	wh, args := NetworkCom.WhArgs(ids)
+	q := `select id,company_id from information.ent_info where id in (` + wh + `)`
+	rows, err := ClickhouseConn.Query(context.Background(), q, args...)
+	if err != nil {
+		logx.Error(err)
+	} else {
+		for rows.Next() {
+			var (
+				id         string
+				company_id string
+			)
+			if err := rows.Scan(&id, &company_id); err != nil {
+				logx.Error(err)
+				continue
+			}
+			m[id] = company_id
+		}
+		rows.Close()
+		if err := rows.Err(); err != nil {
+			logx.Error(err)
+		}
+	}
+	return m
+}
+
+//
+func (n *network) BuyerProjectInfo(ids []string, probusfors []string) map[string]*projectInfo {
+	vm := map[string]*projectInfo{}
+	if len(ids) == 0 {
+		return vm
+	}
+	wh, args := NetworkCom.WhArgs(ids)
+	q := `select buyer_id,count(DISTINCT project_id) AS project_count,sum(project_money) AS project_amount,groupUniqArray(project_id) from information.transaction_info where buyer_id in (` + wh + `) and project_bidstatus>1`
+	if len(probusfors) > 0 {
+		newWh, newArgs := NetworkCom.WhArgs(probusfors)
+		q += ` and hasAny(property_form,[` + newWh + `])`
+		args = append(args, newArgs...)
+	}
+	q += ` group by buyer_id`
+	rows, err := ClickhouseConn.Query(context.Background(), q, args...)
+	if err != nil {
+		logx.Error(err)
+		return nil
+	}
+	for rows.Next() {
+		var (
+			buyer_id       string
+			project_count  uint64
+			project_amount decimal.Decimal
+			project_id     []string
+		)
+		if err := rows.Scan(&buyer_id, &project_count, &project_amount, &project_id); err != nil {
+			logx.Error(err)
+			continue
+		}
+		pf, _ := project_amount.Float64()
+		vm[buyer_id] = &projectInfo{
+			ProjectCount:  int64(project_count),
+			ExportId:      project_id,
+			ProjectAmount: pf,
+		}
+	}
+	rows.Close()
+	if err := rows.Err(); err != nil {
+		logx.Error(err)
+	}
+	return vm
+}
+
+//
+func (n *network) MakeProjectInfo(buyers []string, vbs map[string][]*idName, probusfors []string, entMonitor map[string]bool) map[string]*projectInfo {
+	pis := n.BuyerProjectInfo(buyers, probusfors)
+	vm := map[string]*projectInfo{}
+	for k, v := range vbs {
+		pi := &projectInfo{
+			BuyerCount: int64(len(v)),
+		}
+		re := map[string]bool{}
+		for _, vv := range v {
+			if pis[vv.Id] != nil {
+				pi.ProjectCount += pis[vv.Id].ProjectCount
+				pi.ProjectAmount += pis[vv.Id].ProjectAmount
+				for _, vvv := range pis[vv.Id].ExportId {
+					if re[vvv] {
+						continue
+					}
+					pi.ExportId = append(pi.ExportId, vvv)
+					re[vvv] = true
+				}
+			}
+			if entMonitor[vv.Name] {
+				pi.MonitorCount++
+			}
+		}
+		vm[k] = pi
+	}
+	return vm
+}
+
+//
+func (n *network) AllIntroduceOwner(sqlAppend1, sqlAppend2 string, args []interface{}, isTjProject bool, probusfors []string, entMonitor map[string]bool) *introduceOwnerProject {
+	q := `select a.id,a.company_id,a.company_name,a.qyxy_id,a.itype,a.contact_person as person,a.contact_phone as phone,count(DISTINCT if(b.itype=1,b.relate_id,null)) as buyer_count,count(DISTINCT if(b.itype=2,b.relate_id,null)) as project_count,GROUP_CONCAT(IF(b.itype=1,b.relate_id,NULL)) AS relate_buyer_id,GROUP_CONCAT(IF(b.itype=1,b.relate_name,NULL)) AS relate_buyer_name,GROUP_CONCAT(IF(b.itype=2,b.relate_id,NULL)) AS relate_project_id,a.create_time from crm.connection a 
+		left join crm.connection_introduce b on (a.position_id=? and b.position_id=? and a.id=b.connection_id) where a.position_id=?` + sqlAppend1 + ` GROUP BY a.id order by a.create_time desc` + sqlAppend2
+	listTemp := CrmMysql.SelectBySql(q, args...)
+	firstparty_array, supplier_array, adiffb_array, agency_array, middleman_project_array := []string{}, []string{}, []string{}, []string{}, []string{}
+	myNetworks := []*myNetwork{}
+	for _, v := range *listTemp {
+		myNetwork := &myNetwork{
+			Id:                Int64All(v["id"]),
+			Company_id:        ObjToString(v["company_id"]),
+			Company_name:      ObjToString(v["company_name"]),
+			Qyxy_id:           ObjToString(v["qyxy_id"]),
+			Itype:             Int64All(v["itype"]),
+			Person:            ObjToString(v["person"]),
+			Phone:             ObjToString(v["phone"]),
+			Buyer_count:       Int64All(v["buyer_count"]),
+			Project_count:     Int64All(v["project_count"]),
+			Relate_buyer_id:   ObjToString(v["relate_buyer_id"]),
+			Relate_buyer_name: ObjToString(v["relate_buyer_name"]),
+			Relate_project_id: ObjToString(v["relate_project_id"]),
+			Create_time:       ObjToString(v["create_time"]),
+		}
+		switch myNetwork.Itype {
+		case 1:
+			firstparty_array = append(firstparty_array, myNetwork.Company_id)
+		case 2:
+			supplier_array = append(supplier_array, myNetwork.Company_id)
+		case 3:
+			adiffb_array = append(adiffb_array, myNetwork.Company_id)
+		case 4:
+			if myNetwork.Relate_project_id != "" {
+				middleman_project_array = append(middleman_project_array, strings.Split(myNetwork.Relate_project_id, ",")...)
+			}
+		case 5:
+			agency_array = append(agency_array, myNetwork.Company_id)
+		}
+		myNetworks = append(myNetworks, myNetwork)
+	}
+	iop := &introduceOwnerProject{
+		Networks:          myNetworks,
+		FirstpartyNetwork: map[string][]*firstpartyNetwork{},
+		Firstparty:        map[string]*projectInfo{},
+		Supplier:          map[string]*projectInfo{},
+		Adiffb:            map[string]*projectInfo{},
+		Agency:            map[string]*projectInfo{},
+		Middleman:         map[string]*projectInfo{},
+	}
+	if isTjProject {
+		iop.FirstpartyNetwork = n.FirstpartyNetwork("", firstparty_array)
+		iop.Firstparty = n.Introduce_Firstparty(iop.FirstpartyNetwork, entMonitor, probusfors)
+		iop.Supplier = n.Introduce_Supplier(supplier_array, entMonitor, probusfors)
+		iop.Adiffb = n.Introduce_Supplier(adiffb_array, entMonitor, probusfors)
+		iop.Agency = n.Introduce_Agency(agency_array, entMonitor, probusfors)
+		iop.Middleman = n.Introduce_Middleman(middleman_project_array, entMonitor, probusfors)
+	}
+	return iop
+}

+ 208 - 0
api/internal/service/network_test.go

@@ -0,0 +1,208 @@
+package service
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"log"
+	"testing"
+
+	. "app.yhyue.com/moapp/jybase/common"
+	. "bp.jydev.jianyu360.cn/CRM/application/api/common"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+	"bp.jydev.jianyu360.cn/CRM/application/service"
+)
+
+//go test -test.run=TestAddCustomService -fs=../../etc/crmapplication.yaml -lf=../../etc/logs.yaml -df=../../etc/db.yaml -pf=../../etc/push.yaml
+
+func TestAddOrUpdate(t *testing.T) {
+	InitConf()
+	defer Catch()
+	res1 := Network.AddOrUpdate(&types.AddOrUpdateReq{
+		PositionId:           943,
+		Company_name:         "王传进的89",
+		Contact_person:       "王传进",
+		Contact_phone:        "15037870765",
+		Type:                 "middleman",
+		Introduce_owner_id:   "5aebc2c37a624e8bacc40c1802a57041",
+		Introduce_owner_name: "北京影业(北京)有限公司",
+		Introduce_project_id: "5aebc2c37a624e8bacc40c1802a57041,北京物业服务",
+	})
+	log.Println(res1)
+	return
+	//类型;firstparty:甲方 supplier:供应商 adiffb:同甲异业 middleman:中间人 agency:招标代理机构
+	for _, v := range []string{"firstparty", "supplier", "adiffb", "middleman", "agency"} {
+		text := ""
+		switch v {
+		case "firstparty":
+			text = "甲方"
+		case "supplier":
+			text = "供应商"
+		case "adiffb":
+			text = "同甲异业"
+		case "middleman":
+			text = "中间人"
+		case "agency":
+			text = "招标代理机构"
+		}
+		text += "_2"
+		res := Network.AddOrUpdate(&types.AddOrUpdateReq{
+			PositionId:             943,
+			Company_id:             "112233445566",
+			Company_name:           "王传进的" + text,
+			Contact_person:         "王传进",
+			Contact_phone:          "15037870765",
+			Introduce_owner_id:     "11,22,33",
+			Introduce_owner_name:   "aa,bb,cc",
+			Introduce_project_id:   "44,55,66",
+			Introduce_project_name: "dd,ee,ff",
+			Type:                   "middleman",
+		})
+		log.Println(res)
+	}
+}
+
+func TestAssociate(t *testing.T) {
+	InitConf()
+	//log.Println(NetworkCom.GetEntTagSeat(2))
+	//类型;firstparty:甲方 supplier:供应商 adiffb:同甲异业 middleman:中间人 middleman_owner:中间人-业主 middleman_project:中间人-项目 agency:招标代理机构
+	//
+	res := Network.Associate(&types.AssociateReq{
+		//EntName:      "深圳市光明区马田街道市政管理和建设工程事务中心",
+		//EntAccountId: 64,
+		Name: "北京",
+		Type: "middleman",
+	})
+	log.Println(res.Data)
+}
+
+func TestNetWorkList(t *testing.T) {
+	InitConf()
+	//类型;firstparty:甲方 supplier:供应商 adiffb:同甲异业 middleman:中间人 agency:招标代理机构
+	res := Network.List(&types.NetWorkListReq{
+		EntAccountId: 64,
+		UserId:       "1205591997",
+		PositionId:   1205591997,
+		//PositionId: 1205592003,
+		//PositionId:   935,
+		Current_page: 1,
+		Page_size:    10,
+		//PositionId: 935,
+		//Order_amount: -1,
+		// Monitorcount_start: 1,
+		// Monitorcount_end:   1,
+		//Monitor: 1,
+		//Project_matchme: 1,
+		//Starttime: "2024-04-23",
+		//Endtime:   "2024-04-23",
+		//Type: "middleman",
+		Name: "新疆",
+	})
+	for k, v := range res.Data.(map[string]interface{}) {
+		if k == "list" {
+			continue
+		}
+		log.Println(k, v)
+	}
+	for _, v := range res.Data.(map[string]interface{})["list"].([]*map[string]interface{}) {
+		log.Println(v)
+	}
+}
+func TestAllProject(t *testing.T) {
+	InitConf()
+	res := Network.AllProject(&types.AllprojectReq{
+		EntAccountId: 64,
+		PositionId:   935,
+		//PositionId: 1205591997, //刘苗
+		//PositionId: 1205592003,//刘亚丽
+		//Id:   "009c313ef8e740e59d57432aea777102",
+		//Type: "firstparty",
+	})
+	b, _ := json.Marshal(res.Data)
+	log.Println(string(b))
+}
+
+func TestOwner(t *testing.T) {
+	InitConf()
+	ownerService := &OwnerService{
+		Intermediary: "30157",
+		PositionId:   1205591997,
+		PageIndex:    1,
+		PageSize:     100,
+	}
+	data := ownerService.OwnerlList()
+	b, _ := json.Marshal(data)
+	log.Println(string(b))
+}
+
+func TestAddCustomService(t *testing.T) {
+	InitConf()
+	cs := &service.CustomService{
+		PositionId:           1205591997,
+		AppId:                "10000",
+		CustomType:           35,
+		Summary:              "1",
+		CustomAllName:        "1",
+		CustomAbbreviation:   "1",
+		CustomLevel:          1,
+		CustomIndustry:       11,
+		CustomDetailIndustry: 24,
+		Province:             "000000",
+		NextfollowUpTime:     1714406400,
+		Types:                1,
+		User:                 []int64{1205591997},
+		CreateName:           "刘苗苗",
+		OwnerId:              "875037a55d374627b1bc919c3cd84668",
+	}
+	cs.Add(context.Background())
+}
+func TestCandidateChannel(t *testing.T) {
+	InitConf()
+	ownerService := &OwnerService{
+		PartyA: "15e4d804ce194a029e9fba645fda0cf0,90e9db9308024d3782a1a03e11ccd684,ed856df4ac4f4eb78a8d1ae9a5a98006,009c313ef8e740e59d57432aea777102,9df7aa60510d45a6875205c2069d550b,2c5ecd5d2a0d4c62884c30e472c95ffe",
+		//Supplier: "0d732efa7adc40529100609e6096baad",
+		//Intermediary: "30154",
+		//Heterotophy:  req.Heterotophy,
+		//Agency:       req.Agency,
+		Type:         "adiffb",
+		EntAccountId: 64,
+		PositionId:   1205591999,
+	}
+	data, a1, a2, a3, a4 := ownerService.CandidateChannel()
+	for _, v := range *data {
+		log.Println(fmt.Sprintf("%+v", v))
+	}
+	log.Println(a1)
+	log.Println(a2)
+	log.Println(a3)
+	log.Println(a4)
+}
+
+func TestProjectHistory(t *testing.T) {
+	InitConf()
+	data := GetData3("2", "128a81f9facb4aefb817244dc2c0e655", "北京城市之光生态环境有限公司")
+	for _, v := range data {
+		log.Println(fmt.Sprintf("%+v", v))
+	}
+}
+func TestChanceAdd(t *testing.T) {
+	chance := &service.SaleChanceService{
+		PositionId:        935,
+		AppId:             "10000",
+		ChanceName:        "王传进的销售机会5",  //机会名称
+		Summary:           "王传进的销售机会5",  //概要信息
+		ChanceClassify:    30,           //机会分类
+		ExpectedOrderTime: 0,            //最初预计落单段时间 时间戳
+		CustomName:        "王传进测试",      //客户全称
+		BusinessType:      3,            //业务类型
+		NextfollowUpTime:  1715097600,   //下次跟进时间戳
+		Types:             1,            //处理方式 1自办;2转办
+		User:              []int64{935}, //企业用户id
+		CustomId:          300069,       //客户id
+		CreateName:        "企业管理员",
+		ChanceSource:      54,
+		BusinessId:        "",
+	}
+	status, _ := chance.Add(context.Background())
+	log.Println(status)
+}

+ 1283 - 0
api/internal/service/owner.go

@@ -0,0 +1,1283 @@
+package service
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"sort"
+	"strings"
+	"sync"
+	"time"
+
+	elastic "app.yhyue.com/moapp/jybase/es"
+
+	"app.yhyue.com/moapp/jybase/encrypt"
+
+	"app.yhyue.com/moapp/jybase/common"
+	. "bp.jydev.jianyu360.cn/CRM/application/api/common"
+	"bp.jydev.jianyu360.cn/CRM/application/entity"
+	"github.com/gogf/gf/v2/util/gconv"
+	"github.com/shopspring/decimal"
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+const (
+	EntINDEX = "ent_info"
+	EntTYPE  = "ent_info"
+)
+
+type OwnerService struct {
+	PartyA           string
+	Supplier         string
+	Heterotophy      string
+	Intermediary     string
+	Agency           string
+	SearchEntName    string
+	SourceType       string
+	ProcessingStatus string
+	Area             string
+	PositionId       int64
+	PageIndex        int64
+	PageSize         int64
+	BuyerId          string
+	BuyerName        string
+	WinnerId         string
+	WinnerName       string
+	CooperateType    string
+	EntAccountId     int64
+	ProjectType      string
+	Type             string
+}
+
+type BuyerProject struct {
+	BuyerId          string
+	BuyerName        string
+	Project          ProjectEntity
+	IsMonitor        bool
+	IsCreateCustomer bool
+	IsIgnore         bool
+	Area             string
+	Zbtime           int64
+	BuyerType        string
+	CId              string
+}
+type ProjectEntity struct {
+	Number          int64
+	zbtime          int64
+	EstimatedAmount int64
+	Connections     []map[string]interface{}
+}
+type Recommend struct {
+	BuyerId string `ch:"buyer_id"`
+	Buyer   string `ch:"buyer"`
+}
+type Project struct {
+	BuyerId    string          `ch:"buyer_id"`
+	Area       string          `ch:"area"`
+	GroupCount uint64          `ch:"group_count"`
+	Zbtime     int64           `ch:"zbtime"`
+	Money      decimal.Decimal `ch:"money"`
+}
+
+func (t *OwnerService) OwnerlList() map[string]interface{} {
+	//先查询采购单位列表
+	startTime := time.Now().Unix()
+	dataMap := &map[string]map[string]interface{}{}
+	projectMap := &map[string]map[string]interface{}{}
+	if t.PartyA != "" || t.Supplier != "" || t.Heterotophy != "" || t.Intermediary != "" || t.Agency != "" {
+		dataMap = BuyerList(t.PartyA, t.Supplier, t.Heterotophy, t.Intermediary, t.Agency, t.PositionId)
+		if len(*dataMap) == 0 {
+			return map[string]interface{}{
+				"connectionsNumber": 0,
+				"highSuccessNumber": 0,
+				"monitorNumber":     0,
+				"list":              []BuyerProject{},
+			}
+		}
+		//处理状态初始化
+		ProcessingStatusInit(t.PositionId, dataMap, t.ProcessingStatus)
+		//监控状态处理
+		//MonitorStatusInit(t.PositionId, dataMap, t.SourceType)
+		//项目数量查询
+		buyerArr := []string{}
+		for _, value := range *dataMap {
+			buyerArr = append(buyerArr, fmt.Sprintf(`"%s"`, gconv.String(value["buyerName"])))
+		}
+		//项目数量处理
+		projectMap, _, dataMap = ProjectHandle(buyerArr, t.EntAccountId, t.SearchEntName, t.Area, t.ProjectType, dataMap)
+	} else if t.SearchEntName != "" {
+		//1 只看转介绍成功率高2只看已监控的
+		//先查找采购单位数据
+		projectMap, dataMap, _ = ProjectHandle([]string{}, t.EntAccountId, t.SearchEntName, t.Area, t.ProjectType, dataMap)
+		a7 := time.Now().Unix()
+		fmt.Println("es用时", a7-startTime)
+		ProcessingStatusInit(t.PositionId, dataMap, t.ProcessingStatus)
+		a8 := time.Now().Unix()
+		fmt.Println("状态用时", a8-a7)
+		//监控状态处理
+		/*MonitorStatusInit(t.PositionId, dataMap, t.SourceType)*/
+		a9 := time.Now().Unix()
+		fmt.Println("监控用时", a9-a8)
+	}
+
+	endTime := time.Now().Unix()
+	fmt.Println("用时时间:", endTime-startTime)
+	if len(*dataMap) == 0 {
+		return map[string]interface{}{}
+	}
+	//采购单位和项目合并
+	a1 := time.Now().Unix()
+	returnData, connectionsNumber, highSuccessNumber, monitorNumber := BuyerProjectMerge(dataMap, projectMap, t.SourceType)
+	a2 := time.Now().Unix()
+	fmt.Println("组合数据", a2-a1)
+	//数组排序
+	//分页数据处理
+	if t.PageSize == 0 {
+		t.PageSize = 10
+	}
+	if t.PageIndex == 0 {
+		t.PageIndex = 1
+	}
+	startIndex := (t.PageIndex - 1) * t.PageSize
+	endIndex := t.PageIndex * t.PageSize
+	sort.Slice(returnData, func(i, j int) bool {
+		aa := fmt.Sprintf("%d%s", returnData[i].Zbtime, returnData[i].BuyerId)
+		bb := fmt.Sprintf("%d%s", returnData[j].Zbtime, returnData[j].BuyerId)
+		return aa > bb
+	})
+	if startIndex < gconv.Int64(len(returnData)) {
+		if endIndex > gconv.Int64(len(returnData)) {
+			endIndex = gconv.Int64(len(returnData))
+		}
+		returnData = returnData[startIndex:endIndex]
+	} else {
+		return map[string]interface{}{}
+	}
+	buyerIdArr := []string{}
+	for _, value := range returnData {
+		if value.BuyerId != "" {
+			buyerIdArr = append(buyerIdArr, fmt.Sprintf("'%s'", value.BuyerId))
+		}
+
+	}
+	//可介绍业主人脉处理
+	a3 := time.Now().Unix()
+	routeList := ConnectionsHandle(buyerIdArr, t.PositionId, false)
+	a4 := time.Now().Unix()
+	fmt.Println("组合数1111据", a4-a3)
+	for _, v := range routeList {
+		buyerId := gconv.String(v["a_id"])
+		for i, v1 := range returnData {
+			aBuyerId := v1.BuyerId
+			if buyerId == aBuyerId {
+				//组装数据
+				returnData[i].Project.Connections = append(returnData[i].Project.Connections, v)
+			}
+		}
+	}
+	//返回数据组装
+	return map[string]interface{}{
+		"connectionsNumber": connectionsNumber,
+		"highSuccessNumber": highSuccessNumber,
+		"monitorNumber":     monitorNumber,
+		"list":              returnData,
+	}
+}
+
+// 可介绍业主人脉列表
+func ConnectionsHandle(buyerArr []string, positionId int64, isAll bool) []map[string]interface{} {
+	returnData := []map[string]interface{}{}
+	a1 := time.Now().Unix()
+	//中间人
+	returnData = FindMiddleman(buyerArr, positionId, returnData)
+	a2 := time.Now().Unix()
+	fmt.Println("中间人", a2-a1)
+	if isAll && len(returnData) > 0 {
+		return returnData
+	}
+	//采购单位 投资关系  管辖关系
+	//采购单位
+	a3 := time.Now().Unix()
+	returnData = Findfirstparty(buyerArr, returnData)
+	a4 := time.Now().Unix()
+	fmt.Println("采购单位", a4-a3)
+	if isAll && len(returnData) > 0 {
+		return returnData
+	}
+	a5 := time.Now().Unix()
+	returnData = append(returnData, Findwinner(buyerArr)...)
+	a6 := time.Now().Unix()
+	logx.Info("供应商", a6-a5)
+	return returnData
+}
+
+// 供应商处理
+func Findwinner(buyerArr []string) []map[string]interface{} {
+	returnData := []map[string]interface{}{}
+	if len(buyerArr) == 0 {
+		return returnData
+	}
+	//供应商  采购单位 供应商     招标代理机构  采购单位  招标代理机构  需要计算合作次数
+	winnerSql := fmt.Sprintf(`select  * from  (select
+			zbtime,
+			project_id,
+			project_name,
+			buyer_id,
+			buyer,
+			entId,
+			'supplier' as entType
+from
+			transaction_info ARRAY
+JOIN winner_id as entId
+where
+		buyer_id in (%s)
+UNION ALL
+		select
+			zbtime,
+			project_id,
+			project_name,
+			buyer_id,
+			buyer,
+			agency_id as entId,
+			'agent' as  entType
+from
+			transaction_info
+where
+		buyer_id in (%s) and  agency_id!='') order by  zbtime DESC,project_id DESC   `, strings.Join(buyerArr, ","), strings.Join(buyerArr, ","))
+	winnerArr := SupplierFindConnectionsHandle(winnerSql)
+	if winnerArr != nil && len(winnerArr) > 0 {
+		//企业联系人处理
+		entIdArr := []string{}
+		for _, v := range winnerArr {
+			if v.EntId != "" {
+				entIdArr = append(entIdArr, fmt.Sprintf("'%s'", v.EntId))
+			}
+		}
+		personMap := map[string]string{}
+		entNameMap := map[string]string{}
+		if len(entIdArr) > 0 {
+			personSql := fmt.Sprintf(`select  id,name as personName from   ent_contact    where   id in (%s)  ORDER by  name`, strings.Join(entIdArr, ","))
+			personArr := PersonFindConnectionsHandle(personSql)
+			//联系人处理
+			for _, v := range personArr {
+				personMap[v.Id] = v.PersonName
+			}
+			entSql := fmt.Sprintf(`select  id ,company_name as personName  from  ent_info where   id in (%s)  ORDER by  company_name`, strings.Join(entIdArr, ","))
+			entNameArr := PersonFindConnectionsHandle(entSql)
+			for _, v := range entNameArr {
+				entNameMap[v.Id] = v.PersonName
+			}
+		}
+
+		winnerMap := map[string]map[string]interface{}{}
+		agencyMap := map[string]map[string]interface{}{}
+		agencyIdMap := map[string]bool{}
+		for _, m := range winnerArr {
+			if m.EntId == "" {
+				continue
+			}
+			projectId := encrypt.EncodeArticleId2ByCheck(m.Project_id)
+			projectName := m.Project_name
+			zbtime := m.Zbtime
+			key := fmt.Sprintf("%s_%s", m.Buyer_id, m.EntId)
+			if m.EntType == "supplier" {
+				buyerId := m.Buyer_id
+				winner := entNameMap[m.EntId]
+				buyer := m.Buyer
+				if _, ok := winnerMap[key]; ok {
+					data := winnerMap[key]
+					data["count"] = gconv.Int64(data["count"]) + 1
+					dataList := gconv.Maps(data["list"])
+					dataList = append(dataList, map[string]interface{}{
+						"zbtime":      zbtime,
+						"projectId":   projectId,
+						"projectName": projectName,
+					})
+					data["list"] = dataList
+					data["zbtime"] = zbtime
+					winnerMap[key] = data
+				} else {
+					winnerMap[key] = map[string]interface{}{
+						"b_id":       m.EntId,
+						"b_name":     entNameMap[m.EntId],
+						"a_name":     buyer,
+						"a_id":       buyerId,
+						"sourceType": "supplier",
+						"zbtime":     zbtime,
+						"personName": personMap[m.EntId],
+						"count":      1,
+						"list": []map[string]interface{}{
+							{
+								"zbtime":      zbtime,
+								"entName":     winner,
+								"projectId":   projectId,
+								"projectName": projectName,
+							},
+						},
+					}
+				}
+			} else {
+				agencyId := m.EntId
+				key = fmt.Sprintf("%s_%s", m.Buyer_id, agencyId)
+				if _, ok := agencyIdMap[key]; ok {
+					data := agencyMap[key]
+					data["count"] = gconv.Int64(data["count"]) + 1
+					dataList := gconv.Maps(data["list"])
+					dataList = append(dataList, map[string]interface{}{
+						"zbtime":      zbtime,
+						"projectId":   projectId,
+						"projectName": projectName,
+					})
+					data["list"] = dataList
+					data["zbtime"] = zbtime
+					agencyMap[key] = data
+				} else {
+					agencyIdMap[key] = true
+					agencyMap[key] = map[string]interface{}{
+						"b_id":       m.EntId,
+						"b_name":     entNameMap[m.EntId],
+						"a_name":     m.Buyer,
+						"a_id":       m.Buyer_id,
+						"sourceType": "agency",
+						"count":      1,
+						"zbtime":     zbtime,
+						"personName": gconv.String(personMap[agencyId]),
+						"list": []map[string]interface{}{
+							{
+								"zbtime":      zbtime,
+								"projectId":   projectId,
+								"projectName": projectName,
+							},
+						},
+					}
+				}
+			}
+
+		}
+		for _, m := range winnerMap {
+			returnData = append(returnData, map[string]interface{}{
+				"b_id":         gconv.String(m["b_id"]),
+				"b_name":       gconv.String(m["b_name"]),
+				"a_name":       gconv.String(m["a_name"]),
+				"a_id":         gconv.String(m["a_id"]),
+				"sourceType":   gconv.String(m["sourceType"]),
+				"relationship": gconv.String(m["relationship"]),
+				"count":        gconv.Int64(m["count"]),
+				"personName":   gconv.String(m["personName"]),
+				"list":         m["list"],
+				"zbtime":       m["zbtime"],
+			})
+		}
+		for _, m := range agencyMap {
+			returnData = append(returnData, map[string]interface{}{
+				"b_id":         gconv.String(m["b_id"]),
+				"b_name":       gconv.String(m["b_name"]),
+				"a_name":       gconv.String(m["a_name"]),
+				"a_id":         gconv.String(m["a_id"]),
+				"sourceType":   gconv.String(m["sourceType"]),
+				"relationship": gconv.String(m["relationship"]),
+				"personName":   gconv.String(m["personName"]),
+				"count":        gconv.Int64(m["count"]),
+				"list":         m["list"],
+				"zbtime":       m["zbtime"],
+			})
+		}
+	}
+	sort.Slice(returnData, func(i, j int) bool {
+		aa := fmt.Sprintf("%s%s", gconv.String(returnData[i]["zbtime"]),
+			gconv.String(returnData[i]["b_id"]))
+		bb := fmt.Sprintf("%s%s", gconv.String(returnData[j]["zbtime"]),
+			gconv.String(returnData[j]["b_id"]))
+		return aa > bb
+	})
+	return returnData
+}
+
+// 中间人查询
+func FindMiddleman(buyerArr []string, positionId int64, returnData []map[string]interface{}) []map[string]interface{} {
+	if len(buyerArr) == 0 {
+		return returnData
+	}
+	//中间人  作为可介绍业主    企业名称
+	companyArr := CrmMysql.SelectBySql(
+		fmt.Sprintf("select DISTINCT  b.company_id,b.company_name,a.relate_id,a.relate_name,b.contact_person   from  connection_introduce a  INNER JOIN  connection   b  on  a.position_id=%d  and a.connection_id=b.id  and   a.relate_Id in (%s) and  a.itype =1  and  b.itype=4 and  b.status=1 ", positionId, strings.Join(buyerArr, ",")))
+	for _, v := range *companyArr {
+		companyId := gconv.String(v["company_id"])
+		companyName := gconv.String(v["company_name"])
+		relateName := gconv.String(v["relate_name"])
+		relateId := gconv.String(v["relate_id"])
+		returnData = append(returnData, map[string]interface{}{
+			"b_id":         companyId,
+			"b_name":       companyName,
+			"a_name":       relateName,
+			"a_id":         relateId,
+			"sourceType":   "middleman",
+			"relationship": "业主的关系人",
+			"personName":   gconv.String(v["contact_person"]),
+		})
+	}
+	return returnData
+}
+
+// 企业之间关系查询
+func Findfirstparty(buyerArr []string, returnData []map[string]interface{}) []map[string]interface{} {
+	if len(buyerArr) == 0 {
+		return returnData
+	}
+	buyerSql := fmt.Sprintf(`select DISTINCT 
+			a.a_id as a_id,
+			a.b_id as b_id,
+			a.a_name as a_name,
+			a.b_name as b_name,
+			111 as   status,
+			a.code as code
+		from
+			ent_map_code a
+		where
+			a.a_id in (%s)
+			and a.code in('0101', '0201')
+			UNION  ALL
+			select
+			a.b_id as a_id,
+			a.a_id as b_id,
+			a.b_name as a_name,
+			a.a_name as b_name,
+			222 as   status,
+			a.code as code
+		from
+			ent_map_code a
+		where
+			a.b_id in (%s)
+			and a.code in('0101', '0201')`,
+		strings.Join(buyerArr, ","),
+		strings.Join(buyerArr, ","))
+	relationshipArr := BuyerFindConnectionsHandle(buyerSql)
+	if relationshipArr != nil && len(relationshipArr) > 0 {
+		entIdArr := []string{}
+		for _, v := range relationshipArr {
+			if v.Bid != "" {
+				entIdArr = append(entIdArr, fmt.Sprintf("'%s'", v.Bid))
+			}
+		}
+		personMap := map[string]string{}
+		if len(entIdArr) > 0 {
+			personSql := fmt.Sprintf(`select  id,name as  personName from   ent_contact    where   id in (%s)  ORDER by  name`, strings.Join(entIdArr, ","))
+			personArr := PersonFindConnectionsHandle(personSql)
+			//联系人处理
+			for _, v := range personArr {
+				personMap[v.Id] = v.PersonName
+			}
+		}
+		for _, v := range relationshipArr {
+			code := v.Code
+			status := v.Status
+			if gconv.String(status) == "111" {
+				//key := fmt.Sprintf("%s_%s", a_id, b_id)
+				switch code {
+				case "0101": //管辖关系
+					returnData = append(returnData, map[string]interface{}{
+						"b_id":         v.Bid,
+						"b_name":       v.Bname,
+						"a_name":       v.Aname,
+						"a_id":         v.Aid,
+						"sourceType":   "firstparty",
+						"relationship": "业主的下级机构",
+						"personName":   gconv.String(personMap[v.Bid]),
+					})
+
+				case "0201": //投资关系
+					returnData = append(returnData, map[string]interface{}{
+						"b_id":         v.Bid,
+						"b_name":       v.Bname,
+						"a_name":       v.Aname,
+						"a_id":         v.Aid,
+						"sourceType":   "firstparty",
+						"relationship": "业主的股东",
+						"personName":   gconv.String(personMap[v.Bid]),
+					})
+				}
+			}
+			if gconv.String(status) == "222" {
+				//key := fmt.Sprintf("%s_%s", b_id, a_id)
+				if code == "0101" {
+					//"0101":管辖关系
+					returnData = append(returnData, map[string]interface{}{
+						"b_id":         v.Bid,
+						"b_name":       v.Bname,
+						"a_name":       v.Aname,
+						"a_id":         v.Aid,
+						"sourceType":   "firstparty",
+						"relationship": "业主的上级机构",
+						"personName":   gconv.String(personMap[v.Bid]),
+					})
+				}
+				if code == "0201" {
+					returnData = append(returnData, map[string]interface{}{
+						"b_id":         v.Bid,
+						"b_name":       v.Bname,
+						"a_name":       v.Aname,
+						"a_id":         v.Aid,
+						"sourceType":   "firstparty",
+						"relationship": "业主的股东",
+						"personName":   gconv.String(personMap[v.Bid]),
+					})
+				}
+
+			}
+		}
+	}
+	return returnData
+}
+
+// 采购单位和项目合并
+func BuyerProjectMerge(dataMap, projectMap *map[string]map[string]interface{}, sourceType string) ([]BuyerProject, int64, int64, int64) {
+	returnData := []BuyerProject{}
+	connectionsNumber := int64(0)
+	highSuccessNumber := int64(0)
+	monitorNumber := int64(0)
+	for buyerId, buyerMap := range *dataMap {
+		buyerName := gconv.String(buyerMap["buyerName"])
+		count := int64(0)
+		if _, ok := (*projectMap)[buyerName]; ok {
+			projectMap := (*projectMap)[buyerName]
+			if isMonitor := gconv.Bool(buyerMap["isMonitor"]); isMonitor {
+				monitorNumber++
+			}
+			count = gconv.Int64(projectMap["count"])
+			money := gconv.Int64(projectMap["money"])
+			zbtime := gconv.Int64(projectMap["zbtime"])
+			if count >= 2 {
+				highSuccessNumber++
+			}
+			/*if sourceType == "1" {
+				if count < 2 {
+					continue
+				}
+			}*/
+			returnData = append(returnData, BuyerProject{
+				BuyerId:   buyerId,
+				BuyerName: buyerName,
+				BuyerType: gconv.String(buyerMap["buyerType"]),
+				Project: ProjectEntity{
+					Number:          count,
+					EstimatedAmount: money,
+					Connections:     []map[string]interface{}{},
+				},
+				Area:             gconv.String(projectMap["area"]),
+				Zbtime:           zbtime,
+				IsIgnore:         gconv.Bool(buyerMap["isIgnore"]),
+				IsMonitor:        gconv.Bool(buyerMap["isMonitor"]),
+				IsCreateCustomer: gconv.Bool(buyerMap["isCreateCustomer"]),
+				CId:              gconv.String(buyerMap["cId"]),
+			})
+		} else {
+			/*if sourceType == "1" {
+				if count < 2 {
+					continue
+				}
+			}*/
+			returnData = append(returnData, BuyerProject{
+				BuyerId:   buyerId,
+				BuyerName: buyerName,
+				BuyerType: gconv.String(buyerMap["buyerType"]),
+				Project: ProjectEntity{
+					Number:          0,
+					EstimatedAmount: 0,
+					Connections:     []map[string]interface{}{},
+				},
+				Area:             "",
+				Zbtime:           0,
+				IsIgnore:         gconv.Bool(buyerMap["isIgnore"]),
+				IsMonitor:        gconv.Bool(buyerMap["isMonitor"]),
+				IsCreateCustomer: gconv.Bool(buyerMap["isCreateCustomer"]),
+				CId:              gconv.String(buyerMap["cId"]),
+			})
+
+		}
+		connectionsNumber++
+	}
+	return returnData, connectionsNumber, highSuccessNumber, monitorNumber
+}
+
+// 已监控数据处理
+func MonitorStatusInit(positionId int64, dataMap *map[string]map[string]interface{}, sourceType string) {
+	monitorMap := map[string]bool{}
+	query := map[string]interface{}{
+		"userId": gconv.String(positionId),
+	}
+	clist, ok := Mgo.Find("follow_customer", query, ``, `{"name":1}`, false, -1, -1)
+	if ok && clist != nil && len(*clist) > 0 {
+		for _, v := range *clist {
+			monitorMap[gconv.String(v["name"])] = true
+		}
+	}
+	//采购单位和自己监控的对比
+	newMap := &map[string]map[string]interface{}{}
+	for k, v := range *dataMap {
+		buyerName := gconv.String(v["buyerName"])
+		if _, ok1 := monitorMap[gconv.String(buyerName)]; ok1 {
+			v["isMonitor"] = true
+			(*newMap)[k] = v
+		} else {
+			/*if sourceType != "2" {
+				v["isMonitor"] = false
+				(*newMap)[k] = v
+			}*/
+		}
+	}
+	/*if sourceType == "2" {
+		*dataMap = *newMap
+		return
+	}*/
+	if newMap != nil {
+		*dataMap = *newMap
+	}
+}
+func FindStatus(positionId int64) (map[string]bool, map[string]bool, map[string]bool) {
+	//未处理
+	untreatedMap := map[string]bool{}
+	//已忽略
+	ignoredMap := map[string]bool{}
+	//已创建
+	createdMap := map[string]bool{}
+	processingArr := CrmMysql.Find(entity.CONNECTION_STATUS, map[string]interface{}{
+		"itype":       1,
+		"position_id": positionId,
+	}, "relate_id,is_handle,is_ignore,is_create", "", -1, -1)
+	if processingArr != nil && len(*processingArr) > 0 {
+		for _, v := range *processingArr {
+			entId := gconv.String(v["relate_id"])
+			handle := gconv.Int64(v["is_handle"])
+			ignore := gconv.Int64(v["is_ignore"])
+			create := gconv.Int64(v["is_create"])
+			if handle == 1 {
+				untreatedMap[entId] = true
+			}
+			if ignore == 1 {
+				ignoredMap[entId] = true
+			}
+			if create == 1 {
+				createdMap[entId] = true
+			}
+		}
+	}
+	return untreatedMap, ignoredMap, createdMap
+}
+
+// 处理状态初始化
+func ProcessingStatusInit(positionId int64, dataMap *map[string]map[string]interface{}, processingStatus string) {
+	//收录数据处理
+	untreatedMap, ignoredMap, createdMap := FindStatus(positionId)
+	newMap := &map[string]map[string]interface{}{}
+	//所有采购单位和处理状态对比
+	for buyerId, value := range *dataMap {
+		if _, ok := ignoredMap[buyerId]; ok {
+			value["isIgnore"] = true
+		}
+		if _, ok := createdMap[buyerId]; ok {
+			value["isCreateCustomer"] = true
+		}
+		for _, v := range strings.Split(processingStatus, ",") {
+			switch v {
+			case "1":
+				if _, ok := untreatedMap[buyerId]; !ok {
+					(*newMap)[buyerId] = value
+				}
+			case "2":
+				if _, ok := ignoredMap[buyerId]; ok {
+					(*newMap)[buyerId] = value
+				}
+
+			case "3":
+				if _, ok := createdMap[buyerId]; ok {
+					(*newMap)[buyerId] = value
+				}
+			case "全部", "":
+				(*newMap)[buyerId] = value
+			}
+		}
+
+	}
+	if newMap != nil {
+		*dataMap = *newMap
+	}
+}
+
+// 采购单位查询
+func BuyerList(partyA, supplier, heterotophy, intermediary, agency string, positionId int64) *map[string]map[string]interface{} {
+	dataMap := &map[string]map[string]interface{}{}
+	//甲方
+	if partyA != "" {
+		intermediaryArr := []string{}
+		for _, v := range strings.Split(partyA, ",") {
+			if v != "" {
+				intermediaryArr = append(intermediaryArr, fmt.Sprintf("'%s'", v))
+			}
+		}
+		if len(partyA) > 0 {
+			partyASql := fmt.Sprintf(`select  id as buyer_id,company_name as buyer  from  ent_info   where  id in (%s)`, strings.Join(intermediaryArr, ","))
+			FindHandle(partyASql, dataMap, "firstparty")
+		}
+	}
+	//供应商 //同甲异业
+	findInSetArr := []string{}
+	if supplier != "" {
+		for _, v := range strings.Split(supplier, ",") {
+			if v != "" {
+				findInSetArr = append(findInSetArr, fmt.Sprintf("'%s'", v))
+			}
+		}
+	}
+	if len(findInSetArr) > 0 {
+		sqlStr := fmt.Sprintf(`SELECT buyer_id,buyer FROM transaction_info where  hasAny(winner_id,[%s])    `, strings.Join(findInSetArr, ","))
+		FindHandle(sqlStr, dataMap, "supplier")
+	}
+	//同甲异业
+	findheterotophyArr := []string{}
+	if heterotophy != "" {
+		for _, v := range strings.Split(heterotophy, ",") {
+			if v != "" {
+				findheterotophyArr = append(findheterotophyArr, fmt.Sprintf("'%s'", v))
+			}
+		}
+	}
+	if len(findheterotophyArr) > 0 {
+		sqlStr := fmt.Sprintf(`SELECT buyer_id,buyer FROM transaction_info where  hasAny(winner_id,[%s])    `, strings.Join(findheterotophyArr, ","))
+		FindHandle(sqlStr, dataMap, "adiffb")
+	}
+	//中间人
+	if intermediary != "" {
+		wh, args := common.WhArgs(strings.Split(intermediary, ","))
+		args = append(args, positionId)
+		intermediaryArr := CrmMysql.SelectBySql(`select a.id,b.relate_id as relate_id,b.relate_name as relate_name from crm.connection a inner join crm.connection_introduce b on ( a.id in (`+wh+`) and  a.position_id=?  and a.id=b.connection_id and b.itype=1)`, args...)
+		if intermediaryArr != nil && len(*intermediaryArr) > 0 {
+			for _, m := range *intermediaryArr {
+				buyerId := gconv.String(m["relate_id"])
+				buyerName := gconv.String(m["relate_name"])
+				(*dataMap)[buyerId] = map[string]interface{}{
+					"buyerName": buyerName,
+					"buyerType": "middleman",
+					"cId":       gconv.String(m["id"]),
+				}
+			}
+		}
+	}
+	//招标代理
+	if agency != "" {
+		agencyArr := []string{}
+		for _, s := range strings.Split(agency, ",") {
+			agencyArr = append(agencyArr, fmt.Sprintf("'%s'", s))
+		}
+		sqlStr := fmt.Sprintf(`SELECT  buyer_id,buyer FROM transaction_info  where agency_id in (%s) `, strings.Join(agencyArr, ","))
+		FindHandle(sqlStr, dataMap, "agency")
+	}
+	return dataMap
+}
+
+// 项目数量查询
+func ProjectHandle(buyerArr []string, entAccountId int64, entName, area, projectType string, dataMap *map[string]map[string]interface{}) (*map[string]map[string]interface{}, *map[string]map[string]interface{}, *map[string]map[string]interface{}) {
+	projectMap := &map[string]map[string]interface{}{}
+	returnMap := &map[string]map[string]interface{}{}
+	sql := ""
+	sqlStr := ""
+	propertyFormStr := ""
+	if projectType == "1" {
+		propertyForm := ""
+		m1 := CrmMysql.FindOne("config_tenant", map[string]interface{}{"account_id": entAccountId}, "probusfor", "")
+		if m1 != nil && len(*m1) > 0 {
+			propertyForm = common.ObjToString((*m1)["probusfor"])
+			if propertyForm != "" {
+				propertyFormStr = fmt.Sprintf(`,{"match":{"property_form":"%s"}}`, propertyForm)
+			}
+
+		}
+
+	}
+	if entName != "" {
+		sql = `{"query":{"bool":{"must_not":[{"term":{"project_bidstatus":1}}],"must":[{"multi_match":{"query":"%s","type":"phrase","fields":["buyer.mbuyer"]}}%s%s]}},"aggs":{"buyer_count":{"terms":{"field":"buyer","size":500,"order":{"zbtime_count":"desc"}},"aggs":{"area_count":{"terms":{"field":"area"}},"buyer_id":{"terms":{"field":"buyer_id"}},"money_count":{"sum":{"field":"project_money"}},"zbtime_count":{"max":{"field":"zbtime"}}}}},"size":0}`
+		sqlStr = fmt.Sprintf(sql, entName, common.If(area != "", fmt.Sprintf(`,{"term":{"area":"%s"}}`, area), ""), common.If(projectType == "1", propertyFormStr, ""))
+	} else {
+		sql = `{"query":{"bool":{"must_not":[{"term":{"project_bidstatus":1}}],"must":[{"terms":{"buyer":[%s]}}%s%s]}},"aggs":{"buyer_count":{"terms":{"field":"buyer","size":500,"order":{"zbtime_count":"desc"}},"aggs":{"area_count":{"terms":{"field":"area"}},"buyer_id":{"terms":{"field":"buyer_id"}},"money_count":{"sum":{"field":"project_money"}},"zbtime_count":{"max":{"field":"zbtime"}}}}},"size":0}`
+		sqlStr = fmt.Sprintf(sql, strings.Join(buyerArr, ","), common.If(area != "", fmt.Sprintf(`,{"term":{"area":"%s"}}`, area), ""), common.If(projectType == "1", propertyFormStr, ""))
+	}
+	startTime := time.Now().Unix()
+	data, _, _ := elastic.GetAggs(INDEX_1, INDEX_1, sqlStr)
+	endTime := time.Now().Unix()
+	fmt.Println("es用时时间:", endTime-startTime)
+	if len(data) == 0 {
+		return projectMap, returnMap, dataMap
+	}
+	for _, object := range data {
+		buyerArr := BuyerAggStruct{}
+		bs, ok := object.MarshalJSON()
+		if ok != nil {
+			logx.Error("解析项目数据失败", object)
+			continue
+		}
+
+		err := json.Unmarshal(bs, &buyerArr)
+		if err != nil {
+			logx.Error(err)
+		}
+		for _, v := range buyerArr.Buckets {
+			buyerName := v.Key
+			area := ""
+			buyerId := ""
+			for _, areaEntity := range v.Area_count.Buckets {
+				area = Deduplication(area, areaEntity.Key)
+			}
+			for _, buyerIdEntity := range v.Buyer_id.Buckets {
+				if buyerIdEntity.Key != "" {
+					buyerId = buyerIdEntity.Key
+				}
+			}
+			(*projectMap)[buyerName] = map[string]interface{}{
+				"area":    area,
+				"zbtime":  v.Zbtime_count.Value,
+				"money":   common.RetainDecimal(common.Float64All(v.Money_count.Value)/10000, 2),
+				"count":   v.Doc_count,
+				"buyerId": buyerId,
+			}
+			(*returnMap)[buyerId] = map[string]interface{}{
+				"buyerName": buyerName,
+				"buyerType": "firstparty",
+			}
+
+		}
+	}
+	if projectType == "1" || area != "" {
+		if entName == "" {
+			for buyerId, v := range *dataMap {
+				buyerName := gconv.String(v["buyerName"])
+				if _, ok := (*projectMap)[buyerName]; !ok {
+					delete(*dataMap, buyerId)
+				}
+			}
+		} else {
+			for buyerId, v := range *returnMap {
+				buyerName := gconv.String(v["buyerName"])
+				if _, ok := (*projectMap)[buyerName]; !ok {
+					delete(*returnMap, buyerId)
+				}
+			}
+		}
+
+	}
+	return projectMap, returnMap, dataMap
+}
+
+type BuyerAggStruct struct {
+	Buckets []struct {
+		Key          string `json:"key,omitempty"`
+		Doc_count    int64  `json:"doc_count,omitempty"`
+		Zbtime_count struct {
+			Value interface{} `json:"value,omitempty"`
+		} `json:"zbtime_count,omitempty"`
+		Money_count struct {
+			Value interface{} `json:"value,omitempty"`
+		} `json:"money_count,omitempty"`
+		Area_count struct {
+			Buckets []struct {
+				Key       string `json:"key,omitempty"`
+				Doc_count int64  `json:"doc_count,omitempty"`
+			}
+		} `json:"area_count"`
+		Buyer_id struct {
+			Buckets []struct {
+				Key       string `json:"key,omitempty"`
+				Doc_count int64  `json:"doc_count,omitempty"`
+			}
+		} `json:"buyer_id"`
+	}
+}
+
+// 采购单位查询sql
+func FindHandle(sqlStr string, dataMap *map[string]map[string]interface{}, buyerType string) {
+	rows, err := ClickhouseConn.Query(context.Background(), sqlStr)
+	if err != nil {
+		logx.Error("查询失败", sqlStr, err)
+	}
+	for rows.Next() {
+		data := Recommend{}
+		rows.ScanStruct(&data)
+		if data.BuyerId != "" {
+			(*dataMap)[data.BuyerId] = map[string]interface{}{
+				"buyerName": data.Buyer,
+				"buyerType": buyerType,
+			}
+		}
+	}
+	return
+}
+
+type ConnectionsEntity struct {
+	Aid     string `ch:"a_id"`
+	Bid     string `ch:"b_id"`
+	Aname   string `ch:"a_name"`
+	Bname   string `ch:"b_name"`
+	Status  uint8  `ch:"status"`
+	Code    string `ch:"code"`
+	Cperson string `ch:"c_person"`
+}
+type PersonEntity struct {
+	Id         string `ch:"id"`
+	PersonName string `ch:"personName"`
+}
+type SupplierConnectionsEntity struct {
+	Zbtime       int64  `ch:"zbtime"`
+	Project_id   string `ch:"project_id"`
+	Project_name string `ch:"project_name"`
+	Buyer_id     string `ch:"buyer_id"`
+	Buyer        string `ch:"buyer"`
+	EntId        string `ch:"entId"`
+	EntType      string `ch:"entType"`
+}
+type SupplierConnectionsEntitys struct {
+	Zbtime       int64
+	Project_id   string
+	Project_name string
+	Buyer_id     string
+	Buyer        string
+	EntId        string
+	EntType      string
+}
+type TimeConnectionsEntity struct {
+	Zbtime       int64  `ch:"zbtime"`
+	Project_id   string `ch:"project_id"`
+	Project_name string `ch:"project_name"`
+}
+
+// 采购单位人脉信息查询sql
+func BuyerFindConnectionsHandle(sqlStr string) []ConnectionsEntity {
+	returnData := []ConnectionsEntity{}
+	rows, err := ClickhouseConn.Query(context.Background(), sqlStr)
+	if err != nil {
+		logx.Error("查询失败", sqlStr, err)
+	}
+	for rows.Next() {
+		data := ConnectionsEntity{}
+		err := rows.ScanStruct(&data)
+		logx.Info(err)
+		returnData = append(returnData, data)
+	}
+	return returnData
+}
+func PersonFindConnectionsHandle(sqlStr string) []PersonEntity {
+	returnData := []PersonEntity{}
+	rows, err := ClickhouseConn.Query(context.Background(), sqlStr)
+	if err != nil {
+		logx.Error("查询失败", sqlStr, err)
+	}
+	for rows.Next() {
+		data := PersonEntity{}
+		rows.ScanStruct(&data)
+		returnData = append(returnData, data)
+	}
+	return returnData
+}
+
+// 供应商
+func SupplierFindConnectionsHandle(sqlStr string) []SupplierConnectionsEntitys {
+	returnData := []SupplierConnectionsEntitys{}
+	rows, err := ClickhouseConn.Query(context.Background(), sqlStr)
+	if err != nil {
+		logx.Error("查询失败", sqlStr, err)
+	}
+	for rows.Next() {
+		data := SupplierConnectionsEntity{}
+		err = rows.ScanStruct(&data)
+		if err != nil {
+			logx.Error(err)
+		}
+		returnData = append(returnData, SupplierConnectionsEntitys{
+			Zbtime:       data.Zbtime,
+			Project_id:   data.Project_id,
+			Project_name: data.Project_name,
+			Buyer_id:     data.Buyer_id,
+			Buyer:        data.Buyer,
+			EntId:        data.EntId,
+			EntType:      data.EntType,
+		})
+	}
+	return returnData
+}
+
+// 合作时间查询
+func TimeFindConnectionsHandle(sqlStr string) []TimeConnectionsEntity {
+	returnData := []TimeConnectionsEntity{}
+	rows, err := ClickhouseConn.Query(context.Background(), sqlStr)
+	if err != nil {
+		logx.Error("查询失败", sqlStr, err)
+	}
+	for rows.Next() {
+		data := TimeConnectionsEntity{}
+		rows.ScanStruct(&data)
+		returnData = append(returnData, data)
+	}
+	return returnData
+}
+
+// 去重处理
+func Deduplication(a, b string) string {
+	newArr := []string{}
+	if b == "全国" {
+		return a
+	}
+	if a != "" {
+		newArr = append(newArr, a)
+	}
+	if b != "" {
+		newArr = append(newArr, b)
+	}
+	return strings.Join(newArr, ",")
+}
+
+// 路径列表
+func (t *OwnerService) OwnerRoute() []map[string]interface{} {
+	if t.BuyerId == "" {
+		return []map[string]interface{}{}
+	}
+	routeList := ConnectionsHandle([]string{
+		fmt.Sprintf("'%s'", t.BuyerId),
+	}, t.PositionId, false)
+	for i, routeMap := range routeList {
+		sourceType := gconv.String(routeMap["sourceType"])
+		if sourceType == "agency" || sourceType == "supplier" {
+			data := routeList[i]
+			data["cooperateCount"] = len(gconv.Maps(data["list"]))
+			delete(data, "list")
+			routeList[i] = data
+		}
+	}
+	return routeList
+}
+
+// 合作列表
+func (t *OwnerService) OwnerCooperate() []map[string]interface{} {
+	returData := []map[string]interface{}{}
+	dataArr := []TimeConnectionsEntity{}
+	if t.CooperateType == "supplier" {
+		//供应商
+		supplierSql := fmt.Sprintf(`SELECT
+			zbtime,
+			project_id,
+			project_name
+			
+		FROM
+			transaction_info     
+		ARRAY 
+		JOIN winner_id  as  winnerId  
+		where  buyer_id= '%s' and  winnerId='%s' order by  zbtime DESC,project_id DESC `, t.BuyerId, t.WinnerId)
+		dataArr = TimeFindConnectionsHandle(supplierSql)
+	} else if t.CooperateType == "agency" {
+		//代理机构
+		agentSql := fmt.Sprintf(`select  zbtime,project_id,project_name  from   transaction_info  where  buyer_id ='%s' and  agency_id ='%s' order by  zbtime DESC,project_id DESC   `, t.BuyerId, t.WinnerId)
+		dataArr = TimeFindConnectionsHandle(agentSql)
+	}
+	if dataArr != nil && len(dataArr) > 0 {
+		for _, m := range dataArr {
+			zbtime := m.Zbtime
+			returData = append(returData, map[string]interface{}{
+				"zbtime":      common.If(zbtime == 0, "", time.Unix(zbtime, 10).Format("2006.01.02")),
+				"entName":     t.WinnerName,
+				"projectId":   encrypt.EncodeArticleId2ByCheck(m.Project_id),
+				"projectName": m.Project_name,
+			})
+		}
+	}
+	return returData
+}
+
+// 候选渠道
+func (t *OwnerService) CandidateChannel() (*ResultDatas, int, int, int, int) {
+	returnData := []*ResultData{}
+	dataMap := &map[string]map[string]interface{}{}
+	if t.PartyA != "" || t.Supplier != "" || t.Heterotophy != "" || t.Intermediary != "" || t.Agency != "" {
+		dataMap = BuyerList(t.PartyA, t.Supplier, t.Heterotophy, t.Intermediary, t.Agency,
+			t.PositionId)
+	}
+	a1, a2, a3, a4 := 0, 0, 0, 0
+	if len(*dataMap) > 0 && dataMap != nil {
+		propertyForm := NetworkCom.GetMyProbusfor(t.EntAccountId)
+		buyerIds := []string{}
+		for buyerId := range *dataMap {
+			buyerIds = append(buyerIds, buyerId)
+		}
+		if len(buyerIds) > 300 {
+			buyerIds = buyerIds[:300]
+		}
+		logx.Info("CandidateChannel start ", t.PositionId)
+		buyerIdsTemp := []string{}
+		rs1, rs2 := map[string][]map[string]interface{}{}, map[string][]map[string]interface{}{}
+		for _, v := range buyerIds {
+			buyerIdsTemp = append(buyerIdsTemp, v)
+			if len(buyerIdsTemp) == 50 {
+				rs1Temp, rs2Temp := GetData(propertyForm, strings.Join(buyerIdsTemp, ","))
+				for kk, vv := range rs1Temp {
+					rs1[kk] = vv
+				}
+				for kk, vv := range rs2Temp {
+					rs2[kk] = vv
+				}
+				buyerIdsTemp = []string{}
+			}
+		}
+		if len(buyerIdsTemp) > 0 {
+			rs1Temp, rs2Temp := GetData(propertyForm, strings.Join(buyerIdsTemp, ","))
+			for kk, vv := range rs1Temp {
+				rs1[kk] = vv
+			}
+			for kk, vv := range rs2Temp {
+				rs2[kk] = vv
+			}
+		}
+		logx.Info("CandidateChannel GetData over ", t.PositionId)
+		winners, agency := []string{}, []string{}
+		for buyerId := range *dataMap {
+			for _, m := range rs1[buyerId] {
+				winners = append(winners, common.ObjToString(m["name"]))
+			}
+			for _, m := range rs2[buyerId] {
+				agency = append(agency, common.ObjToString(m["name"]))
+			}
+		}
+		logx.Info("CandidateChannel LastTimeCoopBath start ", t.PositionId, " ", len(buyerIds), " ", len(winners), " ", len(agency))
+		ltcs1, ltcs2 := LastTimeCoopBath(t.PositionId, buyerIds, winners, agency)
+		logx.Info("CandidateChannel LastTimeCoopBath over ", t.PositionId)
+		pool := make(chan bool, 3)
+		wait := &sync.WaitGroup{}
+		lock := &sync.Mutex{}
+		maxByIdCount := 0
+		for buyerId := range *dataMap {
+			if ltcs1[buyerId] != nil {
+				for _, m := range rs1[buyerId] {
+					ltc := ltcs1[buyerId][common.ObjToString(m["name"])]
+					if ltc == nil {
+						continue
+					}
+					tmp := ResultData{
+						SourceType:  "adiffb",
+						EntId:       common.ObjToString(m["nameId"]),
+						EntName:     common.ObjToString(m["name"]),
+						ProjectNum:  common.IntAll(m["coop_size"]),
+						TotalAmount: common.Float64All(m["coop_amount"]),
+						BuyerId:     buyerId,
+						RecentTime:  ltc.ZbTime,
+						NearlyYears: ltc.Near,
+					}
+					if tmp.EntId == "" || tmp.BuyerId == "" {
+						continue
+					}
+					a1++
+					returnData = append(returnData, &tmp)
+				}
+			}
+			if ltcs2[buyerId] != nil {
+				for _, m := range rs2[buyerId] {
+					ltc := ltcs1[buyerId][common.ObjToString(m["name"])]
+					if ltc == nil {
+						continue
+					}
+					tmp := ResultData{
+						SourceType:  "agency",
+						EntName:     common.ObjToString(m["name"]),
+						ProjectNum:  common.IntAll(m["coop_size"]),
+						TotalAmount: common.Float64All(m["coop_amount"]),
+						RecentTime:  ltc.ZbTime,
+						NearlyYears: ltc.Near,
+						EntId:       common.ObjToString(m["nameId"]),
+						BuyerId:     buyerId,
+					}
+					if tmp.EntId == "" || tmp.BuyerId == "" {
+						continue
+					}
+					a2++
+					returnData = append(returnData, &tmp)
+				}
+			}
+			maxByIdCount++
+			if maxByIdCount > 50 {
+				break
+			}
+			pool <- true
+			wait.Add(1)
+			go func(byId string) {
+				defer common.Catch()
+				defer func() {
+					<-pool
+					wait.Done()
+				}()
+				// 中间人可介绍业主
+				var r3 []map[string]interface{}
+				r3 = FindMiddleman([]string{fmt.Sprintf("'%s'", byId)}, t.PositionId, r3)
+				lock.Lock()
+				if r3 != nil && len(r3) > 0 {
+					for _, m := range r3 {
+						tmp := ResultData{
+							SourceType:   "middleman",
+							EntName:      common.ObjToString(m["b_name"]),
+							EntPerson:    common.ObjToString(m["personName"]),
+							Relationship: "业主的关系人",
+							EntId:        common.ObjToString(m["b_id"]),
+							BuyerId:      byId,
+						}
+						if tmp.EntId == "" || tmp.BuyerId == "" {
+							continue
+						}
+						a3++
+						returnData = append(returnData, &tmp)
+					}
+				}
+				lock.Unlock()
+				// 关联单位
+				var r4 []map[string]interface{}
+				r4 = Findfirstparty([]string{fmt.Sprintf("'%s'", byId)}, r4)
+				lock.Lock()
+				if r4 != nil && len(r4) > 0 {
+					for _, m := range r4 {
+						tmp := ResultData{
+							SourceType:   "sup_sub",
+							EntName:      common.ObjToString(m["b_name"]),
+							EntPerson:    common.ObjToString(m["personName"]),
+							Relationship: common.ObjToString(m["relationship"]),
+							EntId:        common.ObjToString(m["b_id"]),
+							BuyerId:      byId,
+						}
+						if tmp.EntId == "" || tmp.BuyerId == "" {
+							continue
+						}
+						a4++
+						returnData = append(returnData, &tmp)
+					}
+				}
+				lock.Unlock()
+			}(buyerId)
+		}
+		wait.Wait()
+	}
+	logx.Info("CandidateChannel over", t.PositionId)
+	//状态处理
+	result := &ResultDatas{}
+	if len(returnData) > 0 {
+		monitorMap := NetworkCom.EntMonitor(gconv.String(t.PositionId))
+		_, ignoredMap, createdMap := FindStatus(t.PositionId)
+		for k, value := range returnData {
+			if _, ok := ignoredMap[value.EntId]; ok {
+				value.IsIgnore = true
+			}
+			if _, ok := createdMap[value.EntId]; ok {
+				value.IsCreateCustomer = true
+			}
+			if _, ok := monitorMap[value.EntName]; ok {
+				value.IsMonitor = true
+			}
+			returnData[k] = value
+			if t.Type != "" && t.Type != value.SourceType {
+				continue
+			}
+			*result = append(*result, value)
+		}
+	}
+	sort.Sort(result)
+	return result, a1, a2, a3, a4
+}

+ 453 - 0
api/internal/service/plistService.go

@@ -0,0 +1,453 @@
+package service
+
+import (
+	"app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	"app.yhyue.com/moapp/jypkg/ent/util"
+	T "bp.jydev.jianyu360.cn/CRM/application/api/common"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
+	"context"
+	"fmt"
+	"github.com/gogf/gf/v2/util/gconv"
+	"github.com/shopspring/decimal"
+	"github.com/zeromicro/go-zero/core/logx"
+	"strconv"
+	"strings"
+)
+
+const (
+	sql_1 = `SELECT buyer_id, count(1) as count FROM information.transaction_info WHERE buyer_id in (%s) GROUP BY buyer_id`
+	sql_2 = `SELECT relate_id, is_handle, is_ignore, is_create FROM crm.connection_status WHERE position_id = ? AND itype = 2`
+	sql_3 = `SELECT * FROM crm.connection WHERE company_id in (%s) AND status = 1`
+	sql_4 = `SELECT id, s_id FROM base_service.follow_project_monitor WHERE s_userid = ?`
+)
+
+type ProjectData struct {
+	count       int64
+	hasNextPage bool
+	pList       []*ProjectEntry
+}
+
+type ProjectEntry struct {
+	ProjectId     string          `ch:"project_id"`
+	ProjectName   string          `ch:"project_name"`
+	BusinessType  string          `ch:"business_type"`
+	Buyer         string          `ch:"buyer"`
+	BuyerId       string          `ch:"buyer_id"`
+	Area          string          `ch:"area"`
+	City          string          `ch:"city"`
+	District      string          `ch:"district"`
+	ZbTime        int64           `ch:"zbtime"`
+	EndTime       int64           `ch:"endtime"`
+	ProjectMoney  decimal.Decimal `ch:"project_money"`
+	InfoId        string          `ch:"info_id"`
+	InformationId string          `ch:"information_id"`
+	InfoIds       string          `ch:"info_ids"`
+	Href          string          `json:"Href"`
+	IsHandle      int             `json:"IsHandle"`
+	IsIgnore      int             `json:"IsIgnore"`
+	IsCreate      int             `json:"IsCreate"`
+	MyConn        bool            `json:"MyConn"`
+	ConnType      int             `json:"ConnType"`
+	HighSuccess   bool            `json:"HighSuccess"`
+	BId           string          `json:"BId"`
+	BName         string          `json:"BName"`
+	RelationShip  string          `json:"RelationShip"`
+	SourceType    string          `json:"SourceType"` // firstparty:甲方 supplier:供应商 adiffb:同甲异业 middleman:中间人 agency:招标代理机构
+	Person        string          `json:"Person"`
+	Num           int             `json:"Num"`
+	FocusId       string          `json:"FocusId"` // 监控主键
+	IsFocus       int             `json:"IsFocus"`
+}
+
+func GetProjectList(req *types.ProjectListReq) (resultList []*ProjectEntry, hasNextPage bool, total int) {
+	buyerM := BuyerList(req.PartyA, req.Supplier, req.Heterotophy, "", req.Agency, req.PositionId)
+	var plist []string
+	if req.Intermediary != "" {
+		plist = getIyProList(req.Intermediary, req.PositionId)
+	}
+	if len(*buyerM) <= 0 && len(plist) <= 0 {
+		return []*ProjectEntry{}, false, 0
+	}
+	mmp := MonitorStatus(req.UserId) // 项目监控
+	var buyerArr []string
+	for b := range *buyerM {
+		buyerArr = append(buyerArr, b)
+	}
+	preSales := preSalesStatus(req.PositionId)
+	isSqlPage := false
+	if req.SaleStatus == "0" {
+		isSqlPage = true // 是否sql分页
+	}
+	countSql, findSql := getQuerySql(req, isSqlPage, buyerArr, plist)
+	logx.Info("findSql: ", findSql)
+	rows, err := T.ClickhouseConn.Query(context.TODO(), findSql)
+	defer rows.Close()
+	if err != nil {
+		return nil, false, 0
+	}
+	for rows.Next() {
+		project := ProjectEntry{}
+		_ = rows.ScanStruct(&project)
+		resultList = append(resultList, &project)
+	}
+
+	resultList = filterData(req, resultList, preSales, mmp, isSqlPage)
+	if !isSqlPage {
+		total = len(resultList)
+		if total > req.PageSize {
+			hasNextPage = true
+			start := (req.PageNum - 1) * req.PageSize
+			end := req.PageNum * req.PageSize
+			if end > total {
+				end = total
+				hasNextPage = false
+			}
+			resultList = resultList[start:end]
+		} else {
+			hasNextPage = false
+		}
+	} else {
+		total = int(T.NetworkCom.Count(countSql))
+		if total > req.PageSize {
+			hasNextPage = true
+		} else {
+			hasNextPage = false
+		}
+	}
+	moreInfo(req, plist, resultList) //  补充信息
+
+	return
+}
+
+// @Author jianghan
+// @Description 销售机会线索状态
+// @Date 2024/4/18
+func preSalesStatus(posid int64) (m1 map[string]interface{}) {
+	m1 = make(map[string]interface{})
+	info := T.CrmMysql.SelectBySql(sql_2, posid)
+	if info != nil && len(*info) > 0 {
+		for _, m := range *info {
+			m1[common.ObjToString(m["relate_id"])] = m
+		}
+	}
+	return m1
+}
+
+// 中间人 直接查询可介绍项目
+func getIyProList(iy string, positionId int64) (array []string) {
+	wh, args := common.WhArgs(strings.Split(iy, ","))
+	args = append(args, positionId)
+	intermediaryArr := T.CrmMysql.SelectBySql(`select b.relate_id as relate_id,b.relate_name as relate_name from crm.connection a inner join crm.connection_introduce b on ( a.id in (`+wh+`) and  a.position_id=?  and a.id=b.connection_id and b.itype=2)`, args...)
+	for _, m := range *intermediaryArr {
+		pid := gconv.String(m["relate_id"])
+		array = append(array, pid)
+	}
+	return
+}
+
+func getQuerySql(req *types.ProjectListReq, isPage bool, buyerArr, plist []string) (countSql, findSql string) {
+	querys := []string{}
+	// 左侧选中的业主id
+	if len(buyerArr) > 0 || len(plist) > 0 {
+		if len(buyerArr) > 0 && len(plist) > 0 {
+			var arr []string
+			for _, s := range buyerArr {
+				arr = append(arr, fmt.Sprintf("'%s'", s))
+			}
+			var arr1 []string
+			for _, s := range plist {
+				arr1 = append(arr1, fmt.Sprintf("'%s'", s))
+			}
+			querys = append(querys, fmt.Sprintf(" (a.buyer_id in (%s) or a.project_id in (%s)) ", strings.Join(arr, ","), strings.Join(arr1, ",")))
+		} else if len(buyerArr) > 0 {
+			var arr []string
+			for _, s := range buyerArr {
+				arr = append(arr, fmt.Sprintf("'%s'", s))
+			}
+			querys = append(querys, fmt.Sprintf(" a.buyer_id in (%s) ", strings.Join(arr, ",")))
+		} else if len(plist) > 0 {
+			var arr1 []string
+			for _, s := range plist {
+				arr1 = append(arr1, fmt.Sprintf("'%s'", s))
+			}
+			querys = append(querys, fmt.Sprintf(" a.project_id in (%s) ", strings.Join(arr1, ",")))
+		}
+	}
+	//	商机类型
+	if req.BusinessType != "" && req.BusinessType != "全部" {
+		querys = append(querys, fmt.Sprintf(" a.business_type in ('%s') ", strings.Join(strings.Split(req.BusinessType, ","), "', '")))
+	}
+	if req.ProjectName != "" {
+		querys = append(querys, " a.project_name like '%"+req.ProjectName+"%'")
+	}
+	if req.StartTime > 0 && req.EntTime > 0 {
+		st := req.StartTime + 90*24*60*60
+		et := req.EntTime + 90*24*60*60
+		querys = append(querys, fmt.Sprintf("  a.endtime>=%d and a.endtime<=%d", st, et))
+	} else if req.StartTime > 0 && req.EntTime == 0 {
+		st := req.StartTime + 90*24*60*60
+		querys = append(querys, fmt.Sprintf(" a.endtime>=%d", st))
+	} else if req.StartTime == 0 && req.EntTime > 0 {
+		et := req.EntTime + 90*24*60*60
+		querys = append(querys, fmt.Sprintf(" a.endtime<=%d", et))
+	}
+	var regionArr = []string{}
+	if req.Area != "" || req.City != "" || req.District != "" {
+		//城市
+		if req.City != "" {
+			regionArr = append(regionArr, fmt.Sprintf(" a.city in ('%s') ", req.City))
+		}
+		//区域
+		if req.Area != "" {
+			regionArr = append(regionArr, fmt.Sprintf(" a.area in ('%s') ", req.Area))
+		}
+		//区域
+		district := []string{}
+		if req.District != "" {
+			for _, v := range strings.Split(req.District, ",") {
+				//cityName := strings.Split(v, "_")[0]
+				districtName := strings.Split(v, "_")[1]
+				district = append(district, districtName)
+			}
+		}
+		if len(district) > 0 {
+			regionArr = append(regionArr, fmt.Sprintf(" a.district in ('%s') ", strings.Join(district, ",")))
+		}
+		if len(regionArr) > 0 {
+			querys = append(querys, fmt.Sprintf("(%s)", strings.Join(regionArr, "or")))
+		}
+	}
+	if req.SubClass != "" {
+		arr := []string{}
+		for _, v := range strings.Split(req.SubClass, ",") {
+			arr = append(arr, fmt.Sprintf("has(a.subclass, '%s')", v))
+		}
+		querys = append(querys, arr...)
+	}
+	// 项目金额 0: 全部,1: 50万以下,2: 50-100万, 3: 100-200万, 4: 200-500万, 5:500万以上
+	if req.Amount != "" {
+		if !strings.Contains(req.Amount, "0") {
+			var tempArr []string
+			for _, s := range strings.Split(req.Amount, ",") {
+				if s == "1" {
+					tempArr = append(tempArr, fmt.Sprintf("(a.project_money<=%d)", 500000))
+				} else if s == "2" {
+					tempArr = append(tempArr, fmt.Sprintf("((a.project_money>=%d and a.project_money<=%d))", 500000, 1000000))
+				} else if s == "3" {
+					tempArr = append(tempArr, fmt.Sprintf("((a.project_money>=%d and a.project_money<=%d))", 1000000, 2000000))
+				} else if s == "4" {
+					tempArr = append(tempArr, fmt.Sprintf("((a.project_money>=%d and a.project_money<=%d))", 2000000, 5000000))
+				} else if s == "5" {
+					tempArr = append(tempArr, fmt.Sprintf("((a.project_money>=%d))", 5000000))
+				}
+			}
+			if len(tempArr) > 0 {
+				querys = append(querys, fmt.Sprintf("(%s)", strings.Join(tempArr, "or")))
+			}
+		}
+	}
+	//物业业态
+	if req.PropertyForm != "" {
+		arr := []string{}
+		for _, v := range strings.Split(req.PropertyForm, ",") {
+			arr = append(arr, fmt.Sprintf("has(a.property_form, '%s')", v))
+		}
+		querys = append(querys, arr...)
+	}
+	//过滤掉已中标的招标项目数据
+	querys = append(querys, fmt.Sprintf(" a.project_bidstatus in (%s) ", "2,3,4"))
+	findSql = "select a.project_id, a.project_name, a.business_type, a.buyer, a.buyer_id, a.area, a.city, a.district, a.zbtime, a.endtime, a.project_money, a.info_id, a.information_id, a.info_ids "
+	if len(querys) > 0 {
+		countSql = fmt.Sprintf("select count(1) from %s a where %s ", "information.transaction_info", strings.Join(querys, " and "))
+		findSql = fmt.Sprintf("%s from %s  a  where  %s order by zbtime desc", findSql, "information.transaction_info", strings.Join(querys, " and "))
+	} else {
+		countSql = fmt.Sprintf("select count(1) from %s a ", "information.transaction_info")
+		findSql = fmt.Sprintf("%s from %s a order by zbtime", findSql, "information.transaction_info")
+	}
+	if isPage {
+		findSql += fmt.Sprintf(" limit %d,%d", (req.PageNum-1)*req.PageSize, req.PageSize)
+	}
+	return
+}
+
+// @Author jianghan
+// @Description 过滤数据/补充销售机会状态信息,返回分页结果数据
+// @Date 2024/4/18
+func filterData(req *types.ProjectListReq, resultList []*ProjectEntry, preSales, mmp map[string]interface{}, isSqlPage bool) []*ProjectEntry {
+	var newList []*ProjectEntry
+	f := make(map[string]int, 1)
+	if req.SaleStatus == "1" {
+		f["is_handle"] = 0
+	} else if req.SaleStatus == "2" {
+		f["is_ignore"] = 1
+	} else if req.SaleStatus == "3" {
+		f["is_create"] = 1
+	}
+	for _, m := range resultList {
+		// 处理/忽略/销售机会
+		if m1, ok := preSales[m.ProjectId].(map[string]interface{}); ok {
+			m.IsIgnore = common.IntAll(m1["is_handle"])
+			m.IsIgnore = common.IntAll(m1["is_ignore"])
+			m.IsCreate = common.IntAll(m1["is_create"])
+		}
+		// 监控
+		for _, s := range strings.Split(m.InfoId, ",") {
+			if mmp[s] != nil {
+				m.IsFocus = 1
+				m.FocusId = common.ObjToString(mmp[s])
+				break
+			}
+		}
+		if !isSqlPage {
+			for k, v := range f {
+				if k == "is_handle" && m.IsHandle == v {
+					newList = append(newList, m)
+				} else if k == "is_ignore" && m.IsIgnore == v {
+					newList = append(newList, m)
+				} else if k == "is_create" && m.IsCreate == v {
+					newList = append(newList, m)
+				}
+			}
+		}
+	}
+	if !isSqlPage {
+		if newList == nil {
+			resultList = make([]*ProjectEntry, 0)
+		} else {
+			resultList = newList
+		}
+	}
+	return resultList
+}
+
+// @Author jianghan
+// @Description 补充人脉 等信息
+// @Date 2024/4/17
+func moreInfo(req *types.ProjectListReq, plist []string, list []*ProjectEntry) (result []*ProjectEntry) {
+	var buyerIds []string
+	for _, m := range list {
+		if m.BuyerId != "" {
+			buyerIds = append(buyerIds, m.BuyerId)
+		}
+	}
+	countMap := make(map[string]int)
+	connMap := make(map[string]int)
+	if buyerIds != nil && len(buyerIds) > 0 {
+		str1, arr1 := common.WhArgs(buyerIds)
+		info1, err := T.ClickhouseConn.Query(context.TODO(), fmt.Sprintf(sql_1, str1), arr1...)
+		if err == nil {
+			for info1.Next() {
+				var buyerId string
+				var count uint64
+				_ = info1.Scan(&buyerId, &count)
+				countMap[buyerId] = int(count)
+			}
+		}
+		info2 := T.CrmMysql.SelectBySql(fmt.Sprintf(sql_3, str1), arr1...)
+		if info2 != nil && len(*info2) > 0 {
+			for _, m := range *info2 {
+				if req.PositionId == common.Int64All(m["position_id"]) {
+					connMap[common.ObjToString(m["company_id"])] = 1 // 我的人脉
+				} else {
+					connMap[common.ObjToString(m["company_id"])] = 2
+				}
+			}
+		}
+	}
+	logx.Info(connMap)
+	for _, m := range list {
+		// 中间人的项目 默认 我的人脉
+		if len(plist) > 0 {
+			for _, pid := range plist {
+				if m.ProjectId == pid {
+					m.MyConn = true
+					m.ConnType = 1
+					break
+				}
+			}
+		}
+		// 补充跳转链接
+		if m.BusinessType == "采购意向" || m.BusinessType == "招标项目" {
+			m.Href = fmt.Sprintf("/article/content/%s.html", encrypt.CommonEncodeArticle("content", m.ProjectId))
+		}
+		m.ProjectId = util.EncodeId(m.ProjectId)
+		// 人脉、人脉所在单位项目 conn_type: 1 人脉可转介绍项目; conn_type: 2 人脉所在单位项目
+		if !m.MyConn {
+			if connMap[m.BuyerId] == 1 {
+				m.MyConn = true // 我的人脉
+				m.ConnType = 1
+			} else {
+				m.MyConn = false
+			}
+		}
+		if m.ConnType == 0 {
+			if connMap[m.BuyerId] != 0 {
+				m.ConnType = 1
+			} else {
+				m.ConnType = 2
+			}
+		}
+		// 转介绍成功率高标签
+		if countMap[m.BuyerId] > 2 {
+			m.HighSuccess = true
+		} else {
+			m.HighSuccess = false
+		}
+	}
+	// 人脉路径
+	var bArr []string
+	for _, m := range list {
+		// 有我的人脉标签时不需要查询人脉路径信息
+		if m.MyConn == false && m.BuyerId != "" {
+			bArr = append(bArr, fmt.Sprintf("'%s'", m.BuyerId))
+		}
+	}
+	companyList := Findfirstparty(bArr, nil)
+	if companyList != nil && len(companyList) > 0 {
+		for _, m := range list {
+			if m.MyConn == false {
+				for _, m1 := range companyList {
+					if m.BuyerId == common.ObjToString(m1["a_id"]) {
+						m.BId = common.ObjToString(m1["b_id"])
+						m.BName = common.ObjToString(m1["b_name"])
+						m.RelationShip = common.ObjToString(m1["relationship"])
+						m.SourceType = common.ObjToString(m1["sourceType"])
+						m.Person = common.ObjToString(m1["person"])
+						m.Num = common.IntAll(m1["count"])
+						break
+					}
+				}
+			}
+		}
+	} else {
+		companyList = Findwinner(bArr)
+		if companyList != nil && len(companyList) > 0 {
+			for _, m := range list {
+				if m.MyConn == false {
+					for _, m1 := range companyList {
+						if m.BuyerId == common.ObjToString(m1["a_id"]) {
+							m.BId = common.ObjToString(m1["b_id"])
+							m.BName = common.ObjToString(m1["b_name"])
+							m.RelationShip = common.ObjToString(m1["relationship"])
+							m.SourceType = common.ObjToString(m1["sourceType"])
+							m.Person = common.ObjToString(m1["person"])
+							m.Num = common.IntAll(m1["count"])
+							break
+						}
+					}
+				}
+			}
+		}
+	}
+	return list
+}
+
+func MonitorStatus(uid string) map[string]interface{} {
+	m1 := make(map[string]interface{})
+	info := T.BaseMysql.SelectBySql(sql_4, uid)
+	for _, m := range *info {
+		m1[common.ObjToString(m["s_id"])] = util.EncodeId(strconv.Itoa(common.IntAll(m["id"])))
+	}
+	return m1
+}

+ 15 - 0
api/internal/svc/servicecontext.go

@@ -0,0 +1,15 @@
+package svc
+
+import (
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/config"
+)
+
+type ServiceContext struct {
+	Config config.Config
+}
+
+func NewServiceContext(c config.Config) *ServiceContext {
+	return &ServiceContext{
+		Config: c,
+	}
+}

+ 164 - 0
api/internal/types/types.go

@@ -0,0 +1,164 @@
+// Code generated by goctl. DO NOT EDIT.
+package types
+
+type Reply struct {
+	Error_code int64       `json:"error_code"`
+	Error_msg  string      `json:"error_msg"`
+	Data       interface{} `json:"data"`
+}
+
+type OwnerListReq struct {
+	PartyA           string `json:"partyA,optional"`           //甲方
+	Supplier         string `json:"supplier,optional"`         //供应商
+	Heterotophy      string `json:"heterotophy,optional"`      //同甲异业
+	Intermediary     string `json:"intermediary,optional"`     //中间人
+	Agency           string `json:"agency,optional"`           //代理机构
+	SearchEntName    string `json:"searchEntName,optional"`    //搜索企业名称
+	SourceType       string `json:"sourceType,optional"`       //搜索类型 1 只看转介绍成功率高2只看已监控的
+	ProcessingStatus string `json:"processingStatus,optional"` //处理状态1未处理2已忽略3已建客户
+	Area             string `json:"area,optional"`             //项目地区
+	PositionId       int64  `header:"positionId,optional"`
+	PageSize         int64  `json:"pageSize,optional"`
+	PageIndex        int64  `json:"pageIndex,optional"`
+	ProjectType      string `json:"projectType,optional"`
+	EntAccountId     int64  `header:"entAccountId"`
+}
+
+type ProjectListReq struct {
+	UserId       string `header:"userId,optional"`
+	PositionId   int64  `header:"positionId,optional"`
+	EntId        string `header:"entId,optional"`
+	EntUserId    string `header:"entUserId,optional"`
+	DeptId       string `header:"deptId,optional"`     //部门id
+	PartyA       string `json:"partyA,optional"`       //甲方
+	Supplier     string `json:"supplier,optional"`     //供应商
+	Heterotophy  string `json:"heterotophy,optional"`  //同甲异业
+	Intermediary string `json:"intermediary,optional"` //中间人
+	Agency       string `json:"agency,optional"`       //代理机构
+	PageNum      int    `json:"pageNum"`
+	PageSize     int    `json:"pageSize"`
+	BusinessType string `json:"businessType"`
+	SaleStatus   string `json:"saleStatus"`
+	ProjectName  string `json:"projectName,optional"`
+	StartTime    int64  `json:"startTime,optional"`
+	EntTime      int64  `json:"entTime,optional"`
+	Area         string `json:"area,optional"`
+	City         string `json:"city,optional"`
+	District     string `json:"district,optional"`
+	PropertyForm string `json:"propertyForm,optional"`
+	SubClass     string `json:"subClass,optional"`
+	Amount       string `json:"amount,optional"`
+}
+
+type PnameAssReq struct {
+	ProjectName string `json:"projectName"`
+}
+
+type CoopHistoryReq struct {
+	EntAccountId int64  `header:"entAccountId,optional"` //企业账户id
+	PositionId   int64  `header:"positionId,optional"`
+	EntId        string `header:"entId,optional"`
+	EntUserId    string `header:"entUserId,optional"`
+	DeptId       string `header:"deptId,optional"` //部门id
+	Pid          string `json:"projectId"`
+	ChannelType  string `json:"channelType"`
+}
+
+type AddOrUpdateReq struct {
+	PositionId              int64  `header:"positionId"`
+	EntUserId               int64  `header:"entUserId,optional"`
+	EntId                   int64  `header:"entId,optional"`
+	EntDeptId               int64  `header:"entDeptId,optional"`
+	Qyxy_id                 string `json:"qyxy_id,optional"`
+	Company_id              string `json:"company_id,optional"`
+	Company_name            string `json:"company_name,optional"`
+	Contact_person          string `json:"contact_person"`
+	Contact_phone           string `json:"contact_phone"`
+	Introduce_owner_id      string `json:"introduce_owner_id,optional"`
+	Introduce_owner_qyxy_id string `json:"introduce_owner_qyxy_id,optional"`
+	Introduce_owner_name    string `json:"introduce_owner_name,optional"`
+	Introduce_project_id    string `json:"introduce_project_id,optional"`
+	Introduce_project_name  string `json:"introduce_project_name,optional"`
+	Id                      int64  `json:"id,optional"`
+	Type                    string `json:"type"`
+}
+
+type AssociateReq struct {
+	EntAccountId int64  `header:"entAccountId"`
+	EntName      string `header:"entName"`
+	Name         string `json:"name"`
+	Type         string `json:"type"`
+}
+
+type AllprojectReq struct {
+	EntAccountId int64  `header:"entAccountId"`
+	PositionId   int64  `header:"positionId"`
+	Name         string `json:"name,optional"`
+	Type         string `json:"type,optional"`
+	Id           string `json:"id,optional"`
+}
+
+type NetWorkListReq struct {
+	UserId             string `header:"userId"`
+	EntAccountId       int64  `header:"entAccountId"`
+	PositionId         int64  `header:"positionId"`
+	Type               string `json:"type,optional"`
+	Name               string `json:"name,optional"`
+	Monitor            int64  `json:"monitor,optional"`
+	Starttime          string `json:"starttime,optional"`
+	Endtime            string `json:"endtime,optional"`
+	Order_amount       int64  `json:"order_amount,optional"`
+	Current_page       int64  `json:"current_page,optional"`
+	Page_size          int64  `json:"page_size,optional"`
+	Project_matchme    int64  `json:"project_matchme,optional"`
+	Buyercount_start   int64  `json:"buyercount_start,optional"`
+	Buyercount_end     int64  `json:"buyercount_end,optional"`
+	Monitorcount_start int64  `json:"monitorcount_start,optional"`
+	Monitorcount_end   int64  `json:"monitorcount_end,optional"`
+}
+
+type IgnoreReq struct {
+	PositionId int64  `header:"positionId"`
+	EntUserId  int64  `header:"entUserId,optional"`
+	EntId      int64  `header:"entId,optional"`
+	EntDeptId  int64  `header:"entDeptId,optional"`
+	RelateId   string `json:"relateId,optional"`
+	Source     string `json:"source,optional"`
+	Action     string `json:"action,optional"`
+}
+
+type InfoDetailReq struct {
+	InfoId string `json:"infoId"`
+}
+
+type PrjectHistoryReq struct {
+	Source   string `json:"source"`
+	BuyerId  string `json:"buyerId"`
+	WinnerId string `json:"winnerId"`
+}
+
+type ChannelListReq struct {
+	PartyA       string `json:"partyA,optional"`       //甲方
+	Supplier     string `json:"supplier,optional"`     //供应商
+	Heterotophy  string `json:"heterotophy,optional"`  //同甲异业
+	Intermediary string `json:"intermediary,optional"` //中间人
+	Agency       string `json:"agency,optional"`       //代理机构
+	PositionId   int64  `header:"positionId,optional"`
+	EntAccountId int64  `header:"entAccountId,optional"` //企业账户id
+	Type         string `json:"type,optional"`
+}
+
+type RouteOwnerListReq struct {
+	BuyerId    string `json:"buyerId,optional"`
+	BuyerName  string `json:"buyerName,optional"`
+	PositionId int64  `header:"positionId,optional"`
+}
+
+type CooperateOwnerListReq struct {
+	BuyerId       string `json:"buyerId,optional"`
+	BuyerName     string `json:"buyerName,optional"`
+	WinnerId      string `json:"winnerId,optional"`
+	WinnerName    string `json:"winnerName,optional"`
+	CooperateType string `json:"cooperateType,optional"`
+	PositionId    int64  `header:"positionId,optional"`
+}

+ 49 - 0
api/logs/access.log

@@ -0,0 +1,49 @@
+{"@timestamp":"2024-04-26T10:45:26.878+08:00","caller":"common/initconfig.go:71","content":"info--日志记录","level":"info"}
+{"@timestamp":"2024-04-26T10:45:26.878+08:00","caller":"common/initconfig.go:71","content":"error--日志记录","level":"info"}
+{"@timestamp":"2024-04-26T10:45:27.025+08:00","caller":"common/initconfig.go:126","content":"--初始化 mongodb--","level":"info"}
+{"@timestamp":"2024-04-26T10:45:27.026+08:00","caller":"common/initconfig.go:135","content":"--初始化 mongodb Bidding --","level":"info"}
+{"@timestamp":"2024-04-26T10:45:27.026+08:00","caller":"common/initconfig.go:146","content":"--初始化 mongodb ent --","level":"info"}
+{"@timestamp":"2024-04-26T10:45:27.027+08:00","caller":"common/initconfig.go:157","content":"--初始化 mongodb ent --","level":"info"}
+{"@timestamp":"2024-04-26T10:46:04.080+08:00","caller":"common/initconfig.go:71","content":"info--日志记录","level":"info"}
+{"@timestamp":"2024-04-26T10:46:04.080+08:00","caller":"common/initconfig.go:71","content":"error--日志记录","level":"info"}
+{"@timestamp":"2024-04-26T10:46:04.235+08:00","caller":"common/initconfig.go:126","content":"--初始化 mongodb--","level":"info"}
+{"@timestamp":"2024-04-26T10:46:04.236+08:00","caller":"common/initconfig.go:135","content":"--初始化 mongodb Bidding --","level":"info"}
+{"@timestamp":"2024-04-26T10:46:04.236+08:00","caller":"common/initconfig.go:146","content":"--初始化 mongodb ent --","level":"info"}
+{"@timestamp":"2024-04-26T10:46:04.236+08:00","caller":"common/initconfig.go:157","content":"--初始化 mongodb ent --","level":"info"}
+{"@timestamp":"2024-04-26T10:47:13.152+08:00","caller":"common/initconfig.go:71","content":"info--日志记录","level":"info"}
+{"@timestamp":"2024-04-26T10:47:13.152+08:00","caller":"common/initconfig.go:71","content":"error--日志记录","level":"info"}
+{"@timestamp":"2024-04-26T10:47:13.329+08:00","caller":"common/initconfig.go:126","content":"--初始化 mongodb--","level":"info"}
+{"@timestamp":"2024-04-26T10:47:13.330+08:00","caller":"common/initconfig.go:135","content":"--初始化 mongodb Bidding --","level":"info"}
+{"@timestamp":"2024-04-26T10:47:13.330+08:00","caller":"common/initconfig.go:146","content":"--初始化 mongodb ent --","level":"info"}
+{"@timestamp":"2024-04-26T10:47:13.330+08:00","caller":"common/initconfig.go:157","content":"--初始化 mongodb ent --","level":"info"}
+{"@timestamp":"2024-04-26T10:48:40.623+08:00","caller":"common/initconfig.go:72","content":"info--日志记录","level":"info"}
+{"@timestamp":"2024-04-26T10:48:40.623+08:00","caller":"common/initconfig.go:72","content":"error--日志记录","level":"info"}
+{"@timestamp":"2024-04-26T10:48:40.784+08:00","caller":"common/initconfig.go:127","content":"--初始化 mongodb--","level":"info"}
+{"@timestamp":"2024-04-26T10:48:40.785+08:00","caller":"common/initconfig.go:136","content":"--初始化 mongodb Bidding --","level":"info"}
+{"@timestamp":"2024-04-26T10:48:40.785+08:00","caller":"common/initconfig.go:147","content":"--初始化 mongodb ent --","level":"info"}
+{"@timestamp":"2024-04-26T10:48:40.786+08:00","caller":"common/initconfig.go:158","content":"--初始化 mongodb ent --","level":"info"}
+{"@timestamp":"2024-04-26T10:48:59.122+08:00","caller":"common/initconfig.go:72","content":"info--日志记录","level":"info"}
+{"@timestamp":"2024-04-26T10:48:59.122+08:00","caller":"common/initconfig.go:72","content":"error--日志记录","level":"info"}
+{"@timestamp":"2024-04-26T10:48:59.273+08:00","caller":"common/initconfig.go:127","content":"--初始化 mongodb--","level":"info"}
+{"@timestamp":"2024-04-26T10:48:59.273+08:00","caller":"common/initconfig.go:136","content":"--初始化 mongodb Bidding --","level":"info"}
+{"@timestamp":"2024-04-26T10:48:59.274+08:00","caller":"common/initconfig.go:147","content":"--初始化 mongodb ent --","level":"info"}
+{"@timestamp":"2024-04-26T10:48:59.274+08:00","caller":"common/initconfig.go:158","content":"--初始化 mongodb ent --","level":"info"}
+{"@timestamp":"2024-04-26T10:49:02.522+08:00","caller":"handler/loghandler.go:155","content":"[HTTP] 200 - POST /crmApplication/owner/list - 127.0.0.1:56620 - PostmanRuntime/7.37.3","duration":"0.0ms","level":"info","span":"f47e26fe81c94a8f","trace":"2923e7250adacc03ba49a23fe6880547"}
+{"@timestamp":"2024-04-26T10:49:20.725+08:00","caller":"service/owner.go:733","content":"\u003cnil\u003e","level":"info"}
+{"@timestamp":"2024-04-26T10:49:20.821+08:00","caller":"service/owner.go:207","content":"供应商0","level":"info"}
+{"@timestamp":"2024-04-26T10:49:20.822+08:00","caller":"handler/loghandler.go:155","content":"[HTTP] 200 - POST /crmApplication/owner/list - 127.0.0.1:56630 - PostmanRuntime/7.37.3","duration":"174.6ms","level":"info","span":"8d0a19d4698b7df2","trace":"8d35c4de2dcaa1a7b8fa623f2f5fe39c"}
+{"@timestamp":"2024-04-26T11:02:15.082+08:00","caller":"service/owner.go:733","content":"\u003cnil\u003e","level":"info"}
+{"@timestamp":"2024-04-26T11:02:15.189+08:00","caller":"service/owner.go:207","content":"供应商0","level":"info"}
+{"@timestamp":"2024-04-26T11:02:15.190+08:00","caller":"handler/loghandler.go:155","content":"[HTTP] 200 - POST /crmApplication/owner/list - 127.0.0.1:57143 - PostmanRuntime/7.37.3","duration":"148.9ms","level":"info","span":"d6a68050bb1d2679","trace":"6aec25713645bf2ba0ae9e8949317397"}
+{"@timestamp":"2024-04-26T11:22:54.148+08:00","caller":"service/owner.go:733","content":"\u003cnil\u003e","level":"info"}
+{"@timestamp":"2024-04-26T11:22:54.592+08:00","caller":"service/owner.go:207","content":"供应商0","level":"info"}
+{"@timestamp":"2024-04-26T11:22:54.592+08:00","caller":"handler/loghandler.go:155","content":"[HTTP] 200 - POST /crmApplication/owner/list - 127.0.0.1:57851 - PostmanRuntime/7.37.3","duration":"528.6ms","level":"info","span":"21a41b577f5f1e66","trace":"2d51f999195111e455cadeefa023a38a"}
+{"@timestamp":"2024-04-26T11:37:12.471+08:00","caller":"common/initconfig.go:72","content":"info--日志记录","level":"info"}
+{"@timestamp":"2024-04-26T11:37:12.471+08:00","caller":"common/initconfig.go:72","content":"error--日志记录","level":"info"}
+{"@timestamp":"2024-04-26T11:37:12.648+08:00","caller":"common/initconfig.go:127","content":"--初始化 mongodb--","level":"info"}
+{"@timestamp":"2024-04-26T11:37:12.649+08:00","caller":"common/initconfig.go:136","content":"--初始化 mongodb Bidding --","level":"info"}
+{"@timestamp":"2024-04-26T11:37:12.649+08:00","caller":"common/initconfig.go:147","content":"--初始化 mongodb ent --","level":"info"}
+{"@timestamp":"2024-04-26T11:37:12.650+08:00","caller":"common/initconfig.go:158","content":"--初始化 mongodb ent --","level":"info"}
+{"@timestamp":"2024-04-26T11:37:17.668+08:00","caller":"service/owner.go:735","content":"\u003cnil\u003e","level":"info"}
+{"@timestamp":"2024-04-26T11:37:17.757+08:00","caller":"service/owner.go:209","content":"供应商0","level":"info"}
+{"@timestamp":"2024-04-26T11:37:17.758+08:00","caller":"handler/loghandler.go:155","content":"[HTTP] 200 - POST /crmApplication/owner/list - 127.0.0.1:58264 - PostmanRuntime/7.37.3","duration":"658.0ms","level":"info","span":"46446d4bfd53fbcf","trace":"a8bf87ecb043819d60c69d2bf88bf547"}

+ 0 - 0
api/logs/error.log


+ 0 - 0
api/logs/severe.log


+ 2 - 0
api/logs/slow.log

@@ -0,0 +1,2 @@
+{"@timestamp":"2024-04-26T11:22:54.592+08:00","caller":"handler/loghandler.go:132","content":"[HTTP] 200 - POST /crmApplication/owner/list - 127.0.0.1:57851 - PostmanRuntime/7.37.3 - slowcall(528.6ms)","duration":"528.6ms","level":"slow","span":"21a41b577f5f1e66","trace":"2d51f999195111e455cadeefa023a38a"}
+{"@timestamp":"2024-04-26T11:37:17.758+08:00","caller":"handler/loghandler.go:132","content":"[HTTP] 200 - POST /crmApplication/owner/list - 127.0.0.1:58264 - PostmanRuntime/7.37.3 - slowcall(658.0ms)","duration":"658.0ms","level":"slow","span":"46446d4bfd53fbcf","trace":"a8bf87ecb043819d60c69d2bf88bf547"}

+ 0 - 0
api/logs/stat.log


+ 209 - 0
api/networkmanage.api

@@ -0,0 +1,209 @@
+syntax = "v1"
+
+type (
+	Reply {
+		Error_code int64       `json:"error_code"`
+		Error_msg  string      `json:"error_msg"`
+		Data       interface{} `json:"data"`
+	}
+	OwnerListReq {
+		PartyA           string `json:"partyA,optional"`           //甲方
+		Supplier         string `json:"supplier,optional"`         //供应商
+		Heterotophy      string `json:"heterotophy,optional"`      //同甲异业
+		Intermediary     string `json:"intermediary,optional"`     //中间人
+		Agency           string `json:"agency,optional"`           //代理机构
+		SearchEntName    string `json:"searchEntName,optional"`    //搜索企业名称
+		SourceType       string `json:"sourceType,optional"`       //搜索类型 1 只看转介绍成功率高2只看已监控的
+		ProcessingStatus string `json:"processingStatus,optional"` //处理状态1未处理2已忽略3已建客户
+		Area             string `json:"area,optional"`             //项目地区
+		PositionId       int64  `header:"positionId,optional"`
+		PageSize         int64  `json:"pageSize,optional"`
+		PageIndex        int64  `json:"pageIndex,optional"`
+		ProjectType      string `json:"projectType,optional"`
+		EntAccountId     int64  `header:"entAccountId"`
+	}
+	ProjectListReq {
+		UserId       string `header:"userId,optional"`
+		PositionId   int64  `header:"positionId,optional"`
+		EntId        string `header:"entId,optional"`
+		EntUserId    string `header:"entUserId,optional"`
+		DeptId       string `header:"deptId,optional"`     //部门id
+		PartyA       string `json:"partyA,optional"`       //甲方
+		Supplier     string `json:"supplier,optional"`     //供应商
+		Heterotophy  string `json:"heterotophy,optional"`  //同甲异业
+		Intermediary string `json:"intermediary,optional"` //中间人
+		Agency       string `json:"agency,optional"`       //代理机构
+		PageNum      int    `json:"pageNum"`
+		PageSize     int    `json:"pageSize"`
+		BusinessType string `json:"businessType"`
+		SaleStatus   string `json:"saleStatus"`
+		ProjectName  string `json:"projectName,optional"`
+		StartTime    int64  `json:"startTime,optional"`
+		EntTime      int64  `json:"entTime,optional"`
+		Area         string `json:"area,optional"`
+		City         string `json:"city,optional"`
+		District     string `json:"district,optional"`
+		PropertyForm string `json:"propertyForm,optional"`
+		SubClass     string `json:"subClass,optional"`
+		Amount       string `json:"amount,optional"`
+	}
+	PnameAssReq {
+		ProjectName string `json:"projectName"`
+	}
+	CoopHistoryReq {
+		EntAccountId int64  `header:"entAccountId,optional"` //企业账户id
+		PositionId   int64  `header:"positionId,optional"`
+		EntId        string `header:"entId,optional"`
+		EntUserId    string `header:"entUserId,optional"`
+		DeptId       string `header:"deptId,optional"` //部门id
+		Pid          string `json:"projectId"`
+		ChannelType  string `json:"channelType"`
+	}
+	AddOrUpdateReq {
+		PositionId              int64  `header:"positionId"`
+		EntUserId               int64  `header:"entUserId,optional"`
+		EntId                   int64  `header:"entId,optional"`
+		EntDeptId               int64  `header:"entDeptId,optional"`
+		Qyxy_id                 string `json:"qyxy_id,optional"`
+		Company_id              string `json:"company_id,optional"`
+		Company_name            string `json:"company_name,optional"`
+		Contact_person          string `json:"contact_person"`
+		Contact_phone           string `json:"contact_phone"`
+		Introduce_owner_id      string `json:"introduce_owner_id,optional"`
+		Introduce_owner_qyxy_id string `json:"introduce_owner_qyxy_id,optional"`
+		Introduce_owner_name    string `json:"introduce_owner_name,optional"`
+		Introduce_project_id    string `json:"introduce_project_id,optional"`
+		Introduce_project_name  string `json:"introduce_project_name,optional"`
+		Id                      int64  `json:"id,optional"`
+		Type                    string `json:"type"`
+	}
+	AssociateReq {
+		EntAccountId int64  `header:"entAccountId"`
+		EntName      string `header:"entName"`
+		Name         string `json:"name"`
+		Type         string `json:"type"`
+	}
+	AllprojectReq {
+		EntAccountId int64  `header:"entAccountId"`
+		PositionId   int64  `header:"positionId"`
+		Name         string `json:"name,optional"`
+		Type         string `json:"type,optional"`
+		Id           string `json:"id,optional"`
+	}
+	NetWorkListReq {
+		UserId             string `header:"userId"`
+		EntAccountId       int64  `header:"entAccountId"`
+		PositionId         int64  `header:"positionId"`
+		Type               string `json:"type,optional"`
+		Name               string `json:"name,optional"`
+		Monitor            int64  `json:"monitor,optional"`
+		Starttime          string `json:"starttime,optional"`
+		Endtime            string `json:"endtime,optional"`
+		Order_amount       int64  `json:"order_amount,optional"`
+		Current_page       int64  `json:"current_page,optional"`
+		Page_size          int64  `json:"page_size,optional"`
+		Project_matchme    int64  `json:"project_matchme,optional"`
+		Buyercount_start   int64  `json:"buyercount_start,optional"`
+		Buyercount_end     int64  `json:"buyercount_end,optional"`
+		Monitorcount_start int64  `json:"monitorcount_start,optional"`
+		Monitorcount_end   int64  `json:"monitorcount_end,optional"`
+	}
+	IgnoreReq {
+		PositionId int64  `header:"positionId"`
+		EntUserId  int64  `header:"entUserId,optional"`
+		EntId      int64  `header:"entId,optional"`
+		EntDeptId  int64  `header:"entDeptId,optional"`
+		RelateId   string `json:"relateId,optional"`
+		Source     string `json:"source,optional"`
+		Action     string `json:"action,optional"`
+	}
+	InfoDetailReq {
+		InfoId string `json:"infoId"`
+	}
+	PrjectHistoryReq {
+		Source   string `json:"source"`
+		BuyerId  string `json:"buyerId"`
+		WinnerId string `json:"winnerId"`
+	}
+	ChannelListReq {
+		PartyA       string `json:"partyA,optional"`       //甲方
+		Supplier     string `json:"supplier,optional"`     //供应商
+		Heterotophy  string `json:"heterotophy,optional"`  //同甲异业
+		Intermediary string `json:"intermediary,optional"` //中间人
+		Agency       string `json:"agency,optional"`       //代理机构
+		PositionId   int64  `header:"positionId,optional"`
+		EntAccountId int64  `header:"entAccountId,optional"` //企业账户id
+		Type         string `json:"type,optional"`
+	}
+	RouteOwnerListReq {
+		BuyerId    string `json:"buyerId,optional"`
+		BuyerName  string `json:"buyerName,optional"`
+		PositionId int64  `header:"positionId,optional"`
+	}
+	CooperateOwnerListReq {
+		BuyerId       string `json:"buyerId,optional"`
+		BuyerName     string `json:"buyerName,optional"`
+		WinnerId      string `json:"winnerId,optional"`
+		WinnerName    string `json:"winnerName,optional"`
+		CooperateType string `json:"cooperateType,optional"`
+		PositionId    int64  `header:"positionId,optional"`
+	}
+)
+
+service networkManage {
+	@doc "人脉可达潜客业主列表"
+	@handler ownerList
+	post /networkManage/owner/list (OwnerListReq) returns (Reply)
+	
+	@doc "人脉可达商机列表"
+	@handler projectList
+	post /networkManage/network/project/list (ProjectListReq) returns (Reply)
+	
+	@doc "项目公关渠道分析-项目名称联想"
+	@handler PrPnameAss
+	post /networkManage/pr/pname/ass (PnameAssReq) returns (Reply)
+	
+	@doc "项目公关渠道分析-与业主合作历史"
+	@handler CoopHistoryList
+	post /networkManage/pr/project/analyse (CoopHistoryReq) returns (Reply)
+	
+	@doc "人脉库-添加/修改人脉"
+	@handler addOrUpdate
+	post /networkManage/network/addOrUpdate (AddOrUpdateReq) returns (Reply)
+	
+	@doc "人脉库-业主名称联想"
+	@handler associate
+	post /networkManage/network/associate (AssociateReq) returns (Reply)
+	
+	@doc "人脉库-全部人脉项目"
+	@handler allProject
+	post /networkManage/network/allProject (AllprojectReq) returns (Reply)
+	
+	@doc "人脉库-列表"
+	@handler networkList
+	post /networkManage/network/networkList (NetWorkListReq) returns (Reply)
+	
+	@doc "忽略操作"
+	@handler ignoreAction
+	post /networkManage/ignore/action (IgnoreReq) returns (Reply)
+	
+	@doc "情报详情"
+	@handler infoDetail
+	post /networkManage/infomation/detail (InfoDetailReq) returns (Reply)
+	
+	@doc "人脉项目分析-业主合作历史"
+	@handler projectHistory
+	post /networkManage/pr/project/history (PrjectHistoryReq) returns (Reply)
+	
+	@doc "可介绍业主路径"
+	@handler ownerRoute
+	post /networkManage/owner/route (RouteOwnerListReq) returns (Reply)
+	
+	@doc "可介绍业主合作次数"
+	@handler ownerCooperate
+	post /networkManage/owner/cooperate (CooperateOwnerListReq) returns (Reply)
+	
+	@doc "候选渠道列表"
+	@handler candidateChannelList
+	post /networkManage/candidate/channel/list (ChannelListReq) returns (Reply)
+}

+ 41 - 0
api/networkmanage.go

@@ -0,0 +1,41 @@
+package main
+
+import (
+	"flag"
+	"fmt"
+	"os"
+	"os/signal"
+	"syscall"
+
+	mc "app.yhyue.com/moapp/jybase/common"
+	"bp.jydev.jianyu360.cn/BaseService/gateway/core/node"
+	. "bp.jydev.jianyu360.cn/CRM/application/api/common"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/handler"
+	"bp.jydev.jianyu360.cn/CRM/application/api/internal/svc"
+	"github.com/zeromicro/go-zero/rest"
+)
+
+func main() {
+	InitConf()
+	//注册代理服务
+	closeNotify, err := node.NewNode(C.Gateway.Etcd...).Register(C.Gateway.ServerCode, mc.InterfaceToStr(C.Port))
+	if err != nil {
+		panic(err)
+	}
+
+	flag.Parse()
+
+	server := rest.MustNewServer(C.RestConf)
+	defer server.Stop()
+
+	ctx := svc.NewServiceContext(C)
+	handler.RegisterHandlers(server, ctx)
+
+	fmt.Printf("Starting server at %s:%d...\n", C.Host, C.Port)
+	server.Start()
+
+	quit := make(chan os.Signal, 1)
+	signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
+	<-quit
+	closeNotify()
+}

+ 192 - 0
api/test/test.pb.go

@@ -0,0 +1,192 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: test.proto
+
+package test
+
+import (
+	context "context"
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	grpc "google.golang.org/grpc"
+	math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+type ReqData struct {
+	In                   string   `protobuf:"bytes,1,opt,name=In,proto3" json:"In,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ReqData) Reset()         { *m = ReqData{} }
+func (m *ReqData) String() string { return proto.CompactTextString(m) }
+func (*ReqData) ProtoMessage()    {}
+func (*ReqData) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c161fcfdc0c3ff1e, []int{0}
+}
+
+func (m *ReqData) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ReqData.Unmarshal(m, b)
+}
+func (m *ReqData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ReqData.Marshal(b, m, deterministic)
+}
+func (m *ReqData) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ReqData.Merge(m, src)
+}
+func (m *ReqData) XXX_Size() int {
+	return xxx_messageInfo_ReqData.Size(m)
+}
+func (m *ReqData) XXX_DiscardUnknown() {
+	xxx_messageInfo_ReqData.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ReqData proto.InternalMessageInfo
+
+func (m *ReqData) GetIn() string {
+	if m != nil {
+		return m.In
+	}
+	return ""
+}
+
+type ReplyData struct {
+	Out                  string   `protobuf:"bytes,1,opt,name=Out,proto3" json:"Out,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ReplyData) Reset()         { *m = ReplyData{} }
+func (m *ReplyData) String() string { return proto.CompactTextString(m) }
+func (*ReplyData) ProtoMessage()    {}
+func (*ReplyData) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c161fcfdc0c3ff1e, []int{1}
+}
+
+func (m *ReplyData) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ReplyData.Unmarshal(m, b)
+}
+func (m *ReplyData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ReplyData.Marshal(b, m, deterministic)
+}
+func (m *ReplyData) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ReplyData.Merge(m, src)
+}
+func (m *ReplyData) XXX_Size() int {
+	return xxx_messageInfo_ReplyData.Size(m)
+}
+func (m *ReplyData) XXX_DiscardUnknown() {
+	xxx_messageInfo_ReplyData.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ReplyData proto.InternalMessageInfo
+
+func (m *ReplyData) GetOut() string {
+	if m != nil {
+		return m.Out
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*ReqData)(nil), "ReqData")
+	proto.RegisterType((*ReplyData)(nil), "ReplyData")
+}
+
+func init() { proto.RegisterFile("test.proto", fileDescriptor_c161fcfdc0c3ff1e) }
+
+var fileDescriptor_c161fcfdc0c3ff1e = []byte{
+	// 121 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x2a, 0x49, 0x2d, 0x2e,
+	0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x57, 0x92, 0xe4, 0x62, 0x0f, 0x4a, 0x2d, 0x74, 0x49, 0x2c,
+	0x49, 0x14, 0xe2, 0xe3, 0x62, 0xf2, 0xcc, 0x93, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x62, 0xf2,
+	0xcc, 0x53, 0x92, 0xe5, 0xe2, 0x0c, 0x4a, 0x2d, 0xc8, 0xa9, 0x04, 0x4b, 0x0a, 0x70, 0x31, 0xfb,
+	0x97, 0x96, 0x40, 0x65, 0x41, 0x4c, 0x23, 0x5d, 0x2e, 0x96, 0x90, 0xd4, 0xe2, 0x12, 0x21, 0x55,
+	0x2e, 0x6e, 0x10, 0xed, 0x5a, 0x91, 0x9a, 0x5c, 0x5a, 0x92, 0x2a, 0xc4, 0xa1, 0x07, 0x35, 0x4f,
+	0x8a, 0x4b, 0x0f, 0xae, 0x5d, 0x89, 0x21, 0x89, 0x0d, 0x6c, 0x9f, 0x31, 0x20, 0x00, 0x00, 0xff,
+	0xff, 0x07, 0xf3, 0xcb, 0x37, 0x7d, 0x00, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConn
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion4
+
+// TestClient is the client API for Test service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type TestClient interface {
+	TestExecute(ctx context.Context, in *ReqData, opts ...grpc.CallOption) (*ReplyData, error)
+}
+
+type testClient struct {
+	cc *grpc.ClientConn
+}
+
+func NewTestClient(cc *grpc.ClientConn) TestClient {
+	return &testClient{cc}
+}
+
+func (c *testClient) TestExecute(ctx context.Context, in *ReqData, opts ...grpc.CallOption) (*ReplyData, error) {
+	out := new(ReplyData)
+	err := c.cc.Invoke(ctx, "/Test/TestExecute", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// TestServer is the server API for Test service.
+type TestServer interface {
+	TestExecute(context.Context, *ReqData) (*ReplyData, error)
+}
+
+func RegisterTestServer(s *grpc.Server, srv TestServer) {
+	s.RegisterService(&_Test_serviceDesc, srv)
+}
+
+func _Test_TestExecute_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ReqData)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(TestServer).TestExecute(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/Test/TestExecute",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(TestServer).TestExecute(ctx, req.(*ReqData))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _Test_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "Test",
+	HandlerType: (*TestServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "TestExecute",
+			Handler:    _Test_TestExecute_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "test.proto",
+}

+ 51 - 0
entity/db.go

@@ -0,0 +1,51 @@
+package entity
+
+type RedisStuct struct {
+	Addr []string `json:"addr"`
+}
+type Mysql struct {
+	Main        *MysqlStruct `json:"main,omitempty"`
+	BaseService *MysqlStruct `json:"baseService,omitempty"`
+	CrmService  *MysqlStruct `json:"crmService,omitempty"`
+	NiJian      *MysqlStruct `json:"niJian,omitempty"`
+}
+type Mongo struct {
+	Main    *MongoStruct `json:"main,optional"`
+	Bidding *MongoStruct `json:"bidding,optional"`
+	Ent     *MongoStruct `json:"ent,optional"`
+	Project *MongoStruct `json:"projectset,optional"`
+}
+type MongoStruct struct {
+	Address        string `json:"address"`
+	Size           int    `json:"size"`
+	DbName         string `json:"dbName"`
+	UserName       string `json:"userName,optional"`
+	Password       string `json:"password,optional"`
+	Collection     string `json:"collection,optional"`
+	CollectionBack string `json:"collectionBack,optional"`
+	MaxOpenConns   int    `json:"maxOpenConns,optional"`
+	MaxIdleConns   int    `json:"maxIdleConns,optional"`
+}
+
+// mysql
+type MysqlStruct struct {
+	DbName       string `json:"dbName"`
+	Address      string `json:"address"`
+	UserName     string `json:"userName"`
+	Password     string `json:"passWord"`
+	MaxOpenConns int    `json:"maxOpenConns"`
+	MaxIdleConns int    `json:"maxIdleConns"`
+}
+
+// es
+type EsStruct struct {
+	Addr     string `json:"addr"`
+	Size     int    `json:"size"`
+	Version  string `json:"version"`
+	UserName string `json:"userName"`
+	Password string `json:"password"`
+}
+
+const (
+	CONNECTION_STATUS = "connection_status"
+)

+ 9 - 0
entity/logx.go

@@ -0,0 +1,9 @@
+package entity
+
+//日志信息
+type Logc struct {
+	Mode     string
+	Path     string
+	Level    []string
+	KeepDays int
+}

+ 144 - 0
go.mod

@@ -0,0 +1,144 @@
+module bp.jydev.jianyu360.cn/CRM/application
+
+go 1.19
+
+require (
+	app.yhyue.com/moapp/jybase v0.0.0-20240424025716-c77615e9004e
+	app.yhyue.com/moapp/jypkg v0.0.0-20230825092743-3bfc415bb5bb
+	bp.jydev.jianyu360.cn/BaseService/fileCenter v0.0.0-20231016051530-64b559fee531
+	bp.jydev.jianyu360.cn/BaseService/gateway v1.3.4
+	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.14-0.20230821092053-934ffe439a9d
+	bp.jydev.jianyu360.cn/CRM/baseCenter v0.0.0-20230904054652-d86e21ec57f3
+	bp.jydev.jianyu360.cn/SocialPlatform/socialPlatform v0.0.0-20230529115950-b726dfbf171f
+	github.com/ClickHouse/clickhouse-go/v2 v2.2.0
+	github.com/RoaringBitmap/roaring v1.5.0
+	github.com/gogf/gf/v2 v2.0.6
+	github.com/golang/protobuf v1.5.3
+	github.com/shopspring/decimal v1.3.1
+	github.com/zeromicro/go-zero v1.5.5
+	google.golang.org/grpc v1.57.0
+)
+
+require (
+	app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d // indirect
+	app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230304035551-21bb1eedf547 // indirect
+	bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20230214091519-89a98c01ab0e // indirect
+	bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20230225125145-431a4f70093a // indirect
+	bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.7 // indirect
+	github.com/BurntSushi/toml v0.4.1 // indirect
+	github.com/beorn7/perks v1.0.1 // indirect
+	github.com/bits-and-blooms/bitset v1.2.0 // indirect
+	github.com/cenkalti/backoff/v4 v4.2.1 // indirect
+	github.com/cespare/xxhash/v2 v2.2.0 // indirect
+	github.com/clbanning/mxj/v2 v2.5.5 // indirect
+	github.com/coreos/go-semver v0.3.1 // indirect
+	github.com/coreos/go-systemd/v22 v22.5.0 // indirect
+	github.com/davecgh/go-spew v1.1.1 // indirect
+	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
+	github.com/emicklei/go-restful/v3 v3.9.0 // indirect
+	github.com/fatih/color v1.15.0 // indirect
+	github.com/fsnotify/fsnotify v1.6.0 // indirect
+	github.com/garyburd/redigo v1.6.2 // indirect
+	github.com/go-logr/logr v1.2.4 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/go-openapi/jsonpointer v0.19.6 // indirect
+	github.com/go-openapi/jsonreference v0.20.1 // indirect
+	github.com/go-openapi/swag v0.22.3 // indirect
+	github.com/go-redis/redis/v8 v8.11.5 // indirect
+	github.com/go-sql-driver/mysql v1.7.1 // indirect
+	github.com/gogo/protobuf v1.3.2 // indirect
+	github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
+	github.com/golang/mock v1.6.0 // indirect
+	github.com/golang/snappy v0.0.4 // indirect
+	github.com/gomodule/redigo v2.0.0+incompatible // indirect
+	github.com/google/gnostic v0.5.7-v3refs // indirect
+	github.com/google/go-cmp v0.5.9 // indirect
+	github.com/google/gofuzz v1.2.0 // indirect
+	github.com/google/uuid v1.3.0 // indirect
+	github.com/gorilla/websocket v1.5.0 // indirect
+	github.com/grokify/html-strip-tags-go v0.0.1 // indirect
+	github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.0 // indirect
+	github.com/jinzhu/inflection v1.0.0 // indirect
+	github.com/jinzhu/now v1.1.1 // indirect
+	github.com/josharian/intern v1.0.0 // indirect
+	github.com/json-iterator/go v1.1.12 // indirect
+	github.com/klauspost/compress v1.15.15 // indirect
+	github.com/longbridgeapp/sqlparser v0.3.1 // indirect
+	github.com/mailru/easyjson v0.7.7 // indirect
+	github.com/mattn/go-colorable v0.1.13 // indirect
+	github.com/mattn/go-isatty v0.0.17 // indirect
+	github.com/mattn/go-runewidth v0.0.13 // indirect
+	github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
+	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
+	github.com/modern-go/reflect2 v1.0.2 // indirect
+	github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
+	github.com/mschoch/smat v0.2.0 // indirect
+	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
+	github.com/nsqio/go-nsq v1.1.0 // indirect
+	github.com/olekukonko/tablewriter v0.0.5 // indirect
+	github.com/olivere/elastic v6.2.37+incompatible // indirect
+	github.com/olivere/elastic/v7 v7.0.22 // indirect
+	github.com/openzipkin/zipkin-go v0.4.1 // indirect
+	github.com/paulmach/orb v0.7.1 // indirect
+	github.com/pelletier/go-toml/v2 v2.0.9 // indirect
+	github.com/pierrec/lz4/v4 v4.1.17 // indirect
+	github.com/pkg/errors v0.9.1 // indirect
+	github.com/prometheus/client_golang v1.16.0 // indirect
+	github.com/prometheus/client_model v0.3.0 // indirect
+	github.com/prometheus/common v0.42.0 // indirect
+	github.com/prometheus/procfs v0.10.1 // indirect
+	github.com/rivo/uniseg v0.2.0 // indirect
+	github.com/spaolacci/murmur3 v1.1.0 // indirect
+	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
+	github.com/xdg-go/scram v1.1.2 // indirect
+	github.com/xdg-go/stringprep v1.0.4 // indirect
+	github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
+	go.etcd.io/etcd/api/v3 v3.5.9 // indirect
+	go.etcd.io/etcd/client/pkg/v3 v3.5.9 // indirect
+	go.etcd.io/etcd/client/v3 v3.5.9 // indirect
+	go.mongodb.org/mongo-driver v1.12.1 // indirect
+	go.opentelemetry.io/otel v1.15.1 // indirect
+	go.opentelemetry.io/otel/exporters/jaeger v1.15.1 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.15.1 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.1 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.15.1 // indirect
+	go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.14.0 // indirect
+	go.opentelemetry.io/otel/exporters/zipkin v1.15.1 // indirect
+	go.opentelemetry.io/otel/sdk v1.15.1 // indirect
+	go.opentelemetry.io/otel/trace v1.15.1 // indirect
+	go.opentelemetry.io/proto/otlp v0.19.0 // indirect
+	go.uber.org/atomic v1.10.0 // indirect
+	go.uber.org/automaxprocs v1.5.3 // indirect
+	go.uber.org/multierr v1.9.0 // indirect
+	go.uber.org/zap v1.24.0 // indirect
+	golang.org/x/crypto v0.12.0 // indirect
+	golang.org/x/net v0.14.0 // indirect
+	golang.org/x/oauth2 v0.7.0 // indirect
+	golang.org/x/sync v0.2.0 // indirect
+	golang.org/x/sys v0.11.0 // indirect
+	golang.org/x/term v0.11.0 // indirect
+	golang.org/x/text v0.12.0 // indirect
+	golang.org/x/time v0.3.0 // indirect
+	google.golang.org/appengine v1.6.7 // indirect
+	google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 // indirect
+	google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 // indirect
+	google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect
+	google.golang.org/protobuf v1.31.0 // indirect
+	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
+	gopkg.in/inf.v0 v0.9.1 // indirect
+	gopkg.in/yaml.v2 v2.4.0 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+	gorm.io/driver/mysql v1.0.5 // indirect
+	gorm.io/gorm v1.21.3 // indirect
+	jygit.jydev.jianyu360.cn/ApplicationCenter/publicService v0.0.0-20230710093759-d9d6c68de8b1 // indirect
+	k8s.io/api v0.26.3 // indirect
+	k8s.io/apimachinery v0.27.0-alpha.3 // indirect
+	k8s.io/client-go v0.26.3 // indirect
+	k8s.io/klog/v2 v2.90.1 // indirect
+	k8s.io/kube-openapi v0.0.0-20230307230338-69ee2d25a840 // indirect
+	k8s.io/utils v0.0.0-20230209194617-a36077c30491 // indirect
+	sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
+	sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
+	sigs.k8s.io/yaml v1.3.0 // indirect
+)

+ 2111 - 0
go.sum

@@ -0,0 +1,2111 @@
+app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d h1:WPsYuuptAd3UEgN+jPzpnsDe/OvcshDUUtOTZPYGSJ8=
+app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d/go.mod h1:91/lSD/hS+ckMVP3WdidRzDhC60lLMdyce9QHy0cSMA=
+app.yhyue.com/moapp/jyInfo v1.0.0/go.mod h1:+RjyGNvk7PT1P8cglkVlaj1lLlBXuPB+f5LipoOtgPs=
+app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230304035551-21bb1eedf547 h1:cCmWQW8DUBD2nuZNDz9aIe6MrlioxTbdaA2YiJhlzjY=
+app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230304035551-21bb1eedf547/go.mod h1:JvIs8uKjdT963+7JnZGIEcL4ctBiBjwkoz0kNyigE78=
+app.yhyue.com/moapp/jybase v0.0.0-20220415064050-37ce64b3e2d4/go.mod h1:qNRA0sHuYqcLoYoP8irpaWnW9YsXixe6obBIkwaXpD0=
+app.yhyue.com/moapp/jybase v0.0.0-20220418104200-46c3fff161c7/go.mod h1:qNRA0sHuYqcLoYoP8irpaWnW9YsXixe6obBIkwaXpD0=
+app.yhyue.com/moapp/jybase v0.0.0-20220419023055-f406279ff7e3/go.mod h1:qNRA0sHuYqcLoYoP8irpaWnW9YsXixe6obBIkwaXpD0=
+app.yhyue.com/moapp/jybase v0.0.0-20220420032112-668025915ee4/go.mod h1:qNRA0sHuYqcLoYoP8irpaWnW9YsXixe6obBIkwaXpD0=
+app.yhyue.com/moapp/jybase v0.0.0-20220421060131-a1001013ba46/go.mod h1:qNRA0sHuYqcLoYoP8irpaWnW9YsXixe6obBIkwaXpD0=
+app.yhyue.com/moapp/jybase v0.0.0-20220706083640-79084ff2be42/go.mod h1:FjBF25AYoBrPhVKTXGXWcmEAbBT0ATTK6KJMOA+I80Q=
+app.yhyue.com/moapp/jybase v0.0.0-20230117032034-ad7c00ffe11a/go.mod h1:zB47XTeJvpcbtBRYgkQuxOICWNexiZfbUO+7aUf6mNs=
+app.yhyue.com/moapp/jybase v0.0.0-20240424025716-c77615e9004e h1:1LaaIJVFQrwtjMKagxxq1JHZ93I48xzmJk6DI5PiCL8=
+app.yhyue.com/moapp/jybase v0.0.0-20240424025716-c77615e9004e/go.mod h1:XHNATN6tsJKHdCB0DbUtFdPPHXexTUFyB3RlO+lUUoM=
+app.yhyue.com/moapp/jypkg v0.0.0-20230825092743-3bfc415bb5bb h1:J9CQ60meKlABYqeOB6zdZXJtBHAsJqnHeWhd/OOCUtU=
+app.yhyue.com/moapp/jypkg v0.0.0-20230825092743-3bfc415bb5bb/go.mod h1:VaHDi3twSg4G84k2+UFOe7ZCw5EqUZVAkW2N2dHeMbU=
+bp.jydev.jianyu360.cn/BP/jynsq v0.0.0-20220222052708-ebc43af90698/go.mod h1:ojo/AUH9Yr1wzarEjOaNMkj1Cet/9r8IgLyba64Z52E=
+bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20230214091519-89a98c01ab0e h1:h+VEI3o1qC0jeCzkFGTrLI4f27cfa/W/y+0sXokWMgE=
+bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20230214091519-89a98c01ab0e/go.mod h1:7Xhygw0KBuL4h0G76FnFg4otQcA9bmOO0c8M0FCjAyQ=
+bp.jydev.jianyu360.cn/BaseService/fileCenter v0.0.0-20231016051530-64b559fee531 h1:dvF0J+VvI/ERMOSaXNX0G8Fc9xgx9JYJdRgIELsL8uI=
+bp.jydev.jianyu360.cn/BaseService/fileCenter v0.0.0-20231016051530-64b559fee531/go.mod h1:4gEXNn675HvTZOHH08zigDM7vdR4q3ZRncz4qS6/R90=
+bp.jydev.jianyu360.cn/BaseService/gateway v0.0.0-20220419090715-88ddb32961be/go.mod h1:Yj4oabIGItuMoF0BXYLz2XAnF581kxgXBrvlUtIJrkI=
+bp.jydev.jianyu360.cn/BaseService/gateway v0.0.0-20220421060822-97590f0dd0d9/go.mod h1:BMLd/5wb3BIEGhnEgF9y1sJN9P5/Dw9kYsoiE9V8I9g=
+bp.jydev.jianyu360.cn/BaseService/gateway v1.3.4 h1:zl5eZrKDBENVVBUiPpzyQQ0/SBdGUmZS3thXycSEO1g=
+bp.jydev.jianyu360.cn/BaseService/gateway v1.3.4/go.mod h1:BMLd/5wb3BIEGhnEgF9y1sJN9P5/Dw9kYsoiE9V8I9g=
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20230225125145-431a4f70093a h1:JX2jEMrbdLzXfVC/nTUvdFOkqNj5DUxkJFjl3XE1gyg=
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20230225125145-431a4f70093a/go.mod h1:5nimT8GJh46AyfeeDeyRlDQygMlO7TRM8Pwm41Gxemc=
+bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.0-20220418005748-8ba5d936dd53/go.mod h1:E5lcDI3k4FESLxiAetCfWQTq8qfpy9cv0yN1oKoEO34=
+bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.0-20220419023723-0b32d4a41751/go.mod h1:6KL5LMEku83uRbre0W/bj5kXG2I6pJGBFtktmtp51yM=
+bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.0-20220419063004-233fc7ce006c/go.mod h1:6KL5LMEku83uRbre0W/bj5kXG2I6pJGBFtktmtp51yM=
+bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.0-20220420075831-0b59892e9982/go.mod h1:wsHNO91h37H+xE4ZNny0yd7mtpODeDJxbVYhIRMR+qw=
+bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.0-20220708071315-1c310ec608dd/go.mod h1:a37CJ6SsOw+lb01BJ+qI4enoSR0aVF6jRG2+sL6dhg4=
+bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.7 h1:G6PHMWAHfYEuY6kbl7OM/KnCQf1Xa54mdhuP7JzK8/I=
+bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.7/go.mod h1:rRiGzKG4F/fmkNxXQCxrkxNWc8yf1SmW8qWCKfGIQSM=
+bp.jydev.jianyu360.cn/BaseService/userCenter v0.0.0-20220418072311-2062bed1e700/go.mod h1:KjcrxTzM96tBc6G4B8tlLBn1lrVy5UJYF8+eTdP4xAE=
+bp.jydev.jianyu360.cn/BaseService/userCenter v0.0.0-20220421015128-4a36f3eac5c5/go.mod h1:GT0QC4aaKDuXxAvaU4G02XjCc31TU1ctqBGqxQYOfC4=
+bp.jydev.jianyu360.cn/BaseService/userCenter v0.0.0-20220704032709-ba714ee655b0/go.mod h1:6TePXVLkKusfyXhYOqL2qvT+uvu2uvhyw8CdOOsIdDQ=
+bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.14-0.20230821092053-934ffe439a9d h1:7Mkr/6fGB2OZ56VZDI1FwfAAd6h6XediO2oRhztywYs=
+bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.14-0.20230821092053-934ffe439a9d/go.mod h1:03M9BWIGHy7BbGxLvjt8V9zZzEZDWhN6BuHVfVcDFbQ=
+bp.jydev.jianyu360.cn/CRM/baseCenter v0.0.0-20230904054652-d86e21ec57f3 h1:6py1No+pUGaHcPNZ1IUYIg9RIsEJOcKFCuxwDDAzKL8=
+bp.jydev.jianyu360.cn/CRM/baseCenter v0.0.0-20230904054652-d86e21ec57f3/go.mod h1:piwHJz2xm8etjtQpSGAfSbWR/zY46Ck8NSiwWQk11/Q=
+bp.jydev.jianyu360.cn/SocialPlatform/messageCenter v0.0.0-20230509083421-a1e4689d566a/go.mod h1:oT4+Q6HwwsVAAWkDNspdlwM1scif7Usgp8kapzYECJ0=
+bp.jydev.jianyu360.cn/SocialPlatform/socialPlatform v0.0.0-20230529115950-b726dfbf171f h1:8o9g09pFHJnviHbzzF8Strxb5wp5SGrcG7RfygiaqRs=
+bp.jydev.jianyu360.cn/SocialPlatform/socialPlatform v0.0.0-20230529115950-b726dfbf171f/go.mod h1:hE5TnccSuQG3CnFBREamDbo+PIEBtxmChicCo6/Q/9U=
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw=
+cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
+cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
+cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
+cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
+cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
+cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
+cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
+cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
+cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
+cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
+cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
+cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
+cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
+cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
+cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY=
+cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
+cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
+cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
+cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY=
+cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM=
+cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY=
+cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=
+cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=
+cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4=
+cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc=
+cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA=
+cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U=
+cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A=
+cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc=
+cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU=
+cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA=
+cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM=
+cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I=
+cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4=
+cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw=
+cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o=
+cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE=
+cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw=
+cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY=
+cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg=
+cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI=
+cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4=
+cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk=
+cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc=
+cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc=
+cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04=
+cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno=
+cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak=
+cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4=
+cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0=
+cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ=
+cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk=
+cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0=
+cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc=
+cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o=
+cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s=
+cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0=
+cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ=
+cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY=
+cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY=
+cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw=
+cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI=
+cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo=
+cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0=
+cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0=
+cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8=
+cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8=
+cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM=
+cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc=
+cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI=
+cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE=
+cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE=
+cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4=
+cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8=
+cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
+cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
+cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
+cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
+cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
+cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA=
+cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw=
+cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc=
+cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY=
+cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s=
+cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI=
+cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y=
+cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM=
+cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI=
+cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0=
+cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk=
+cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg=
+cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590=
+cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk=
+cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk=
+cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U=
+cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA=
+cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM=
+cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk=
+cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY=
+cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI=
+cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4=
+cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI=
+cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow=
+cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM=
+cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M=
+cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s=
+cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU=
+cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U=
+cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU=
+cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU=
+cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU=
+cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE=
+cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo=
+cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA=
+cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU=
+cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
+cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM=
+cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
+cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY=
+cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck=
+cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg=
+cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo=
+cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I=
+cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4=
+cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0=
+cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs=
+cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc=
+cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE=
+cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM=
+cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM=
+cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ=
+cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo=
+cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE=
+cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0=
+cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38=
+cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w=
+cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I=
+cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ=
+cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA=
+cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A=
+cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s=
+cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI=
+cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo=
+cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA=
+cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
+cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM=
+cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo=
+cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ=
+cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g=
+cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4=
+cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c=
+cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s=
+cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4=
+cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0=
+cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8=
+cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek=
+cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0=
+cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM=
+cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q=
+cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU=
+cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU=
+cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k=
+cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4=
+cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y=
+cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg=
+cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk=
+cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w=
+cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU=
+cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI=
+cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8=
+cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc=
+cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw=
+cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w=
+cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI=
+cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE=
+cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk=
+cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg=
+cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY=
+cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08=
+cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM=
+cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA=
+cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w=
+cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM=
+cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60=
+cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo=
+cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o=
+cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A=
+cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0=
+cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0=
+cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA=
+cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI=
+cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc=
+cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM=
+cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o=
+cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c=
+cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY=
+cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc=
+cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc=
+cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg=
+cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE=
+cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc=
+cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A=
+cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM=
+cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY=
+cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs=
+cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g=
+cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA=
+cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg=
+cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0=
+cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic=
+cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI=
+cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE=
+cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8=
+cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8=
+cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08=
+cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw=
+cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE=
+cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc=
+cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE=
+cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM=
+cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI=
+cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4=
+cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w=
+cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE=
+cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM=
+cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA=
+cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY=
+cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY=
+cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s=
+cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8=
+cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI=
+cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk=
+cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4=
+cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA=
+cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o=
+cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM=
+cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8=
+cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8=
+cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4=
+cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ=
+cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU=
+cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY=
+cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34=
+cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA=
+cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0=
+cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4=
+cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs=
+cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA=
+cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk=
+cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE=
+cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc=
+cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs=
+cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg=
+cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo=
+cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw=
+cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E=
+cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU=
+cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70=
+cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo=
+cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0=
+cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA=
+cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg=
+cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE=
+cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0=
+cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI=
+cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
+cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
+cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
+cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI=
+cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0=
+cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg=
+cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4=
+cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o=
+cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk=
+cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo=
+cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE=
+cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U=
+cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg=
+cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4=
+cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg=
+cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c=
+cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs=
+cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70=
+cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y=
+cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A=
+cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA=
+cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM=
+cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA=
+cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0=
+cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU=
+cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg=
+cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4=
+cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY=
+cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc=
+cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y=
+cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do=
+cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo=
+cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s=
+cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI=
+cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk=
+cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44=
+cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA=
+cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4=
+cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4=
+cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4=
+cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0=
+cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU=
+cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q=
+cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA=
+cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU=
+cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc=
+cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk=
+cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk=
+cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU=
+cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s=
+cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs=
+cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg=
+cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4=
+cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U=
+cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco=
+cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo=
+cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E=
+cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU=
+cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4=
+cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw=
+cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos=
+cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM=
+cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ=
+cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0=
+cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco=
+cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
+cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
+cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
+cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
+cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
+cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y=
+cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc=
+cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s=
+cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w=
+cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I=
+cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw=
+cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g=
+cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM=
+cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA=
+cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8=
+cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4=
+cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ=
+cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg=
+cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28=
+cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y=
+cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs=
+cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg=
+cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk=
+cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw=
+cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU=
+cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4=
+cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M=
+cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU=
+cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0=
+cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo=
+cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo=
+cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY=
+cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E=
+cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE=
+cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g=
+cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208=
+cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w=
+cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8=
+cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE=
+cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg=
+cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc=
+cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A=
+cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo=
+cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ=
+cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0=
+cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M=
+cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M=
+cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA=
+dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
+github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw=
+github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA=
+github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg=
+github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A=
+github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M=
+github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
+github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
+github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
+github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
+github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
+github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw=
+github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/ClickHouse/clickhouse-go v1.5.1/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI=
+github.com/ClickHouse/clickhouse-go v1.5.4/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI=
+github.com/ClickHouse/clickhouse-go/v2 v2.0.14/go.mod h1:iq2DUGgpA4BBki2CVwrF8x43zqBjdgHtbexkFkh5a6M=
+github.com/ClickHouse/clickhouse-go/v2 v2.2.0 h1:dj00TDKY+xwuTJdbpspCSmTLFyWzRJerTHwaBxut1C0=
+github.com/ClickHouse/clickhouse-go/v2 v2.2.0/go.mod h1:8f2XZUi7XoeU+uPIytSi1cvx8fmJxi7vIgqpvYTF1+o=
+github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
+github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
+github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
+github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
+github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
+github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
+github.com/RoaringBitmap/roaring v1.5.0 h1:V0VCSiHjroItEYCM3guC8T83ehi5QMt3oM9EefTTOms=
+github.com/RoaringBitmap/roaring v1.5.0/go.mod h1:plvDsJQpxOC5bw8LRteu/MLWHsHez/3y6cubLI4/1yE=
+github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
+github.com/Shopify/sarama v1.30.0/go.mod h1:zujlQQx1kzHsh4jfV1USnptCQrHAEZ2Hk8fTKCulPVs=
+github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
+github.com/Shopify/toxiproxy/v2 v2.1.6-0.20210914104332-15ea381dcdae/go.mod h1:/cvHQkZ1fst0EmZnA5dFtiQdWCNCFYzb+uE2vqVgvx0=
+github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
+github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a h1:HbKu58rmZpUGpz5+4FfNmIU+FmZg2P3Xaj2v2bfNWmk=
+github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc=
+github.com/alicebob/miniredis/v2 v2.17.0/go.mod h1:gquAfGbzn92jvtrSC69+6zZnwSODVXVpYDRaGhWaL6I=
+github.com/alicebob/miniredis/v2 v2.21.0/go.mod h1:XNqvJdQJv5mSuVMc0ynneafpnL/zv52acZ6kqeS0t88=
+github.com/alicebob/miniredis/v2 v2.22.0/go.mod h1:XNqvJdQJv5mSuVMc0ynneafpnL/zv52acZ6kqeS0t88=
+github.com/alicebob/miniredis/v2 v2.30.0/go.mod h1:84TWKZlxYkfgMucPBf5SOQBYJceZeQRFIaQgNMiCX6Q=
+github.com/alicebob/miniredis/v2 v2.30.5 h1:3r6kTHdKnuP4fkS8k2IrvSfxpxUTcW1SOL0wN7b7Dt0=
+github.com/aliyun/aliyun-oss-go-sdk v2.2.2+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
+github.com/aliyun/aliyun-oss-go-sdk v2.2.4+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
+github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
+github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/antonlindstrom/pgstore v0.0.0-20200229204646-b08ebf1105e0/go.mod h1:2Ti6VUHVxpC0VSmTZzEvpzysnaGAfGBOoMIz5ykPyyw=
+github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
+github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
+github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48=
+github.com/aws/aws-sdk-go v1.35.20/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k=
+github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
+github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc=
+github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
+github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bits-and-blooms/bitset v1.2.0 h1:Kn4yilvwNtMACtf1eYDlG8H77R07mZSPbMjLyS07ChA=
+github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
+github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwjwegp5jy4=
+github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff/go.mod h1:+RTT1BOk5P97fT2CiHkbFQwkK3mjsFAP6zCYV2aXtjw=
+github.com/bos-hieu/mongostore v0.0.2/go.mod h1:8AbbVmDEb0yqJsBrWxZIAZOxIfv/tsP8CDtdHduZHGg=
+github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA=
+github.com/bradleypeabody/gorilla-sessions-memcache v0.0.0-20181103040241-659414f458e1/go.mod h1:dkChI7Tbtx7H1Tj7TqGSZMOeGpMP5gLHtjroHd4agiI=
+github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
+github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
+github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw=
+github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
+github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
+github.com/clbanning/mxj/v2 v2.5.5 h1:oT81vUeEiQQ/DcHbzSytRngP6Ky9O+L+0Bw0zSJag9E=
+github.com/clbanning/mxj/v2 v2.5.5/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
+github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
+github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
+github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4=
+github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec=
+github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
+github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/coscms/tagfast v0.0.0-20150925144250-2b69b2496250/go.mod h1:zX8vynptAghuV/KG8BOZlDeo4DsTKWfBQ154RWlkay0=
+github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/dchest/captcha v0.0.0-20200903113550-03f5f0333e1f/go.mod h1:QGrK8vMWWHQYQ3QU9bw9Y9OPNfxccGzfb41qjvVeXtY=
+github.com/denisenkom/go-mssqldb v0.0.0-20190707035753-2be1aa521ff4/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM=
+github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
+github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
+github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
+github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
+github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
+github.com/donnie4w/go-logger v0.0.0-20170827050443-4740c51383f4/go.mod h1:L7S4x0R7vv3xoOhGuyAJyCO2MYzWOpccM4Isn8jIUgY=
+github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
+github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
+github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
+github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
+github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
+github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
+github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
+github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE=
+github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
+github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
+github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
+github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo=
+github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w=
+github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0=
+github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
+github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
+github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
+github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
+github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs=
+github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=
+github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw=
+github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
+github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
+github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
+github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
+github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
+github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
+github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
+github.com/fullstorydev/grpcurl v1.8.7/go.mod h1:pVtM4qe3CMoLaIzYS8uvTuDj2jVYmXqMUkZeijnXp/E=
+github.com/garyburd/redigo v1.6.2 h1:yE/pwKCrbLpLpQICzYTeZ7JsTA/C53wFTJHaEtRqniM=
+github.com/garyburd/redigo v1.6.2/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
+github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/gin-contrib/sessions v0.0.5/go.mod h1:vYAuaUPqie3WUSsft6HUlCjlwwoJQs97miaG2+7neKY=
+github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
+github.com/gin-gonic/gin v1.7.4/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY=
+github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
+github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
+github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
+github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
+github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
+github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
+github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
+github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=
+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-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
+github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
+github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
+github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
+github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
+github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
+github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
+github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
+github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8=
+github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
+github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
+github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
+github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
+github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g=
+github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
+github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
+github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
+github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
+github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
+github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w=
+github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
+github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
+github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
+github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
+github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
+github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
+github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
+github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M=
+github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8=
+github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:56xuuqnHyryaerycW3BfssRdxQstACi0Epw/yC5E2xM=
+github.com/go-xorm/xorm v0.7.9/go.mod h1:XiVxrMMIhFkwSkh96BW7PACl7UhLtx2iJIHMdmjh5sQ=
+github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0=
+github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY=
+github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg=
+github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
+github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
+github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs=
+github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
+github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
+github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk=
+github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28=
+github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo=
+github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk=
+github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw=
+github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360=
+github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg=
+github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE=
+github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8=
+github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
+github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
+github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
+github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
+github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ=
+github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0=
+github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
+github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
+github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
+github.com/gogf/gf/v2 v2.0.6 h1:2etb4FMpbQKWIJO+UjtIWrZUp01HUsFb6Po8pgizAWk=
+github.com/gogf/gf/v2 v2.0.6/go.mod h1:8uYzw7qNzuq8vrhVlWke1b1925FFqOJIgmyYW1sr/0M=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
+github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
+github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
+github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
+github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
+github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
+github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
+github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
+github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
+github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
+github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
+github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
+github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
+github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=
+github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0=
+github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
+github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54=
+github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
+github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
+github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
+github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
+github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
+github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
+github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=
+github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=
+github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg=
+github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
+github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
+github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
+github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM=
+github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM=
+github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM=
+github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c=
+github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo=
+github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY=
+github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8=
+github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
+github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU=
+github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA=
+github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4=
+github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
+github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
+github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c=
+github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
+github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
+github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
+github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
+github.com/gorilla/sessions v1.1.1/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w=
+github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
+github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
+github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
+github.com/grokify/html-strip-tags-go v0.0.1 h1:0fThFwLbW7P/kOiTBs03FsJSV9RM2M/Q/MOnCQxKMo0=
+github.com/grokify/html-strip-tags-go v0.0.1/go.mod h1:2Su6romC5/1VXOQMaWL2yb618ARB8iVo6/DR99A6d78=
+github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
+github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.0 h1:1JYBfzqrWPcCclBwxFCPAou9n+q86mfnu7NAeHfte7A=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.0/go.mod h1:YDZoGHuwE+ov0c8smSH49WLF3F2LaWnYYuDVd+EWrc0=
+github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslCrtky5vbi9dd7HrQPQIx6wqiw=
+github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI=
+github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/howeyc/fsnotify v0.9.0/go.mod h1:41HzSPxBGeFRQKEEwgh49TRw/nKBsYZ2cF1OzPjSJsA=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
+github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=
+github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
+github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
+github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
+github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
+github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
+github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ=
+github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA=
+github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE=
+github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s=
+github.com/jackc/pgconn v1.4.0/go.mod h1:Y2O3ZDF0q4mMacyWV3AstPJpeHXWGEetiFttmq5lahk=
+github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI=
+github.com/jackc/pgconn v1.5.1-0.20200601181101-fa742c524853/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI=
+github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o=
+github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8=
+github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE=
+github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c=
+github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
+github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78=
+github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA=
+github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg=
+github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
+github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
+github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
+github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
+github.com/jackc/pgproto3/v2 v2.0.7/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
+github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E=
+github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E=
+github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg=
+github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc=
+github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw=
+github.com/jackc/pgtype v1.2.0/go.mod h1:5m2OfMh1wTK7x+Fk952IDmI4nw3nPrvtQdM0ZT4WpC0=
+github.com/jackc/pgtype v1.3.1-0.20200510190516-8cd94a14c75a/go.mod h1:vaogEUkALtxZMCH411K+tKzNpwzCKU+AnPzBKZ+I+Po=
+github.com/jackc/pgtype v1.3.1-0.20200606141011-f6355165a91c/go.mod h1:cvk9Bgu/VzJ9/lxTO5R5sf80p0DiucVtN7ZxvaC4GmQ=
+github.com/jackc/pgtype v1.6.2/go.mod h1:JCULISAZBFGrHaOXIIFiyfzW5VY0GRitRr8NeJsrdig=
+github.com/jackc/pgx v3.6.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I=
+github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y=
+github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM=
+github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc=
+github.com/jackc/pgx/v4 v4.5.0/go.mod h1:EpAKPLdnTorwmPUUsqrPxy5fphV18j9q3wrfRXgo+kA=
+github.com/jackc/pgx/v4 v4.6.1-0.20200510190926-94ba730bb1e9/go.mod h1:t3/cdRQl6fOLDxqtlyhe9UWgfIi9R8+8v8GKV5TRA/o=
+github.com/jackc/pgx/v4 v4.6.1-0.20200606145419-4e5062306904/go.mod h1:ZDaNWkt9sW1JMiNn0kdYBaLelIhw7Pg4qd+Vk6tw7Hg=
+github.com/jackc/pgx/v4 v4.10.1/go.mod h1:QlrWebbs3kqEZPHCTGyxecvzG6tvIsYu+A5b1raylkA=
+github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs=
+github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM=
+github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=
+github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg=
+github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc=
+github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc=
+github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI=
+github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI=
+github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ=
+github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E=
+github.com/jhump/protoreflect v1.12.0/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI=
+github.com/jhump/protoreflect v1.14.1/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI=
+github.com/jinzhu/gorm v1.9.16/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs=
+github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
+github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
+github.com/jinzhu/now v1.1.1 h1:g39TucaRWyV3dwDO++eEc6qf8TVIQ/Da48WmqjZ3i7E=
+github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
+github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
+github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
+github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
+github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
+github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
+github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
+github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
+github.com/justinas/alice v1.2.0/go.mod h1:fN5HRH/reO/zrUflLfTN43t3vXvKzvZIENsNEe7i7qA=
+github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=
+github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
+github.com/kidstuff/mongostore v0.0.0-20181113001930-e650cd85ee4b/go.mod h1:g2nVr8KZVXJSS97Jo8pJ0jgq29P6H7dG0oplUA86MQw=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
+github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
+github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw=
+github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
+github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
+github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/lib/pq v1.10.3/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/longbridgeapp/sqlparser v0.3.1 h1:iWOZWGIFgQrJRgobLXUNJdvqGRpbVXkyKUKUA5CNJBE=
+github.com/longbridgeapp/sqlparser v0.3.1/go.mod h1:GIHaUq8zvYyHLCLMJJykx1CdM6LHtkUih/QaJXySSx4=
+github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA=
+github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA=
+github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
+github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0=
+github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
+github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
+github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
+github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
+github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
+github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
+github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
+github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
+github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
+github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
+github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
+github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
+github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
+github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
+github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
+github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus=
+github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI=
+github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
+github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
+github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
+github.com/memcachier/mc v2.0.1+incompatible/go.mod h1:7bkvFE61leUBvXz+yxsOnGBQSZpBSPIMUQSmmSHvuXc=
+github.com/microcosm-cc/bluemonday v1.0.23/go.mod h1:mN70sk7UkkF8TUr2IGBpNN0jAgStuPzlK76QuruE/z4=
+github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/mkevac/debugcharts v0.0.0-20191222103121-ae1c48aa8615/go.mod h1:Ad7oeElCZqA1Ufj0U9/liOF4BtVepxRcTvr2ey7zTvM=
+github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0=
+github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
+github.com/mschoch/smat v0.2.0 h1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM=
+github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw=
+github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
+github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
+github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
+github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms=
+github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
+github.com/nsqio/go-nsq v1.1.0 h1:PQg+xxiUjA7V+TLdXw7nVrJ5Jbl3sN86EhGCQj4+FYE=
+github.com/nsqio/go-nsq v1.1.0/go.mod h1:vKq36oyeVXgsS5Q8YEO7WghqidAVXQlcFxzQbQTuDEY=
+github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
+github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
+github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
+github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
+github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
+github.com/olivere/elastic v6.2.37+incompatible h1:UfSGJem5czY+x/LqxgeCBgjDn6St+z8OnsCuxwD3L0U=
+github.com/olivere/elastic v6.2.37+incompatible/go.mod h1:J+q1zQJTgAz9woqsbVRqGeB5G1iqDKVBWLNSYW8yfJ8=
+github.com/olivere/elastic/v7 v7.0.22 h1:esBA6JJwvYgfms0EVlH7Z+9J4oQ/WUADF2y/nCNDw7s=
+github.com/olivere/elastic/v7 v7.0.22/go.mod h1:VDexNy9NjmtAkrjNoI7tImv7FR4tf5zUA3ickqu5Pc8=
+github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
+github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
+github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
+github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
+github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
+github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
+github.com/onsi/ginkgo/v2 v2.7.0 h1:/XxtEV3I3Eif/HobnVx9YmJgk8ENdRsuUmM+fLCFNow=
+github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
+github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
+github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
+github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
+github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
+github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
+github.com/onsi/gomega v1.26.0 h1:03cDLK28U6hWvCAns6NeydX3zIm4SF3ci69ulidS32Q=
+github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
+github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
+github.com/openzipkin/zipkin-go v0.3.0/go.mod h1:4c3sLeE8xjNqehmF5RpAFLPLJxXscc0R4l6Zg0P1tTQ=
+github.com/openzipkin/zipkin-go v0.4.0/go.mod h1:4c3sLeE8xjNqehmF5RpAFLPLJxXscc0R4l6Zg0P1tTQ=
+github.com/openzipkin/zipkin-go v0.4.1 h1:kNd/ST2yLLWhaWrkgchya40TJabe8Hioj9udfPcEO5A=
+github.com/openzipkin/zipkin-go v0.4.1/go.mod h1:qY0VqDSN1pOBN94dBc6w2GJlWLiovAyg7Qt6/I9HecM=
+github.com/paulmach/orb v0.5.0/go.mod h1:FWRlTgl88VI1RBx/MkrwWDRhQ96ctqMCh8boXhmqB/A=
+github.com/paulmach/orb v0.7.1 h1:Zha++Z5OX/l168sqHK3k4z18LDvr+YAO/VjK0ReQ9rU=
+github.com/paulmach/orb v0.7.1/go.mod h1:FWRlTgl88VI1RBx/MkrwWDRhQ96ctqMCh8boXhmqB/A=
+github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY=
+github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
+github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
+github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI=
+github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek=
+github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0=
+github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
+github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
+github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
+github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
+github.com/pierrec/lz4/v4 v4.1.14/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
+github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
+github.com/pierrec/lz4/v4 v4.1.17 h1:kV4Ip+/hUBC+8T6+2EgburRtkE9ef4nbY3f4dFhGjMc=
+github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
+github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
+github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
+github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
+github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
+github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
+github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ=
+github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8=
+github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
+github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
+github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
+github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
+github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
+github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=
+github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
+github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=
+github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg=
+github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM=
+github.com/quasoft/memstore v0.0.0-20191010062613-2bce066d2b0b/go.mod h1:wTPjTepVu7uJBYgZ0SdWHQlIas582j6cn2jgk4DDdlg=
+github.com/rabbitmq/amqp091-go v1.1.0/go.mod h1:ogQDLSOACsLPsIq0NpbtiifNZi2YOz0VTJ0kHRghqbM=
+github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
+github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
+github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
+github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
+github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=
+github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
+github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
+github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
+github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
+github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
+github.com/shirou/gopsutil v2.19.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
+github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
+github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
+github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
+github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
+github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
+github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
+github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
+github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
+github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
+github.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
+github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
+github.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+zMHZXV9/bvak=
+github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
+github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
+github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
+github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
+github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y=
+github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
+github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
+github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
+github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk=
+github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ=
+github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
+github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
+github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
+github.com/wader/gormstore/v2 v2.0.0/go.mod h1:3BgNKFxRdVo2E4pq3e/eiim8qRDZzaveaIcIvu2T8r0=
+github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
+github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
+github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
+github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
+github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
+github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
+github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
+github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
+github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
+github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
+github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
+github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
+github.com/yl2chen/cidranger v1.0.2/go.mod h1:9U1yz7WPYDwf0vpNWFaeRh0bjwz5RVgRy/9UEQfHl0g=
+github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
+github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
+github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+github.com/yuin/gopher-lua v0.0.0-20200816102855-ee81675732da/go.mod h1:E1AXubJBdNmFERAOucpDIxNzeGfLzg0mYh+UfMWdChA=
+github.com/yuin/gopher-lua v0.0.0-20210529063254-f4c35e4016d9/go.mod h1:E1AXubJBdNmFERAOucpDIxNzeGfLzg0mYh+UfMWdChA=
+github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
+github.com/yuin/gopher-lua v1.1.0 h1:BojcDhfyDWgU2f2TOzYK/g5p2gxMrku8oupLDqlnSqE=
+github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
+github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
+github.com/zeromicro/go-zero v1.3.2/go.mod h1:DEj3Fwj1Ui1ltsgf6YqwTL9nD4+tYzIRX0c1pWtQo1E=
+github.com/zeromicro/go-zero v1.3.4/go.mod h1:nEU/ITZSmxRxvr/JmSoJ48MNV62UpY6bqJz9Voba7Yw=
+github.com/zeromicro/go-zero v1.3.5/go.mod h1:wh4o794b7Ul3W0k35Pw9nc3iB4O0OpaQTMQz/PJc1bc=
+github.com/zeromicro/go-zero v1.4.4/go.mod h1:5WSUwtJm0bYdDZ69GlckigcT6D0EyAPbDaX3unbSY/4=
+github.com/zeromicro/go-zero v1.5.5 h1:qEHnDuCBu/gDBmfWEZXYow6ZmWmzsrJTjtjSMVm4SiY=
+github.com/zeromicro/go-zero v1.5.5/go.mod h1:AGCspTFitHzYjl5ddAmYWLfdt341+BrhefqlwO45UbU=
+github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
+go.etcd.io/etcd/api/v3 v3.5.2/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A=
+go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A=
+go.etcd.io/etcd/api/v3 v3.5.5/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8=
+go.etcd.io/etcd/api/v3 v3.5.9 h1:4wSsluwyTbGGmyjJktOf3wFQoTBIURXHnq9n/G/JQHs=
+go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k=
+go.etcd.io/etcd/client/pkg/v3 v3.5.2/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
+go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
+go.etcd.io/etcd/client/pkg/v3 v3.5.5/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ=
+go.etcd.io/etcd/client/pkg/v3 v3.5.9 h1:oidDC4+YEuSIQbsR94rY9gur91UPL6DnxDCIYd2IGsE=
+go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4=
+go.etcd.io/etcd/client/v3 v3.5.2/go.mod h1:kOOaWFFgHygyT0WlSmL8TJiXmMysO/nNUlEsSsN6W4o=
+go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY=
+go.etcd.io/etcd/client/v3 v3.5.5/go.mod h1:aApjR4WGlSumpnJ2kloS75h6aHUmAyaPLjHMxpc7E7c=
+go.etcd.io/etcd/client/v3 v3.5.9 h1:r5xghnU7CwbUxD/fbUtRyJGaYNfDun8sp/gTr1hew6E=
+go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA=
+go.mongodb.org/mongo-driver v1.5.0/go.mod h1:boiGPFqyBs5R0R5qf2ErokGRekMfwn+MqKaUyHs7wy0=
+go.mongodb.org/mongo-driver v1.9.0/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY=
+go.mongodb.org/mongo-driver v1.9.1/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY=
+go.mongodb.org/mongo-driver v1.11.1/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8=
+go.mongodb.org/mongo-driver v1.12.1 h1:nLkghSU8fQNaK7oUmDhQFsnrtcoNy7Z6LVFKsEecqgE=
+go.mongodb.org/mongo-driver v1.12.1/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ=
+go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
+go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
+go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
+go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
+go.opentelemetry.io/otel v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg=
+go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=
+go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk=
+go.opentelemetry.io/otel v1.8.0/go.mod h1:2pkj+iMj0o03Y+cW6/m8Y4WkRdYN3AvCXCnzRMp9yvM=
+go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ=
+go.opentelemetry.io/otel v1.11.0/go.mod h1:H2KtuEphyMvlhZ+F7tg9GRhAOe60moNx61Ex+WmiKkk=
+go.opentelemetry.io/otel v1.15.1 h1:3Iwq3lfRByPaws0f6bU3naAqOR1n5IeDWd9390kWHa8=
+go.opentelemetry.io/otel v1.15.1/go.mod h1:mHHGEHVDLal6YrKMmk9LqC4a3sF5g+fHfrttQIB1NTc=
+go.opentelemetry.io/otel/exporters/jaeger v1.3.0/go.mod h1:KoYHi1BtkUPncGSRtCe/eh1ijsnePhSkxwzz07vU0Fc=
+go.opentelemetry.io/otel/exporters/jaeger v1.7.0/go.mod h1:PwQAOqBgqbLQRKlj466DuD2qyMjbtcPpfPfj+AqbSBs=
+go.opentelemetry.io/otel/exporters/jaeger v1.8.0/go.mod h1:GbWg+ng88rDtx+id26C34QLqw2erqJeAjsCx9AFeHfE=
+go.opentelemetry.io/otel/exporters/jaeger v1.10.0/go.mod h1:n9IGyx0fgyXXZ/i0foLHNxtET9CzXHzZeKCucvRBFgA=
+go.opentelemetry.io/otel/exporters/jaeger v1.11.0/go.mod h1:nRgyJbgJ0hmaUdHwyDpTTfBYz61cTTeeGhVzfQc+FsI=
+go.opentelemetry.io/otel/exporters/jaeger v1.15.1 h1:x3SLvwli0OyAJapNcOIzf1xXBRBA+HD3elrMQmFfmXo=
+go.opentelemetry.io/otel/exporters/jaeger v1.15.1/go.mod h1:0Ck9b5oLL/bFZvfAEEqtrb1U0jZXjm5fWXMCOCG3vvM=
+go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0/go.mod h1:78XhIg8Ht9vR4tbLNUhXsiOnE2HOuSeKAiAcoVQEpOY=
+go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.11.0/go.mod h1:+Lq4/WkdCkjbGcBMVHHg2apTbv8oMBf29QCnyCCJjNQ=
+go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.15.1 h1:XYDQtNzdb2T4uM1pku2m76eSMDJgqhJ+6KzkqgQBALc=
+go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.15.1/go.mod h1:uOTV75+LOzV+ODmL8ahRLWkFA3eQcSC2aAsbxIu4duk=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0/go.mod h1:Krqnjl22jUJ0HgMzw5eveuCvFDXY4nSYb4F8t5gdrag=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.11.0/go.mod h1:FnDp7XemjN3oZ3xGunnfOUTVwd2XcvLbtRAuOSU3oc8=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.1 h1:tyoeaUh8REKay72DVYsSEBYV18+fGONe+YYPaOxgLoE=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.1/go.mod h1:HUSnrjQQ19KX9ECjpQxufsF+3ioD3zISPMlauTPZu2g=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0/go.mod h1:OfUCyyIiDvNXHWpcWgbF+MWvqPZiNa3YDEnivcnYsV0=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.11.0/go.mod h1:pILgiTEtrqvZpoiuGdblDgS5dbIaTgDrkIuKfEFkt+A=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1 h1:pIfoG5IAZFzp9EUlJzdSkpUwpaUAAnD+Ru1nBLTACIQ=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1/go.mod h1:poNKBqF5+nR/6ke2oGTDjHfksrsHDOHXAl2g4+9ONsY=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.10.0/go.mod h1:5WV40MLWwvWlGP7Xm8g3pMcg0pKOUY609qxJn8y7LmM=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.15.1 h1:pnJfHmVcCEBcH5lkM+npJF8cTAjV/d+9cXVNCs5P/ao=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.15.1/go.mod h1:cC3Eu2V56zXY09YlijmqDhOUnL2jVL6KKJg4PGh++dU=
+go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.14.0 h1:sEL90JjOO/4yhquXl5zTAkLLsZ5+MycAgX99SDsxGc8=
+go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.14.0/go.mod h1:oCslUcizYdpKYyS9e8srZEqM6BB8fq41VJBjLAE6z1w=
+go.opentelemetry.io/otel/exporters/zipkin v1.3.0/go.mod h1:LxGGfHIYbvsFnrJtBcazb0yG24xHdDGrT/H6RB9r3+8=
+go.opentelemetry.io/otel/exporters/zipkin v1.7.0/go.mod h1:9YBXeOMFLQGwNEjsxMRiWPGoJX83usGMhbCmxUbNe5I=
+go.opentelemetry.io/otel/exporters/zipkin v1.8.0/go.mod h1:0uYAyCuGT67MFV9Z/Mmx93wGuugHw0FbxMc74fs3LNo=
+go.opentelemetry.io/otel/exporters/zipkin v1.10.0/go.mod h1:HdfvgwcOoCB0+zzrTHycW6btjK0zNpkz2oTGO815SCI=
+go.opentelemetry.io/otel/exporters/zipkin v1.11.0/go.mod h1:unWnsLCMYfINP8ue0aXVrB/GYHoXNn/lbTnupvLekGQ=
+go.opentelemetry.io/otel/exporters/zipkin v1.15.1 h1:B6s/o48bx00ayJu7F+jIMJfhPTyxW+S8vthjTZMNBj0=
+go.opentelemetry.io/otel/exporters/zipkin v1.15.1/go.mod h1:EjjV7/YfYXG+khxCOfG6PPeRGoOmtcSusyW66qPqpRQ=
+go.opentelemetry.io/otel/sdk v1.0.0/go.mod h1:PCrDHlSy5x1kjezSdL37PhbFUMjrsLRshJ2zCzeXwbM=
+go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=
+go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU=
+go.opentelemetry.io/otel/sdk v1.8.0/go.mod h1:uPSfc+yfDH2StDM/Rm35WE8gXSNdvCg023J6HeGNO0c=
+go.opentelemetry.io/otel/sdk v1.10.0/go.mod h1:vO06iKzD5baltJz1zarxMCNHFpUlUiOy4s65ECtn6kE=
+go.opentelemetry.io/otel/sdk v1.11.0/go.mod h1:REusa8RsyKaq0OlyangWXaw97t2VogoO4SSEeKkSTAk=
+go.opentelemetry.io/otel/sdk v1.15.1 h1:5FKR+skgpzvhPQHIEfcwMYjCBr14LWzs3uSqKiQzETI=
+go.opentelemetry.io/otel/sdk v1.15.1/go.mod h1:8rVtxQfrbmbHKfqzpQkT5EzZMcbMBwTzNAggbEAM0KA=
+go.opentelemetry.io/otel/trace v1.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs=
+go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=
+go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU=
+go.opentelemetry.io/otel/trace v1.8.0/go.mod h1:0Bt3PXY8w+3pheS3hQUt+wow8b1ojPaTBoTCh2zIFI4=
+go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM=
+go.opentelemetry.io/otel/trace v1.11.0/go.mod h1:nyYjis9jy0gytE9LXGU+/m1sHTKbRY0fX0hulNNDP1U=
+go.opentelemetry.io/otel/trace v1.15.1 h1:uXLo6iHJEzDfrNC0L0mNjItIp06SyaBQxu5t3xMlngY=
+go.opentelemetry.io/otel/trace v1.15.1/go.mod h1:IWdQG/5N1x7f6YUlmdLeJvH9yxtuJAfc4VW5Agv9r/8=
+go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
+go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
+go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw=
+go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
+go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
+go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ=
+go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
+go.uber.org/automaxprocs v1.4.0/go.mod h1:/mTEdr7LvHhs0v7mjdxDreTz1OG5zdZGqgOnhWiR/+Q=
+go.uber.org/automaxprocs v1.5.1/go.mod h1:BF4eumQw0P9GtnuxxovUd06vwm1o18oMzFtK66vU6XU=
+go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8=
+go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0=
+go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
+go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
+go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=
+go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=
+go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
+go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
+go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
+go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
+go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
+go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
+go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
+go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
+go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
+go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
+golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
+golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
+golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
+golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
+golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk=
+golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
+golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
+golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
+golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
+golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
+golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
+golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
+golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
+golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
+golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
+golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220421235706-1d1ef9303861/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220531201128-c960675eff93/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
+golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
+golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
+golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
+golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
+golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14=
+golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
+golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
+golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
+golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE=
+golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE=
+golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
+golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
+golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
+golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
+golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec=
+golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g=
+golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI=
+golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191220220014-0732a990476f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220429233432-b5fbb4746d32/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
+golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
+golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
+golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0=
+golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
+golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.3.8-0.20211105212822-18b340fc7af2/go.mod h1:EFNZuWvGYxIRUEX+K8UmCFwYmZjqcrnq15ZuVldZkZ0=
+golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
+golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
+golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20220411224347-583f2d630306/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
+golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
+golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
+golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
+golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
+golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
+google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
+google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
+google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
+google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
+google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
+google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
+google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
+google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
+google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo=
+google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4=
+google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw=
+google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU=
+google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k=
+google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
+google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
+google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI=
+google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I=
+google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo=
+google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g=
+google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA=
+google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8=
+google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs=
+google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA=
+google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA=
+google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw=
+google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg=
+google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o=
+google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g=
+google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw=
+google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw=
+google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI=
+google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
+google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
+google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s=
+google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08=
+google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70=
+google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo=
+google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
+google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
+google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
+google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
+google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
+google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
+google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
+google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
+google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
+google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
+google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
+google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24=
+google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
+google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
+google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
+google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
+google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w=
+google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
+google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
+google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
+google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
+google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
+google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
+google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
+google.golang.org/genproto v0.0.0-20220228195345-15d65a4533f7/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
+google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
+google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
+google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E=
+google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
+google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
+google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
+google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
+google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
+google.golang.org/genproto v0.0.0-20220422154200-b37d22cd5731/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
+google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
+google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
+google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
+google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
+google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
+google.golang.org/genproto v0.0.0-20220602131408-e326c6e8e9c8/go.mod h1:yKyY4AMRwFiC8yMMNaMi+RkCnjZJt9LoWuvhXjMs+To=
+google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
+google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
+google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
+google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
+google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
+google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE=
+google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc=
+google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=
+google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=
+google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=
+google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=
+google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk=
+google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=
+google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=
+google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=
+google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=
+google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo=
+google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw=
+google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI=
+google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI=
+google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U=
+google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM=
+google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM=
+google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s=
+google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s=
+google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo=
+google.golang.org/genproto v0.0.0-20221111202108-142d8a6fa32e/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
+google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
+google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
+google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
+google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
+google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE=
+google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
+google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 h1:9NWlQfY2ePejTmfwUH1OWwmznFa+0kKcHGPDvcPza9M=
+google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk=
+google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 h1:m8v1xLLLzMe1m5P+gCTF8nJB9epwZQUBERm20Oy1poQ=
+google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA=
+google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
+google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
+google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
+google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
+google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
+google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
+google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
+google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
+google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
+google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
+google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
+google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k=
+google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
+google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
+google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
+google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
+google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
+google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
+google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
+google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
+google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
+google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
+google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww=
+google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=
+google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw=
+google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo=
+google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
+google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
+gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE=
+gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw=
+gopkg.in/h2non/gock.v1 v1.1.2 h1:jBbHXgGBK/AoPVfJh5x4r/WxIrElvbLel8TCZkkZJoY=
+gopkg.in/h2non/gock.v1 v1.1.2/go.mod h1:n7UGz/ckNChHiK05rDoiC4MYSunEC/lyaUm2WWaDva0=
+gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s=
+gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
+gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gorm.io/driver/mysql v1.0.4/go.mod h1:MEgp8tk2n60cSBCq5iTcPDw3ns8Gs+zOva9EUhkknTs=
+gorm.io/driver/mysql v1.0.5 h1:WAAmvLK2rG0tCOqrf5XcLi2QUwugd4rcVJ/W3aoon9o=
+gorm.io/driver/mysql v1.0.5/go.mod h1:N1OIhHAIhx5SunkMGqWbGFVeh4yTNWKmMo1GOAsohLI=
+gorm.io/driver/postgres v1.0.8/go.mod h1:4eOzrI1MUfm6ObJU/UcmbXyiHSs8jSwH95G5P5dxcAg=
+gorm.io/driver/sqlite v1.1.4/go.mod h1:mJCeTFr7+crvS+TRnWc5Z3UvwxUN1BGBLMrf5LA9DYw=
+gorm.io/gorm v1.20.7/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw=
+gorm.io/gorm v1.20.12/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw=
+gorm.io/gorm v1.21.3 h1:qDFi55ZOsjZTwk5eN+uhAmHi8GysJ/qCTichM/yO7ME=
+gorm.io/gorm v1.21.3/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw=
+honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+jygit.jydev.jianyu360.cn/ApplicationCenter/publicService v0.0.0-20230710093759-d9d6c68de8b1 h1:BItxi1gkQUs3sjxaBk6tc34fZWSO4hUSXcTM3PcnY4I=
+jygit.jydev.jianyu360.cn/ApplicationCenter/publicService v0.0.0-20230710093759-d9d6c68de8b1/go.mod h1:p/595fgbj4r6GhSJhHDpx3Ru1NkD5UASFL8OuIQw09E=
+k8s.io/api v0.20.12/go.mod h1:A2brwyEkVLM3wQGNnzoAa5JsQRzHK0uoOQ+bsnv7V68=
+k8s.io/api v0.22.9/go.mod h1:rcjO/FPOuvc3x7nQWx29UcDrFJMx82RxDob71ntNH4A=
+k8s.io/api v0.26.3 h1:emf74GIQMTik01Aum9dPP0gAypL8JTLl/lHa4V9RFSU=
+k8s.io/api v0.26.3/go.mod h1:PXsqwPMXBSBcL1lJ9CYDKy7kIReUydukS5JiRlxC3qE=
+k8s.io/apimachinery v0.20.12/go.mod h1:uM7hCI0NyBymUwgshMgZyte475lxhr+QH6h3cvdnzEc=
+k8s.io/apimachinery v0.22.9/go.mod h1:ZvVLP5iLhwVFg2Yx9Gh5W0um0DUauExbRhe+2Z8I1EU=
+k8s.io/apimachinery v0.27.0-alpha.3 h1:uujqsdFrbqF+cEbqFHrkLKp+s3XxRgphTpc6Yg84qLo=
+k8s.io/apimachinery v0.27.0-alpha.3/go.mod h1:TO4higCGNMwebVSdb1XPJdXMU4kk+nmMY/cTMVCGa6M=
+k8s.io/client-go v0.20.12/go.mod h1:NBJj6Evp73Xy/4v/O/RDRaH0+3JoxNfjRxkyRgrdbsA=
+k8s.io/client-go v0.22.9/go.mod h1:IoH7exYnoH/zgvHOuVxh2c4yJepcCBt72FzCTisOc4k=
+k8s.io/client-go v0.26.3 h1:k1UY+KXfkxV2ScEL3gilKcF7761xkYsSD6BC9szIu8s=
+k8s.io/client-go v0.26.3/go.mod h1:ZPNu9lm8/dbRIPAgteN30RSXea6vrCpFvq+MateTUuQ=
+k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
+k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
+k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
+k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
+k8s.io/klog/v2 v2.40.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
+k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
+k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw=
+k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
+k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM=
+k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=
+k8s.io/kube-openapi v0.0.0-20230307230338-69ee2d25a840 h1:1Q4XWtrQQh04ZweCpL7aMNYafFMoPEiST4dl5b4PmYw=
+k8s.io/kube-openapi v0.0.0-20230307230338-69ee2d25a840/go.mod h1:y5VtZWM9sHHc2ZodIH/6SHzXj+TPU5USoA8lcIeKEKY=
+k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
+k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
+k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
+k8s.io/utils v0.0.0-20220706174534-f6158b442e7c/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
+k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+k8s.io/utils v0.0.0-20230209194617-a36077c30491 h1:r0BAOLElQnnFhE/ApUsg3iHdVYYPBjNSSOMowRZxxsY=
+k8s.io/utils v0.0.0-20230209194617-a36077c30491/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
+rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
+sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
+sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
+sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
+sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
+sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
+sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=
+sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=
+sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
+sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
+sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
+sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
+xorm.io/builder v0.3.6/go.mod h1:LEFAPISnRzG+zxaxj2vPicRwz67BdhFreKg8yv8/TgU=
+xorm.io/core v0.7.2-0.20190928055935-90aeac8d08eb/go.mod h1:jJfd0UAEzZ4t87nbQYtVjmqpIODugN6PD2D9E+dJvdM=

+ 373 - 0
service/custom.go

@@ -0,0 +1,373 @@
+package service
+
+import (
+	"context"
+	"database/sql"
+	"fmt"
+	"log"
+	"strings"
+	"time"
+
+	qu "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/date"
+	"bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/pb"
+	cm "bp.jydev.jianyu360.cn/CRM/application/api/common"
+	"bp.jydev.jianyu360.cn/CRM/application/entity"
+	baseC "bp.jydev.jianyu360.cn/CRM/baseCenter/rpc/pb"
+	"github.com/gogf/gf/v2/util/gconv"
+)
+
+// 客户相关
+type CustomService struct {
+	BaseUserId           int64
+	PositionId           int64
+	EntUserId            int64
+	EntId                int64
+	AppId                string
+	AccountId            int64
+	EntDeptId            int64
+	CustomType           int64   //客户类型
+	Summary              string  //概要信息
+	CustomAllName        string  //客户全称
+	CustomAbbreviation   string  //客户简称
+	CustomLevel          int64   //客户级别
+	CustomIndustry       int64   //客户行业
+	CustomDetailIndustry int64   //客户细分行业
+	Province             string  //省份
+	City                 string  //城市
+	District             string  //地区
+	Address              string  //详细地址
+	CompanyPhone         string  //公司电话
+	NextfollowUpTime     int64   //下次跟进时间戳
+	Types                int64   //处理方式 1自办;2转办
+	User                 []int64 //转办用户
+	EmployCustomId       int64   //客户收录id
+	EmployInfoId         int64   //资讯收录id
+	Remarks              string  //备注
+	CreateName           string  //创建人
+	Source               string
+	OwnerId              string //潜客收录id(人脉)
+	BusinessId           string //商机收录id(人脉)
+}
+
+// Add 创建客户
+func (this *CustomService) Add(ctx context.Context) (int64, string) {
+	nowtime := time.Now().Format(date.Date_Full_Layout)
+	nextFollowTime := time.Unix(this.NextfollowUpTime, 0).Format(date.Date_Full_Layout)
+
+	args := []interface{}{}
+	argsTask := []interface{}{}
+	argsTaskTeam := []interface{}{}
+	//判断处理方式
+	//转办
+	baseUserIdArr := []int64{}
+	customId, taskId := int64(-1), int64(-1)
+	groupId := ""
+	if this.Types == 2 {
+		transferArr := []int64{}
+		for _, v := range this.User {
+			i_entuserid := v
+			resp, err := cm.UserCenterRpc.IdentityByEntUserId(ctx, &pb.IdentityReq{
+				Id: i_entuserid,
+			})
+			if err != nil {
+				log.Println("获取用户职位id信息出错", i_entuserid, "的信息出错", err)
+				return -1, groupId
+			} else if resp == nil {
+				log.Println("entuser用户", i_entuserid, "没有找到职位信息")
+				return -1, groupId
+			}
+			transferArr = append(transferArr, resp.PositionId)
+			baseUserIdArr = append(baseUserIdArr, resp.UserId)
+		}
+		//客户
+		args = append(args, this.PositionId, this.EntId, this.EntUserId, this.EmployInfoId, this.EmployCustomId, this.CustomType, this.CustomAllName, this.CustomAbbreviation, this.Summary, qu.If(this.CustomLevel == 0, nil, this.CustomLevel), this.CustomIndustry, this.CustomDetailIndustry, qu.If(this.Province == "", nil, this.Province), qu.If(this.City == "", nil, this.City), qu.If(this.District == "", nil, this.District), qu.If(this.Address == "", nil, this.Address), qu.If(this.CompanyPhone == "", nil, this.CompanyPhone), qu.If(this.Remarks == "", nil, this.Remarks), this.CreateName, nowtime, this.Source, this.OwnerId, this.BusinessId)
+		//任务
+		argsTask = append(argsTask, this.EntId, this.CustomAllName+"的跟进任务", 3, this.PositionId, 1, nowtime, 1, 0, qu.If(this.NextfollowUpTime == 0, nil, nextFollowTime), nil, nil)
+		customId, taskId = SaveCustom(ctx, args, argsTask, argsTaskTeam, this.EmployInfoId, this.EmployCustomId, this.OwnerId, this.BusinessId, this.PositionId, this.CreateName, transferArr, this.EntId, this.EntUserId, this.EntDeptId)
+		if customId < 0 {
+			return -1, groupId
+		}
+	} else if this.Types == 1 {
+		//客户
+		args = append(args, this.PositionId, this.EntId, this.EntUserId, this.EmployInfoId, this.EmployCustomId, this.CustomType, this.CustomAllName, this.CustomAbbreviation, this.Summary, qu.If(this.CustomLevel == 0, nil, this.CustomLevel), this.CustomIndustry, this.CustomDetailIndustry, qu.If(this.Province == "", nil, this.Province), qu.If(this.City == "", nil, this.City), qu.If(this.District == "", nil, this.District), qu.If(this.Address == "", nil, this.Address), qu.If(this.CompanyPhone == "", nil, this.CompanyPhone), qu.If(this.Remarks == "", nil, this.Remarks), this.CreateName, nowtime, this.Source, this.OwnerId, this.BusinessId)
+		//任务s
+		argsTask = append(argsTask, this.EntId, this.CustomAllName+"的跟进任务", 3, this.PositionId, 2, nowtime, 1, 0, qu.If(this.NextfollowUpTime == 0, nil, nextFollowTime), nil, nil)
+		//任务团队
+		argsTaskTeam = append(argsTaskTeam, this.PositionId, this.EntUserId, this.CreateName, 1, nowtime)
+		//存库
+		customId, taskId = SaveCustom(ctx, args, argsTask, argsTaskTeam, this.EmployInfoId, this.EmployCustomId, this.OwnerId, this.BusinessId, this.PositionId, this.CreateName, []int64{}, this.EntId, this.EntUserId, this.EntDeptId)
+		if customId < 0 {
+			return -1, groupId
+		}
+		baseUserIdArr = append(baseUserIdArr, this.BaseUserId)
+
+		//自办 创建 群聊
+		// gp := &Group{
+		// 	EntId:      this.EntId,
+		// 	PositionId: this.PositionId,
+		// 	UserIdArr:  []int64{},
+		// 	AppId:      this.AppId,
+		// 	EntUserId:  this.EntUserId,
+		// 	AccountId:  this.AccountId,
+		// }
+		// groupId = gp.GroupAdd()
+	} else if this.Types == 3 {
+		transferArr := []int64{}
+		transferArr = append(transferArr, this.PositionId)
+		//客户
+		args = append(args, this.PositionId, this.EntId, this.EntUserId, this.EmployInfoId, this.EmployCustomId, this.CustomType, this.CustomAllName, this.CustomAbbreviation, this.Summary, qu.If(this.CustomLevel == 0, nil, this.CustomLevel), this.CustomIndustry, this.CustomDetailIndustry, qu.If(this.Province == "", nil, this.Province), qu.If(this.City == "", nil, this.City), qu.If(this.District == "", nil, this.District), qu.If(this.Address == "", nil, this.Address), qu.If(this.CompanyPhone == "", nil, this.CompanyPhone), qu.If(this.Remarks == "", nil, this.Remarks), this.CreateName, nowtime, this.Source, this.OwnerId, this.BusinessId)
+		//任务
+		argsTask = append(argsTask, this.EntId, this.CustomAllName+"的跟进任务", 3, this.PositionId, 1, nowtime, 1, 0, qu.If(this.NextfollowUpTime == 0, nil, nextFollowTime), nil, nil)
+		customId, taskId = SaveCustom(ctx, args, argsTask, argsTaskTeam, this.EmployInfoId, this.EmployCustomId, this.OwnerId, this.BusinessId, this.PositionId, this.CreateName, transferArr, this.EntId, this.EntUserId, this.EntDeptId)
+		if customId < 0 {
+			return -1, groupId
+		}
+		baseUserIdArr = append(baseUserIdArr, this.BaseUserId)
+	}
+	u := &User{BaseUserIds: baseUserIdArr}
+
+	if this.Types != 3 {
+		var kb strings.Builder
+		var vb strings.Builder
+		for k, v := range u.GetUserId(this.EntId) {
+			kb.WriteString(k + ",")
+			vb.WriteString(gconv.String(v) + ",")
+			userId := strings.TrimRight(kb.String(), ",")
+			positionId := strings.TrimRight(vb.String(), ",")
+			next := strings.Replace(time.Unix(this.NextfollowUpTime, 0).Format(YYYYMMDDHHMM), " ", "%20", -1)
+			pcHref := ""
+			content := ""
+			if this.Types == 1 {
+				pcHref = fmt.Sprintf(cm.Push.Custom.Create.MyselfPcHref, positionId, taskId, customId)
+				content = fmt.Sprintf(cm.Push.Custom.Create.MySelfContent, this.CreateName, strings.Replace(date.NowFormat(YYYYMMDDHHMM), " ", "%20", -1), next)
+			} else if this.Types == 2 {
+				pcHref = fmt.Sprintf(cm.Push.Custom.Create.TransferPcHref, positionId)
+				content = fmt.Sprintf(cm.Push.Custom.Create.TransferContent, this.CreateName, strings.Replace(date.NowFormat(YYYYMMDDHHMM), " ", "%20", -1), next)
+			}
+			StationMailPush(userId, positionId, cm.Push.Custom.Create.Title, content, pcHref, cm.Push.Custom.Create.MobileHref, "11")
+		}
+	}
+
+	return 1, groupId
+}
+
+func SaleCustomAdd(tx *sql.Tx, args []interface{}) int64 {
+	fields := []string{"position_id", "ent_id", "ent_user_id", "employ_info_id", "employ_custom_id", "type", "full_name", "sort_name", "summary", "level", "industry", "subdivision_industry", "province", "city", "county", "address", "phone", "remark", "create_person", "create_time", "source", "connection_owner_id", "connection_business_id"}
+	_, id := cm.CrmMysql.InsertBatchByTx(tx, entity.CUSTOM, fields, args)
+	return id
+}
+
+// EmployUpdate 是否创建线索/机会/客户修改
+// return employ_info_id,employ_custom_id
+func EmployUpdate(tx *sql.Tx, employ_info_id, employ_custom_id, positionId int64, key string, entId, entUserId, entDeptId int64) (int64, int64) {
+	tablename := ""
+	id := int64(0)
+	if employ_custom_id > 0 {
+		tablename = entity.EMPLOY_CUSTOM
+		id = employ_custom_id
+	} else if employ_info_id > 0 {
+		tablename = entity.EMPLOY_INFO
+		id = employ_info_id
+	}
+	fmt.Println(tablename, id)
+	if tablename == "" || id == 0 {
+		return employ_info_id, employ_custom_id
+	}
+	//判断该条信息是不是当前资讯分配员的
+	d := cm.CrmMysql.SelectBySqlByTx(tx, fmt.Sprintf(`select * from %v where id = ?`, tablename), id)
+	fmt.Println(d)
+	if d != nil && len(*d) > 0 {
+		data := (*d)[0]
+		position_id := gconv.Int64(data["position_id"])
+		if position_id == positionId {
+			cm.CrmMysql.UpdateByTx(tx, tablename, map[string]interface{}{"id": id, "position_id": positionId}, map[string]interface{}{key: 1, "is_handle": 1})
+		} else {
+			//判断是否已创建该条,但是是取消收录状态、如果是则改为已收录,不是则创建一条新的
+			d2 := cm.CrmMysql.SelectBySqlByTx(tx, fmt.Sprintf(`select * from %v where source_id = ? and position_id =?`, tablename), data["source_id"], positionId)
+			if d2 != nil && len(*d2) > 0 {
+				//已创建
+				qwe := cm.CrmMysql.UpdateByTx(tx, tablename, map[string]interface{}{
+					"source_id":   data["source_id"],
+					"position_id": positionId,
+				}, map[string]interface{}{
+					key:      1,
+					"status": 1,
+				})
+				log.Println(qwe, data["source_id"], positionId)
+			} else {
+				data["position_id"] = positionId
+				data["ent_id"] = entId
+				data["ent_dept_id"] = entDeptId
+				data["ent_user_id"] = entUserId
+				//当前咨询不是分配员的 创建该条
+				if employ_custom_id > 0 {
+					//
+					data["is_handle"] = 1
+					data["is_ignore"] = 0
+					data["is_create_custom"] = 1
+
+				} else if employ_info_id > 0 {
+					data["is_handle"] = 1
+					data["is_ignore"] = 0
+					data["is_dis"] = 0
+					data[key] = 1
+					for _, v := range GetOtherKey(key) {
+						data[v] = 0
+					}
+				}
+				delete(data, "id")
+				newId := cm.CrmMysql.InsertByTx(tx, tablename, data)
+				if tablename == entity.EMPLOY_INFO {
+					employ_info_id = newId
+				} else if tablename == entity.EMPLOY_CUSTOM {
+					employ_custom_id = newId
+				}
+			}
+		}
+	}
+	return employ_info_id, employ_custom_id
+}
+
+func SaveCustom(ctx context.Context, argsCustom, argsTask, argsTaskTeam []interface{}, employ_info_id, employ_custom_id int64, ownerId, connectionBusinessId string, positionId int64, createPerson string, transferArr []int64, entId, entUserId, entDeptId int64) (int64, int64) {
+	customId := int64(-1)
+	taskId := int64(-1)
+	//存库
+	cm.CrmMysql.ExecTx("创建客户", func(tx *sql.Tx) bool {
+		//修改状态
+		employ_info_id_new, employ_custom_id_new := EmployUpdate(tx, employ_info_id, employ_custom_id, positionId, "is_create_custom", entId, entUserId, entDeptId)
+		//插入客户
+
+		//修改客户id、咨询id
+		argsCustom[3] = employ_info_id_new
+		argsCustom[4] = employ_custom_id_new
+
+		customId = SaleCustomAdd(tx, argsCustom)
+		//传过来的argTask没有来源id,需要append
+		argsTask = append(argsTask, customId)
+		//任务车存储
+		taskId = TaskAdd(tx, argsTask, argsTaskTeam, transferArr, positionId)
+		//插入台账
+		ok2 := SaveLedger(ctx, positionId, customId, taskId, "创建客户", fmt.Sprintf("%s创建了客户", createPerson), createPerson)
+		//人脉信息添加
+		if ownerId != "" || connectionBusinessId != "" {
+			SaveConnection(tx, positionId, connectionBusinessId, ownerId, entId, entDeptId, entUserId)
+		}
+		if customId > 0 && taskId > 0 && ok2 {
+			return true
+		}
+		log.Println("SaveCustom err:", customId, taskId)
+		return false
+	})
+	return customId, taskId
+}
+
+// SaveLedger 操作台帐相关
+func SaveLedger(ctx context.Context, positionId, businessId, taskId int64, types, content, createPerson string) bool {
+	//操作台账
+	resp, err := cm.BaseCenterRpc.LedgerAdd(ctx, &baseC.LedgerAddReq{
+		PositionId:   positionId,
+		BusinessId:   businessId, //业务id
+		TaskId:       taskId,     //任务id
+		Types:        types,      //类型
+		Content:      content,    //内容
+		CreateWay:    1,          //创建方式 1:人 2:系统
+		CreatePerson: createPerson,
+	})
+	if err != nil {
+		log.Println("save ledger err:", err)
+		return false
+	}
+	if resp == nil {
+		log.Println("save ledger resp is nil")
+		return false
+	}
+	return resp.State
+}
+
+// 消息漏斗保存
+func saveSalesFunnel(tx *sql.Tx, args []interface{}, tpl_id int64) int64 {
+	fields := []string{`chance_id`, `task_id`, `chance_name`, `outline`, `next_follow_time`, `expected_transaction_amount`, `business_type`, `ent_id`, `employ_info_id`, `current_generation`, `current_generation_progress`, `generation`}
+	//当前阶段
+	stageId := int64(0)
+	stageData := cm.CrmMysql.Find(entity.CONFIG_TPL_STAGE, map[string]interface{}{
+		"tpl_id": tpl_id}, "id, `order`", "", -1, -1)
+	if stageData != nil && len(*stageData) > 0 {
+		var a1 []interface{}
+		for _, m := range *stageData {
+			stageId = gconv.Int64(m["id"])
+			order := gconv.Int(m["order"])
+			a1 = append(a1, args...)
+			if order == 1 {
+				a1 = append(a1, stageId)
+			} else {
+				a1 = append(a1, 0)
+			}
+			a1 = append(a1, 0)
+			a1 = append(a1, stageId)
+			//进度查询
+			/*matterData := cm.CrmMysql.SelectBySql("select COUNT(1) as ratio from config_stage_matter where stage_id=? and is_must == 1", stageId)
+			if matterData != nil && len(*matterData) > 0 {
+				ratio := gconv.Int64((*matterData)[0]["ratio"])
+				a1 = append(a1, ratio)
+			} else {
+				a1 = append(a1, 0)
+			}*/
+		}
+		//当前阶段进展
+		_, id := cm.CrmMysql.InsertBatchByTx(tx, entity.SALES_FUNNEL, fields, a1)
+		return id
+		/**/
+	}
+	return 0
+}
+func GetOtherKey(key string) []string {
+	parameters := map[string][]string{
+		"is_create_clue":   {"is_create_chance", "is_create_custom"},
+		"is_create_chance": {"is_create_clue", "is_create_custom"},
+		"is_create_custom": {"is_create_chance", "is_create_clue"},
+	}
+	return parameters[key]
+}
+func SaveConnection(tx *sql.Tx, positionId int64, businessId, ownerId string, entId, entDeptId, entUserId int64) bool {
+	if businessId != "" || ownerId != "" {
+		table := entity.CONNECTION_STATUS
+		sourceType := 2
+		if businessId == "" {
+			businessId = ownerId
+			sourceType = 1
+		}
+		if cm.CrmMysql.Count(table, map[string]interface{}{
+			"position_id": positionId,
+			"relate_id":   businessId,
+			"itype":       sourceType,
+		}) > 0 {
+			cm.CrmMysql.UpdateByTx(tx, table, map[string]interface{}{
+				"position_id": positionId,
+				"relate_id":   businessId,
+				"itype":       sourceType,
+			}, map[string]interface{}{
+				"is_handle":   1,
+				"relate_id":   businessId,
+				"update_time": time.Now().Format(date.Date_Full_Layout),
+				"is_create":   1,
+			})
+			return true
+		} else {
+			id := cm.CrmMysql.InsertByTx(tx, table, map[string]interface{}{
+				"position_id": positionId,
+				"ent_id":      entId,
+				"ent_dept_id": entDeptId,
+				"ent_user_id": entUserId,
+				"relate_id":   businessId,
+				"is_handle":   1,
+				"is_create":   1,
+				"itype":       sourceType,
+				"create_time": time.Now().Format(date.Date_Full_Layout),
+				"update_time": time.Now().Format(date.Date_Full_Layout),
+			})
+			return id > 0
+		}
+	}
+	return true
+}

+ 80 - 0
service/ent.go

@@ -0,0 +1,80 @@
+package service
+
+import (
+	"app.yhyue.com/moapp/jybase/common"
+	MC "bp.jydev.jianyu360.cn/CRM/application/api/common"
+	"errors"
+	"log"
+	"strings"
+	"time"
+)
+
+type EntService struct {
+}
+
+const (
+	Date_Full_Layout  = "2006-01-02 15:04:05"
+	Date_Short_Layout = "2006-01-02"
+)
+
+func (in *EntService) EntInfo(entName string) (map[string]interface{}, error) {
+	entinfo, _ := MC.MgoEnt.FindOneByField("qyxy_std", map[string]interface{}{"company_name": entName}, map[string]interface{}{
+		"company_type": 1, //公司类型
+		//"issue_date":          1, //核准日期
+		"operation_startdate": 1, //营业期限开始
+		"operation_enddate":   1, //营业期限结束
+		//"authority":           1, //登记机关
+		"credit_no":       1, //统一社会信用代码
+		"tax_code":        1, //纳税人识别码
+		"capital":         1, //注册资本
+		"establish_date":  1, //成立日期
+		"company_status":  1, //经营状态
+		"employee_no":     1, //员工规模
+		"company_address": 1, //注册地
+		"business_scope":  1, //经营范围
+		"company_code":    1, //工商注册号
+		"org_code":        1, //组织机构代码
+		//"stock_realcapital":   1, //实缴资本
+		"legal_person":  1, //法人姓名
+		"company_phone": 1, //公司电话
+	})
+	if entinfo == nil || len(*entinfo) == 0 {
+		log.Println()
+		return nil, errors.New("未查询到企业相关信息")
+	}
+	rData := map[string]interface{}{
+		"type":         (*entinfo)["company_type"],
+		"status":       (*entinfo)["company_status"],
+		"creditNo":     (*entinfo)["credit_no"],
+		"taxCode":      (*entinfo)["tax_code"],
+		"capital":      (*entinfo)["capital"],
+		"employeeNo":   (*entinfo)["employee_no"],
+		"address":      (*entinfo)["company_address"],
+		"scope":        (*entinfo)["business_scope"],
+		"company_code": (*entinfo)["company_code"],
+		"org_code":     (*entinfo)["org_code"],
+		"operStart":    paseDateToint64(common.ObjToString((*entinfo)["operation_startdate"])),
+		"operEnd":      paseDateToint64(common.ObjToString((*entinfo)["operation_enddate"])),
+		"establish":    paseDateToint64(common.ObjToString((*entinfo)["establish_date"])),
+		"legal":        (*entinfo)["legal_person"],
+		"phone":        (*entinfo)["company_phone"],
+		"entName":      (*entinfo)["company_name"],
+	}
+	return rData, nil
+}
+func paseDateToint64(dateStr string) (timeStamp int64) {
+	timeStamp = -1
+	if dateStr == "" {
+		return
+	}
+	if thisTime, err := time.Parse(Date_Short_Layout, dateStr); err == nil {
+		timeStamp = thisTime.Unix()
+	}
+	//企业变更部分信息时间格式2017-04-18 00:00:00.0
+	if len(strings.Split(dateStr, " ")) == 2 {
+		if thisTime, err := time.Parse(Date_Full_Layout, dateStr); err == nil {
+			timeStamp = thisTime.Unix()
+		}
+	}
+	return
+}

+ 48 - 0
service/file.go

@@ -0,0 +1,48 @@
+package service
+
+import (
+	"database/sql"
+	"time"
+
+	"app.yhyue.com/moapp/jybase/date"
+	cm "bp.jydev.jianyu360.cn/CRM/application/api/common"
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+//文件相关
+
+type File struct {
+	Name       string //附件名称
+	Suffix     string //文件后缀
+	FileType   string //文件类型,产品介绍、项目方案、立项报告、报价文件、招标文件、投标文件、中标通知书、合同、发票、其他文件
+	Size       string //文件大小
+	Oss        string //oss地址
+	BusinessId int64  //业务id
+	Types      int64  //类型;1:跟进记录-线下 2:跟进记录-线上 3:跟进记录-备忘 4:销售机会-项目文档 5:客户-客户档案
+}
+
+//Add 文件上传
+func (this *File) Add() bool {
+	//存库
+	return cm.CrmMysql.ExecTx("上传文件", func(tx *sql.Tx) bool {
+		attachmentId := cm.CrmMysql.InsertByTx(tx, "attachment", map[string]interface{}{
+			"name":        this.Name,
+			"suffix":      this.Suffix,
+			"type":        this.FileType,
+			"size":        this.Size,
+			"oss":         this.Oss,
+			"create_time": time.Now().Format(date.Date_Full_Layout),
+		})
+		pointId := cm.CrmMysql.InsertByTx(tx, "anchor_point", map[string]interface{}{
+			"attachment_id": attachmentId,
+			"business_id":   this.BusinessId,
+			"type":          this.Types,
+		})
+		if attachmentId > 0 && pointId > 0 {
+			return true
+		}
+
+		logx.Info("file add err:", attachmentId, pointId)
+		return false
+	})
+}

+ 40 - 0
service/group.go

@@ -0,0 +1,40 @@
+package service
+
+import (
+	"log"
+
+	cm "bp.jydev.jianyu360.cn/CRM/application/api/common"
+	"bp.jydev.jianyu360.cn/SocialPlatform/socialPlatform/rpc/social/social"
+	"github.com/gogf/gf/v2/os/gctx"
+)
+
+type Group struct {
+	EntId      int64
+	PositionId int64
+	UserIdArr  []int64
+	AppId      string
+	EntUserId  int64
+	AccountId  int64
+}
+
+//GroupAdd 创建群组
+//return 群组id
+func (this *Group) GroupAdd() string {
+	resp, err := cm.SocialPlatformRpc.ChatGroupAdd(gctx.New(), &social.ChatGroupAddReq{
+		EntId:      this.EntId,
+		PositionId: this.PositionId,
+		UserIdArr:  this.UserIdArr,
+		AppId:      this.AppId,
+		EntUserId:  this.EntUserId,
+		AccountId:  this.AccountId,
+	})
+	if err != nil {
+		log.Println("新建群组出错", this.PositionId, err)
+		return ""
+	} else if resp == nil {
+		log.Println("positionId用户", this.PositionId, "新建群组失败")
+		return ""
+	}
+
+	return resp.Data
+}

+ 241 - 0
service/sale_chance.go

@@ -0,0 +1,241 @@
+package service
+
+import (
+	"context"
+	"database/sql"
+	"fmt"
+	"log"
+	"strings"
+	"time"
+
+	qu "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	"bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/pb"
+	cm "bp.jydev.jianyu360.cn/CRM/application/api/common"
+	"bp.jydev.jianyu360.cn/CRM/application/entity"
+	"github.com/gogf/gf/v2/util/gconv"
+)
+
+// 线索相关
+type SaleChanceService struct {
+	BaseUserId        int64
+	PositionId        int64
+	EntUserId         int64
+	EntId             int64
+	AppId             string
+	AccountId         int64
+	EntDeptId         int64
+	ChanceName        string  //机会名称
+	Owner             string  //机会所有者
+	Summary           string  //概要信息
+	ChanceClassify    int64   //机会分类
+	ExpectedOrderTime int64   //最初预计落单段时间 时间戳
+	ExpectedMoney     float64 //最初预计落单金额
+	CustomName        string  //客户全称
+	BusinessType      int64   //业务类型
+	Remarks           string  //备注
+	NextfollowUpTime  int64   //下次跟进时间戳
+	Types             int64   //处理方式 1自办;2转办
+	User              []int64 //企业用户id
+	EmployInfoId      int64   //资讯收录id
+	CustomId          int64   //客户id
+	CreateName        string
+	ChanceSource      int64
+	OwnerId           string //潜客收录id(人脉)
+	BusinessId        string //商机收录id(人脉)
+}
+
+// Add 创建机会
+func (this *SaleChanceService) Add(ctx context.Context) (int64, string) {
+	nowtime := time.Now().Format(date.Date_Full_Layout)
+	args := []interface{}{}
+	argsTask := []interface{}{}
+	argsTaskTeam := []interface{}{}
+	//落单时间戳转时间
+	expect_deal_time := time.Unix(this.ExpectedOrderTime, 0).Format(date.Date_Full_Layout)
+	//下次跟进时间
+	nextFollowTime := time.Unix(this.NextfollowUpTime, 0).Format(date.Date_Full_Layout)
+
+	baseUserIdArr := []int64{}
+	chanceId, taskId := int64(-1), int64(-1)
+	groupId := ""
+	//判断处理方式
+	stageId := 0
+	if stageData := cm.CrmMysql.SelectBySql("select id from  config_tpl_stage where tpl_id =? order by `order` limit 1", this.BusinessType); stageData != nil && len(*stageData) > 0 {
+		stageId = gconv.Int((*stageData)[0]["id"])
+	}
+	//转办
+	if this.Types == 2 {
+		transferArr := []int64{}
+		for _, v := range this.User {
+			i_entuserid := v
+			resp, err := cm.UserCenterRpc.IdentityByEntUserId(ctx, &pb.IdentityReq{
+				Id: i_entuserid,
+			})
+			if err != nil {
+				log.Println("获取用户职位id信息出错", i_entuserid, "的信息出错", err)
+				return -1, groupId
+			} else if resp == nil {
+				log.Println("entuser用户", i_entuserid, "没有找到职位信息")
+				return -1, groupId
+			}
+			transferArr = append(transferArr, resp.PositionId)
+			baseUserIdArr = append(baseUserIdArr, resp.UserId)
+		}
+
+		args = append(args, this.PositionId, this.EntId, this.EntUserId, this.EmployInfoId, this.CustomId, this.BusinessType, this.ChanceName, this.Summary, this.ChanceClassify, qu.If(this.ExpectedOrderTime == 0, nil, expect_deal_time), qu.If(this.ExpectedMoney == 0, nil, this.ExpectedMoney), qu.If(this.Remarks == "", nil, this.Remarks), nowtime, this.CreateName, this.ChanceSource, this.OwnerId, this.BusinessId)
+		//任务
+		argsTask = append(argsTask, this.EntId, this.ChanceName+"的跟进任务", 2, this.PositionId, 1, nowtime, 1, 0, qu.If(this.NextfollowUpTime == 0, nil, nextFollowTime), this.BusinessType, stageId)
+
+		chanceId, taskId = this.SaveChange(ctx, args, argsTask, argsTaskTeam, transferArr, this.OwnerId, this.BusinessId)
+
+		if chanceId < 0 {
+			return -1, groupId
+		}
+	} else if this.Types == 1 {
+		//线索机会
+		args = append(args, this.PositionId, this.EntId, this.EntUserId, this.EmployInfoId, this.CustomId, this.BusinessType, this.ChanceName, this.Summary, this.ChanceClassify, qu.If(this.ExpectedOrderTime == 0, nil, expect_deal_time), qu.If(this.ExpectedMoney == 0, nil, this.ExpectedMoney), qu.If(this.Remarks == "", nil, this.Remarks), nowtime, this.CreateName, this.ChanceSource, this.OwnerId, this.BusinessId)
+		//任务
+		argsTask = append(argsTask, this.EntId, this.ChanceName+"的跟进任务", 2, this.PositionId, 2, nowtime, 1, 0, qu.If(this.NextfollowUpTime == 0, nil, nextFollowTime), this.BusinessType, stageId)
+		//任务团队
+		argsTaskTeam = append(argsTaskTeam, this.PositionId, this.EntUserId, this.CreateName, 1, nowtime)
+		//存库
+		chanceId, taskId = this.SaveChange(ctx, args, argsTask, argsTaskTeam, []int64{}, this.OwnerId, this.BusinessId)
+		if chanceId < 0 {
+			return -1, groupId
+		}
+		baseUserIdArr = append(baseUserIdArr, this.BaseUserId)
+
+		// //自办 创建 群聊
+		// gp := &Group{
+		// 	EntId:      this.EntId,
+		// 	PositionId: this.PositionId,
+		// 	UserIdArr:  []int64{},
+		// 	AppId:      this.AppId,
+		// 	EntUserId:  this.EntUserId,
+		// 	AccountId:  this.AccountId,
+		// }
+		// groupId = gp.GroupAdd()
+	} else if this.Types == 3 {
+		transferArr := []int64{}
+		transferArr = append(transferArr, this.PositionId)
+		args = append(args, this.PositionId, this.EntId, this.EntUserId, this.EmployInfoId, this.CustomId, this.BusinessType, this.ChanceName, this.Summary, this.ChanceClassify, qu.If(this.ExpectedOrderTime == 0, nil, expect_deal_time), qu.If(this.ExpectedMoney == 0, nil, this.ExpectedMoney), qu.If(this.Remarks == "", nil, this.Remarks), nowtime, this.CreateName, this.ChanceSource, this.OwnerId, this.BusinessId)
+		//任务
+		argsTask = append(argsTask, this.EntId, this.ChanceName+"的跟进任务", 2, this.PositionId, 1, nowtime, 1, 0, qu.If(this.NextfollowUpTime == 0, nil, nextFollowTime), this.BusinessType, stageId)
+		chanceId, taskId = this.SaveChange(ctx, args, argsTask, argsTaskTeam, transferArr, this.OwnerId, this.BusinessId)
+		if chanceId < 0 {
+			return -1, groupId
+		}
+		baseUserIdArr = append(baseUserIdArr, this.BaseUserId)
+	}
+
+	u := &User{BaseUserIds: baseUserIdArr}
+
+	if this.Types != 3 {
+		var kb strings.Builder
+		var vb strings.Builder
+		for k, v := range u.GetUserId(this.EntId) {
+			kb.WriteString(k + ",")
+			vb.WriteString(gconv.String(v) + ",")
+			userId := strings.TrimRight(kb.String(), ",")
+			positionId := strings.TrimRight(vb.String(), ",")
+
+			next := strings.Replace(time.Unix(this.NextfollowUpTime, 0).Format(YYYYMMDDHHMM), " ", "%20", -1)
+			content := ""
+			pcHref := ""
+			if this.Types == 1 {
+				pcHref = fmt.Sprintf(cm.Push.SaleChance.Create.MyselfPcHref, positionId, taskId, chanceId)
+				content = fmt.Sprintf(cm.Push.SaleChance.Create.MySelfContent, this.CreateName, strings.Replace(date.NowFormat(YYYYMMDDHHMM), " ", "%20", -1), next)
+
+			} else if this.Types == 2 {
+				pcHref = fmt.Sprintf(cm.Push.SaleChance.Create.TransferPcHref, positionId)
+				content = fmt.Sprintf(cm.Push.SaleChance.Create.TransferContent, this.CreateName, strings.Replace(date.NowFormat(YYYYMMDDHHMM), " ", "%20", -1), next)
+			}
+
+			StationMailPush(userId, positionId, cm.Push.SaleChance.Create.Title, content, pcHref, cm.Push.SaleChance.Create.MobileHref, "11")
+
+		}
+	}
+	return 1, groupId
+}
+
+// SaleChangeAdd 机会存储
+func SaleChangeAdd(tx *sql.Tx, args []interface{}) int64 {
+	fields := []string{"position_id", "ent_id", "ent_user_id", "employ_info_id", "custom_id", "tpl_id", "name", "summary", "classify", "expect_deal_time", "expect_deal_amount", "remark", "create_time", "create_person", "source", "connection_owner_id", "connection_business_id"}
+
+	_, id := cm.CrmMysql.InsertBatchByTx(tx, entity.SALE_CHANCE, fields, args)
+	//
+
+	return id
+}
+
+// Save 存库
+func (this *SaleChanceService) SaveChange(ctx context.Context, argsChange, argsTask, argsTaskTeam []interface{}, transferArr []int64, ownerId, connectionBusinessId string) (int64, int64) {
+	//存库
+	changeId, taskId := int64(-1), int64(-1)
+	cm.CrmMysql.ExecTx("创建机会", func(tx *sql.Tx) bool {
+		//
+		employ_info_id_new, _ := EmployUpdate(tx, this.EmployInfoId, 0, this.PositionId, "is_create_chance", this.EntId, this.EntUserId, this.EntDeptId)
+
+		argsChange[3] = employ_info_id_new
+
+		//插入机会
+		changeId = SaleChangeAdd(tx, argsChange)
+		//传过来的argTask没有来源id,需要append
+		argsTask = append(argsTask, changeId)
+		//任务车存储
+		taskId = TaskAdd(tx, argsTask, argsTaskTeam, transferArr, this.PositionId)
+		//操作台帐
+		ok1 := SaveLedger(ctx, this.PositionId, changeId, taskId, "创建销售机会", fmt.Sprintf("%s创建了销售机会", this.CreateName), this.CreateName)
+		//任务执行计划
+		planId := TaskExecutePlanAdd(tx, this.BusinessType, taskId)
+		//销售漏斗
+		nextFollowTime := time.Unix(this.NextfollowUpTime, 0).Format(date.Date_Full_Layout)
+		argsSalesFunnel := []interface{}{
+			changeId,
+			taskId,
+			this.ChanceName,
+			this.Summary,
+			nextFollowTime,
+			this.ExpectedMoney,
+			this.BusinessType,
+			this.EntId,
+			this.EmployInfoId,
+		}
+		SalesFunnel := saveSalesFunnel(tx, argsSalesFunnel, this.BusinessType)
+		//人脉保存
+		if ownerId != "" || connectionBusinessId != "" {
+			if connectionBusinessId != "" {
+				connectionBusinessId = encrypt.DecodeArticleId2ByCheck(connectionBusinessId)[0]
+			}
+			SaveConnection(tx, this.PositionId, connectionBusinessId, ownerId, this.EntId, this.EntDeptId, this.EntUserId)
+		}
+		if changeId > 0 && taskId > 0 && ok1 && planId > 0 && SalesFunnel > 0 {
+			return true
+		}
+		log.Println("save change err: ", changeId, taskId, ok1, planId, SalesFunnel)
+		return false
+	})
+
+	return changeId, taskId
+}
+
+// TaskExecutePlanAdd 任务执行计划存储
+func TaskExecutePlanAdd(tx *sql.Tx, tplId, taskId int64) int64 {
+	args := []interface{}{}
+	data := cm.CrmMysql.SelectBySqlByTx(tx, `SELECT a.name,b.name,b.id FROM config_tpl_stage a
+											INNER JOIN config_stage_matter b ON (b.stage_id=a.id) 
+											where  a.tpl_id=?
+											order by a.id,b.id `, tplId)
+	if data != nil && len(*data) > 0 {
+		for _, v := range *data {
+			matterId := gconv.Int(v["id"])
+			args = append(args, taskId, matterId)
+		}
+		_, id := cm.CrmMysql.InsertBatchByTx(tx, entity.TASK_EXECUTE_PLAN, []string{"task_id", "matter_id"}, args)
+		return id
+	}
+
+	return 0
+}

+ 204 - 0
service/sale_clue.go

@@ -0,0 +1,204 @@
+package service
+
+import (
+	"context"
+	"database/sql"
+	"fmt"
+	"log"
+	"strings"
+	"time"
+
+	qu "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	"bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/pb"
+	cm "bp.jydev.jianyu360.cn/CRM/application/api/common"
+	"bp.jydev.jianyu360.cn/CRM/application/entity"
+	"github.com/gogf/gf/v2/util/gconv"
+)
+
+var Se = encrypt.SimpleEncrypt{Key: "topnet"}
+var YYYYMMDDHHMM = "2006-01-02 15:04" //%20用于转义
+
+// 线索相关
+type SaleClueService struct {
+	AppId        string
+	PositionId   int64
+	EntId        int64
+	EntUserId    int64
+	BaseUserId   int64
+	AccountId    int64
+	EntDeptId    int64
+	ClueName     string
+	CluesSource  string
+	Summary      string
+	EmployInfoId int64
+	Types        int64
+	User         []int64
+	FollowUpTime int64
+	CreateName   string
+	Channel      string
+}
+
+// Add 创建线索
+// return 是否成功,群组id
+func (this *SaleClueService) Add(ctx context.Context) (int64, string) {
+	nowtime := time.Now().Format(date.Date_Full_Layout)
+	nextFollowTime := time.Unix(this.FollowUpTime, 0).Format(date.Date_Full_Layout)
+	groupId := ""
+	args := []interface{}{}
+	argsTask := []interface{}{}
+	argsTaskTeam := []interface{}{}
+	baseUserIdArr := []int64{}
+	clueId, taskId := int64(-1), int64(-1)
+	//判断处理方式
+	//转办
+	if this.Types == 2 {
+		transferArr := []int64{}
+		for _, v := range this.User {
+			i_entuserid := v
+			resp, err := cm.UserCenterRpc.IdentityByEntUserId(ctx, &pb.IdentityReq{
+				Id: i_entuserid,
+			})
+			if err != nil {
+				log.Println("获取用户职位id信息出错", i_entuserid, "的信息出错", err)
+				return -1, groupId
+			} else if resp == nil {
+				log.Println("entuser用户", i_entuserid, "没有找到职位信息")
+				return -1, groupId
+			}
+			transferArr = append(transferArr, resp.PositionId)
+			baseUserIdArr = append(baseUserIdArr, resp.UserId)
+		}
+		//线索
+		args = append(args, this.PositionId, this.EntId, this.EntUserId, this.ClueName, this.CluesSource, this.Summary, this.EmployInfoId, 0, nowtime, this.CreateName, this.Channel)
+		//任务
+		argsTask = append(argsTask, this.EntId, this.ClueName+"的跟进任务", 1, this.PositionId, 1, nowtime, 1, 0, qu.If(this.FollowUpTime == 0, nil, nextFollowTime), nil, nil)
+		clueId, taskId = Save(ctx, args, argsTask, argsTaskTeam, this.EmployInfoId, 0, this.PositionId, this.CreateName, transferArr, this.EntId, this.EntUserId, this.EntDeptId)
+		if clueId < 0 {
+			return -1, groupId
+		}
+	} else if this.Types == 1 {
+		//线索
+		args = append(args, this.PositionId, this.EntId, this.EntUserId, this.ClueName, this.CluesSource, this.Summary, this.EmployInfoId, 0, time.Now().Format(date.Date_Full_Layout), this.CreateName, this.Channel)
+		//任务
+		argsTask = append(argsTask, this.EntId, this.ClueName+"的跟进任务", 1, this.PositionId, 2, nowtime, 1, 0, qu.If(this.FollowUpTime == 0, nil, nextFollowTime), nil, nil)
+		//任务团队
+		argsTaskTeam = append(argsTaskTeam, this.PositionId, this.EntUserId, this.CreateName, 1, nowtime)
+		//存库
+		clueId, taskId = Save(ctx, args, argsTask, argsTaskTeam, this.EmployInfoId, 0, this.PositionId, this.CreateName, []int64{}, this.EntId, this.EntUserId, this.EntDeptId)
+		if clueId < 0 {
+			return -1, groupId
+		}
+		baseUserIdArr = append(baseUserIdArr, this.BaseUserId)
+
+		//自办 创建 群聊
+		// gp := &Group{
+		// 	EntId:      this.EntId,
+		// 	PositionId: this.PositionId,
+		// 	UserIdArr:  []int64{},
+		// 	AppId:      this.AppId,
+		// 	EntUserId:  this.EntUserId,
+		// 	AccountId:  this.AccountId,
+		// }
+		// groupId = gp.GroupAdd()
+	} else if this.Types == 3 {
+		transferArr := []int64{}
+		transferArr = append(transferArr, this.PositionId)
+		//线索
+		args = append(args, this.PositionId, this.EntId, this.EntUserId, this.ClueName, this.CluesSource, this.Summary, this.EmployInfoId, 0, nowtime, this.CreateName, this.Channel)
+		//任务
+		argsTask = append(argsTask, this.EntId, this.ClueName+"的跟进任务", 1, this.PositionId, 1, nowtime, 1, 0, qu.If(this.FollowUpTime == 0, nil, nextFollowTime), nil, nil)
+		clueId, taskId = Save(ctx, args, argsTask, argsTaskTeam, this.EmployInfoId, 0, this.PositionId, this.CreateName, transferArr, this.EntId, this.EntUserId, this.EntDeptId)
+		if clueId < 0 {
+			return -1, groupId
+		}
+		baseUserIdArr = append(baseUserIdArr, this.BaseUserId)
+	}
+	u := &User{BaseUserIds: baseUserIdArr}
+
+	if this.Types != 3 {
+		var kb strings.Builder
+		var vb strings.Builder
+		for k, v := range u.GetUserId(this.EntId) {
+			kb.WriteString(k + ",")
+			vb.WriteString(gconv.String(v) + ",")
+			userId := strings.TrimRight(kb.String(), ",")
+			positionId := strings.TrimRight(vb.String(), ",")
+			content, pcHref := "", ""
+			next := strings.Replace(time.Unix(this.FollowUpTime, 0).Format(YYYYMMDDHHMM), " ", "%20", -1)
+
+			if this.Types == 1 {
+				pcHref = fmt.Sprintf(cm.Push.SaleClue.Create.MyselfPcHref, positionId, taskId, clueId)
+				content = fmt.Sprintf(cm.Push.SaleClue.Create.MySelfContent, this.CreateName, strings.Replace(date.NowFormat(YYYYMMDDHHMM), " ", "%20", -1), next)
+			} else if this.Types == 2 {
+				pcHref = fmt.Sprintf(cm.Push.SaleClue.Create.TransferPcHref, positionId)
+				content = fmt.Sprintf(cm.Push.SaleClue.Create.TransferContent, this.CreateName, strings.Replace(date.NowFormat(YYYYMMDDHHMM), " ", "%20", -1), next)
+			}
+			StationMailPush(userId, positionId, cm.Push.SaleClue.Create.Title, content, pcHref, cm.Push.SaleClue.Create.MobileHref, "11")
+		}
+	}
+	return 1, groupId
+}
+
+// SaleClueAdd 线索存储
+func SaleClueAdd(tx *sql.Tx, args []interface{}) int64 {
+	fields := []string{"position_id", "ent_id", "ent_user_id", "name", "source", "summary", "employ_info_id", "is_close", "create_time", "create_person", "channel"}
+	_, id := cm.CrmMysql.InsertBatchByTx(tx, entity.SALE_CLUE, fields, args)
+	return id
+}
+
+//TaskAdd 任务车存储
+/*创建任务
+taskTransferMap 自办的map
+transferArr 转办的用户职位id
+*/
+func TaskAdd(tx *sql.Tx, args, taskTeamArgs []interface{}, transferArr []int64, positionId int64) int64 {
+	fields := []string{"ent_id", "name", "source", "create_person", "status", "create_time", "create_way", "join_task_vehicle", "next_follow_time", "tpl_id", "current_stage", "source_id"}
+	_, id := cm.CrmMysql.InsertBatchByTx(tx, entity.TASK, fields, args)
+	teamId, transferId := int64(0), int64(0)
+	if len(taskTeamArgs) > 0 {
+		//自办
+		taskTeamFields := []string{"position_id", "ent_user_id", "name", "role", "create_time", "task_id"}
+		taskTeamArgs = append(taskTeamArgs, id)
+		_, teamId = cm.CrmMysql.InsertBatchByTx(tx, entity.TASK_TEAM, taskTeamFields, taskTeamArgs)
+	} else if len(transferArr) > 0 {
+		//转办
+		taskTransferFields := []string{"transfer_id", "responsible_id", "create_time", "task_id"}
+		taskTransferArgs := []interface{}{}
+		for _, v := range transferArr {
+			taskTransferArgs = append(taskTransferArgs, positionId, v, time.Now().Format(date.Date_Full_Layout), id)
+		}
+		_, transferId = cm.CrmMysql.InsertBatchByTx(tx, entity.TASK_TRANSFER, taskTransferFields, taskTransferArgs)
+	}
+	if transferId > 0 || teamId > 0 {
+		return id
+	}
+	log.Println("task add err :", id, len(taskTeamArgs), teamId, len(transferArr), transferId)
+	return -1
+}
+
+// Save 存库
+func Save(ctx context.Context, argsClue, argsTask, argsTaskTeam []interface{}, employ_info_id, employ_custom_id, positionId int64, createName string, transferArr []int64, entId, entUserId, entDeptId int64) (int64, int64) {
+	clueId, taskId := int64(-1), int64(-1)
+	//存库
+	cm.CrmMysql.ExecTx("创建线索", func(tx *sql.Tx) bool {
+		//是否创建销售线索
+		employ_info_id_new, _ := EmployUpdate(tx, employ_info_id, employ_custom_id, positionId, "is_create_clue", entId, entUserId, entDeptId)
+		//插入线索
+		argsClue[6] = employ_info_id_new
+		clueId = SaleClueAdd(tx, argsClue)
+		//传过来的argTask没有来源id,需要append
+		argsTask = append(argsTask, clueId)
+		//任务车存储
+		taskId = TaskAdd(tx, argsTask, argsTaskTeam, transferArr, positionId)
+		//操作台帐
+		ok2 := SaveLedger(ctx, positionId, clueId, taskId, "创建销售线索", fmt.Sprintf("%s创建了销售线索", createName), createName)
+		if clueId > 0 && taskId > 0 && ok2 {
+			return true
+		}
+		log.Println("save clue err: ", clueId, taskId, ok2)
+		return false
+	})
+	return clueId, taskId
+}

+ 64 - 0
service/sendMsg.go

@@ -0,0 +1,64 @@
+package service
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"log"
+	"strconv"
+	"time"
+
+	qu "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/date"
+	cm "bp.jydev.jianyu360.cn/CRM/application/api/common"
+	"github.com/gogf/gf/v2/frame/g"
+)
+
+//将用户格式化成 123,456 格式
+func FormatUserId(useridArr []string) (userids string) {
+	userids = ""
+	for k, v := range useridArr {
+		userids += v
+		if k+1 != len(useridArr) {
+			userids += ","
+		}
+	}
+	return
+}
+
+//站内信推送 msgType 11待办 2服务通知
+func StationMailPush(userId, positionId, title, content, pcHref, mobileHref string, msgType string) bool {
+	pcLandingPage := "/front/sess/" + Se.EncodeString(positionId+",positionId,"+strconv.Itoa(int(time.Now().Unix()))+",") + "__" + Se.EncodeString(pcHref)
+	wxLandingPage := "/front/sess/" + Se.EncodeString(positionId+",positionId,"+strconv.Itoa(int(time.Now().Unix()))+",") + "__" + Se.EncodeString(mobileHref)
+	appLandingPage := "/jyapp/free/sess/" + Se.EncodeString(positionId+",positionId,"+strconv.Itoa(int(time.Now().Unix()))+",") + "__" + Se.EncodeString(mobileHref)
+	href := fmt.Sprintf("%s?_action=%s&userIds=%s&msgType=%s&title=%s&content=%s&link=%s&sendMode=2&sendTime=%s&androidUrl=%s&iosUrl=%s&weChatUrl=%s&_token=12311&reqSource=1&callPlatform=crm&menuname=message&positionIds=%s",
+		cm.Push.StationMailHref, cm.Push.StationMailAction, userId, msgType, title, content, pcLandingPage, date.NowFormat(date.Date_Short_Layout), appLandingPage, appLandingPage, wxLandingPage, positionId)
+	log.Println(href)
+	resp := Get(href, nil)
+	log.Println("resp:", resp)
+	ret := map[string]interface{}{}
+	err := json.Unmarshal([]byte(resp), &ret)
+	if err != nil {
+		return false
+	}
+	if ret != nil && len(ret) > 0 {
+		if data := qu.ObjToMap(ret["data"]); data != nil && len(*data) > 0 {
+			if qu.Int64All((*data)["status"]) != 1 {
+				return false
+			}
+		}
+	}
+	return true
+}
+
+//公共get方法
+func Get(url string, param map[string]interface{}) (str string) {
+	ctx := context.Background()
+	if r, err := g.Client().Get(ctx, url, param); err != nil {
+		log.Println("get err:", err)
+	} else {
+		defer r.Close()
+		str = r.ReadAllString()
+	}
+	return
+}

+ 48 - 0
service/user.go

@@ -0,0 +1,48 @@
+package service
+
+import (
+	"log"
+
+	"app.yhyue.com/moapp/jybase/mongodb"
+	"bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/pb"
+	cm "bp.jydev.jianyu360.cn/CRM/application/api/common"
+	"github.com/gogf/gf/v2/os/gctx"
+	"github.com/gogf/gf/v2/util/gconv"
+)
+
+type User struct {
+	BaseUserIds []int64
+}
+
+func (this *User) GetUserId(entId int64) map[string]int64 {
+	m := map[string]int64{}
+	data, ok := cm.Mgo.Find("user", map[string]interface{}{
+		"base_user_id": map[string]interface{}{
+			"$in": this.BaseUserIds,
+		},
+	}, nil, `{"_id":1,"base_user_id":1}`, false, -1, -1)
+	if ok && data != nil && len(*data) > 0 {
+		for _, v := range *data {
+			mdata := cm.BaseMysql.SelectBySql(`SELECT id FROM base_position WHERE user_id =? AND ent_id =? LIMIT 1`, gconv.Int64(v["base_user_id"]), entId)
+			if mdata != nil && len(*mdata) > 0 {
+				m[mongodb.BsonIdToSId(v["_id"])] = gconv.Int64((*mdata)[0]["id"])
+			}
+		}
+	}
+	return m
+}
+
+func (this *User) IdentityByPositionId(positionId int64) *pb.Identity {
+	resp, err := cm.UserCenterRpc.IdentityByPositionId(gctx.New(), &pb.IdentityReq{
+		Id: positionId,
+	})
+	if err != nil {
+		log.Println("获取用户职位id信息出错", positionId, "的信息出错", err)
+		return nil
+	} else if resp == nil {
+		log.Println("positionId用户", positionId, "没有找到职位信息")
+		return nil
+	}
+
+	return resp
+}

+ 130 - 0
service/util.go

@@ -0,0 +1,130 @@
+package service
+
+import (
+	"fmt"
+	"strings"
+
+	cm "bp.jydev.jianyu360.cn/CRM/application/api/common"
+	"github.com/gogf/gf/v2/util/gconv"
+)
+
+// CanAdd 是否允许多人针对一个创建
+func CanAdd(entId int64, key string, employInfoId, employCustomId, positionId int64) (status int64, error_msg string) {
+	if employInfoId <= 0 && employCustomId <= 0 {
+		return 1, ""
+	}
+	accountData := cm.BaseMysql.SelectBySql(`select * from base_service.base_account where ent_id =? and person_id =0 and type =1 limit 1`, entId)
+	if accountData == nil || len(*accountData) <= 0 {
+		return 1, ""
+	}
+	accountId := (*accountData)[0]["id"]
+	//
+	tenantData := cm.BaseMysql.SelectBySql(`select * from crm.config_tenant where account_id =?`, accountId)
+	//不允许
+	if (len(*tenantData) == 0) || (len(*tenantData) > 0 && gconv.Int((*tenantData)[0][key]) == 0) {
+		employInfoIdArr := []int64{}
+		if employInfoId > 0 {
+			employ_info := cm.BaseMysql.SelectBySql(`select id from crm.employ_info where source_id =(SELECT source_id FROM crm.employ_info WHERE id =?) and status=1`, employInfoId)
+			if employ_info != nil && len(*employ_info) > 0 {
+				for _, v := range *employ_info {
+					employInfoIdArr = append(employInfoIdArr, gconv.Int64(v["id"]))
+				}
+			} else {
+				employInfoIdArr = []int64{employInfoId}
+			}
+		} else {
+			employInfoIdArr = []int64{employInfoId}
+		}
+		args, ws := GetInForCommaArr(employInfoIdArr)
+		args = append(args, entId)
+		//判断是否已经创建
+		if strings.Contains(key, "clue") {
+			if hasZero(employInfoIdArr) {
+				return 1, ""
+			}
+			d := cm.BaseMysql.SelectBySql(`select create_person,position_id from crm.sale_clue where employ_info_id in( `+ws+`) and ent_id =? and is_close=0`, args...)
+			if d != nil && len(*d) > 0 {
+				for _, v := range *d {
+					position_id := gconv.Int64(v["position_id"])
+					if positionId == position_id {
+						return 1, ""
+					}
+					return -1, fmt.Sprintf("%v已经基于该资讯创建了线索", v["create_person"])
+				}
+			}
+		} else if strings.Contains(key, "chance") {
+			if hasZero(employInfoIdArr) {
+				return 1, ""
+			}
+			d := cm.BaseMysql.SelectBySql(`select create_person,position_id from crm.sale_chance where   employ_info_id in ( `+ws+`) and ent_id =? `, args...)
+			if d != nil && len(*d) > 0 {
+				for _, v := range *d {
+					position_id := gconv.Int64(v["position_id"])
+					if positionId == position_id {
+						return 1, ""
+					}
+					return -1, fmt.Sprintf("%v已经基于该资讯创建了机会", v["create_person"])
+				}
+			}
+
+		} else if strings.Contains(key, "custom") {
+			if employInfoId > 0 {
+				d := cm.BaseMysql.SelectBySql(`select create_person,position_id from crm.custom where   employ_info_id in( `+ws+`) and ent_id =? `, args...)
+				if d != nil && len(*d) > 0 {
+					for _, v := range *d {
+						position_id := gconv.Int64(v["position_id"])
+						if positionId == position_id {
+							return 1, ""
+						}
+						return -1, fmt.Sprintf("%v已经基于该资讯创建了客户", v["create_person"])
+					}
+				}
+			} else if employCustomId > 0 {
+				employCustomIdArr := []int64{}
+				employ_info := cm.BaseMysql.SelectBySql(`select id from crm.employ_custom where company_id =(SELECT company_id FROM crm.employ_custom WHERE id =?)`, employCustomId)
+				if employ_info != nil && len(*employ_info) > 0 {
+					for _, v := range *employ_info {
+						employCustomIdArr = append(employCustomIdArr, gconv.Int64(v["id"]))
+					}
+				} else {
+					employCustomIdArr = []int64{employCustomId}
+				}
+
+				args, ws := GetInForCommaArr(employCustomIdArr)
+				args = append(args, entId)
+				d := cm.BaseMysql.SelectBySql(`select create_person,position_id from crm.custom where   employ_custom_id in( `+ws+`) and ent_id =? `, args...)
+				if d != nil && len(*d) > 0 {
+					for _, v := range *d {
+						position_id := gconv.Int64(v["position_id"])
+						if positionId == position_id {
+							return 1, ""
+						}
+						return -1, fmt.Sprintf("%v已经基于该候选客户创建了客户", v["create_person"])
+					}
+				}
+			}
+		}
+	}
+
+	return 1, ""
+}
+
+// 获取sql语句的in操作相关参数
+func GetInForCommaArr(ids []int64) ([]interface{}, string) {
+	args := []interface{}{}
+	ws := []string{}
+	for _, v := range ids {
+		args = append(args, v)
+		ws = append(ws, "?")
+	}
+	return args, strings.Join(ws, ",")
+}
+
+func hasZero(arr []int64) bool {
+	for i := 0; i < len(arr); i++ {
+		if arr[i] == int64(0) {
+			return true
+		}
+	}
+	return false
+}