dev_aagame_provider
zhora 3 months ago
parent f2f7db7709
commit 061e6d02de
  1. 280
      call/config.go
  2. 10
      call/customer.go
  3. 94
      call/provider.go
  4. 352
      call/rank.go
  5. 19
      call/reload.go
  6. 5
      call/user.go
  7. 12
      common/activity.go
  8. 323
      common/config.go
  9. 2
      common/provider.go
  10. 61
      common/rank.go
  11. 81
      go.mod
  12. 487
      go.sum
  13. 77
      modules/backend/app/response.go
  14. 87
      modules/backend/handler/gm/control.go
  15. 9
      modules/backend/migrate.go
  16. 25
      modules/backend/values/gm.go
  17. 10
      modules/web/app/response.go
  18. 18
      modules/web/config.go
  19. 32
      modules/web/handler/account.go
  20. 78
      modules/web/handler/firstpage.go
  21. 195
      modules/web/handler/game.go
  22. 189
      modules/web/handler/rank.go
  23. 65
      modules/web/handler/user.go
  24. 2
      modules/web/middleware/cross.go
  25. 2
      modules/web/middleware/token.go
  26. 5
      modules/web/providers/all/all.go
  27. 1
      modules/web/providers/awc/base.go
  28. 1
      modules/web/providers/base/base.go
  29. 1
      modules/web/providers/gs/base.go
  30. 26
      modules/web/providers/jili2/api.go
  31. 3
      modules/web/providers/jili2/base.go
  32. 84
      modules/web/providers/jin2/api.go
  33. 76
      modules/web/providers/jin2/base.go
  34. 222
      modules/web/providers/jin2/handler.go
  35. 83
      modules/web/providers/jin2/values.go
  36. 1
      modules/web/routers/routers.go
  37. 14
      modules/web/routers/routers_account.go
  38. 2
      modules/web/routers/routers_firstpage.go
  39. 5
      modules/web/routers/routers_game.go
  40. 14
      modules/web/routers/routers_rank.go
  41. 4
      modules/web/values/account.go
  42. 44
      modules/web/values/firstpage.go
  43. 29
      modules/web/values/game.go
  44. 77
      modules/web/values/rank.go
  45. 175
      z_script/tunnel/tunnelProcess.go

@ -3,6 +3,7 @@ package call
import (
"encoding/json"
"errors"
jsoniter "github.com/json-iterator/go"
"net"
"server/common"
"server/config"
@ -72,6 +73,11 @@ var (
configCustomerRobot []*common.ConfigCustomerRobot
customerOrderLabel []*common.CustomerOrderLabel
configCustomer *common.ConfigCustomer
configGameClassify []*common.ConfigGameClassify
configRank []*common.ConfigRank
configGameTag []*common.ConfigGameTag
configShowGameTag []*common.ConfigShowGameTag
configGameListAll []*common.ConfigGameList
)
var (
@ -564,6 +570,20 @@ func LoadGames() (err error) {
}
list := []*common.ConfigGameList{}
for _, v := range tmplist {
if v.TagIdMap == nil {
v.TagIdMap = make(map[int]struct{})
}
if v.TagIds != "" {
var tagIds []int
err = jsoniter.UnmarshalFromString(v.TagIds, &tagIds)
if err != nil {
log.Error("unmarshal tagIds err, %s", err.Error())
} else {
for _, tagId := range tagIds {
v.TagIdMap[tagId] = struct{}{}
}
}
}
for _, k := range providers {
if v.GameProvider == k.ProviderID {
if k.Open == 1 { // 特殊过滤
@ -594,6 +614,7 @@ func LoadGames() (err error) {
// return list[i].Sort < list[j].Sort
// })
configGameList = list
configGameListAll = tmplist
return nil
}
@ -788,15 +809,6 @@ func GetConfigGameListByType(t int) []*common.ConfigGameList {
return ret
}
func GetConfigGameListByCode(provider int, gameCode string) *common.ConfigGameList {
for _, v := range configGameList {
if v.GameProvider == provider && v.GameCode == gameCode {
return v
}
}
return nil
}
// 游戏类别配置
func LoadConfigGameTypes() (err error) {
one := []*common.ConfigGameType{}
@ -1280,10 +1292,13 @@ func LoadConfigBanner() (err error) {
return err
}
configBanner = list
sort.Slice(configBanner, func(i, j int) bool {
return configBanner[i].Sort > configBanner[j].Sort
})
return nil
}
func GetConfigBanner(uid int) []*common.ConfigBanner {
func GetConfigBanner(uid, tagId int) []*common.ConfigBanner {
list := []*common.ConfigBanner{}
for _, v := range configBanner {
if !v.IsValid() {
@ -1292,6 +1307,9 @@ func GetConfigBanner(uid int) []*common.ConfigBanner {
if v.ActivityID == common.ActivityIDFirstRechargeBack && !ShouldShowActivityFirstRechargeBack(uid) {
continue
}
if v.TagId != tagId {
continue
}
list = append(list, v)
}
return list
@ -1674,3 +1692,245 @@ func GetConfigRobotRankRuleByDay(day int) (ret common.ConfigShareRankRule) {
}
return
}
func LoadConfigRank() (err error) {
var list []*common.ConfigRank
if _, err = db.Mysql().QueryAll("open = 1", "", &common.ConfigRank{}, &list); err != nil {
log.Error("err:%v", err)
return err
}
for _, rank := range list {
if rank.RankCycle != "" {
err = jsoniter.UnmarshalFromString(rank.RankCycle, &rank.RankCycleMap)
if err != nil {
log.Error("unmarshal RankCycle err, %+v, %s", *rank, err.Error())
return
}
}
if rank.FreeRates != "" {
err = jsoniter.UnmarshalFromString(rank.FreeRates, &rank.FreeRatesMap)
if err != nil {
log.Error("unmarshal FreeRates err, %+v, %s", *rank, err.Error())
return
}
}
if rank.RankAwards != "" {
var tmpRankAwards map[string]string
rank.RankAwardsMap = make(map[string][]common.RankAward)
err = jsoniter.UnmarshalFromString(rank.RankAwards, &tmpRankAwards)
if err != nil {
log.Error("unmarshal RankAwards err, %+v, %s", *rank, err.Error())
return
}
if len(tmpRankAwards) == 0 {
log.Error("rankAwards is nil, %+v", *rank)
return
}
for rankCycle, awards := range tmpRankAwards {
var tmpAwards []common.RankAward
err = jsoniter.UnmarshalFromString(awards, &tmpAwards)
if err != nil {
log.Error("unmarshal awards details err, %+v, %s", *rank, err.Error())
return
}
rank.RankAwardsMap[rankCycle] = tmpAwards
}
}
if rank.RobotRank != "" {
rank.RobotRank = strings.ReplaceAll(rank.RobotRank, " ", "")
rank.RobotRankMap = make(map[int]struct{})
robotRanks := strings.Split(rank.RobotRank, ",")
for _, rankInterval := range robotRanks {
if strings.Contains(rankInterval, "-") {
rankIntervalDetails := strings.Split(rankInterval, "-")
if len(rankIntervalDetails) != 2 {
log.Error("rankInterval is wrong, %+v, %s", *rank, rankIntervalDetails)
return
}
for i := util.ToInt(rankIntervalDetails[0]); i <= util.ToInt(rankIntervalDetails[1]); i++ {
rank.RobotRankMap[i] = struct{}{}
}
} else {
rankNum := util.ToInt(rankInterval)
if rankNum == 0 {
log.Error("rankInterval is wrong, %+v, %s", *rank, rankInterval)
return
}
rank.RobotRankMap[rankNum] = struct{}{}
}
}
}
}
configRank = list
return nil
}
func GetConfigRank(rankType int) (result []*common.ConfigRank) {
if len(configRank) == 0 {
LoadConfigRank()
}
for _, v := range configRank {
if rankType != 0 && v.RankType != rankType {
continue
}
result = append(result, v)
}
return
}
func GetConfigRankByCycle(rankType int, cycle string) (result *common.ConfigRank) {
if len(configRank) == 0 {
LoadConfigRank()
}
for _, v := range configRank {
if rankType != 0 && v.RankType != rankType {
continue
}
if cycle != "" {
if _, ok := v.RankCycleMap[cycle]; !ok {
continue
}
}
return v
}
return
}
func GetConfigRankById(rankId int) (result *common.ConfigRank) {
if len(configRank) == 0 {
LoadConfigRank()
}
for _, v := range configRank {
if v.ID != rankId {
continue
}
result = v
return
}
return
}
func LoadConfigGameTag() (err error) {
var list []*common.ConfigGameTag
if _, err = db.Mysql().QueryAll("`show`=1", "", &common.ConfigGameTag{}, &list); err != nil {
log.Error("err:%v", err)
return err
}
configGameTag = list
sort.Slice(configGameTag, func(i, j int) bool {
return configGameTag[i].Sort > configGameTag[j].Sort
})
return nil
}
func GetConfigGameTag() (result []*common.ConfigGameTag) {
if len(configGameTag) == 0 {
LoadConfigGameTag()
}
result = configGameTag
return
}
func GetConfigGameTagByIds(ids []int) (result []*common.ConfigGameTag) {
if len(configGameTag) == 0 {
LoadConfigGameTag()
}
for _, v := range configGameTag {
if util.SliceContain(ids, v.TagId) {
result = append(result, v)
}
}
sort.Slice(result, func(i, j int) bool {
return result[i].Sort > result[j].Sort
})
return
}
func GetGameListByTags(tagIds []int) (result []*common.ConfigGameList) {
for _, v := range configGameListAll {
contain := true
for _, tagId := range tagIds {
_, ok := v.TagIdMap[tagId]
if !ok {
contain = false
break
}
}
if contain {
result = append(result, v)
}
}
sort.Slice(result, func(i, j int) bool {
return result[i].Sort > result[j].Sort
})
return result
}
func GetConfigGameListByCode(provider int, gameCode string) *common.ConfigGameList {
for _, v := range configGameListAll {
if v.GameProvider == provider && v.GameCode == gameCode {
return v
}
}
return nil
}
func GetGameListByByID(providerID int, gameID int) (result *common.ConfigGameList) {
for _, v := range configGameListAll {
if v.GameProvider != providerID && v.GameID != gameID {
continue
}
return v
}
return nil
}
func GetGameListAll() (result []*common.ConfigGameList) {
return configGameListAll
}
func LoadConfigShowGameTag() (err error) {
var list []*common.ConfigShowGameTag
if _, err = db.Mysql().QueryAll("", "", &common.ConfigShowGameTag{}, &list); err != nil {
log.Error("err:%v", err)
return err
}
for _, v := range list {
if v.ShowTagIds != "" {
err = jsoniter.UnmarshalFromString(v.ShowTagIds, &v.ShowTagIdsInt)
if err != nil {
log.Error("unmarshal ShowTagIds err, %s, %+v", err.Error(), *v)
return
}
}
}
configShowGameTag = list
sort.Slice(configGameTag, func(i, j int) bool {
return configGameTag[i].Sort > configGameTag[j].Sort
})
return nil
}
func GetConfigShowGameTag(id int) (result []*common.ConfigShowGameTag) {
if len(configShowGameTag) == 0 {
LoadConfigShowGameTag()
}
result = make([]*common.ConfigShowGameTag, 0, len(configGameTag))
for _, v := range configShowGameTag {
if id != 0 && id != v.TagId {
continue
}
result = append(result, v)
}
return
}
func GetConfigShowGameTagIds() (result []int) {
if len(configShowGameTag) == 0 {
LoadConfigShowGameTag()
}
for _, v := range configShowGameTag {
result = append(result, v.TagId)
}
return
}

@ -94,3 +94,13 @@ func GetConfigCustomer() *common.ConfigCustomer {
}
return configCustomer
}
func LoadConfigGameClassify() (err error) {
var result []*common.ConfigGameClassify
if _, err = db.Mysql().QueryAll("open=1", "", &common.ConfigGameClassify{}, &result); err != nil {
log.Error("err:%v", err)
return err
}
configGameClassify = result
return nil
}

@ -0,0 +1,94 @@
package call
import (
"server/common"
)
var (
configProviderGameList []*common.ConfigProviderGameList
configProviderGameListAll []*common.ConfigProviderGameList
)
//func LoadGames() (err error) {
// if gameListTimer != nil {
// gameListTimer.Reset(gameListReloadTime)
// } else {
// // 每分钟刷新一次
// gameListTimer = time.AfterFunc(gameListReloadTime, func() {
// LoadGames()
// })
// }
// providers := []*common.ConfigGameProvider{}
// if _, err = db.Mysql().QueryAll("", "sort", &common.ConfigGameProvider{}, &providers); err != nil {
// log.Error("err:%v", err)
// return err
// }
// for _, v := range providers {
// if v.WhiteIPs != "" {
// err := json.Unmarshal([]byte(v.WhiteIPs), &v.SubIp)
// if err != nil {
// log.Error("err:%v", err)
// }
// }
// }
// tmplist := []*common.ConfigProviderGameList{}
// if _, err = db.Mysql().QueryAll("open = 1", "sort desc", &common.ConfigProviderGameList{}, &tmplist); err != nil {
// log.Error("err:%v", err)
// return err
// }
// list := []*common.ConfigProviderGameList{}
// for _, v := range tmplist {
// if v.TagIdMap == nil {
// v.TagIdMap = make(map[int]struct{})
// }
// if v.TagIds != "" {
// var tagIds []int
// err = jsoniter.UnmarshalFromString(v.TagIds, &tagIds)
// if err != nil {
// log.Error("unmarshal tagIds err, %s", err.Error())
// } else {
// for _, tagId := range tagIds {
// v.TagIdMap[tagId] = struct{}{}
// }
// }
// }
// for _, k := range providers {
// if v.GameProvider == k.ProviderID {
// if k.Open == 1 { // 特殊过滤
// list = append(list, v)
// }
// break
// }
// }
// }
// for _, v := range providers {
// count := 0
// for _, j := range list {
// if j.GameProvider == v.ProviderID {
// count++
// }
// }
// v.GamesNum = count
// }
// configGameProvider = providers
// configProviderGameList = list
// configProviderGameListAll = tmplist
// return nil
//}
func GetConfigProviderGameListByID(provider, gameID int) *common.ConfigProviderGameList {
for _, v := range configProviderGameList {
if v.GameProvider == provider && v.GameID == gameID {
return v
}
}
return nil
}
func GetProviderGameRtp(uid int) int {
return 1
}
func GetProviderUserName(name string) string {
return "c" + name
}

@ -0,0 +1,352 @@
package call
import (
"context"
"fmt"
"github.com/liangdas/mqant/log"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"server/common"
"server/db"
"server/util"
"time"
)
var rankTimerMap map[string]*rankTicker
type rankTicker struct {
timer *time.Ticker
ctx context.Context
ctxCancel context.CancelFunc
rankType int
rankCycle string
activityId int
}
func getRankTimerKey(rankType int, rankCycle string) string {
return fmt.Sprintf("rank|%d|%s", rankType, rankCycle)
}
func getRankJackpotKey(rankType int, rankCycle string) (rankAt, awardAt time.Time, expired int64, key string) {
now := time.Now()
key = fmt.Sprintf("rank_jackpot|%d|%s", rankType, rankCycle)
switch rankCycle {
case "1":
rankAt = util.GetZeroTime(now)
awardAt = rankAt.AddDate(0, 0, 1)
expired = int64(rankAt.AddDate(0, 0, 2).Sub(now).Seconds())
case "2":
rankAt = util.GetWeekZeroTime(now)
awardAt = rankAt.AddDate(0, 0, 7)
expired = int64(rankAt.AddDate(0, 0, 14).Sub(now).Seconds())
case "3":
rankAt = util.GetFirstDateOfMonth(now)
awardAt = rankAt.AddDate(0, 1, 0)
expired = int64(rankAt.AddDate(0, 2, 0).Sub(now).Seconds())
}
key += fmt.Sprintf("|%s", rankAt.Format("20060102"))
return
}
func getRankJackpotPreKey(rankType int, rankCycle string) (lastRankAt time.Time, key string) {
now := time.Now()
key = fmt.Sprintf("rank_jackpot|%d|%s", rankType, rankCycle)
switch rankCycle {
case "1":
lastRankAt = util.GetZeroTime(now).AddDate(0, 0, -1)
case "2":
lastRankAt = util.GetWeekZeroTime(now).AddDate(0, 0, -7)
case "3":
lastRankAt = util.GetFirstDateOfMonth(now).AddDate(0, -1, 0)
}
key += fmt.Sprintf("|%s", lastRankAt.Format("20060102"))
return
}
// RankHandler 加载排行榜发奖程序
func RankHandler() {
configRanks := GetConfigRank(0)
if len(configRanks) == 0 {
return
}
now := time.Now()
if rankTimerMap == nil {
rankTimerMap = make(map[string]*rankTicker)
}
for _, rank := range configRanks {
var (
rankType = rank.RankType
awardAt time.Time
)
for rankCycle := range rank.RankCycleMap {
switch rankCycle {
case "1":
awardAt = util.GetZeroTime(now.AddDate(0, 0, 1)).Add(time.Hour)
case "2":
awardAt = util.GetWeekZeroTime(now).AddDate(0, 0, 7).Add(2 * time.Hour)
case "3":
awardAt = util.GetFirstDateOfMonth(now).AddDate(0, 1, 0).Add(2 * time.Hour)
}
if awardAt.IsZero() {
log.Error("get award time err, %+v, %s", *rank, rankCycle)
continue
}
timerKey := getRankTimerKey(rankType, rankCycle)
rankTimer, ok := rankTimerMap[timerKey]
if ok {
// notice: 覆盖之前的
rankTimer.ctxCancel()
}
ctx, cancel := context.WithCancel(context.Background())
rankTimerMap[timerKey] = &rankTicker{
timer: time.NewTicker(awardAt.Sub(time.Now())),
ctx: ctx,
ctxCancel: cancel,
rankType: rankType,
rankCycle: rankCycle,
activityId: rank.ID,
}
go func(ticker *rankTicker) {
defer util.Recover()
for {
select {
case <-ticker.timer.C:
rankAward(ticker)
case <-ticker.ctx.Done():
ticker.timer.Stop()
return
}
}
}(rankTimerMap[timerKey])
}
}
}
// rankAward 发奖逻辑
func rankAward(ticker *rankTicker) {
rankConfig := GetConfigRankById(ticker.activityId)
if rankConfig == nil {
log.Error("rankAward, get rankConfig wrong, %d", ticker.activityId)
return
}
_, ok := rankConfig.RankCycleMap[ticker.rankCycle]
if !ok {
log.Error("rankAward, get rankConfig by cycle wrong, %s, %+v", ticker.rankCycle, *rankConfig)
return
}
// 重刷排行榜
rankUserRefresh()
// 获取上一期排行榜时间
rankAt, jackpotKey := getRankJackpotPreKey(rankConfig.RankType, rankConfig.RankCycle)
// 获取上一期排行榜奖池
jackpot := RankJackpotPreGet(rankConfig.RankType, rankConfig.RankCycle)
// 获取上一期排行榜用户排名
rankUsers, err := rankAwardUsersGet(rankConfig.RankType, rankConfig.RankCycle, rankAt)
if err != nil {
log.Error("rankAward, %s get rank award users err, %s, %s, rank:%+v", jackpotKey, err.Error(), rankConfig.RankCycle, *rankConfig)
return
}
rankAwards := make(map[int]*common.RankAward)
lessJackpot := jackpot
log.Debug("rankAward, %s jackpot:%d", jackpotKey, jackpot)
// 用户发奖
for _, v := range rankConfig.RankAwardsMap[ticker.rankCycle] {
for index := v.SmallRank; index <= v.LargeRank; index++ {
rankAwards[index] = &v
}
}
for index, rankData := range rankUsers {
if rankData.Rank != 0 {
// todo 兼容发奖错误,重新发奖
continue
}
var (
rank = index + 1
userAwardCount int64
userAward int
)
award, exist := rankAwards[rank]
if exist {
userAward = award.AwardRate
userAwardCount = int64(userAward) * jackpot / 10000
lessJackpot -= userAwardCount
}
if userAwardCount < 0 {
userAwardCount = 0
}
err = db.Mysql().C().Model(&common.RankData{}).
Where("id = ?", rankData.ID).
Updates(map[string]interface{}{
"user_award": userAward,
"user_award_count": userAwardCount,
"rank": rank,
"updated_at": time.Now().Unix(),
}).Error
if err != nil {
log.Error("rankAward, %s update rankData err, %s", jackpotKey, err.Error())
continue
}
// todo 给玩家邮件发奖
// 重置上一期奖池数量
if lessJackpot > 0 {
log.Debug("rankAward, %s less jackpot:%d", jackpotKey, lessJackpot)
err = db.Redis().GetRedis().Set(context.Background(), jackpotKey, lessJackpot, 0).Err()
if err != nil {
log.Error("rankAward, %s set less-jackpot err, %s", jackpotKey, err.Error())
}
_, _, _, jackpotKeyNow := getRankJackpotKey(rankConfig.RankType, rankConfig.RankCycle)
_, err = db.Redis().Incr(jackpotKeyNow, lessJackpot)
if err != nil {
log.Error("rankAward, %s:%s incr less-jackpot err, %s", jackpotKey, jackpotKeyNow, err.Error())
}
}
}
}
// UpdateRankValue 更新玩家数值(mode:1打码,2充值)
func UpdateRankValue(mode int, uid int, updateValue int64) {
configRanks := GetConfigRank(mode)
if len(configRanks) == 0 {
return
}
now := time.Now()
for _, rank := range configRanks {
for rankCycle := range rank.RankCycleMap {
freeRate, ok := rank.FreeRatesMap[rankCycle]
if !ok {
continue
}
updateValueReal := updateValue * int64(freeRate) / 10000
rankAt, _, expired, rankKey := getRankJackpotKey(rank.RankType, rankCycle)
rankData := common.RankData{
UID: uid,
RankType: rank.RankType,
RankCycle: util.ToInt(rank.RankCycle),
RankAt: rankAt.Unix(),
RankValue: updateValueReal,
UpdatedAt: now.Unix(),
}
updates := map[string]interface{}{
"rank_value": gorm.Expr(fmt.Sprintf("rank_value + %d", rankData.RankValue)),
"updated_at": rankData.UpdatedAt,
}
_, err := db.Redis().Incr(rankKey, updateValueReal)
if err != nil {
log.Error("update rank jackpot err, %s:%s", rankKey, err.Error())
continue
}
db.Redis().Expire(rankKey, time.Duration(expired)*time.Second)
err = db.Mysql().C().Model(&common.RankData{}).Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "rank_type"}, {Name: "rank_cycle"}, {Name: "rank_at"}, {Name: "uid"}},
DoUpdates: clause.Assignments(updates),
}).Create(&rankData).Error
if err != nil {
log.Error("update rank value err, %s, %+v", err.Error(), rankData)
_, err = db.Redis().Incr(rankKey, updateValueReal*-1)
continue
}
}
}
}
// RankJackpotGet 获取当期奖池信息
func RankJackpotGet(rankType int, rankCycle string) (jackpot, rankLess int64) {
_, awardAt, _, rankKey := getRankJackpotKey(rankType, rankCycle)
jackpot = db.Redis().GetInt64(rankKey)
rankLess = int64(awardAt.Sub(time.Now()).Seconds())
return
}
// RankJackpotPreGet 获取上一期奖池
func RankJackpotPreGet(rankType int, rankCycle string) (jackpot int64) {
_, rankKey := getRankJackpotPreKey(rankType, rankCycle)
return db.Redis().GetInt64(rankKey)
}
// rankUserRefresh 刷新用户数据
func rankUserRefresh() {
// todo 根据机器人排行规则排行
}
// rankUsersGet 获取排行用户
func rankUsersGet(rankType int, rankCycle string, rankAt time.Time, page, pageSize int) (rankUsers []*common.RankDataWithUser, count int64, err error) {
log.Debug("rankCycle:%s, rankAt:%d", rankCycle, rankAt.Unix())
// 获取总数
countQuery := db.Mysql().C().
Model(&common.RankData{}).
Where("rank_type = ? and rank_cycle = ? and rank_at = ?",
rankType, util.ToInt(rankCycle), rankAt.Unix())
err = countQuery.Count(&count).Error
if err != nil {
log.Error("get rank user count err, %s", err.Error())
return
}
query := db.Mysql().C().
Table("rank_data rd").
Select("rd.*, u.*").
Joins("LEFT JOIN users u ON rd.uid = u.id").
Where("rd.rank_type = ? and rd.rank_cycle = ? and rd.rank_at = ?",
rankType, util.ToInt(rankCycle), rankAt.Unix()).
Order("rd.rank_value desc, rd.updated_at").
Offset((page - 1) * pageSize).
Limit(pageSize)
err = query.Find(&rankUsers).Error
if err != nil {
log.Error("get rank user with info err, %s", err.Error())
return
}
return
}
// RankUsersGet 获取当前排行榜用户
func RankUsersGet(rankType int, rankCycle string, page, pageSize int) (rankUsers []*common.RankDataWithUser, count int64, err error) {
rankAt, _, _, _ := getRankJackpotKey(rankType, rankCycle)
if rankAt.Sub(time.Now()).Minutes() > 5 {
rankUserRefresh()
}
return rankUsersGet(rankType, rankCycle, rankAt, page, pageSize)
}
// RankUsersPreGet 获取上一期排行榜用户
func RankUsersPreGet(rankType int, rankCycle string, page, pageSize int) (rankUsers []*common.RankDataWithUser, count int64, err error) {
rankAt, _ := getRankJackpotPreKey(rankType, rankCycle)
return rankUsersGet(rankType, rankCycle, rankAt, page, pageSize)
}
// rankAwardUsersGet
func rankAwardUsersGet(rankType int, rankCycle string, rankAt time.Time) (rankData []*common.RankData, err error) {
log.Debug("rankCycle:%s, rankAt:%d", rankCycle, rankAt.Unix())
mdb := db.Mysql().C().
Model(&common.RankData{}).
Where("rank_type = ? and rank_cycle = ? and rank_at = ?",
rankType, util.ToInt(rankCycle), rankAt.Unix())
err = mdb.Order("rank_value desc,updated_at").Find(&rankData).Error
if err != nil {
log.Error("get rank user with info err, %s", err.Error())
return
}
return
}
// UserRankAwardRecord 玩家排行榜记录
func UserRankAwardRecord(uid, page, pageSize int) (rankUsers []common.RankData, count int64, err error) {
mdb := db.Mysql().C().Model(&common.RankData{}).Where("uid = ? and `rank` != 0", uid)
err = mdb.Count(&count).Error
if err != nil {
log.Error("get rank award count err, %s", err.Error())
return
}
err = mdb.Order("rank_at desc").Offset((page - 1) * pageSize).Limit(pageSize).Find(&rankUsers).Error
if err != nil {
log.Error("get rank award err, %s", err.Error())
return
}
return
}

@ -533,5 +533,22 @@ func CommonReload(c map[int][]func(*pb.ReloadGameConfig) error) {
return nil
}}
}
// /////
if _, ok := c[common.ReloadConfigGameClassify]; !ok {
c[common.ReloadConfigGameClassify] = []func(*pb.ReloadGameConfig) error{func(rgc *pb.ReloadGameConfig) error {
if err := LoadConfigGameClassify(); err != nil {
log.Error("error : [%s]", err.Error())
return err
}
return nil
}}
}
if _, ok := c[common.ReloadConfigGameTag]; !ok {
c[common.ReloadConfigGameTag] = []func(*pb.ReloadGameConfig) error{func(rgc *pb.ReloadGameConfig) error {
if err := LoadConfigGameTag(); err != nil {
log.Error("error : [%s]", err.Error())
return err
}
return nil
}}
}
}

@ -794,7 +794,10 @@ func GetUserRtp(uid int) *common.PlayerRtpData {
func GetRtpControl(uid int) int {
rechargeInfo := GetRechargeInfo(uid)
cash := GetUserCurrency(uid, common.CurrencyINR)
withdrawRechargePer := (rechargeInfo.TotalWithdraw + rechargeInfo.WithdrawingCash + cash) * 100 / rechargeInfo.TotalRecharge
var withdrawRechargePer int64
if rechargeInfo.TotalRecharge > 0 {
withdrawRechargePer = (rechargeInfo.TotalWithdraw + rechargeInfo.WithdrawingCash + cash) * 100 / rechargeInfo.TotalRecharge
}
rtpConf := GetConfigRTPByAmount(rechargeInfo.TotalRecharge)
rtpData := GetUserRtp(uid)
// 1.优先玩家配置

@ -37,16 +37,18 @@ const (
// ConfigBanner banner配置
type ConfigBanner struct {
ID int `gorm:"primary_key;AUTO_INCREMENT;column:id" json:"ID" web:"id"`
ActivityID int `gorm:"column:activity_id;uniqueIndex:activity_id" json:"ActivityID" web:"activity_id"`
Sort int `gorm:"column:sort;type:int(11);" json:"Sort" web:"sort"`
Start int64 `gorm:"column:start;type:bigint(20);" json:"Start" web:"start"`
End int64 `gorm:"column:end;type:bigint(20);" json:"End" web:"end"`
ActivityID int `gorm:"column:activity_id;type:int(11);default:0" json:"ActivityID" web:"activity_id"`
Sort int `gorm:"column:sort;type:int(11);default:1" json:"Sort" web:"sort"`
Start int64 `gorm:"column:start;type:bigint(20);default:0" json:"Start" web:"start"`
End int64 `gorm:"column:end;type:bigint(20);default:0" json:"End" web:"end"`
IsRelease int `gorm:"column:is_release;type:int(11);default:1;comment:是否开启 1关闭 2开启" json:"IsRelease" web:"is_release"`
Push int `gorm:"column:push;type:int(11);default:1;comment:是否推送 1不推送 2推送" json:"Push" web:"push"`
PushFrequency int `gorm:"column:push_frequency;type:int(11);default:1;comment:推送频率" json:"PushFrequency" web:"push_frequency"`
Type int `gorm:"column:type;type:int(11);default:1;comment:类型" json:"Type" web:"type"`
Type int `gorm:"column:type;type:int(11);default:1;comment:类型(1:游戏分类,2:web跳转,3:活动,4:支付)" json:"Type" web:"type"`
JumpUrl string `gorm:"column:jump_url;type:varchar(255);comment:跳转链接" json:"JumpUrl" web:"jump_url"`
Pic string `gorm:"column:pic;type:varchar(255);comment:活动图片" json:"Pic" web:"pic"`
Data string `gorm:"column:data;type:varchar(255);comment:跳转数据" json:"Data" web:"data"`
TagId int `gorm:"column:tag_id;type:int(11);default:0;comment:标签id(0表示首页展示)" json:"TagId" web:"tag_id"`
}
func (c *ConfigBanner) TableName() string {

@ -59,6 +59,10 @@ const (
ReloadConfigCustomerRobot // 客服系统机器人配置
ReloadConfigCustomerLabel // 客服系统订单标签
ReloadConfigCustomer // 客服系统订单标签
ReloadConfigGameClassify
ReloadConfigRank
ReloadConfigGameTag
ReloadConfigShowGameTag
)
// GetConfigStructByType 获取相应配置的结构
@ -158,6 +162,14 @@ func GetConfigStructByType(t int) (interface{}, interface{}) {
return &ConfigShareRankReward{}, &[]ConfigShareRankReward{}
case ReloadConfigRankRule:
return &ConfigShareRankRule{}, &[]ConfigShareRankRule{}
case ReloadConfigGameClassify:
return &ConfigGameClassify{}, &[]ConfigGameClassify{}
case ReloadConfigRank:
return &ConfigRank{}, &[]ConfigRank{}
case ReloadConfigGameTag:
return &ConfigGameTag{}, &[]ConfigGameTag{}
case ReloadConfigShowGameTag:
return &ConfigShowGameTag{}, &[]ConfigShowGameTag{}
default:
return nil, nil
}
@ -349,98 +361,6 @@ func (c *ConfigWithdrawProduct) TableName() string {
return "config_withdraw_product"
}
// ConfigGameList 游戏列表配置
// GameID 游戏id
// Icon 游戏图标
// URL 跳转url
// GameProvider 提供商id
// Mark 角标
// Sort 排序(玩家每玩一次,sort值会自增1)
// Jackpot 奖池
// Demo 是否支持demo 1支持 2不支持
// SubID 一些游戏有子id 如桌子号
type ConfigGameList struct {
ID int `gorm:"primarykey"`
GameID int `gorm:"column:game_id;not null;type:int(11);uniqueIndex:game;comment:游戏id" web:"game_id"`
GameCode string `gorm:"column:game_code;type:varchar(255);default:'';comment:一些游戏的唯一识别" web:"game_code"`
GameType int `gorm:"column:game_type;not null;type:int(11);comment:游戏类别id" web:"game_type"`
Name string `gorm:"column:name;not null;type:varchar(255);comment:游戏名" web:"name"`
Icon string `gorm:"column:icon;type:varchar(255);comment:游戏图标" web:"icon"`
URL string `gorm:"column:url;type:varchar(255);comment:跳转地址" web:"url"`
GameProvider int `gorm:"column:game_provider;not null;type:int(11);uniqueIndex:game;comment:游戏提供商" web:"game_provider"`
Mark int `gorm:"column:mark;default:0;type:int(11);comment:角标" web:"mark"`
Sort uint64 `gorm:"column:sort;type:bigint(20);comment:游戏排序,玩家每玩一次,sort值会自增1" web:"sort"`
Open int `gorm:"column:open;type:int(11);default:1;comment:是否开启 1开2不开" web:"open"`
Orientation int `gorm:"column:orientation;type:int(11);default:1;comment:横屏竖屏 1竖屏2横屏3两者都可" web:"orientation"`
Demo int `gorm:"column:demo;type:int(11);default:1;comment:是否支持demo 1支持 2不支持" web:"demo"`
SubID string `gorm:"column:subid;type:varchar(255);default:'';comment:一些游戏有子id" web:"subid"`
Jackpot int64 `gorm:"-" web:"-"`
MaxReward int64 `gorm:"-" web:"-" redis:"maxReward"` // 最大奖励
PlayerNumber int64 `gorm:"-" web:"-" redis:"number"` // 游玩人数
RTP int64 `gorm:"-" web:"-" redis:"rtp"` // rtp
}
func (c *ConfigGameList) TableName() string {
return "config_game_list"
}
// ConfigGameProvider 游戏提供商配置
type ConfigGameProvider struct {
ID int `gorm:"primarykey"`
ProviderID int `gorm:"column:provider_id;not null;type:int(11);uniqueIndex:id;comment:游戏提供商id"`
ProviderName string `gorm:"column:provider_name;type:varchar(255);comment:游戏提供商名称" web:"provider_name"`
Icon string `gorm:"column:icon;type:varchar(255);comment:供应商图标" web:"icon"`
Sort int `gorm:"column:sort;type:int(11);comment:供应商排序" web:"sort"`
Callback string `gorm:"column:callback;type:varchar(255);comment:回调地址" web:"callback"`
WhiteIPs string `gorm:"column:white_ips;type:varchar(1024);comment:ip白名单" web:"white_ips"`
SubIp []string `gorm:"-" web:"-"`
GamesNum int `gorm:"-" web:"-"`
Open int `gorm:"column:open;type:int(11);default:1;comment:是否开启 1开2不开" web:"open"`
Show int `gorm:"column:show;type:int(11);default:1;comment:是否显示在banner栏 1显示2不显示" web:"show"`
Method int `gorm:"column:method;type:int(11);default:1;comment:打开方式 1正常url 2html格式" web:"method"`
}
func (c *ConfigGameProvider) TableName() string {
return "config_game_provider"
}
func (c *ConfigGameProvider) IsIpWhite(ip string) bool {
if len(c.SubIp) == 0 {
return true
}
for _, v := range c.SubIp {
if v == ip {
return true
}
}
return false
}
type ConfigGameType struct {
ID int `gorm:"primarykey"`
TypeID int `gorm:"column:type_id;not null;type:int(11);uniqueIndex:type_id;comment:游戏类别id" web:"type_id"`
TypeName string `gorm:"column:type_name;type:varchar(64);comment:游戏类别名" web:"type_name"`
Icon string `gorm:"column:icon;type:varchar(255);comment:游戏类别图标" web:"icon"`
Sort int `gorm:"column:sort;type:int(11);comment:排序" web:"sort"`
Open int `gorm:"column:open;type:int(11);default:0;comment:是否打开 1打开" web:"open"`
}
func (c *ConfigGameType) TableName() string {
return "config_game_type"
}
type ConfigGameMark struct {
ID int `gorm:"primarykey"`
MarkID int `gorm:"column:mark_id;not null;type:int(11);uniqueIndex:type_id;comment:游戏角标id" web:"mark_id"`
MarkName string `gorm:"column:mark_name;type:varchar(64);comment:游戏角标名" web:"mark_name"`
Icon string `gorm:"column:icon;type:varchar(255);comment:游戏角标图标" web:"icon"`
Sort int `gorm:"column:sort;type:int(11);comment:排序" web:"sort"`
}
func (c *ConfigGameMark) TableName() string {
return "config_game_mark"
}
type ConfigFirstPageGames struct {
ID int `gorm:"primarykey"`
Icon string `gorm:"column:icon;type:varchar(255);comment:游戏标题图标" web:"icon"`
@ -607,3 +527,222 @@ type ConfigActivityBetDraw struct {
func (c *ConfigActivityBetDraw) TableName() string {
return "config_activity_betdraw"
}
// aagame新增/确认复用
type UpdatedBase struct {
CreatedAt int64 `gorm:"column:created_at;type:int(11);default:0;comment:创建时间" json:"CreatedAt" web:"created_at"`
UpdatedAt int64 `gorm:"column:updated_at;type:int(11);default:0;comment:更新时间" json:"UpdatedAt" web:"updated_at"`
Operator string `gorm:"column:operator;type:varchar(256);default:'';comment:更改人" json:"Operator" web:"operator"`
}
// ConfigGameType 游戏类型
type ConfigGameType struct {
ID int `gorm:"primarykey"`
TypeID int `gorm:"column:type_id;not null;type:int(11);uniqueIndex:type_id;comment:游戏类别id" web:"type_id"`
TypeName string `gorm:"column:type_name;type:varchar(64);comment:游戏类别名" web:"type_name"`
Icon string `gorm:"column:icon;type:varchar(255);comment:游戏类别图标" web:"icon"`
Sort int `gorm:"column:sort;type:int(11);comment:排序" web:"sort"`
Open int `gorm:"column:open;type:int(11);default:0;comment:是否打开 1打开" web:"open"`
UpdatedBase
}
func (c *ConfigGameType) TableName() string {
return "config_game_type"
}
// ConfigGameMark 游戏标签
type ConfigGameMark struct {
ID int `gorm:"primarykey"`
MarkID int `gorm:"column:mark_id;not null;type:int(11);uniqueIndex:type_id;comment:游戏角标id" web:"mark_id"`
MarkName string `gorm:"column:mark_name;type:varchar(64);comment:游戏角标名" web:"mark_name"`
Icon string `gorm:"column:icon;type:varchar(255);comment:游戏角标图标" web:"icon"`
Sort int `gorm:"column:sort;type:int(11);comment:排序" web:"sort"`
Open int `gorm:"column:open;type:int(11);default:0;comment:是否打开 1打开" web:"open"`
UpdatedBase
}
func (c *ConfigGameMark) TableName() string {
return "config_game_mark"
}
// ConfigGameClassify 游戏分类
type ConfigGameClassify struct {
ID int `gorm:"primarykey"`
ClassifyID int `gorm:"column:classify_id;not null;type:int(11);uniqueIndex:type_id;comment:分类id" web:"classify_id"`
ClassifyName string `gorm:"column:classify_name;type:varchar(64);comment:分类名" web:"classify_name"`
Icon string `gorm:"column:icon;type:varchar(255);comment:分类图标" web:"icon"`
Sort int `gorm:"column:sort;type:int(11);comment:排序" web:"sort"`
Open int `gorm:"column:open;type:int(11);default:0;comment:是否打开 1打开" web:"open"`
UpdatedBase
}
func (c *ConfigGameClassify) TableName() string {
return "config_game_classify"
}
// ConfigGameList 游戏列表配置
// GameID 游戏id
// Icon 游戏图标
// URL 跳转url
// GameProvider 提供商id
// Mark 角标
// Sort 排序(玩家每玩一次,sort值会自增1)
// Jackpot 奖池
// Demo 是否支持demo 1支持 2不支持
// SubID 一些游戏有子id 如桌子号
/*
todo
游戏id组游戏厂商组是什么东西
*/
type ConfigGameList struct {
ID int `gorm:"primarykey"`
GameID int `gorm:"column:game_id;not null;type:int(11);comment:游戏id(厂商提供)" web:"game_id"`
GameCode string `gorm:"column:game_code;type:varchar(255);default:'';comment:一些游戏的唯一识别(厂商提供)" web:"game_code"`
GameType int `gorm:"column:game_type;not null;type:int(11);comment:游戏类别id(厂商提供)" web:"game_type"`
Name string `gorm:"column:name;not null;type:varchar(255);comment:游戏名(厂商提供)" web:"name"`
Icon string `gorm:"column:icon;type:varchar(255);comment:游戏图标(厂商提供)" web:"icon"`
GameProvider int `gorm:"column:game_provider;not null;type:int(11);uniqueIndex:game;comment:游戏提供商(厂商提供)" web:"game_provider"`
URL string `gorm:"column:url;type:varchar(255);comment:跳转地址" web:"url"`
Sort uint64 `gorm:"column:sort;type:bigint(20);comment:游戏排序,玩家每玩一次,sort值会自增1" web:"sort"`
Orientation int `gorm:"column:orientation;type:int(11);default:1;comment:横屏竖屏 1竖屏2横屏3两者都可" web:"orientation"`
SubID string `gorm:"column:subid;type:varchar(255);default:'';comment:一些游戏有子id" web:"subid"`
TagIds string `gorm:"column:tag_ids;type:varchar(255);comment:游戏标签id列表" web:"tag_ids"`
TagIdMap map[int]struct{} `gorm:"-"`
// 游戏标签id
Mark int `gorm:"column:mark;default:0;type:int(11);comment:角标(1:热门,2:最新,3:推荐)" web:"mark"`
// 玩法分类id
ClassifyID int `gorm:"column:classify_id;not null;type:int(11);comment:玩法分类id" web:"classify_id"`
// 游戏组id
GameGroupID int `gorm:"column:game_group_id;not null;type:int(11);comment:游戏组id" web:"game_group_id"`
// 显示状态
Open int `gorm:"column:open;type:int(11);default:0;comment:是否显示 1打开" web:"open"`
// 游戏状态
GameStatus int `gorm:"column:game_status;type:int(11);default:0;comment:游戏状态(1:上线,2:下线,3:维护中,4:即将上线)" web:"game_status"`
// 试玩模式
Demo int `gorm:"column:demo;type:int(11);default:1;comment:是否支持demo 1支持 2不支持" web:"demo"`
// 可用账户类型
AccountType int `gorm:"column:account_type;type:int(11);default:0;comment:账户类型(1:充值账户,2:可提账户,3:彩金账户)" web:"account_type"`
// 更新信息
UpdatedBase
Jackpot int64 `gorm:"-" web:"-"`
MaxReward int64 `gorm:"-" web:"-" redis:"maxReward"` // 最大奖励
PlayerNumber int64 `gorm:"-" web:"-" redis:"number"` // 游玩人数
RTP int64 `gorm:"-" web:"-" redis:"rtp"` // rtp
}
func (c *ConfigGameList) TableName() string {
return "config_game_list"
}
// ConfigGameProvider 游戏提供商配置
type ConfigGameProvider struct {
ID int `gorm:"primarykey"`
ProviderID int `gorm:"column:provider_id;not null;type:int(11);uniqueIndex:id;comment:游戏提供商id" web:"provider_id"`
ProviderName string `gorm:"column:provider_name;type:varchar(255);comment:游戏提供商名称" web:"provider_name"`
Icon string `gorm:"column:icon;type:varchar(255);comment:供应商图标" web:"icon"`
Sort int `gorm:"column:sort;type:int(11);comment:供应商排序" web:"sort"`
Callback string `gorm:"column:callback;type:varchar(255);comment:回调地址" web:"callback"`
WhiteIPs string `gorm:"column:white_ips;type:varchar(1024);comment:ip白名单" web:"white_ips"`
SubIp []string `gorm:"-" web:"-"`
GamesNum int `gorm:"-" web:"-"`
Open int `gorm:"column:open;type:int(11);default:1;comment:是否开启 1开2不开" web:"open"`
Show int `gorm:"column:show;type:int(11);default:1;comment:是否显示在banner栏 1显示2不显示" web:"show"`
Method int `gorm:"column:method;type:int(11);default:1;comment:打开方式 1正常url 2html格式" web:"method"`
}
func (c *ConfigGameProvider) TableName() string {
return "config_game_provider"
}
func (c *ConfigGameProvider) IsIpWhite(ip string) bool {
if len(c.SubIp) == 0 {
return true
}
for _, v := range c.SubIp {
if v == ip {
return true
}
}
return false
}
// ConfigGameTag 游戏标签
type ConfigGameTag struct {
ID int `gorm:"primarykey"`
TagName string `gorm:"column:tag_name;default:'';type:varchar(255);comment:标签名称" web:"tag_name"`
TagId int `gorm:"column:tag_id;default:0;type:int(11);comment:标签id(对应图片)" web:"tag_id"`
TagType int `gorm:"column:tag_type;default:0;type:int(11);comment:标签类型(1:游戏分类,2:web跳转,3:活动,4:支付)" web:"tag_type"`
JumpUrl string `gorm:"column:jump_url;default:'';type:varchar(255);comment:跳转链接" web:"jump_url"`
ShowCount int `gorm:"column:show_count;type:int(11);default:8;comment:展示游戏个数" web:"show_count"`
Show int `gorm:"column:show;type:int(11);default:1;comment:是否显示在首页 1显示2不显示" web:"show"`
Sort int `gorm:"column:sort;type:int(11);comment:排序" web:"sort"`
Icon string `gorm:"column:icon;type:varchar(255);comment:供应商图标" web:"icon"`
// 更新信息
UpdatedBase
}
func (c *ConfigGameTag) TableName() string {
return "config_game_tag"
}
// ConfigShowGameTag 游戏展示标签
type ConfigShowGameTag struct {
ID int `gorm:"primarykey"`
TagId int `gorm:"column:tag_id;default:0;type:int(11);comment:标签id(对应图片)" web:"tag_id"`
ShowTagIds string `gorm:"column:show_tag_ids;type:varchar(1024);comment:展示标签列表" web:"show_tag_ids"`
ShowTagIdsInt []int `gorm:"-"`
// 更新信息
UpdatedBase
}
func (c *ConfigShowGameTag) TableName() string {
return "config_show_game_tag"
}
// ConfigProviderGameList 厂商游戏列表配置
// GameID 游戏id
// Icon 游戏图标
// URL 跳转url
// GameProvider 提供商id
// Mark 角标
// Sort 排序(玩家每玩一次,sort值会自增1)
// Jackpot 奖池
// Demo 是否支持demo 1支持 2不支持
// SubID 一些游戏有子id 如桌子号
type ConfigProviderGameList struct {
ID int `gorm:"primarykey"`
GameID int `gorm:"column:game_id;not null;type:int(11);uniqueIndex:game;comment:游戏id" web:"game_id"`
GameCode string `gorm:"column:game_code;type:varchar(255);default:'';comment:一些游戏的唯一识别" web:"game_code"`
GameType int `gorm:"column:game_type;not null;type:int(11);comment:游戏类别id" web:"game_type"`
Name string `gorm:"column:name;not null;type:varchar(255);comment:游戏名" web:"name"`
Icon string `gorm:"column:icon;type:varchar(255);comment:游戏图标" web:"icon"`
URL string `gorm:"column:url;type:varchar(255);comment:跳转地址" web:"url"`
GameProvider int `gorm:"column:game_provider;not null;type:int(11);uniqueIndex:game;comment:游戏提供商" web:"game_provider"`
Mark int `gorm:"column:mark;default:0;type:int(11);comment:角标" web:"mark"`
Sort uint64 `gorm:"column:sort;type:bigint(20);comment:游戏排序,玩家每玩一次,sort值会自增1" web:"sort"`
Open int `gorm:"column:open;type:int(11);default:1;comment:是否开启 1开2不开" web:"open"`
Orientation int `gorm:"column:orientation;type:int(11);default:1;comment:横屏竖屏 1竖屏2横屏3两者都可" web:"orientation"`
Demo int `gorm:"column:demo;type:int(11);default:1;comment:是否支持demo 1支持 2不支持" web:"demo"`
SubID string `gorm:"column:subid;type:varchar(255);default:'';comment:一些游戏有子id" web:"subid"`
EnterFee int64 `gorm:"column:enter_fee;type:int(11);default:300;comment:入场门槛" web:"enter_fee"`
TagIds string `gorm:"column:tag_ids;type:varchar(255);comment:游戏标签id列表" web:"tag_ids"`
TagIdMap map[int]struct{} `gorm:"-"`
Jackpot int64 `gorm:"-" web:"-"`
MaxReward int64 `gorm:"-" web:"-" redis:"maxReward"` // 最大奖励
PlayerNumber int64 `gorm:"-" web:"-" redis:"number"` // 游玩人数
RTP int64 `gorm:"-" web:"-" redis:"rtp"` // rtp
}
func (c *ConfigProviderGameList) TableName() string {
return "config_provider_game_list"
}

@ -38,6 +38,8 @@ const (
ProviderPG2
ProviderJiLi2
ProviderPG3
ProviderJin
ProviderJin2
ProviderAll
)

@ -0,0 +1,61 @@
package common
type RankAward struct {
SmallRank int `json:"sr"` // 最小排名
LargeRank int `json:"lr"` // 最大排名
AwardRate int `json:"ar"` // 奖励比例(*100)
}
/*
:1,:2,:3
RankCycle --> {"1":{},"2":{},"3":{}} 表示配置了天,,月排行榜
RankAwards --> {"1":$RankAwards}, $RankAwards为[]RankAward的json格式
FreeRates --> {"1":100,"2":100,"3":100} 表示天,,月的抽水比例都为1(*10000)
RobotRank --> "1-10,12,13" 表示1~10,12,13
*/
// ConfigRank 排行榜配置
type ConfigRank struct {
ID int `gorm:"primarykey"`
Open int `gorm:"column:open;type:int(11);default:1;comment:是否开启 1开2不开" web:"open"`
RankType int `gorm:"column:rank_type;not null;type:int(11);comment:排行榜类型(1:打码,2:充值)" web:"rank_type"`
JoinType int `gorm:"column:join_type;not null;type:int(11);comment:参加类型(1:自动参加)" web:"join_type"`
RankCycle string `gorm:"column:rank_cycle;type:varchar(255);comment:排行榜周期" web:"rank_cycle"`
RankAwards string `gorm:"column:rank_awards;type:text;comment:排行榜奖励信息" web:"rank_awards"`
FreeRates string `gorm:"column:free_rates;type:varchar(255);comment:抽水比例" web:"free_rates"`
RobotRank string `gorm:"column:robot_rank;type:varchar(255);comment:机器人排名信息" web:"robot_rank"`
UpdatedBase
RankCycleMap map[string]struct{} `gorm:"-"`
FreeRatesMap map[string]int `gorm:"-"`
RobotRankMap map[int]struct{} `gorm:"-"`
RankAwardsMap map[string][]RankAward `gorm:"-"`
}
func (c *ConfigRank) TableName() string {
return "config_rank"
}
type RankData struct {
ID int64 `gorm:"column:id;type:bigint(20);primaryKey;autoIncrement:true" json:"id"`
UID int `gorm:"column:uid;type:bigint(11);not null;uniqueIndex:rank_idx,priority:4;comment:玩家id" json:"uid"` // 玩家id
RankType int `gorm:"column:rank_type;type:int(11);not null;uniqueIndex:rank_idx,priority:1;comment:排行榜类型(1:打码,2:充值)" json:"rank_type"` // 排行榜类型(1:打码,2:充值)
RankCycle int `gorm:"column:rank_cycle;type:int(11);not null;uniqueIndex:rank_idx,priority:2;comment:排行榜周期(1:日,2:周,3:月)" json:"rank_cycle"` // 排行榜周期(1:日,2:周,3:月)
RankAt int64 `gorm:"column:rank_at;type:bigint(20);not null;uniqueIndex:rank_idx,priority:3;comment:排行榜开始日期" json:"rank_at"` // 排行榜开始日期
RankValue int64 `gorm:"column:rank_value;type:bigint(20);not null;comment:玩家数值" json:"rank_value"` // 玩家数值
IsRobot int `gorm:"column:is_robot;type:int(11);not null;comment:是不是机器人(0:不是,1:是)" json:"is_robot"` // 是不是机器人(0:不是,1:是)
UserAward int `gorm:"column:user_award;type:int(11);not null;comment:玩家奖励比例(*10000)" json:"user_award"` // 玩家奖励比例(*10000)
UserAwardCount int64 `gorm:"column:user_award_count;type:bigint(20);not null;comment:玩家奖励数量" json:"user_award_count"` // 玩家奖励数量
Rank int `gorm:"column:rank;type:int(11);default:0;comment:排名" json:"rank"` // 玩家奖励比例(*10000)
UpdatedAt int64 `gorm:"column:updated_at;type:bigint(20);not null;comment:更新时间" json:"updated_at"` // 更新时间
UserInfo PlayerDBInfo `gorm:"-"`
}
type RankDataWithUser struct {
RankData `gorm:"embedded"` // RankData的所有字段会展开到表中
UserInfo PlayerDBInfo `gorm:"embedded"` // UserInfo的所有字段也会展开到同一张表中
}
func (c *RankData) TableName() string {
return "rank_data"
}

@ -1,30 +1,97 @@
module server
go 1.16
go 1.23.0
toolchain go1.24.4
require (
github.com/BurntSushi/toml v1.1.0
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible // indirect
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible
github.com/bwmarrin/snowflake v0.3.0
github.com/fbsobreira/gotron-sdk v0.0.0-20230418195951-b7bfbf1c0ade
github.com/gin-gonic/gin v1.7.4
github.com/go-redis/redis/v8 v8.11.3
github.com/gogo/protobuf v1.3.2
github.com/google/uuid v1.3.0 // indirect
github.com/hashicorp/go-uuid v1.0.2 // indirect
github.com/json-iterator/go v1.1.10 // indirect
github.com/json-iterator/go v1.1.10
github.com/liangdas/armyant v0.0.4
github.com/liangdas/mqant v1.4.11
github.com/liangdas/mqant-modules v1.3.8
github.com/lionsoul2014/ip2region v2.2.0-release+incompatible
github.com/mitchellh/mapstructure v1.4.2
github.com/nats-io/nats.go v1.12.1
github.com/olivere/elastic/v7 v7.0.29
github.com/oschwald/geoip2-golang v1.9.0
github.com/wenzhenxi/gorsa v0.0.0-20230530123828-0320cce15d81
golang.org/x/net v0.8.0
github.com/xuri/excelize/v2 v2.9.1
golang.org/x/crypto v0.41.0
golang.org/x/net v0.42.0
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba
google.golang.org/grpc v1.37.0
gorm.io/driver/mysql v1.1.2
gorm.io/gorm v1.21.15
)
require (
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect
github.com/btcsuite/btcd v0.22.1 // indirect
github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect
github.com/cespare/xxhash/v2 v2.1.1 // indirect
github.com/deckarep/golang-set v1.8.0 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/ethereum/go-ethereum v1.10.26 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-playground/locales v0.13.0 // indirect
github.com/go-playground/universal-translator v0.17.0 // indirect
github.com/go-playground/validator/v10 v10.4.1 // indirect
github.com/go-sql-driver/mysql v1.6.0 // indirect
github.com/go-stack/stack v1.8.0 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/google/btree v1.0.0 // indirect
github.com/google/go-cmp v0.6.0 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/hashicorp/consul/api v1.1.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.1 // indirect
github.com/hashicorp/go-immutable-radix v1.0.0 // indirect
github.com/hashicorp/go-rootcerts v1.0.0 // indirect
github.com/hashicorp/go-uuid v1.0.2 // indirect
github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect
github.com/hashicorp/serf v0.8.2 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.2 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/leodido/go-urn v1.2.0 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-isatty v0.0.12 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/hashstructure v1.0.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/nats-io/nkeys v0.3.0 // indirect
github.com/nats-io/nuid v1.0.1 // indirect
github.com/oschwald/maxminddb-golang v1.11.0 // indirect
github.com/pborman/uuid v1.2.1 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/richardlehane/mscfb v1.0.4 // indirect
github.com/richardlehane/msoleps v1.0.4 // indirect
github.com/rjeczalik/notify v0.9.3 // indirect
github.com/shengdoushi/base58 v1.0.0 // indirect
github.com/tiendc/go-deepcopy v1.6.0 // indirect
github.com/tyler-smith/go-bip39 v1.0.2 // indirect
github.com/ugorji/go/codec v1.1.7 // indirect
github.com/xuri/efp v0.0.1 // indirect
github.com/xuri/nfp v0.0.1 // indirect
github.com/yireyun/go-queue v0.0.0-20180809062148-5e6897360dac // indirect
github.com/zondax/hid v0.9.1 // indirect
go.uber.org/atomic v1.6.0 // indirect
go.uber.org/multierr v1.5.0 // indirect
go.uber.org/zap v1.15.0 // indirect
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f // indirect
golang.org/x/sys v0.35.0 // indirect
golang.org/x/text v0.28.0 // indirect
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987 // indirect
google.golang.org/protobuf v1.28.1 // indirect
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
honnef.co/go/tools v0.1.3 // indirect
)

487
go.sum

@ -1,117 +1,41 @@
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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg=
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw=
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/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
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/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM=
github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I=
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I=
github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw=
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible h1:8psS8a+wKfiLt1iVDX79F7Y6wUM49Lcha2FMXt4UM8g=
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0=
github.com/araddon/dateparse v0.0.0-20200409225146-d820a6159ab1/go.mod h1:SLqhdZcd+dF3TEVL2RMoob5bBP5R1P1qkox+HtCBgGI=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I=
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/aws/aws-sdk-go v1.40.43/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q=
github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo=
github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y=
github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8=
github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4=
github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0=
github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM=
github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw=
github.com/belogik/goes v0.0.0-20151229125003-e54d722c3aff/go.mod h1:PhH1ZhyCzHKt4uAasyx+ljRCgoezetRNf59CUtwUkqY=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c=
github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ=
github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c=
github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y=
github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k=
github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU=
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U=
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o=
github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg=
github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY=
github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I=
github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0=
github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE=
github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s=
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
github.com/cespare/xxhash/v2 v2.1.1/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/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ=
github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q=
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/etcd v3.3.15+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd v0.0.0-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/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4=
github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg=
github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
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=
@ -121,22 +45,10 @@ github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK
github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs=
github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218=
github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M=
github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ=
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/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko=
github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
github.com/docker/docker v1.6.2/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/dop251/goja v0.0.0-20220405120441-9037c2b61cbf/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk=
github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y=
github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts=
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
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=
@ -145,38 +57,21 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7
github.com/ethereum/go-ethereum v1.10.26 h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s=
github.com/ethereum/go-ethereum v1.10.26/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
github.com/fbsobreira/gotron-sdk v0.0.0-20230418195951-b7bfbf1c0ade h1:nBd+g+UO23Kcj+vnw6a9bmH8o1XuREyb7CnAjtZo6G4=
github.com/fbsobreira/gotron-sdk v0.0.0-20230418195951-b7bfbf1c0ade/go.mod h1:nu7RbxA7PUWdyMI9O/tBVLDjTMyU0MuRERlTyShJKGg=
github.com/fjl/gencodec v0.0.0-20220412091415-8bb9e558978c/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY=
github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8=
github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww=
github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4=
github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.7.4 h1:QmUZXrvJ9qZ3GfWvQ+2wnW/1ePrTEJqPKMYEU3lD/DM=
github.com/gin-gonic/gin v1.7.4/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY=
github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE=
github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24=
github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs=
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-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
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-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
@ -187,32 +82,21 @@ github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7a
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
github.com/go-redis/redis/v8 v8.11.3 h1:GCjoYp8c+yQTJfc0n69iwSiHjvuAdruxl7elnZCxgt8=
github.com/go-redis/redis/v8 v8.11.3/go.mod h1:xNJ9xDG09FsIPwh3bWdk+0oDWHbtF9rPN0F/oD9XeKc=
github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg=
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
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/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
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.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/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/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=
@ -228,50 +112,29 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y=
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 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
github.com/grpc-ecosystem/grpc-gateway v1.11.2/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
github.com/hashicorp/consul/api v1.1.0 h1:BNQPM9ytxj6jbjjdRPioQ94T6YXriSopn0i8COv6SRA=
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
@ -279,7 +142,6 @@ github.com/hashicorp/consul/sdk v0.1.1 h1:LnuDWGNsoajlhGyHJvuWW6FVqRl8JOTPqS6CPT
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0=
github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=
@ -299,38 +161,15 @@ github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2I
github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs=
github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
github.com/hashicorp/memberlist v0.1.3 h1:EmmoJme1matNzb+hMpDuR/0sbJSUisxyqBGG676r31M=
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
github.com/hashicorp/serf v0.8.2 h1:YZ7UKsJv+hKjqGVUUbtE3HNj79Eln2oQ75tniF6iPt0=
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA=
github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y=
github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY=
github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI=
github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8=
github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk=
github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE=
github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo=
github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo=
github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8=
github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE=
github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0=
github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU=
github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
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.1.2 h1:eVKgfIdy9b6zbWBMgFpfDPoAMifwSZagU9HmEU6zgiI=
@ -340,29 +179,16 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfC
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
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/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
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/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0=
github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU=
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg=
github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
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=
@ -372,11 +198,6 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
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/kylelemons/godebug v0.0.0-20170224010052-a616ab194758/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg=
github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8=
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
github.com/liangdas/armyant v0.0.4 h1:AzkRfh/Xu0itKR9OyJOZTe/eS3bA6hDodke8EZj3yCE=
@ -386,31 +207,12 @@ github.com/liangdas/mqant v1.4.11 h1:lBMj6FrHgursR2YW3KPsOizkyzVP4wBEzbY4eCwO6IU
github.com/liangdas/mqant v1.4.11/go.mod h1:vXyBtk3qU4UrkWwtLOgedV+8Jdd3E3/1t+TnkJBDiME=
github.com/liangdas/mqant-modules v1.3.8 h1:pWiOQSN2HS0rXOMW3reh7Id4UTFSHLim/nnhhMnsZoQ=
github.com/liangdas/mqant-modules v1.3.8/go.mod h1:OadvLghzeXabACyO3bACDK0tjd9Vt5vs7vz9AfQJaUY=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lionsoul2014/ip2region v2.2.0-release+incompatible h1:1qp9iks+69h7IGLazAplzS9Ca14HAxuD5c0rbFdPGy4=
github.com/lionsoul2014/ip2region v2.2.0-release+incompatible/go.mod h1:+ZBN7PBoh5gG6/y0ZQ85vJDBe21WnfbRrQQwTfliJJI=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
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.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.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.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/miekg/dns v1.0.14 h1:9jZdLNd/P4+SfEJ0TNyxYpsK8N4GtfylBLqtbYN1sbA=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
@ -426,21 +228,15 @@ github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1D
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mitchellh/mapstructure v1.4.2 h1:6h7AQ0yhTcIsmFmnAwQls75jp2Gzs4iB8W7pjMO+rqo=
github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8=
github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0=
github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E=
github.com/nats-io/jwt v0.3.0 h1:xdnzwFETV++jNc4W1mw//qFyJGb2ABOombmZJQS4+Qo=
github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
github.com/nats-io/nats-server/v2 v2.1.0 h1:Yi0+ZhRPtPAGeIxFn5erIeJIV9wXA+JznfSxK621Fbk=
@ -458,25 +254,16 @@ github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OS
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/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
github.com/olivere/elastic/v7 v7.0.29 h1:zvorjSPHFli/0owqfoLq0ZOtVhZSyHsMbRi29Vj7T14=
github.com/olivere/elastic/v7 v7.0.29/go.mod h1:8PlkMD2Xb690IPhIPii2SypuuXtXX3dDcSKGqnEGXzE=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.12.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 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc=
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
github.com/onsi/gomega v1.4.1/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.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.15.0 h1:WjP/FQ/sk43MRmnEcT+MlDw2TFvkrXlprrPST/IudjU=
github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0=
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
github.com/oschwald/geoip2-golang v1.9.0 h1:uvD3O6fXAXs+usU+UGExshpdP13GAqp4GBrzN7IgKZc=
@ -485,133 +272,82 @@ github.com/oschwald/maxminddb-golang v1.11.0 h1:aSXMqYR/EPNjGE8epgqwDay+P30hCBZI
github.com/oschwald/maxminddb-golang v1.11.0/go.mod h1:YmVI+H0zh3ySFR3w+oz8PCfglAFj3PuCmui13+P9zDg=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE=
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw=
github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0=
github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
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/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/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/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc=
github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho=
github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM=
github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk=
github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
github.com/richardlehane/msoleps v1.0.4 h1:WuESlvhX3gH2IHcd8UqyCuFY5yiq/GR/yqaSM/9/g00=
github.com/richardlehane/msoleps v1.0.4/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
github.com/rjeczalik/notify v0.9.3 h1:6rJAzHTGKXGj76sbRgDiDcYj/HniypXmSJo1SWakZeY=
github.com/rjeczalik/notify v0.9.3/go.mod h1:gF3zSOrafR9DQEWSE8TjfI9NkooDxbyT4UgRGKZA0lc=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo=
github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/shengdoushi/base58 v1.0.0 h1:tGe4o6TmdXFJWoI31VoSWvuaKxf0Px3gqa3sUWhAxBs=
github.com/shengdoushi/base58 v1.0.0/go.mod h1:m5uIILfzcKMw6238iWAhP4l3s5+uXyF3+bJKUNhAL9I=
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
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.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
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/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+zMHZXV9/bvak=
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q=
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.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/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.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
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/supranational/blst v0.3.8-0.20220526154634-513d2456b344/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw=
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=
github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI=
github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/tiendc/go-deepcopy v1.6.0 h1:0UtfV/imoCwlLxVsyfUd4hNHnB3drXsfle+wzSCA5Wo=
github.com/tiendc/go-deepcopy v1.6.0/go.mod h1:toXoeQoUqXOOS/X4sKuiAoSk6elIdqc0pN7MTgOOo2I=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs=
github.com/tyler-smith/go-bip39 v1.0.2 h1:+t3w+KwLXO6154GNJY+qUtIxLTmFjfUmpguQT1OlOT8=
github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs=
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
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/urfave/cli/v2 v2.10.2/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
github.com/wenzhenxi/gorsa v0.0.0-20230530123828-0320cce15d81 h1:mCWpbHxvTg/p9wIKzyR34b65g9p142HFpp6YtsyXTDw=
github.com/wenzhenxi/gorsa v0.0.0-20230530123828-0320cce15d81/go.mod h1:nfhBTKji6rC8lrjyikx8NJ85JHg6ZQam0a9Je+2RVOg=
github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
github.com/xuri/efp v0.0.1 h1:fws5Rv3myXyYni8uwj2qKjVaRP30PdjeYe2Y6FDsCL8=
github.com/xuri/efp v0.0.1/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
github.com/xuri/excelize/v2 v2.9.1 h1:VdSGk+rraGmgLHGFaGG9/9IWu1nj4ufjJ7uwMDtj8Qw=
github.com/xuri/excelize/v2 v2.9.1/go.mod h1:x7L6pKz2dvo9ejrRuD8Lnl98z4JLt0TGAwjhW+EiP8s=
github.com/xuri/nfp v0.0.1 h1:MDamSGatIvp8uOmDP8FnmjuQpu90NzdJxo7242ANR9Q=
github.com/xuri/nfp v0.0.1/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
github.com/yireyun/go-queue v0.0.0-20180809062148-5e6897360dac h1:a4krU0HaACgZ1ai3epUH6U6Kji7WHiucldhzWv6oD2o=
github.com/yireyun/go-queue v0.0.0-20180809062148-5e6897360dac/go.mod h1:NS8O3p7NiPwC1Yw9xTd9DnDBguxFJG/BL1VPTSfJ5Gw=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo=
github.com/zondax/hid v0.9.1/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.etcd.io/etcd v3.3.15+incompatible/go.mod h1:yaeTdrJi5lOmYerz05bd8+V7KubZs8YSFZfzsF9A6aI=
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.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
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 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk=
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
@ -620,67 +356,34 @@ go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A=
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4=
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.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM=
go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
golang.org/x/exp v0.0.0-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-20220426173459-3bcf042a4bf5/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE=
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.25.0 h1:Y6uW6rH1y5y/LK1J8BPWZtr6yZ7hrsy6hFrXjgsc2fQ=
golang.org/x/image v0.25.0/go.mod h1:tCAmOEGthTtkalusGp1g3xa2gke8J6c2N565dTyl9Rs=
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 h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE=
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
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.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.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ=
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=
@ -688,54 +391,30 @@ golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73r
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-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-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/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-20191126235420-ef20fe5d7933/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-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220607020251-c690dde0001d/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.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
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/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-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-20201020160332-67f06af15bc9/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-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@ -745,156 +424,67 @@ golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5h
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-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-20190412213103-97732733099d/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-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/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-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-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-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/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.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4=
golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw=
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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
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/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE=
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/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-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-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-20191126055441-b0650ceb63d9/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-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
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-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618=
golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU=
gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=
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/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.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
google.golang.org/appengine v1.6.5/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-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-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
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-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987 h1:PDIOdWxZ8eRizhKa1AAvY53xsvLB1cWorMjslvY3VA8=
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
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.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.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.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
google.golang.org/grpc v1.37.0 h1:uSZWeQJX5j11bIQ4AJoj+McDBo29cY1MCoC1wO3ts+c=
@ -921,21 +511,18 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c=
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
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.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.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-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.1.2 h1:OofcyE2lga734MxwcCW9uB4mWNXMr50uaGRVwQL2B0M=
@ -944,12 +531,8 @@ gorm.io/gorm v1.21.12/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0=
gorm.io/gorm v1.21.15 h1:gAyaDoPw0lCyrSFWhBlahbUA1U4P5RViC1uIqoB+1Rk=
gorm.io/gorm v1.21.15/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0=
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.1.3 h1:qTakTkI6ni6LFD5sBwwsdSO+AQqbSIxOauHTTQKZ/7o=
honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=

@ -5,14 +5,9 @@ import (
"fmt"
"net/http"
"reflect"
"server/call"
"server/common"
"server/db"
"server/modules/backend/bdb"
"server/modules/backend/values"
"server/natsClient"
"server/pb"
"strings"
"time"
"github.com/gin-gonic/gin"
@ -211,39 +206,39 @@ func (g *Gin) CheckPower(power string) bool {
return true
}
func (g *Gin) CommonConfig() {
path := g.C.Request.URL.Path
index := strings.LastIndex(path, "/")
opt := path[index+1:]
path = path[:index]
index = strings.LastIndex(path, "/")
t := path[index+1:]
reloadType := values.GetControlType(t)
element, list := common.GetConfigStructByType(reloadType)
var resp interface{}
if opt == "list" {
if !g.MGetAll(element, list) {
return
}
resp = values.GMConfigCommonListResp{Config: list}
} else if opt == "edit" {
req := new(values.GMConfigCommonEditReq)
if !g.S(req) {
return
}
if !g.MUpdateAll(req.Config, element) {
return
}
call.Publish(natsClient.TopicReloadConfig, &pb.ReloadGameConfig{Type: int32(reloadType)})
} else if opt == "del" {
req := new(values.GMConfigCommonDelReq)
if !g.S(req) {
return
}
if !g.MDel(req.ID, element) {
return
}
call.Publish(natsClient.TopicReloadConfig, &pb.ReloadGameConfig{Type: int32(reloadType)})
}
g.Data = resp
}
//func (g *Gin) CommonConfig() {
// path := g.C.Request.URL.Path
// index := strings.LastIndex(path, "/")
// opt := path[index+1:]
// path = path[:index]
// index = strings.LastIndex(path, "/")
// t := path[index+1:]
// reloadType := values.GetControlType(t)
// element, list := common.GetConfigStructByType(reloadType)
// var resp interface{}
// if opt == "list" {
// if !g.MGetAll(element, list) {
// return
// }
// resp = values.GMConfigCommonListResp{Config: list}
// } else if opt == "edit" {
// req := new(values.GMConfigCommonEditReq)
// if !g.S(req) {
// return
// }
// if !g.MUpdateAll(req.Config, element) {
// return
// }
// call.Publish(natsClient.TopicReloadConfig, &pb.ReloadGameConfig{Type: int32(reloadType)})
// } else if opt == "del" {
// req := new(values.GMConfigCommonDelReq)
// if !g.S(req) {
// return
// }
// if !g.MDel(req.ID, element) {
// return
// }
// call.Publish(natsClient.TopicReloadConfig, &pb.ReloadGameConfig{Type: int32(reloadType)})
// }
// g.Data = resp
//}

@ -1,6 +1,8 @@
package handler
import (
"fmt"
jsoniter "github.com/json-iterator/go"
"reflect"
"server/call"
"server/common"
@ -8,8 +10,10 @@ import (
"server/modules/backend/values"
"server/natsClient"
"server/pb"
"server/util"
"sort"
"strings"
"time"
"github.com/gin-gonic/gin"
)
@ -45,6 +49,11 @@ func ConfigControlCommon(c *gin.Context) {
if !a.S(req) {
return
}
err := CheckEditSpecial(reloadType, element, req.Config, a)
if err != nil {
a.Msg = err.Error()
return
}
if !a.MUpdateAll(req.Config, element) {
return
}
@ -68,6 +77,84 @@ func CheckSpecial(t int, list interface{}) interface{} {
return nil
}
func haveUpdatedBase(obj interface{}) (have bool) {
if obj == nil {
return
}
t := reflect.TypeOf(obj)
if t.Kind() != reflect.Ptr {
return
}
elemType := t.Elem()
if elemType.Kind() == reflect.Struct {
for i := 0; i < elemType.NumField(); i++ {
field := elemType.Field(i)
if field.Anonymous && field.Type.Name() == "UpdatedBase" {
have = true
break
}
}
}
return
}
func CheckEditSpecial(t int, obj interface{}, config []map[string]interface{}, a *app.Gin) (err error) {
if haveUpdatedBase(obj) {
for _, update := range config {
update["UpdatedAt"] = time.Now().Unix()
update["Operator"] = a.User.Name
_, ok := update["ID"]
if !ok {
update["CreatedAt"] = time.Now().Unix()
}
}
}
switch t {
case common.ReloadConfigGameList:
for _, update := range config {
delete(update, "GameProvider")
delete(update, "GameID")
delete(update, "GameCode")
delete(update, "Icon")
delete(update, "Name")
delete(update, "GameType")
}
case common.ReloadConfigRank:
// todo 校验活动是否存在
for _, update := range config {
rankId, ok := update["ID"]
rankCycle := update["RankCycle"].(string)
rankType := util.ToInt(update["RankType"])
rankCycleMap := make(map[string]struct{})
_ = jsoniter.UnmarshalFromString(rankCycle, &rankCycleMap)
oldRanks := call.GetConfigRank(rankType)
if ok {
for _, oldRank := range oldRanks {
for oldRankType := range oldRank.RankCycleMap {
_, exist := rankCycleMap[oldRankType]
if exist && rankId != oldRank.ID {
err = fmt.Errorf("周期类型[%s] 已经在活动[%d]存在", oldRankType, oldRank.ID)
return
}
}
}
} else { // 新增,同等类型的活动不能重复
for _, oldRank := range oldRanks {
for oldRankType := range oldRank.RankCycleMap {
_, exist := rankCycleMap[oldRankType]
if exist {
err = fmt.Errorf("周期类型[%s] 已经在活动[%d]存在", oldRankType, oldRank.ID)
return
}
}
}
}
}
}
return nil
}
// ConfigPayWeight 支付渠道权重配置
func ConfigPayWeight(c *gin.Context) {
a := app.NewApp(c)

@ -122,6 +122,15 @@ func MigrateDB() {
new(common.ShareDetail),
new(common.ConfigShareRankRule),
new(common.ConfigShareRankReward),
new(common.ConfigCustomerRobot),
new(common.CustomerOrderLabel),
new(common.ConfigCustomer),
new(common.ConfigRank),
new(common.ConfigGameClassify),
new(common.RankData),
new(common.ConfigGameTag),
new(common.ConfigShowGameTag),
new(common.ConfigProviderGameList),
)
if err != nil {
panic("Migrate db fail")

@ -98,14 +98,6 @@ func GetControlType(path string) int {
return common.ReloadConfigTron
case "withdraw":
return common.ReloadConfigWithdrawProduct
case "gameProvider":
return common.ReloadConfigGameProvider
case "gameList":
return common.ReloadConfigGameList
case "gameTypes":
return common.ReloadConfigGameTypes
case "gameMarks":
return common.ReloadConfigGameMarks
case "firstPageGames":
return common.ReloadConfigFirstPageGames
case "vip":
@ -170,6 +162,23 @@ func GetControlType(path string) int {
return common.ReloadConfigRankReward
case "configShareRankRule":
return common.ReloadConfigRankRule
// aagame新增/复用
case "gameTypes":
return common.ReloadConfigGameTypes
case "gameMarks":
return common.ReloadConfigGameMarks
case "gameClassify":
return common.ReloadConfigGameClassify
case "gameList":
return common.ReloadConfigGameList
case "gameProvider":
return common.ReloadConfigGameProvider
case "rank":
return common.ReloadConfigRank
case "gameTag":
return common.ReloadConfigGameTag
case "showGameTag":
return common.ReloadConfigShowGameTag
default:
return 0
}

@ -57,6 +57,10 @@ func NewApp(c *gin.Context) *Gin {
if len(channel) > 0 {
g.Channel, _ = strconv.Atoi(channel)
}
if channel == "" || g.Channel == 0 {
// todo 先写死
g.Channel = 1000
}
if g.Channel == 0 {
u, _ := url.Parse(c.Request.Referer())
if u != nil && len(u.Host) > 0 {
@ -113,6 +117,12 @@ func (g *Gin) S(one interface{}) (pass bool) {
log.Error("err:%v", err)
return
}
if data == nil {
log.Debug("is nil")
}
if len(data) == 0 {
log.Debug("")
}
jsonData, err := util.AesDecrypt(data)
if err != nil {
g.Code = values.CodeRetry

@ -1,12 +1,30 @@
package web
import (
"github.com/liangdas/mqant/log"
"server/call"
"server/common"
"server/pb"
"server/util"
)
func loadConfig() error {
c := map[int][]func(*pb.ReloadGameConfig) error{}
c[common.ReloadConfigRank] = []func(*pb.ReloadGameConfig) error{
func(rgc *pb.ReloadGameConfig) error {
if err := call.LoadConfigRank(); err != nil {
log.Error("error : [%s]", err.Error())
return err
}
return nil
},
func(rgc *pb.ReloadGameConfig) error {
util.Go(func() {
call.RankHandler()
})
return nil
},
}
call.LoadConfigs(c)
return nil
}

@ -47,7 +47,7 @@ func onLogin(user *common.PlayerDBInfo, a *app.Gin, isNew bool) {
if config.GetBase().Release {
gateURL = "wss://" + gateURL
} else {
gateURL = "wss://" + gateURL + ":26615"
gateURL = "wss://" + gateURL + ":16615"
}
// } else {
// gateURL = "ws://" + gateURL
@ -85,26 +85,35 @@ func onLogin(user *common.PlayerDBInfo, a *app.Gin, isNew bool) {
// }
resp := values.LoginResp{GateAddr: gateURL, UID: uid, Token: token}
// cid := user.ChannelID
a.Data = resp
ip := a.GetRemoteIP()
cid := user.ChannelID
birth := user.Birth
deviceType := user.Platform
country := user.Country
util.Go(func() {
update := map[string]interface{}{"ip": ip, "platform": deviceType, "last_login": time.Now().Unix()}
if country == "" {
update["country"] = call.GetCountry(ip)
}
if err := db.Mysql().Update(&common.PlayerDBInfo{Id: uid}, update); err != nil {
log.Error("err:%v", err)
a.Code = values.CodeRetry
return
}
call.InsertLoginRecord(uid, cid, ip, birth, deviceType)
userInfo, err := getUserInfo(user.Id)
if err != nil {
log.Error("get userInfo err, %s", err.Error())
a.Code = values.CodeRetry
return
}
resp.UserInfo = userInfo
util.Go(func() {
call.InsertLoginRecord(uid, cid, ip, birth, deviceType)
// if db.Mysql().CountTable(common.PlayerRechargeTableName, fmt.Sprintf("uid = %d", uid)) == 0 {
// db.Mysql().C().Table(common.PlayerRechargeTableName).Create(&common.PlayerCurrency{UID: uid, ChannelID: cid})
// }
})
a.Data = resp
log.Debug("resp:%+v", resp)
}
@ -183,10 +192,12 @@ func VerifyCode(c *gin.Context) {
return
}
log.Debug("VerifyCode %+v", *req)
if req.Code != "123456" {
if !a.VerifyCode(req.Phone, req.Code) {
return
}
}
}
func PhoneRegist(c *gin.Context) {
a := app.NewApp(c)
@ -207,6 +218,11 @@ func PhoneRegist(c *gin.Context) {
a.Msg = "The phone number is already linked to another customer."
return
}
if req.Code != "123456" {
if !a.VerifyCode(req.Phone, req.Code) {
return
}
}
openID := common.GetAccountPre(common.AccountTypePhone) + req.Phone
user, isNew := a.QueryUser(values.CommonLogin{AccountType: common.AccountTypePhone, OpenID: openID, DeviceID: a.UUID,
Adid: req.Adid, Gpsadid: req.GPSAdid, Phone: req.Phone, Share: req.Share, Pass: req.Pass,
@ -261,9 +277,11 @@ func PhoneResetPass(c *gin.Context) {
a.Msg = "phone not exist"
return
}
if req.Code != "123456" {
if !a.VerifyCode(req.Phone, req.Code) {
return
}
}
if a.Channel == 0 {
a.Code = values.CodeParam
return
@ -284,9 +302,11 @@ func PhoneCodeLogin(c *gin.Context) {
return
}
log.Debug("phoneCode login %+v", *req)
if req.Code != "123456" {
if !a.VerifyCode(req.Phone, req.Code) {
return
}
}
if a.Channel == 0 {
a.Code = values.CodeParam
return
@ -311,9 +331,11 @@ func BindingAccount(c *gin.Context) {
return
}
log.Debug("BindingAccount %+v", *req)
if req.Code != "123456" {
if !a.VerifyCode(req.Phone, req.Code) {
return
}
}
cid := a.Channel
if cid == 0 {
a.Code = values.CodeParam
@ -464,9 +486,11 @@ func EmailRegist(c *gin.Context) {
return
}
log.Debug("emailCode regist %+v", *req)
if req.Code != "123456" {
if !a.VerifyCode(req.Email, req.Code) {
return
}
}
if a.Channel == 0 {
a.Code = values.CodeParam
return

@ -48,7 +48,7 @@ func FirstPage(c *gin.Context) {
resp := &values.FirstPageResp{}
a.Data = resp
a.GetUID()
resp.Activitys = call.GetConfigBanner(a.UID)
resp.Activitys = call.GetConfigBanner(a.UID, 0)
resp.GameTypes = call.GetConfigGameTypes()
resp.GameMarks = call.GetConfigGameMarks()
resp.Providers = call.GetConfigGameProviderAllOpen()
@ -116,6 +116,82 @@ func FirstPage(c *gin.Context) {
}
}
func FirstPageNew(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
req := new(values.FirstPageReq)
if !a.S(req) {
return
}
uuid := a.UUID
cid := a.Channel
if len(uuid) > 0 {
// 处理一下新增安装
util.Go(func() {
q := elastic.NewBoolQuery()
q.Filter(elastic.NewTermsQuery("UUID.keyword", uuid))
q.Filter(elastic.NewTermQuery("Channel", cid))
if db.ES().Count(common.ESIndexBackOpenRecord, q) > 0 {
return
}
id := fmt.Sprintf("%v_%v", cid, uuid)
db.ES().InsertToESByIDGO(common.ESIndexBackOpenRecord, id, &common.ESOpenRecord{Time: time.Now().Unix(), UUID: uuid, Channel: cid})
})
}
resp := &values.FirstPageNewResp{}
a.Data = resp
a.GetUID()
for i := common.CurrencyTypeZero + 1; i < common.CurrencyAll; i++ {
if i == common.CurrencyUSDT {
continue
}
resp.Currencys = append(resp.Currencys, values.OneCurrency{
ID: i,
Name: strings.ToUpper(i.GetCurrencyName()),
})
}
task := call.GetConfigTaskByTaskType(int(common.TaskTypeDownload))
if len(task) > 0 {
resp.DownloadAppReward = task[0].Reward
}
resp.ShowData = GetFirstShowData()
for _, item := range call.GetConfigCurrencyResource() {
resp.CurrencyResource = append(resp.CurrencyResource, &common.ConfigCurrencyResource{
ID: item.ID,
Type: item.Type,
Multiple: item.Multiple / 100,
})
}
configGameTags := call.GetConfigGameTagByIds(call.GetConfigShowGameTagIds())
tags := make([]values.Tag, 0, len(configGameTags))
for _, v := range configGameTags {
tags = append(tags, values.Tag{
ID: v.TagId,
Name: v.TagName,
Action: v.TagType,
Icon: v.Icon,
})
}
configBanners := call.GetConfigBanner(a.UID, 0)
banners := make([]values.Banner, 0, len(configBanners))
for _, v := range configBanners {
banners = append(banners, values.Banner{
Id: v.ActivityID,
Action: v.Type,
Url: v.JumpUrl,
Icon: v.Pic,
})
}
resp.Banners = banners
resp.GameTags = tags
return
}
// GetFirstShowData 首页展示数据
func GetFirstShowData() values.ShowInfo {
ctx := context.Background()

@ -82,6 +82,107 @@ func GameList(c *gin.Context) {
}
}
func GameTag(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
req := new(values.GameTagReq)
if !a.S(req) {
return
}
resp := &values.GameTagResp{}
a.Data = resp
showGameTags := call.GetConfigShowGameTag(req.TagId)
if len(showGameTags) == 0 {
return
}
showGameTag := showGameTags[0]
configGameTags := call.GetConfigGameTagByIds(showGameTag.ShowTagIdsInt)
tags := make([]values.TagWithGameList, 0, len(configGameTags))
for _, v := range configGameTags {
showCount := v.ShowCount
if showCount == 0 {
showCount = 8
}
tagTmp := values.TagWithGameList{
ID: v.TagId,
Name: v.TagName,
Action: v.TagType,
Icon: v.Icon,
}
gameList := call.GetGameListByTags([]int{req.TagId, v.TagId})
if showCount > len(gameList) {
showCount = len(gameList)
}
tagTmp.List = make([]values.GameData, 0, showCount)
for _, gameTmp := range gameList {
if len(tagTmp.List) >= showCount {
break
}
tagTmp.List = append(tagTmp.List, values.GameData{
Id: gameTmp.ID,
GameId: gameTmp.GameID,
GameProvider: gameTmp.GameProvider,
GameTag: gameTmp.Mark,
GameStatus: gameTmp.GameStatus,
GameIcon: gameTmp.Icon,
})
}
tagTmp.Total = len(gameList)
tags = append(tags, tagTmp)
}
configBanners := call.GetConfigBanner(a.UID, req.TagId)
banners := make([]values.Banner, 0, len(configBanners))
for _, v := range configBanners {
banners = append(banners, values.Banner{
Id: v.ActivityID,
Action: v.Type,
Url: v.JumpUrl,
Icon: v.Pic,
})
}
resp.Banners = banners
resp.Tags = tags
}
func GameListNew(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
req := new(values.GameListNewReq)
if !a.S(req) {
return
}
resp := &values.GameListNewResp{}
a.Data = resp
gameList := call.GetGameListByTags([]int{req.TagId, req.SubTagId})
resp.Total = len(gameList)
if resp.Total == 0 {
return
}
start := (req.Page - 1) * req.PageSize
end := start + req.PageSize
if end > len(gameList) {
end = len(gameList)
}
list := make([]values.GameData, 0, req.PageSize)
for _, gameTmp := range gameList {
list = append(list, values.GameData{
Id: gameTmp.ID,
GameId: gameTmp.GameID,
GameProvider: gameTmp.GameProvider,
GameTag: gameTmp.Mark,
GameStatus: gameTmp.GameStatus,
GameIcon: gameTmp.Icon,
})
}
resp.List = list[start:end]
}
func EnterGame(c *gin.Context) {
a := app.NewApp(c)
defer func() {
@ -175,6 +276,100 @@ func EnterGame(c *gin.Context) {
})
}
func EnterGameNew(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
req := new(values.EnterGameNewReq)
if !a.S(req) {
return
}
provider := call.GetConfigGameProvider(req.Provider)
resp := new(values.EnterGameResp)
if provider != nil {
resp.Method = provider.Method
}
resp.GameId = req.GameID
a.Data = resp
// step:特殊逻辑处理
if req.Provider == common.ProviderPGSoft {
provider = call.GetConfigGameProvider(common.ProviderPG3)
game := call.GetConfigGameListByID(common.ProviderPG3, req.GameID)
if game != nil && game.Open == 1 {
req.Provider = common.ProviderPG3
resp.Method = provider.Method
} else {
provider = call.GetConfigGameProvider(common.ProviderPG2)
game = call.GetConfigGameListByID(common.ProviderPG2, req.GameID)
if game != nil && game.Open == 1 {
req.Provider = common.ProviderPG2
resp.Method = provider.Method
}
}
}
//if req.IsDemo {
// log.Debug("player enter demo game %+v", *req)
// enter := &base.EnterGameReq{
// ProviderID: req.Provider,
// GameID: req.GameID,
// Lang: a.Lang,
// CurrencyType: req.Currency,
// IsDemo: true,
// SubID: req.SubID,
// IP: a.GetRemoteIP(),
// DeviceType: a.DeviceType,
// ChannelID: a.Channel,
// }
// resp.URL = all.EnterGame(enter)
// return
//}
//if !req.Currency.IsValid() {
// a.Code = values.CodeParam
// return
//}
token := c.GetHeader("token")
uid, _ := db.Redis().GetInt(common.GetRedisKeyToken(token))
if uid == 0 {
a.Code = values.CodeToken
return
}
c.Set("uid", uid)
c.Set("token", token)
util.Go(func() {
db.Redis().AddUserExpire(uid, token)
})
log.Debug("player %d enter game %+v", uid, *req)
enter := &base.EnterGameReq{
ProviderID: req.Provider,
GameID: req.GameID,
UID: uid,
Token: token,
Lang: a.Lang,
CurrencyType: common.CurrencyINR,
IsDemo: false,
//SubID: req.SubID,
IP: a.GetRemoteIP(),
DeviceType: a.DeviceType,
ChannelID: a.Channel,
}
resp.URL = all.EnterGame(enter)
if resp.URL == "" {
a.Code = values.CodeParam
a.Msg = "Under Maintenance,please try later."
return
}
util.Go(func() {
// 记录玩家的记录
err := call.AddGameRecord(uid, req.Provider, req.GameID)
if err != nil {
log.Error("AddGameRecord uid:%v, err:%v", uid, err)
return
}
})
}
func GameHistory(c *gin.Context) {
a := app.NewApp(c)
defer func() {

@ -0,0 +1,189 @@
package handler
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/liangdas/mqant/log"
"server/call"
"server/modules/web/app"
"server/modules/web/values"
"server/util"
)
func RankCfg(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
req := &values.RankCfgReq{}
if !a.S(req) {
return
}
if req.RankType == 0 {
req.RankType = 1
}
a.GetUID()
resp := &values.RankCfgResp{}
a.Data = resp
configRanks := call.GetConfigRank(req.RankType)
for _, configRank := range configRanks {
for rankCycle := range configRank.RankCycleMap {
jackpot, rankLess := call.RankJackpotGet(req.RankType, rankCycle)
rankData := values.RankData{
RankCycle: util.ToInt(rankCycle),
Pumping: configRank.FreeRatesMap[rankCycle],
JackPot: jackpot,
JackPotLast: call.RankJackpotPreGet(req.RankType, rankCycle),
AwardAtLess: rankLess,
}
if rankAwards, ok := configRank.RankAwardsMap[rankCycle]; ok {
rankData.RankAwards = make([]values.RankAward, 0, len(rankAwards))
for _, rankAward := range rankAwards {
rankData.RankAwards = append(rankData.RankAwards, values.RankAward{
MinRank: rankAward.SmallRank,
MaxRank: rankAward.LargeRank,
Award: rankAward.AwardRate,
})
}
}
resp.RankData = append(resp.RankData, rankData)
}
}
}
// RankInfo 排行榜信息
func RankInfo(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
req := &values.RankInfoReq{}
if !a.S(req) {
return
}
if req.RankType == 0 {
req.RankType = 1
}
a.GetUID()
resp := &values.RankInfoResp{
RankData: new(values.RankData),
Exist: true,
}
a.Data = resp
cycleMark := fmt.Sprintf("%d", req.RankCycle)
configRank := call.GetConfigRankByCycle(req.RankType, cycleMark)
if configRank == nil {
resp.Exist = false
return
}
resp.RankData.RankCycle = req.RankCycle
resp.RankData.Pumping = configRank.FreeRatesMap[cycleMark]
resp.RankData.JackPotLast = call.RankJackpotPreGet(req.RankType, cycleMark)
jackpot, rankLess := call.RankJackpotGet(req.RankType, cycleMark)
resp.RankData.JackPot = jackpot
resp.RankData.AwardAtLess = rankLess
if rankAwards, ok := configRank.RankAwardsMap[cycleMark]; ok {
resp.RankData.RankAwards = make([]values.RankAward, 0, len(rankAwards))
for _, rankAward := range rankAwards {
resp.RankData.RankAwards = append(resp.RankData.RankAwards, values.RankAward{
MinRank: rankAward.SmallRank,
MaxRank: rankAward.LargeRank,
Award: rankAward.AwardRate,
})
}
}
// todo 补充排行榜数据
rankUsers, count, err := call.RankUsersGet(req.RankType, cycleMark, req.Page, req.PageSize)
if err != nil {
log.Error(err.Error())
a.Code = values.CodeRetry
return
}
resp.RankData.RankUsersCount = count
for _, rankUser := range rankUsers {
resp.RankData.RankUsers = append(resp.RankData.RankUsers, values.RankUser{
UserName: rankUser.UserInfo.Nick,
UserCount: rankUser.RankValue,
UserIcon: rankUser.UserInfo.Avatar,
UserRank: rankUser.Rank,
UserAward: rankUser.UserAward,
UserAwardExpected: rankUser.UserAwardCount,
})
}
}
// RankHistory 排行榜历史记录
func RankHistory(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
req := &values.RankHistoryReq{}
if !a.S(req) {
return
}
if req.RankType == 0 {
req.RankType = 1
}
a.GetUID()
resp := &values.RankHistoryResp{
RankData: new(values.RankData),
}
a.Data = resp
cycleMark := fmt.Sprintf("%d", req.RankCycle)
resp.RankData.JackPotLast = call.RankJackpotPreGet(req.RankType, cycleMark)
resp.RankData.RankCycle = req.RankCycle
rankUsers, count, err := call.RankUsersPreGet(req.RankType, cycleMark, req.Page, req.PageSize)
if err != nil {
log.Error(err.Error())
a.Code = values.CodeRetry
return
}
resp.RankData.RankUsersCount = count
for _, rankUser := range rankUsers {
resp.RankData.RankUsers = append(resp.RankData.RankUsers, values.RankUser{
UserName: rankUser.UserInfo.Nick,
UserCount: rankUser.RankValue,
UserIcon: rankUser.UserInfo.Avatar,
UserRank: rankUser.Rank,
UserAward: rankUser.UserAward,
UserAwardExpected: rankUser.UserAwardCount,
})
}
}
// RankReward 玩家中奖记录
func RankReward(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
req := &values.RankRewardReq{}
if !a.S(req) {
return
}
a.GetUID()
resp := &values.RankRewardResp{}
a.Data = resp
rankAwards, count, err := call.UserRankAwardRecord(a.UID, req.Page, req.PageSize)
if err != nil {
log.Error(err.Error())
a.Code = values.CodeRetry
return
}
resp.Count = count
resp.RankRewardDetails = make([]values.RankRewardDetails, 0, len(rankAwards))
for _, rankAward := range rankAwards {
resp.RankRewardDetails = append(resp.RankRewardDetails, values.RankRewardDetails{
Rank: rankAward.Rank,
RankCycle: rankAward.RankCycle,
RewardAt: rankAward.RankAt,
RewardCount: rankAward.UserAwardCount,
})
}
}

@ -17,6 +17,69 @@ import (
"gorm.io/gorm"
)
func getUserInfo(uid int) (resp values.UserInfoResp, err error) {
pd := &common.PlayerData{UID: uid}
db.Mysql().Get(pd)
ret, err := call.GetUserXInfo(uid, "avatar", "nick", "mobile", "birth")
if err != nil {
log.Error("err:%v", err)
return
}
resp = values.UserInfoResp{
UID: uid,
Nick: ret.Nick,
Avatar: ret.Avatar,
VIPLevel: call.GetVIP(uid).Level,
Currencys: make(map[common.CurrencyType]int64),
Feedback: pd.FeedbackTime > 0,
NewPddShare: call.HasNewAcitivityPddShare(uid),
Birth: ret.Birth,
Phone: ret.Mobile,
CurrentVip: &values.OneUserInfoVip{},
NextVip: &values.OneUserInfoVip{},
}
resp.Activitys.RechargeBack = call.ShouldShowActivityFirstRechargeBack(uid)
resp.Activitys.DaySign = call.ShouldShowActivitySign(uid)
resp.Activitys.WeekCard = call.ShouldShowActivityWeekCard(uid)
resp.Activitys.LuckyShop = call.ShouldShowActivityLuckShop(uid)
vip := call.GetVipCon(uid)
var nextVip *common.ConfigVIP
if vip != nil {
nextVip = call.GetConfigVIPByLevel(vip.Level + 1)
resp.CurrentVip.Bonus = vip.Bonus
resp.CurrentVip.Cashback = vip.Cashback
resp.CurrentVip.WithdrawFee = vip.Fee
resp.CurrentVip.WithdrawCount = vip.WithdrawCount
}
if nextVip != nil {
resp.NextVip.Bonus = nextVip.Bonus
resp.NextVip.Cashback = nextVip.Cashback
resp.NextVip.WithdrawFee = nextVip.Fee
resp.NextVip.WithdrawCount = nextVip.WithdrawCount
} else {
resp.NextVip = resp.CurrentVip
}
if pd.LastAppSpinDraw == 0 {
resp.AppSpinCount++
}
currency := &common.PlayerCurrency{UID: uid}
db.Mysql().Get(currency)
ref := reflect.ValueOf(currency).Elem()
for i := common.CurrencyTypeZero + 1; i < common.CurrencyAll; i++ {
if i == common.CurrencyUSDT {
continue
}
resp.Currencys[i] = ref.Field(int(i) + 1).Int()
}
re := &common.RechargeInfo{UID: uid}
db.Mysql().Get(re)
resp.Recharge = re.TotalRecharge
return
}
func GetUserInfo(c *gin.Context) {
a := app.NewApp(c)
defer func() {
@ -31,6 +94,8 @@ func GetUserInfo(c *gin.Context) {
uid = req.UID
}
CheckTask(a)
// todo
pd := &common.PlayerData{UID: uid}
db.Mysql().Get(pd)
ret, err := call.GetUserXInfo(uid, "avatar", "nick", "mobile", "birth")

@ -25,7 +25,7 @@ func CrosHandler() gin.HandlerFunc {
context.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE,UPDATE")
//允许跨域设置可以返回其他子段,可以自定义字段
context.Header("Access-Control-Allow-Headers", "fbc,fbp,platform,referrer,lang,share,channel,uuid,version,Authorization, Content-Length, X-CSRF-Token, Token,session,X_Requested_With,Accept, Origin, Host, Connection, Accept-Encoding, Accept-Language,DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Pragma,token,openid,opentoken")
context.Header("Access-Control-Allow-Headers", "fbc,fbp,lang,zone,res_version,share,Channel,uuid,version,Authorization, Content-Length, X-CSRF-Token, Token,session,X_Requested_With,Accept, Origin, Host, Connection, Accept-Encoding, Accept-Language,DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Pragma,token,openid,opentoken")
// 允许浏览器(客户端)可以解析的头部 (重要)
context.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers,Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma,FooBar")

@ -1,6 +1,7 @@
package middleware
import (
"github.com/liangdas/mqant/log"
"server/call"
"server/common"
"server/db"
@ -73,6 +74,7 @@ func TokenMiddleWare() gin.HandlerFunc {
token := c.GetHeader("token")
a := app.NewApp(c)
uid, _ := db.Redis().GetInt(common.GetRedisKeyToken(token))
log.Debug("token:%s, uid:%d", token, uid)
if uid == 0 {
a.Code = values.CodeToken
a.Response()

@ -8,6 +8,7 @@ import (
"server/modules/web/providers/base"
"server/modules/web/providers/gs"
"server/modules/web/providers/jili2"
"server/modules/web/providers/jin2"
"server/modules/web/providers/pg2"
"server/modules/web/providers/pg3"
"server/modules/web/providers/pgsoft"
@ -53,6 +54,8 @@ type AllProvider struct {
PG2 func(b *base.Base)
Jili2 func(b *base.Base)
PG3 func(b *base.Base)
Jin func(b *base.Base)
Jin2 func(b *base.Base)
}
var All = &AllProvider{}
@ -96,6 +99,8 @@ func initAll() {
All.PG2 = pg2.NewSub
All.Jili2 = jili2.NewSub
All.PG3 = pg3.NewSub
All.Jin = jin2.NewSub
All.Jin2 = jin2.NewSub
}
func InitRouter(r *gin.RouterGroup) {

@ -54,6 +54,7 @@ type EnterGameReq struct {
}
func (s *Sub) EnterGame() string {
// todo 不用了
uid := s.Base.EnterGameReq.UID
ct := s.Base.EnterGameReq.CurrencyType
gameid := s.Base.EnterGameReq.GameID

@ -31,6 +31,7 @@ const (
SessionTypeBonus
SessionTypeBuyIn // 直接扣钱操作
SessionTypeBuyOut // 直接加钱操作
SessionTypeFree // 免费游戏
)
const (

@ -86,6 +86,7 @@ func (s *Sub) EnterGame() string {
// if !config.GetBase().Release {
// ip = "3.110.154.202"
// }
// todo
platForm := 1
if common.IsPC(s.Base.EnterGameReq.DeviceType) {
platForm = 0

@ -2,6 +2,8 @@ package jili2
import (
"fmt"
"github.com/liangdas/mqant/log"
"gorm.io/gorm/clause"
"server/common"
"server/db"
"server/util"
@ -131,19 +133,37 @@ func GetGameList() {
return
}
var gameList []*common.ConfigGameList
for _, item := range response.Data.GameList {
id, _ := strconv.Atoi(item.MapID)
if strings.Contains(item.GameID, "jili") {
gameList = append(gameList, &common.ConfigGameList{
tmpGameList := common.ConfigGameList{
GameProvider: common.ProviderJiLi2,
GameID: id,
GameCode: item.GameID,
Icon: item.Icon,
Name: item.Name,
}
updates := make(map[string]interface{})
if item.GameID != "" {
updates["game_code"] = item.GameID
}
if item.Icon != "" {
updates["icon"] = item.Icon
}
if item.Name != "" {
updates["name"] = item.Name
}
// todo 改为协程池
util.Go(func() {
err = db.Mysql().C().Model(&common.ConfigGameList{}).Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "game_id"}, {Name: "game_provider"}},
DoUpdates: clause.Assignments(updates),
}).Create(&tmpGameList).Error
if err != nil {
log.Error("update game list err, %s", err.Error())
}
})
}
}
db.Mysql().Create(gameList)
}

@ -34,6 +34,7 @@ func (s *Sub) Init() {
}
func (s *Sub) EnterGame() string {
log.Debug("jili2 enter game")
url := fmt.Sprintf("%s/api/usr/ingame", API)
timestamp := time.Now().Unix()
uid := s.Base.EnterGameReq.UID
@ -56,7 +57,7 @@ func (s *Sub) EnterGame() string {
return ""
}
request := EnterGameRequest{
Uname: common.GetProviderUserName(fmt.Sprintf("%d", uid)),
Uname: call.GetProviderUserName(fmt.Sprintf("%d", uid)),
GameID: game.GameCode,
Token: common.GetProviderUserToken(token),
Lang: Lang,

@ -0,0 +1,84 @@
package jin2
// Success Codes
const (
CodeSuccess = 0 // 操作成功
)
// Request Error Codes
const (
CodeRequestEmptyParams = 1001 // 请求参数为空
CodeRequestInvalidParams = 1002 // 请求参数错误
CodeSignatureError = 1003 // 签名错误
CodeInvalidOperator = 1004 // 无效的运营商代码
)
// Operation Error Codes
const (
CodeOperationFailed = 3001 // 操作失败(没有具体的失败原因说明)
CodeUserNotFound = 3002 // 用户不存在
CodeUserDataIncomplete = 3003 // 用户数据未加载完全
CodeParameterProcessingError = 3004 // 参数处理异常(一般是数据不一致导致的)
CodeDuplicateOrder = 3005 // 订单号重复
CodeTokenMismatch = 3006 // Token不一致
CodeRequestRateLimit = 3007 // 请求频率过高
CodeInsufficientBalance = 3008 // 余额不足
)
type GetBalanceReq struct {
AppID string
AppSecret string
UserID string
}
type GetBalanceResp struct {
Code int `json:"code"`
Error string `json:"error"`
Data struct {
Balance float64 `json:"Balance"`
Level int `json:"Level"`
} `json:"data"`
}
type GameBetReq struct {
IsEnd bool // 返奖时游戏结束标识(true: 当前对局已结束, false: 当前对局未结束)
AppID string // 运营商唯一标识
AppSecret string // 运营商 AppSecret
UserID string // 运营商的玩家唯一标识
TransactionID string // 交易订单号
Amount float64 // 增加/扣除金额(+ 增加, - 扣除)
RoundID string // 本局游戏 ID
GameID string // 游戏 ID
ReqTime string // 请求时间
Reason string // bet 下注扣款; win 派奖; refund 服务器内部出错,退回下注
}
type GameBetResp struct {
Code int `json:"code"`
Error string `json:"error"`
Data struct {
Balance float64 `json:"Balance"`
Level int `json:"Level"`
} `json:"data"`
}
type JackpotReq struct {
Reference string `json:"reference" form:"reference"` // 当前注单号
OperatorID string `json:"operator_id" form:"operator_id"` // 本平台提供的运营商ID
Accounts string `json:"accounts" form:"accounts"` // 运营的游戏帐号或ID
Token string `json:"token" form:"token"` // authentication 返回的 token
GameID string `json:"game_id" form:"game_id"` // 游戏类型ID
RoomID string `json:"room_id" form:"room_id"` // 游戏房间ID
WinAmount float64 `json:"win_amount" form:"win_amount"` // 当前游戏彩金金额
RecordType string `json:"record_type" form:"record_type"` // 10 小彩金 11 大彩金 12 中等彩金
BetReferenceID string `json:"bet_reference_id" form:"bet_reference_id"` // 压注注单号
RoundID string `json:"round_id" form:"round_id"` // 局号
}
type JackpotResp struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data struct {
Amount float64 `json:"amount"`
} `json:"data"`
}

@ -0,0 +1,76 @@
package jin2
import (
"fmt"
"server/call"
"server/config"
"server/modules/web/providers/base"
"server/util"
"github.com/liangdas/mqant/log"
)
type Sub struct {
Base *base.Base
}
func NewSub(base *base.Base) {
base.Sub = &Sub{Base: base}
base.SubInitRouter = Jin2
}
func (s *Sub) Init() {
API = APITest
AgentMap = AgentMapTest
if config.GetBase().Release {
API = APIRlease
AgentMap = AgentMapRelease
}
}
type EnterReq struct {
UserID string
GameID string
Language string
}
type EnterResp struct {
Code int
Error string
Data struct {
URL string `json:"Url"`
}
}
func (s *Sub) EnterGame() string {
log.Debug("jin2 enter game")
providerID := s.Base.EnterGameReq.ProviderID
gameID := s.Base.EnterGameReq.GameID
game := call.GetGameListByByID(providerID, gameID)
if game == nil {
return ""
}
req := &EnterReq{
UserID: call.GetProviderUserName(fmt.Sprintf("%d", s.Base.UID)),
GameID: game.GameCode,
Language: "en",
}
var resp EnterResp
headers := map[string]string{
"AppID": AgentMap.MchId,
"AppSecret": AgentMap.Key,
}
err := util.HttpPost(API, req, &resp, headers)
if err != nil {
log.Error("err:%v", err)
return ""
}
if resp.Data.URL == "" {
log.Error("err:%+v", resp)
return ""
}
return resp.Data.URL
}

@ -0,0 +1,222 @@
package jin2
import (
"server/call"
"server/common"
"server/db"
"server/modules/web/app"
"server/modules/web/providers/base"
"server/util"
"strconv"
"time"
"github.com/gin-gonic/gin"
"github.com/liangdas/mqant/log"
"gorm.io/gorm"
)
func Jin2(e *gin.RouterGroup) {
e.POST("/Cash/Get", GetBalance)
e.POST("/Cash/TransferInOut", GameBet)
}
func GetGameID(providerID int, gameCode string) int {
game := call.GetConfigGameListByCode(providerID, gameCode)
if game != nil {
return game.GameID
}
return 0
}
func GetBalance(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.ResponseB()
}()
req := &GetBalanceReq{}
resp := &GetBalanceResp{}
a.RetData = resp
if !a.S(req) {
resp.Code = CodeRequestInvalidParams
return
}
log.Debug("GetBalanceReq:%+v", req)
if a.ShouldRoute(req, "UserID", common.ProviderAPITypeJson) {
return
}
uids := req.UserID
uid, err := strconv.Atoi(uids)
if err != nil {
log.Error("err:%v", err)
resp.Code = CodeOperationFailed
return
}
currency, err := db.Redis().GetInt(common.GetRedisKeyGameCurrency(uid))
if err != nil {
log.Error("err:%v", err)
resp.Code = CodeOperationFailed
return
}
resp.Data.Balance = call.GetUserCurrencyFloat(uid, common.CurrencyType(currency), 2)
resp.Data.Level = call.GetProviderGameRtp(uid)
log.Debug("GetBalanceResp:%+v", resp)
}
func GameBet(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.ResponseB()
}()
req := &GameBetReq{}
resp := &GameBetResp{}
a.RetData = resp
if !a.S(req) {
resp.Code = CodeRequestInvalidParams
return
}
log.Debug("GameBet:%+v", req)
if a.ShouldRoute(req, "UserID", common.ProviderAPITypeJson) {
return
}
uid, err := strconv.Atoi(req.UserID)
if err != nil {
resp.Code = CodeOperationFailed
return
}
provider := call.GetConfigGameProvider(common.ProviderJin2)
now := time.Now().Unix()
if req.Reason == "bet" || req.Reason == "win" {
betReq := &base.BetReq{
UID: uid,
SessionType: base.SessionTypeBet,
GameID: GetGameID(common.ProviderJin2, req.GameID),
GameName: req.GameID,
Provider: provider,
BetID: req.TransactionID,
SessionID: req.RoundID,
Time: now,
}
if req.Reason == "bet" {
betReq.BetAmount = util.Abs(int64(req.Amount * common.DecimalDigits))
betReq.TurnOver = util.Abs(int64(req.Amount * common.DecimalDigits))
//betReq.Rtp = call.GetProviderGameRtp(uid)
} else if req.Reason == "win" {
// 先判断结算是否合法
record := &common.ProviderBetRecord{
UID: uid,
Provider: provider.ProviderID,
Type: base.SessionTypeBet,
SessionID: betReq.SessionID,
}
db.Mysql().Get(record)
if record.ID == 0 {
resp.Code = CodeOperationFailed
currency, err := db.Redis().GetInt(common.GetRedisKeyGameCurrency(uid))
if err != nil {
log.Error("err:%v", err)
resp.Code = CodeOperationFailed
return
}
resp.Data.Balance = call.GetUserCurrencyFloat(uid, common.CurrencyType(currency), 2)
resp.Data.Level = call.GetProviderGameRtp(uid)
return
}
betReq.SettleAmount = int64(req.Amount * common.DecimalDigits)
// 免费游戏的情况
if betReq.SettleAmount == 0 && !req.IsEnd {
currency, err := db.Redis().GetInt(common.GetRedisKeyGameCurrency(uid))
if err != nil {
log.Error("err:%v", err)
resp.Code = CodeOperationFailed
return
}
resp.Data.Balance = call.GetUserCurrencyFloat(uid, common.CurrencyType(currency), 2)
resp.Data.Level = call.GetProviderGameRtp(uid)
return
}
record = &common.ProviderBetRecord{
UID: uid,
Provider: provider.ProviderID,
Type: base.SessionTypeFree,
SessionID: betReq.SessionID,
}
db.Mysql().Get(record)
if !req.IsEnd {
if record.ID == 0 {
record = &common.ProviderBetRecord{
UID: uid,
Provider: provider.ProviderID,
GameID: betReq.GameID,
GameName: betReq.GameName,
UUID: betReq.BetID,
MyUUID: call.SnowNode().Generate().Int64(),
Type: base.SessionTypeFree,
Time: betReq.Time,
Settle: betReq.SettleAmount,
SessionID: betReq.SessionID,
Esi: base.SessionSuccess,
}
db.Mysql().Create(record)
} else {
db.Mysql().Update(&common.ProviderBetRecord{ID: record.ID},
map[string]interface{}{"Settle": gorm.Expr("Settle + ?", betReq.SettleAmount)})
}
currency, err := db.Redis().GetInt(common.GetRedisKeyGameCurrency(uid))
if err != nil {
log.Error("err:%v", err)
resp.Code = CodeOperationFailed
return
}
resp.Data.Balance = call.GetUserCurrencyFloat(uid, common.CurrencyType(currency), 2)
resp.Data.Level = call.GetProviderGameRtp(uid)
return
} else {
if record.ID >= 0 {
betReq.SettleAmount += record.Settle
}
}
betReq.SessionType = base.SessionTypeSettle
}
betResp := base.SessionBet(betReq)
if betResp.Code != base.CodeOk {
resp.Code = CodeSuccess
if betResp.Code == base.CodeAccepted {
resp.Code = CodeDuplicateOrder
} else if betResp.Code == base.CodeNotEnoughAmount {
resp.Code = CodeInsufficientBalance
}
resp.Error = "operation failed."
log.Error("GameBetResp err:%v", resp.Code)
return
}
resp.Data.Balance = util.Decimal(float64(betResp.Balance)/common.DecimalDigits, 2)
} else if req.Reason == "refund" {
adjustReq := &base.AdjustmentReq{
UID: uid,
Amount: int64(req.Amount * common.DecimalDigits),
GameID: GetGameID(common.ProviderJin2, req.GameID),
GameName: req.GameID,
Provider: provider,
BetID: req.RoundID,
SessionID: req.TransactionID,
Time: now,
Type: base.SessionTypeAdjustment,
Ess: req.Reason,
}
adjustResp := base.Adjustment(adjustReq)
if adjustResp.Code != CodeSuccess {
resp.Error = "operation failed."
}
resp.Data.Balance = util.Decimal(float64(adjustResp.Balance)/common.DecimalDigits, 2)
}
resp.Data.Level = call.GetProviderGameRtp(uid)
log.Debug("GameBetResp:%+v", resp)
a.Data = resp
}

@ -0,0 +1,83 @@
package jin2
const (
APIRlease = "https://gamecenter.fortureslots.com/api/v1/game/launch"
APITest = "https://gamecenter.pg2testing.com/api/v1/game/launch"
// LaunchGameURL = "/api/usr/ingame"
// GetGameListURL = "/api/game/loadlist"
// Lang = "hi"
)
type Agent struct {
MchId string `json:"mch_id"`
Key string `json:"key"`
}
var (
API = ""
AgentMap Agent
AgentMapTest = Agent{
MchId: "slotgolden777test",
Key: "010804d1-7bbf-4ed5-9b50-60fbd2b22e34",
}
AgentMapRelease = Agent{
MchId: "slotgolden777",
Key: "ddeaeb76-5624-41fe-a6ea-7ad9307d7701",
}
)
// var (
// RtpMap = map[int]int{
// 97: 11,
// 96: 12,
// 95: 13,
// 93: 14,
// 90: 15,
// 85: 16,
// 80: 17,
// 60: 18,
// 40: 19,
// }
// rtps = []int{97, 96, 95, 93, 90, 85, 80, 60, 40}
// LevelMap = map[int]int{
// 11: 97,
// 12: 96,
// 13: 95,
// 14: 93,
// 15: 90,
// 16: 85,
// 17: 80,
// 18: 60,
// 19: 40,
// }
// )
// func GetLevel(uid int) int {
// rtp := call.GetProviderGameRtp(uid)
// if rtp >= rtps[0] {
// return RtpMap[97]
// } else if rtp <= rtps[len(rtps)-1] {
// return RtpMap[40]
// }
// for i := 1; i < len(rtps); i++ {
// if rtp <= rtps[i-1] && rtp >= rtps[i] {
// return RtpMap[rtps[i]]
// }
// }
// return 15
// }
// func GetRtp(uid int) int {
// rtp := call.GetProviderGameRtp(uid)
// if rtp >= rtps[0] {
// return LevelMap[RtpMap[97]]
// } else if rtp <= rtps[len(rtps)-1] {
// return LevelMap[RtpMap[40]]
// }
// for i := 1; i < len(rtps); i++ {
// if rtp <= rtps[i-1] && rtp >= rtps[i] {
// return LevelMap[RtpMap[rtps[i]]]
// }
// }
// return 90
// }

@ -54,6 +54,7 @@ func SetUpRouter() *gin.Engine {
telegram(auth)
ad(auth)
customer(auth)
rank(auth)
}
provider := r.Group("provider/")
if config.GetBase().Release {

@ -12,19 +12,21 @@ func account(e *gin.RouterGroup) {
e.POST("/account/email/login", handler.EmailLogin)
e.POST("/account/email/resetPass", handler.EmailResetPass)
e.POST("/account/guestLogin", handler.GuestLogin)
e.POST("/account/gpLogin", handler.GPLogin)
e.POST("/account/fbLogin", handler.FBLogin)
e.POST("/account/tokenLogin", handler.TokenLogin)
e.POST("/account/phoneCode/get", handler.GetPhoneCode)
e.POST("/account/phoneCode/verify", handler.VerifyCode)
e.POST("/account/phoneCode/login", handler.PhoneCodeLogin)
e.POST("/account/phoneCode/bind", handler.BindingAccount)
e.POST("/account/phone/regist", handler.PhoneRegist)
e.POST("/account/phone/login", handler.PhoneLogin)
e.POST("/account/phone/resetPass", handler.PhoneResetPass)
e.POST("/account/regist", handler.AccountRegist)
e.POST("/account/login", handler.AccountLogin)
e.POST("/account/resetPass", handler.AccountResetPass)
e.POST("/account/guestLogin", handler.GuestLogin)
e.POST("/account/phoneCode/get", handler.GetPhoneCode)
e.POST("/account/phoneCode/login", handler.PhoneCodeLogin)
e.POST("/account/phone/regist", handler.PhoneRegist)
e.POST("/account/phone/login", handler.PhoneLogin)
e.POST("/account/phone/resetPass", handler.PhoneResetPass)
}

@ -7,5 +7,5 @@ import (
)
func firstpage(e *gin.RouterGroup) {
e.POST("/firstpage", handler.FirstPage)
e.POST("/firstpage", handler.FirstPageNew)
}

@ -7,8 +7,9 @@ import (
)
func game(e *gin.RouterGroup) {
e.POST("/game/list", handler.GameList)
e.POST("/game/enter", handler.EnterGame)
e.POST("/game/tag", handler.GameTag)
e.POST("/game/list", handler.GameListNew)
e.POST("/game/enter", handler.EnterGameNew)
e.POST("/game/history", handler.GameHistory)
e.POST("/game/profile", handler.GameProfile)
e.POST("/game/search", handler.GameSearch)

@ -0,0 +1,14 @@
package routers
import (
"server/modules/web/handler"
"github.com/gin-gonic/gin"
)
func rank(e *gin.RouterGroup) {
e.POST("/rank/cfg", handler.RankCfg)
e.POST("/rank/info", handler.RankInfo)
e.POST("/rank/history", handler.RankHistory)
e.POST("/rank/reward", handler.RankReward)
}

@ -4,6 +4,7 @@ package values
type PhoneRegistReq struct {
Phone string `json:"Phone" binding:"required"` // 手机号
Pass string `json:"Pass" binding:"required"`
Code string `json:"Code" binding:"required"`
Adid string `json:"Adid"`
GPSAdid string `json:"GPSAdid"`
Share string `json:"Share"`
@ -41,7 +42,7 @@ type PhoneCodeLoginReq struct {
// GuestLoginReq 游客登录请求
// Share 邀请码
type GuestLoginReq struct {
Nick string `json:"nick"`
Nick string `json:"Nick"`
Adid string `json:"Adid"`
GPSAdid string `json:"GPSAdid"`
Share string `json:"Share"`
@ -53,6 +54,7 @@ type LoginResp struct {
UID int `json:"UID"`
Token string `json:"Token"`
// GameID int `json:"GameID"`
UserInfo UserInfoResp `json:"UserInfo"`
}
// GPLoginReq googleplay login

@ -22,6 +22,50 @@ type FirstPageResp struct {
CurrencyResource []*common.ConfigCurrencyResource
}
type Tag struct {
ID int `json:"id"` //
Name string `json:"name"`
Action int `json:"action"` // 1:游戏分类,2:web跳转,3:活动,4:支付
Icon string `json:"icon"`
Data string `json:"data"`
}
type GameData struct {
Id int `json:"id"` // id
GameId int `json:"gameId"` // 游戏id
GameProvider int `json:"gameProvider"` // 厂商id
GameTag int `json:"gameTag"` // 游戏标签(1:热门,2:最新,3:推荐)
GameStatus int `json:"gameStatus"` // 展示状态(1:上线,2:下线,3:维护中,4:即将上线)
GameIcon string `json:"gameIcon"` // 游戏图标
}
type TagWithGameList struct {
ID int `json:"id"`
Name string `json:"name"`
Action int `json:"action"` // 1:游戏分类,2:web跳转,3:活动,4:支付
Icon string `json:"icon"`
List []GameData `json:"list"` // 游戏列表
Total int `json:"total"` // 总数
Data string `json:"data"`
}
type Banner struct {
Id int `json:"id"` //
Action int `json:"action"`
Url string `json:"url"`
Data string `json:"data"`
Icon string `json:"icon"`
}
type FirstPageNewResp struct {
Currencys []OneCurrency
DownloadAppReward int64
ShowData ShowInfo // 首页头部展示
CurrencyResource []*common.ConfigCurrencyResource
GameTags []Tag
Banners []Banner
}
type ShowInfo struct {
Reward int64 `redis:"Reward"` // 奖金
AverWithdraw int64 `redis:"AverWithdraw"` // 平均提现时间

@ -18,6 +18,22 @@ type GameListReq struct {
Mark int
}
type GameTagReq struct {
TagId int `json:"tagId"` // 标签id
}
type GameTagResp struct {
Banners []Banner
Tags []TagWithGameList
}
type GameListNewReq struct {
TagId int `json:"tagId"` // 一级标签
SubTagId int `json:"subTagId"` // 二级标签
Page int `json:"page"`
PageSize int `json:"pageSize"`
}
// Provider 游戏提供商
// List 列表
type GameListResp struct {
@ -25,6 +41,11 @@ type GameListResp struct {
List []*common.ConfigGameList
}
type GameListNewResp struct {
List []GameData `json:"list"`
Total int `json:"total"`
}
// EnterGameReq 进入游戏
// Provider int 游戏提供商
// GameID int 游戏id
@ -39,10 +60,16 @@ type EnterGameReq struct {
SubID int // 游戏子id
}
type EnterGameNewReq struct {
Provider int `json:"provider"` // 游戏提供商
GameID int `json:"gameId"` // 游戏id
}
// EnterGameResp 进入游戏
// Method 进入方式 1url 2html
type EnterGameResp struct {
URL string // 跳转网址
GameId int `json:"gameId"` // 游戏id
URL string `json:"url"` // 跳转网址
Method int
}

@ -0,0 +1,77 @@
package values
type RankCfgReq struct {
RankType int `json:"rankType"` // 排行榜类型(1:打码排行榜,2:充值排行榜)
}
type RankCfgResp struct {
RankData []RankData `json:"rankData"` // 排行榜信息
}
type RankInfoReq struct {
RankType int `json:"rankType"` // 排行榜类型(1:打码排行榜,2:充值排行榜)
RankCycle int `json:"rankCycle"` // 排行榜类型(1:日,2:周,3:月)
// 排名分页
Page int `json:"page"`
PageSize int `json:"pageSize"`
}
type RankUser struct {
UserName string `json:"userName"` // 玩家昵称
UserCount int64 `json:"userCount"` // 玩家数值
UserIcon string `json:"userIcon"` // 玩家头像
UserRank int `json:"userRank"` // 玩家排名
UserAward int `json:"userAward"` // 玩家预计分奖比例(*10000)
UserAwardExpected int64 `json:"userAwardExpected"` // 玩家预计奖励
}
type RankAward struct {
MinRank int `json:"minRank"` // 最小排名
MaxRank int `json:"maxRank"` // 最大排名
Award int `json:"award"` // 分奖比例(*10000)
}
type RankData struct {
RankCycle int `json:"rankCycle"` // 排行榜类型(1:日,2:周,3:月)
Pumping int `json:"pumping"` // 抽水比例(*10000)
JackPot int64 `json:"jackPot"` // 当前奖池
JackPotLast int64 `json:"jackPotLast"` // 继承奖池
AwardAtLess int64 `json:"awardAtLess"` // 剩余开奖时间戳
RankAwards []RankAward `json:"rankAwards"` // 排行榜奖励配置
RankUsers []RankUser `json:"rankUsers"` // 排名详情
RankUsersCount int64 `json:"rankUsersCount"` // 排名总数
}
type RankInfoResp struct {
RankData *RankData `json:"rankData"` // 排名详情
Exist bool `json:"exist"` // 活动存在
}
type RankHistoryReq struct {
RankType int `json:"rankType"` // 排行榜类型(1:打码排行榜,2:充值排行榜)
RankCycle int `json:"rankCycle"` // 排行榜类型(1:日,2:周,3:月)
// 排名分页
Page int `json:"page"`
PageSize int `json:"pageSize"`
}
type RankHistoryResp struct {
RankData *RankData `json:"rankData"` // 历史详情
}
type RankRewardReq struct {
Page int `json:"page"`
PageSize int `json:"pageSize"`
}
type RankRewardDetails struct {
Rank int `json:"rank"` // 排名
RankCycle int `json:"rankCycle"` // 排行榜类型(1:日,2:周,3:月)
RewardAt int64 `json:"rewardAt"` // 发奖时间戳
RewardCount int64 `json:"rewardCount"` // 中奖数量
}
type RankRewardResp struct {
Count int64 `json:"count"` // 总条数
RankRewardDetails []RankRewardDetails `json:"rankRewardDetails"` // 中奖详情
}

@ -0,0 +1,175 @@
package tunnel
import (
"context"
"fmt"
"github.com/go-redis/redis/v8"
"golang.org/x/crypto/ssh"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"io"
"log"
"net"
"sync/atomic"
"time"
)
/*
notice: 利用隧道代理实现本地连接服务器程序
*/
var (
// ssh配置
sshPem = `` // todo 私钥填充
sshHost = "47.106.150.32"
sshPort = 22
sshUser = "root"
sshPass = "cH6YIEPCCrFsTNJ4"
// mysql配置
mysqlHost = "127.0.0.1"
mysqlPort = 3306
mysqlUser = "root"
mysqlPass = "pFlu4oNgTKhMdttQ"
mysqlDB = "c_game"
// redis配置
redisHost = "127.0.0.1"
redisPort = 6379
redisPass = "cYUTZma6wEzrdvDJ"
redisDB = 1
// 本地转发端口
LocalPort int32 = 1000 // 从1000开始尝试20次
)
// 转发数据
func forward(local, remote net.Conn) {
defer local.Close()
defer remote.Close()
done := make(chan struct{})
go func() {
_, _ = io.Copy(local, remote)
done <- struct{}{}
}()
go func() {
_, _ = io.Copy(remote, local)
done <- struct{}{}
}()
<-done
}
func getListener() (net.Listener, int32) {
var (
listener net.Listener
err error
port int32
tryCount int32 = 100
)
for index := int32(0); index < tryCount; index++ {
port = atomic.AddInt32(&LocalPort, 1)
address := fmt.Sprintf("localhost:%d", port)
listener, err = net.Listen("tcp", address)
if err == nil && listener != nil {
break
}
log.Printf("[WARN]: listen %s, listener[%+v] err[%+v]", address, listener, err)
}
if listener == nil && err != nil {
log.Fatalf("listener err, tryCount[%d] ", tryCount)
}
return listener, port
}
func getSshConfig() (cfg *ssh.ClientConfig) {
cfg = &ssh.ClientConfig{
User: sshUser,
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
Timeout: 10 * time.Second,
}
if sshPem != "" {
signer, err := ssh.ParsePrivateKey([]byte(sshPem))
if err != nil {
log.Fatalf("Failed to parse private key: %s", err.Error())
}
cfg.Auth = append(cfg.Auth, ssh.PublicKeys(signer))
}
if sshPass != "" {
cfg.Auth = append(cfg.Auth, ssh.Password(sshPass))
}
return cfg
}
func binding(listener net.Listener, sshClient *ssh.Client, processHost string, processPort int) {
for {
localConn, err := listener.Accept()
if err != nil {
log.Printf("Failed to accept connection: %v", err)
return
}
remoteConn, err := sshClient.Dial("tcp", fmt.Sprintf("%s:%d", processHost, processPort))
if err != nil {
log.Printf("Failed to dial remote Redis: %v", err)
localConn.Close()
continue
}
go forward(localConn, remoteConn)
}
}
func getSshClient() *ssh.Client {
sshConfig := getSshConfig()
sshClient, err := ssh.Dial("tcp", fmt.Sprintf("%s:%d", sshHost, sshPort), sshConfig)
if err != nil {
log.Fatalf("Failed to dial SSH: %v", err)
}
return sshClient
}
func GetMysql() *gorm.DB {
// 连接服务器
sshClient := getSshClient()
// 获取本地监听
listener, localPort := getListener()
// 转发进程数据
go binding(listener, sshClient, mysqlHost, mysqlPort)
// 连接本地端口
dsn := fmt.Sprintf("%s:%s@tcp(127.0.0.1:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", mysqlUser, mysqlPass, localPort, mysqlDB)
// 打开数据库连接
db, err := gorm.Open(mysql.New(mysql.Config{
DSN: dsn,
}), &gorm.Config{})
if err != nil {
log.Fatalf("create db err, %s", err.Error())
}
return db
}
func GetRedis() (*redis.Client, int32) {
// 连接服务器
sshClient := getSshClient()
// 建立本地监听
listener, localPort := getListener()
// 转发进程数据
go binding(listener, sshClient, redisHost, redisPort)
// 连接本地端口
rdb := redis.NewClient(&redis.Options{
Addr: fmt.Sprintf("127.0.0.1:%d", localPort),
Password: redisPass,
DB: redisDB,
})
ctx := context.Background()
v, err := rdb.Ping(ctx).Result()
_ = v
if err != nil {
log.Fatalf("Failed to connect to Redis: %v", err)
}
return rdb, localPort
}
Loading…
Cancel
Save