├── pb ├── fsm_log.proto ├── badger_value.proto ├── raft_log.proto ├── fsm_log.pb.go ├── badger_value.pb.go └── raft_log.pb.go ├── config.yaml ├── raft ├── snapshot.go ├── fsm.go └── server.go ├── wal ├── wal.go └── alfheimdbwal.go ├── main.go ├── LICENSE ├── store ├── store.go ├── store_ex.go ├── mem_store.go └── badger_store.go ├── go.mod ├── log └── log.go ├── httpserver └── httpserver.go ├── config └── config.go ├── README.md ├── resp └── resp.go └── go.sum /pb/fsm_log.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package pb; 4 | 5 | 6 | option go_package = "./;pb"; 7 | 8 | message FsmLog { 9 | string Cmd = 1; 10 | repeated bytes CmdArgs = 2; 11 | int64 TimeStamp = 3; 12 | } 13 | -------------------------------------------------------------------------------- /pb/badger_value.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package pb; 4 | 5 | 6 | option go_package = "./;pb"; 7 | 8 | message BadgerStringValue { 9 | bytes Value = 1; 10 | int64 TimeStamp = 2; 11 | int64 Timeout = 3; 12 | } 13 | -------------------------------------------------------------------------------- /config.yaml: -------------------------------------------------------------------------------- 1 | loglevel: info 2 | raftdir: data/ 3 | raftid: id1 4 | raftaddr: localhost:40000 5 | raftcluster: 6 | - localhost:40000/id1 7 | - localhost:40001/id2 8 | - localhost:40002/id3 9 | httpserveraddr: localhost:12345 10 | respserveraddr: localhost:6379 11 | walengine: alfheimdbwal 12 | 13 | storeengine: badger -------------------------------------------------------------------------------- /pb/raft_log.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package pb; 4 | 5 | import public "google/protobuf/timestamp.proto"; 6 | 7 | option go_package = "./;pb"; 8 | 9 | message RaftLog { 10 | uint64 Index = 1; 11 | uint64 Term = 2; 12 | bytes Data = 3; 13 | bytes Extensions =4; 14 | google.protobuf.Timestamp AppendedAt = 5; 15 | uint32 Type = 6; 16 | } 17 | -------------------------------------------------------------------------------- /raft/snapshot.go: -------------------------------------------------------------------------------- 1 | /* 2 | * @Descripttion: 3 | * @version: 4 | * @Author: cm.d 5 | * @Date: 2021-11-11 12:15:28 6 | * @LastEditors: cm.d 7 | * @LastEditTime: 2021-11-12 22:37:19 8 | */ 9 | package raft 10 | 11 | import ( 12 | "github.com/hashicorp/raft" 13 | ) 14 | 15 | type AlfheimRaftSnapshot struct { 16 | SnapshotBytes []byte 17 | } 18 | 19 | func (s *AlfheimRaftSnapshot) Persist(sink raft.SnapshotSink) error { 20 | sink.Write(s.SnapshotBytes) 21 | return sink.Close() 22 | } 23 | 24 | func (s *AlfheimRaftSnapshot) Release() { 25 | } 26 | -------------------------------------------------------------------------------- /wal/wal.go: -------------------------------------------------------------------------------- 1 | /* 2 | * @Descripttion: 3 | * @version: 4 | * @Author: cm.d 5 | * @Date: 2021-11-22 11:33:51 6 | * @LastEditors: cm.d 7 | * @LastEditTime: 2021-11-27 13:09:16 8 | */ 9 | package wal 10 | 11 | import ( 12 | "path/filepath" 13 | 14 | "github.com/AlfheimDB/config" 15 | raftbadger "github.com/BBVA/raft-badger" 16 | "github.com/hashicorp/raft" 17 | "github.com/sirupsen/logrus" 18 | ) 19 | 20 | func NewWAL(baseDir string) (raft.LogStore, error) { 21 | switch config.Config.WALEngine { 22 | case "badger": 23 | return raftbadger.NewBadgerStore(filepath.Join(baseDir, "logs.dat")) 24 | case "alfheimdbwal": 25 | return NewAlheimDBWALRaftEngine(baseDir), nil 26 | default: 27 | logrus.Fatal("Unknow wal engine: ", config.Config.WALEngine) 28 | } 29 | return nil, nil 30 | } 31 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | /* 2 | * @Descripttion:Main 3 | * @version: 4 | * @Author: cm.d 5 | * @Date: 2021-11-06 18:48:23 6 | * @LastEditors: cm.d 7 | * @LastEditTime: 2021-12-09 18:11:57 8 | */ 9 | 10 | package main 11 | 12 | import ( 13 | _ "net/http/pprof" 14 | 15 | "github.com/AlfheimDB/config" 16 | "github.com/AlfheimDB/httpserver" 17 | "github.com/AlfheimDB/log" 18 | "github.com/AlfheimDB/raft" 19 | "github.com/AlfheimDB/resp" 20 | "github.com/AlfheimDB/store" 21 | "github.com/sirupsen/logrus" 22 | ) 23 | 24 | //Module init 25 | func init() { 26 | //Init config module 27 | config.Init() 28 | 29 | //Init log module 30 | log.Init() 31 | 32 | //Init store module 33 | store.Init() 34 | 35 | //Init redcon server 36 | go resp.Init() 37 | 38 | //Init raft server 39 | go raft.Init() 40 | 41 | //Init test http server 42 | go httpserver.Init() 43 | } 44 | 45 | //main 46 | func main() { 47 | logrus.Info("AlfheimDB is start") 48 | select {} 49 | } 50 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 cm.d 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /store/store.go: -------------------------------------------------------------------------------- 1 | /* 2 | * @Descripttion: 3 | * @version: 4 | * @Author: cm.d 5 | * @Date: 2021-11-13 18:05:16 6 | * @LastEditors: cm.d 7 | * @LastEditTime: 2021-12-09 18:17:38 8 | */ 9 | package store 10 | 11 | import ( 12 | "github.com/AlfheimDB/config" 13 | "github.com/sirupsen/logrus" 14 | ) 15 | 16 | var ADBStore AlfheimdbStore 17 | 18 | type AlfheimdbStore interface { 19 | //String store 20 | Set(key string, value string, nowTime int64) error 21 | Get(key string) (*string, error) 22 | Incr(key string, nowTime int64) (int64, error) 23 | Del(key string) error 24 | Keys(prefix string) ([]string, error) 25 | SetEx(key string, value string, nowTime int64, time int64) (string, error) 26 | TTL(key string) (int64, error) 27 | SetNx(key string, value string, nowTime int64) (int, error) 28 | Expire(key string, nowTime, timeout int64) (int, error) 29 | Snapshot() ([]byte, error) 30 | LoadSnapshot(data []byte) error 31 | } 32 | 33 | func Init() { 34 | switch config.Config.StoreEngine { 35 | case "map": 36 | ADBStore = NewMemStoreDatabase() 37 | case "badger": 38 | ADBStore = NewBadgerDBStore(config.Config.BaseDir) 39 | default: 40 | logrus.Fatal("Unknow store engine") 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/AlfheimDB 2 | 3 | go 1.16 4 | 5 | require ( 6 | github.com/BBVA/raft-badger v1.1.0 // indirect 7 | github.com/dgraph-io/badger/v3 v3.2103.2 // indirect 8 | github.com/dj456119/AlfheimDB-WAL v0.0.0-20211129160511-6f954b366408 // indirect 9 | github.com/golang/protobuf v1.5.2 // indirect 10 | github.com/google/pprof v0.0.0-20211122183932-1daafda22083 // indirect 11 | github.com/hashicorp/raft v1.3.2 12 | github.com/hashicorp/raft-boltdb v0.0.0-20211202195631-7d34b9fb3f42 13 | github.com/jinzhu/configor v1.2.1 14 | github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible 15 | github.com/lestrrat-go/strftime v1.0.5 // indirect 16 | github.com/magefile/mage v1.11.0 // indirect 17 | github.com/pkg/errors v0.9.1 // indirect 18 | github.com/sirupsen/logrus v1.8.1 19 | github.com/tidwall/redcon v1.4.2 // indirect 20 | golang.org/x/mod v0.5.1 // indirect 21 | golang.org/x/sys v0.0.0-20211124211545-fe61309f8881 // indirect 22 | golang.org/x/tools v0.1.8 // indirect 23 | google.golang.org/grpc v1.42.0 24 | google.golang.org/protobuf v1.27.1 // indirect 25 | k8s.io/client-go v0.22.4 26 | ) 27 | 28 | // replace github.com/hashicorp/raft => ../raft 29 | 30 | // replace github.com/dj456119/AlfheimDB-WAL => /Users/chunming.dong/Downloads/wal/AlfheimDB-WAL 31 | -------------------------------------------------------------------------------- /log/log.go: -------------------------------------------------------------------------------- 1 | /* 2 | * @Descripttion:The log 3 | * @version: 4 | * @Author: cm.d 5 | * @Date: 2021-10-16 16:13:36 6 | * @LastEditors: cm.d 7 | * @LastEditTime: 2021-11-14 20:24:00 8 | */ 9 | 10 | package log 11 | 12 | import ( 13 | "io" 14 | "os" 15 | "time" 16 | 17 | "github.com/AlfheimDB/config" 18 | rotatelogs "github.com/lestrrat-go/file-rotatelogs" 19 | "github.com/sirupsen/logrus" 20 | ) 21 | 22 | var LogWriter io.Writer 23 | 24 | func Init() { 25 | 26 | logrus.SetFormatter(&logrus.TextFormatter{}) 27 | if config.Config.LogType == "file" { 28 | logFile := "./runtime-log/runtime.log" 29 | writer, _ := rotatelogs.New( 30 | logFile+".%Y%m%d", 31 | rotatelogs.WithLinkName(logFile), 32 | rotatelogs.WithMaxAge(time.Duration(72)*time.Hour), 33 | ) 34 | LogWriter = writer 35 | } else { 36 | LogWriter = os.Stdout 37 | } 38 | logrus.SetOutput(LogWriter) 39 | logLevel := config.Config.LogLevel 40 | switch logLevel { 41 | case "info": 42 | logrus.SetLevel(logrus.InfoLevel) 43 | case "debug": 44 | logrus.SetLevel(logrus.DebugLevel) 45 | case "error": 46 | logrus.SetLevel(logrus.ErrorLevel) 47 | case "fatal": 48 | logrus.SetLevel(logrus.FatalLevel) 49 | default: 50 | logrus.SetLevel(logrus.InfoLevel) 51 | } 52 | 53 | logrus.Info("Log module is start, the log type is ", config.Config.LogType, ", log level is ", logLevel) 54 | } 55 | -------------------------------------------------------------------------------- /httpserver/httpserver.go: -------------------------------------------------------------------------------- 1 | /* 2 | * @Descripttion:Http test server. 3 | * @version: 4 | * @Author: cm.d 5 | * @Date: 2021-11-11 23:33:20 6 | * @LastEditors: cm.d 7 | * @LastEditTime: 2021-12-04 13:36:09 8 | */ 9 | package httpserver 10 | 11 | import ( 12 | "log" 13 | "net/http" 14 | "time" 15 | 16 | "github.com/AlfheimDB/config" 17 | "github.com/AlfheimDB/raft" 18 | "github.com/sirupsen/logrus" 19 | ) 20 | 21 | const ( 22 | HTTP_TEST_APPLY_TIMEOUT = 10 * time.Second 23 | ) 24 | 25 | //The http test server only supprot test command to test raft-fsm. 26 | func TestServer(w http.ResponseWriter, req *http.Request) { 27 | future := raft.RaftServer.Raft.Apply([]byte("test"), HTTP_TEST_APPLY_TIMEOUT) 28 | err := future.Error() 29 | if err != nil { 30 | w.Write([]byte(err.Error())) 31 | return 32 | } else { 33 | respInter := future.Response() 34 | if respInter == nil { 35 | w.Write([]byte("Raft fsm error")) 36 | return 37 | } 38 | resp := respInter.(raft.FsmResponse) 39 | if resp.Error != nil { 40 | w.Write([]byte(resp.Error.Error())) 41 | return 42 | } 43 | w.Write([]byte(resp.Data.(string))) 44 | } 45 | } 46 | 47 | func PingServer(w http.ResponseWriter, req *http.Request) { 48 | w.Write([]byte("pong")) 49 | } 50 | 51 | func Init() { 52 | logrus.Info("Http Test Server is start") 53 | http.HandleFunc("/test", TestServer) 54 | http.HandleFunc("/ping", PingServer) 55 | err := http.ListenAndServe(config.Config.HttpServerAddr, nil) 56 | if err != nil { 57 | log.Fatal("ListenAndServe: ", err) 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /store/store_ex.go: -------------------------------------------------------------------------------- 1 | /* 2 | * @Descripttion: 3 | * @version: 4 | * @Author: cm.d 5 | * @Date: 2021-12-04 13:55:21 6 | * @LastEditors: cm.d 7 | * @LastEditTime: 2021-12-06 16:53:25 8 | */ 9 | package store 10 | 11 | import ( 12 | "time" 13 | 14 | "github.com/sirupsen/logrus" 15 | ) 16 | 17 | type DataEx struct { 18 | Callback func(key string) error 19 | Des DataExStore 20 | IsLeader bool 21 | } 22 | 23 | type DataExStore interface { 24 | Set(key string, dev DataExValue) error 25 | Get(key string) (*DataExValue, error) 26 | GetExKeys(nowtime time.Duration) error 27 | } 28 | 29 | type DataExValue struct { 30 | Key string 31 | When time.Duration 32 | Timeout time.Duration 33 | TimeoutAt time.Duration 34 | } 35 | 36 | func NewDataEx(callback func(key string) error) *DataEx { 37 | return &DataEx{ 38 | Callback: callback, 39 | } 40 | } 41 | 42 | type Void struct{} 43 | 44 | func (de *DataEx) SetEx(key string, timeout time.Duration) { 45 | nowTime := time.Duration(time.Now().UnixNano()) / 1e6 46 | dev := DataExValue{Key: key, When: nowTime, Timeout: timeout, TimeoutAt: nowTime + timeout} 47 | err := de.Des.Set(key, dev) 48 | if err != nil { 49 | logrus.Fatal("Set expire time error, ", err) 50 | } 51 | } 52 | 53 | func (de *DataEx) TTL(key string) (time.Duration, error) { 54 | dev, err := de.Des.Get(key) 55 | if err != nil { 56 | return -1, err 57 | } 58 | nowTime := time.Duration(time.Now().UnixNano()) / 1e6 59 | return dev.TimeoutAt - nowTime, nil 60 | } 61 | 62 | // func (de *DataEx) Loop() { 63 | // for { 64 | // if de.IsLeader { 65 | 66 | // } 67 | // } 68 | // } 69 | -------------------------------------------------------------------------------- /config/config.go: -------------------------------------------------------------------------------- 1 | /* 2 | * @Descripttion:Config 3 | * @version: 4 | * @Author: cm.d 5 | * @Date: 2021-10-16 17:50:03 6 | * @LastEditors: cm.d 7 | * @LastEditTime: 2021-12-02 21:30:03 8 | */ 9 | package config 10 | 11 | import ( 12 | "flag" 13 | "log" 14 | "path/filepath" 15 | "strings" 16 | 17 | "github.com/jinzhu/configor" 18 | "github.com/sirupsen/logrus" 19 | ) 20 | 21 | type GTConfig struct { 22 | LogLevel string `default:"info"` 23 | RaftDir string `default:"data/"` 24 | RaftId string 25 | RaftAddr string `default:"localhost:50011"` 26 | HttpServerAddr string `default:"localhost:12345"` 27 | RaftCluster []string 28 | RespServerAddr string 29 | RaftSnapshotInterval int `default:"1"` 30 | RaftMaxAppendEntris int `default:"1000"` 31 | RaftTrailingLogs uint64 `default:"1024000"` 32 | LogType string `default:"stdout"` 33 | StoreEngine string `default:"map"` 34 | WALEngine string `default:"badger"` 35 | IsBigEndian bool `default:"true"` 36 | BaseDir string 37 | } 38 | 39 | var Config GTConfig 40 | 41 | func Init() { 42 | configor.Load(&Config, "config.yaml") 43 | 44 | myAddr := flag.String("raft_addr", Config.RaftAddr, "TCP host+port for this node") 45 | raftId := flag.String("raft_id", Config.RaftId, "Node id used by Raft") 46 | raftCluster := flag.String("raft_cluster", "", "Raft cluster list") 47 | httpserverAddr := flag.String("httpserver_addr", Config.HttpServerAddr, "Http test server addr") 48 | respserverAddr := flag.String("respserver_addr", Config.RespServerAddr, "Resp server addr") 49 | logtype := flag.String("logtype", Config.LogType, "Log type, file or stdout") 50 | flag.Parse() 51 | 52 | if *raftId == "" { 53 | log.Fatal("Raft id is empty") 54 | } 55 | 56 | if *raftCluster != "" { 57 | Config.RaftCluster = strings.Split(*raftCluster, ",") 58 | } 59 | 60 | if Config.RaftCluster == nil || len(Config.RaftCluster) == 0 { 61 | log.Fatal("Raft cluster is empty") 62 | } 63 | 64 | Config.RaftAddr = *myAddr 65 | Config.RaftId = *raftId 66 | Config.LogType = *logtype 67 | if *httpserverAddr == "" { 68 | logrus.Info("No need http server") 69 | } 70 | Config.HttpServerAddr = *httpserverAddr 71 | 72 | if *respserverAddr == "" { 73 | logrus.Fatal("Resp server addr is empty!") 74 | } 75 | 76 | Config.RespServerAddr = *respserverAddr 77 | Config.BaseDir = filepath.Join(Config.RaftDir, Config.RaftId) 78 | logrus.Info("Init config ok, ", Config) 79 | } 80 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 9 | 10 | # AlfheimDB 11 | 12 | A linearizability distributed database by raft and wisckey, which supports redis client. The badger is default raft log store, you can use [AlfheimDB-WAL](https://github.com/dj456119/AlfheimDB-WAL) instead of it. 13 | 14 | # Build 15 | 16 | This project build by mage, you will need install it at first: 17 | 18 | ```` shell 19 | go get github.com/magefile/mage 20 | ```` 21 | 22 | Execute "mage build" in project dir: 23 | 24 | ```` shell 25 | mage build 26 | ```` 27 | 28 | # Test Case 29 | 30 | The single node test: 31 | 32 | ```` shell 33 | mage initDataDir 34 | mage test single 35 | ```` 36 | 37 | You can also startup a test cluster, the magefile include a cluster test case: 38 | 39 | ```` shell 40 | mage initDataDir 41 | mage test id1 42 | mage test id2 43 | mage test id3 44 | ```` 45 | 46 | # Dependencies 47 | 48 | + Go 1.16 49 | + mage 50 | + [raft](https://github.com/hashicorp/raft) 51 | + [AlfheimDB-WAL](https://github.com/dj456119/AlfheimDB-WAL) 52 | + [badger](https://github.com/dgraph-io/badger) 53 | + [redcon](https://github.com/tidwall/redcon) 54 | 55 | # Command Support 56 | 57 | String 58 | 59 | + Set 60 | + Get 61 | + Incr 62 | + Del 63 | + SetNx 64 | + SetEx 65 | + Expire 66 | + TTL 67 | + Keys 68 | 69 | # Benchmarks 70 | 71 | ## Macbook pro 13, 2020(M1) SSD 72 | 73 | ### Single node test case 74 | 75 | Set/Incr and Get: 76 | 77 | ```` shell 78 | ./redis-benchmark -p 6379 -t set,get -n 1000000 -q -c 512 79 | SET: 114850.12 requests per second, p50=2.727 msec 80 | GET: 161524.80 requests per second, p50=1.447 msec 81 | ```` 82 | 83 | ### Three node test case 84 | 85 | Set/Incr and Get: 86 | 87 | ```` shell 88 | ./redis-benchmark -p 6379 -t set,get -n 500000 -q -c 512 89 | SET: 66952.33 requests per second, p50=6.279 msec 90 | GET: 161917.09 requests per second, p50=1.447 msec 91 | ```` 92 | 93 | ## Centos 7 8c8g HDD 94 | 95 | ### Single node test case 96 | 97 | ```` shell 98 | ./redis-benchmark -p 6379 -t set,get -n 500000 -q -c 512 99 | SET: 40038.44 requests per second, p50=10.431 msec 100 | GET: 100684.66 requests per second, p50=2.423 msec 101 | ```` 102 | 103 | ### Three node test case 104 | 105 | Set/Incr and Get: 106 | 107 | ```` shell 108 | ./redis-benchmark -p 6379 -t set,get -n 500000 -q -c 1024 109 | SET: 23836.77 requests per second, p50=39.391 msec 110 | GET: 92114.96 requests per second, p50=5.375 msec 111 | ```` 112 | 113 | # References 114 | 115 | Raft: ["Raft: In Search of an Understandable Consensus Algorithm"](https://raft.github.io/raft.pdf) 116 | 117 | Wisckey: ["WiscKey: Separating Keys from Values in SSD-conscious Storage"](https://www.usenix.org/system/files/conference/fast16/fast16-papers-lu.pdf)(FAST2016) 118 | 119 | # Todo List 120 | 121 | + [ ] WASM script 122 | + [x] mage build 123 | + [x] High performance WAL log 124 | + [ ] Set support 125 | + [ ] Map support 126 | + [ ] ZSet support 127 | -------------------------------------------------------------------------------- /store/mem_store.go: -------------------------------------------------------------------------------- 1 | /* 2 | * @Descripttion: 3 | * @version: 4 | * @Author: cm.d 5 | * @Date: 2021-11-13 18:43:19 6 | * @LastEditors: cm.d 7 | * @LastEditTime: 2021-12-09 18:17:58 8 | */ 9 | 10 | package store 11 | 12 | import ( 13 | "encoding/json" 14 | "strconv" 15 | "strings" 16 | "sync" 17 | ) 18 | 19 | type MemStoreDatabase struct { 20 | RWMutex *sync.RWMutex 21 | StringStore map[string]string `json:"stringstore"` 22 | } 23 | 24 | func NewMemStoreDatabase() *MemStoreDatabase { 25 | return &MemStoreDatabase{RWMutex: new(sync.RWMutex), StringStore: make(map[string]string)} 26 | } 27 | 28 | func (memStore *MemStoreDatabase) Set(key, value string, nowTime int64) error { 29 | memStore.RWMutex.Lock() 30 | memStore.StringStore[key] = value 31 | memStore.RWMutex.Unlock() 32 | return nil 33 | } 34 | 35 | func (memStore *MemStoreDatabase) Get(key string) (*string, error) { 36 | memStore.RWMutex.RLock() 37 | defer memStore.RWMutex.RUnlock() 38 | result, ok := memStore.StringStore[key] 39 | if !ok { 40 | return nil, nil 41 | } 42 | return &result, nil 43 | } 44 | 45 | func (memStore *MemStoreDatabase) Incr(key string, nowTime int64) (int64, error) { 46 | memStore.RWMutex.Lock() 47 | if value, ok := memStore.StringStore[key]; ok { 48 | int64value, err := strconv.ParseInt(value, 10, 64) 49 | if err != nil { 50 | memStore.RWMutex.Unlock() 51 | return -1, err 52 | } 53 | int64value = int64value + 1 54 | result := strconv.FormatInt(int64value, 10) 55 | memStore.StringStore[key] = result 56 | memStore.RWMutex.Unlock() 57 | return int64value, nil 58 | } else { 59 | memStore.StringStore[key] = "1" 60 | memStore.RWMutex.Unlock() 61 | return 1, nil 62 | } 63 | } 64 | 65 | func (memStore *MemStoreDatabase) Del(key string) error { 66 | memStore.RWMutex.Lock() 67 | delete(memStore.StringStore, key) 68 | memStore.RWMutex.Unlock() 69 | return nil 70 | } 71 | 72 | func (memStore *MemStoreDatabase) Snapshot() ([]byte, error) { 73 | memStore.RWMutex.RLock() 74 | buff, err := json.Marshal(memStore.StringStore) 75 | memStore.RWMutex.RUnlock() 76 | return buff, err 77 | } 78 | 79 | func (memStore *MemStoreDatabase) LoadSnapshot(data []byte) error { 80 | stringstore := make(map[string]string) 81 | memStore.RWMutex.Lock() 82 | err := json.Unmarshal(data, &stringstore) 83 | memStore.RWMutex.Unlock() 84 | return err 85 | } 86 | 87 | func (memStore *MemStoreDatabase) Keys(prefix string) ([]string, error) { 88 | memStore.RWMutex.RLock() 89 | defer memStore.RWMutex.RUnlock() 90 | if prefix == "*" { 91 | prefix = "" 92 | } 93 | result := []string{} 94 | for k, v := range memStore.StringStore { 95 | if strings.HasPrefix(k, prefix) { 96 | result = append(result, v) 97 | } 98 | } 99 | return result, nil 100 | } 101 | 102 | func (memStore *MemStoreDatabase) SetEx(key string, value string, nowTime, timeout int64) (string, error) { 103 | //TO DO 104 | return "", nil 105 | } 106 | func (memStore *MemStoreDatabase) TTL(key string) (int64, error) { 107 | //TO DO 108 | return -1, nil 109 | } 110 | 111 | func (memStore *MemStoreDatabase) SetNx(key string, value string, nowTime int64) (int, error) { 112 | //TO DO 113 | return 0, nil 114 | } 115 | 116 | func (memStore *MemStoreDatabase) Expire(key string, nowTime, timeout int64) (int, error) { 117 | //TO DO 118 | return 0, nil 119 | } 120 | -------------------------------------------------------------------------------- /wal/alfheimdbwal.go: -------------------------------------------------------------------------------- 1 | /* 2 | * @Descripttion: 3 | * @version: 4 | * @Author: cm.d 5 | * @Date: 2021-11-22 11:39:04 6 | * @LastEditors: cm.d 7 | * @LastEditTime: 2021-11-30 21:43:11 8 | */ 9 | package wal 10 | 11 | import ( 12 | "sync" 13 | 14 | "github.com/AlfheimDB/config" 15 | "github.com/AlfheimDB/pb" 16 | alfheimdbwal "github.com/dj456119/AlfheimDB-WAL" 17 | "github.com/golang/protobuf/ptypes" 18 | "github.com/hashicorp/raft" 19 | "google.golang.org/protobuf/proto" 20 | ) 21 | 22 | type AlheimDBWALRaftEngine struct { 23 | WAL *alfheimdbwal.AlfheimDBWAL 24 | WriteBuff []byte 25 | } 26 | 27 | func NewAlheimDBWALRaftEngine(basedir string) raft.LogStore { 28 | engine := new(AlheimDBWALRaftEngine) 29 | wal := &alfheimdbwal.AlfheimDBWAL{ 30 | Dirname: basedir, 31 | MaxItems: 10000000, 32 | IsBigEndian: true, 33 | Mutex: new(sync.Mutex), 34 | } 35 | wal.BuildDirIndex() 36 | engine.WAL = wal 37 | engine.WriteBuff = make([]byte, 10*(1<<26)) 38 | return engine 39 | } 40 | 41 | // FirstIndex returns the first index written. 0 for no entries. 42 | func (ae AlheimDBWALRaftEngine) FirstIndex() (uint64, error) { 43 | if ae.WAL.MinIndex == -1 { 44 | return 0, nil 45 | } 46 | return uint64(ae.WAL.MinIndex), nil 47 | } 48 | 49 | // LastIndex returns the last index written. 0 for no entries. 50 | func (ae AlheimDBWALRaftEngine) LastIndex() (uint64, error) { 51 | return uint64(ae.WAL.MaxIndex), nil 52 | } 53 | 54 | // GetLog gets a log entry at a given index. 55 | func (ae AlheimDBWALRaftEngine) GetLog(index uint64, log *raft.Log) error { 56 | buff := ae.WAL.GetLog(int64(index)) 57 | return Decode(buff, log) 58 | } 59 | 60 | // StoreLog stores a log entry. 61 | func (ae AlheimDBWALRaftEngine) StoreLog(log *raft.Log) error { 62 | buff, err := Encode(log) 63 | if err != nil { 64 | return err 65 | } 66 | lItem := alfheimdbwal.NewLogItemBuff(int64(log.Index), buff, ae.WriteBuff, config.Config.IsBigEndian) 67 | ae.WAL.WriteLog(lItem, ae.WriteBuff[:8+8+len(buff)]) 68 | return nil 69 | } 70 | 71 | // StoreLogs stores multiple log entries. 72 | func (ae AlheimDBWALRaftEngine) StoreLogs(logs []*raft.Log) error { 73 | var length int64 = 0 74 | for _, log := range logs { 75 | length = length + int64(len(log.Data)) 76 | } 77 | pos := 0 78 | lItems := make([]*alfheimdbwal.LogItem, len(logs)) 79 | for i, log := range logs { 80 | buff, err := Encode(log) 81 | if err != nil { 82 | return err 83 | } 84 | lItem := alfheimdbwal.NewLogItemBuff(int64(log.Index), buff, ae.WriteBuff[pos:], config.Config.IsBigEndian) 85 | lItems[i] = lItem 86 | pos = pos + 8 + 8 + len(buff) 87 | } 88 | ae.WAL.BatchWriteLog(lItems, ae.WriteBuff[:pos]) 89 | return nil 90 | } 91 | 92 | // DeleteRange deletes a range of log entries. The range is inclusive. 93 | func (ae AlheimDBWALRaftEngine) DeleteRange(min, max uint64) error { 94 | ae.WAL.TruncateLog(ae.WAL.MinIndex, ae.WAL.MaxIndex) 95 | return nil 96 | } 97 | 98 | func Decode(buff []byte, log *raft.Log) error { 99 | raftLogPB := pb.RaftLog{} 100 | err := proto.Unmarshal(buff, &raftLogPB) 101 | if err != nil { 102 | return err 103 | } 104 | log.AppendedAt, err = ptypes.Timestamp(raftLogPB.AppendedAt) 105 | 106 | if err != nil { 107 | return nil 108 | } 109 | log.Data = raftLogPB.Data 110 | log.Extensions = raftLogPB.Extensions 111 | log.Index = raftLogPB.Index 112 | log.Term = raftLogPB.Term 113 | log.Type = raft.LogType(raftLogPB.Type) 114 | return nil 115 | } 116 | 117 | func Encode(log *raft.Log) ([]byte, error) { 118 | logTimeStampProto, err := ptypes.TimestampProto(log.AppendedAt) 119 | if err != nil { 120 | return nil, err 121 | } 122 | raftLogPB := pb.RaftLog{ 123 | Index: log.Index, 124 | Term: log.Term, 125 | Data: log.Data, 126 | Extensions: log.Extensions, 127 | Type: uint32(log.Type), 128 | AppendedAt: logTimeStampProto, 129 | } 130 | return proto.Marshal(&raftLogPB) 131 | } 132 | -------------------------------------------------------------------------------- /raft/fsm.go: -------------------------------------------------------------------------------- 1 | /* 2 | * @Descripttion: AlfheimDB raft fsm core implement raft's interface. 3 | * @version: 4 | * @Author: cm.d 5 | * @Date: 2021-11-11 11:19:46 6 | * @LastEditors: cm.d 7 | * @LastEditTime: 2021-12-09 17:56:20 8 | */ 9 | 10 | package raft 11 | 12 | import ( 13 | "errors" 14 | "io" 15 | "io/ioutil" 16 | "strconv" 17 | 18 | "github.com/AlfheimDB/pb" 19 | "github.com/AlfheimDB/store" 20 | "github.com/hashicorp/raft" 21 | "github.com/sirupsen/logrus" 22 | "google.golang.org/protobuf/proto" 23 | ) 24 | 25 | //Fsm apply response struct 26 | type FsmResponse struct { 27 | Data interface{} 28 | Error error 29 | } 30 | 31 | //AlfheimDB raft fsm which implents raft batch-fsm interface 32 | type AlfheimRaftFSMImpl struct { 33 | } 34 | 35 | func NewAlfheimRaftFSM() raft.BatchingFSM { 36 | return new(AlfheimRaftFSMImpl) 37 | } 38 | 39 | //The fsm's apply log 40 | type AlfheimRaftFSMLog struct { 41 | Cmd string 42 | Args [][]byte 43 | TimeStamp int64 44 | Buff []byte 45 | } 46 | 47 | //The bytes in apply log convert to AlfheimRaftFSMLog 48 | func (fLog *AlfheimRaftFSMLog) Decode() error { 49 | pbLog := pb.FsmLog{} 50 | err := proto.Unmarshal(fLog.Buff, &pbLog) 51 | if err != nil { 52 | return err 53 | } 54 | fLog.Cmd = pbLog.Cmd 55 | fLog.Args = pbLog.CmdArgs 56 | fLog.TimeStamp = pbLog.TimeStamp 57 | return nil 58 | } 59 | 60 | //AlfheimRaftFSMLog convert to bytes 61 | func (fLog *AlfheimRaftFSMLog) Encode() error { 62 | pbLog := pb.FsmLog{ 63 | Cmd: fLog.Cmd, 64 | CmdArgs: fLog.Args, 65 | TimeStamp: fLog.TimeStamp, 66 | } 67 | var err error 68 | fLog.Buff, err = proto.Marshal(&pbLog) 69 | if err != nil { 70 | return err 71 | } 72 | return nil 73 | } 74 | 75 | //Single apply 76 | func (aFsm *AlfheimRaftFSMImpl) Apply(l *raft.Log) interface{} { 77 | fLog := AlfheimRaftFSMLog{Buff: l.Data} 78 | err := fLog.Decode() 79 | if err != nil { 80 | return FsmResponse{Error: err} 81 | } 82 | switch fLog.Cmd { 83 | case "test": 84 | return FsmResponse{Data: "test ok"} 85 | case "set": 86 | err := store.ADBStore.Set(string(fLog.Args[1]), string(fLog.Args[2]), fLog.TimeStamp) 87 | if err != nil { 88 | return FsmResponse{Error: err} 89 | } 90 | return FsmResponse{Data: "ok"} 91 | case "del": 92 | err := store.ADBStore.Del(string(fLog.Args[1])) 93 | if err != nil { 94 | return FsmResponse{Error: err} 95 | } 96 | return FsmResponse{Data: "ok"} 97 | case "incr": 98 | result, err := store.ADBStore.Incr(string(fLog.Args[1]), fLog.TimeStamp) 99 | return FsmResponse{Data: result, Error: err} 100 | case "setnx": 101 | result, err := store.ADBStore.SetNx(string(fLog.Args[1]), string(fLog.Args[2]), fLog.TimeStamp) 102 | return FsmResponse{Data: result, Error: err} 103 | case "setex": 104 | timeout, _ := strconv.ParseInt(string(fLog.Args[3]), 10, 64) 105 | result, err := store.ADBStore.SetEx(string(fLog.Args[1]), string(fLog.Args[2]), fLog.TimeStamp, timeout) 106 | return FsmResponse{Data: result, Error: err} 107 | default: 108 | return FsmResponse{Error: errors.New("Unknow command, " + fLog.Cmd)} 109 | } 110 | 111 | } 112 | 113 | //Batch apply, just run apply multiple times 114 | func (aFsm *AlfheimRaftFSMImpl) ApplyBatch(logs []*raft.Log) []interface{} { 115 | result := make([]interface{}, len(logs)) 116 | for i, l := range logs { 117 | result[i] = aFsm.Apply(l) 118 | } 119 | return result 120 | } 121 | 122 | //Snapshot 123 | func (aFsm *AlfheimRaftFSMImpl) Snapshot() (raft.FSMSnapshot, error) { 124 | logrus.Info("Start create snapshot") 125 | snapshot := new(AlfheimRaftSnapshot) 126 | buff, err := store.ADBStore.Snapshot() 127 | if err != nil { 128 | logrus.Fatal("Snapshot create error, ", err) 129 | } 130 | snapshot.SnapshotBytes = buff 131 | return snapshot, err 132 | } 133 | 134 | //Load snapshot 135 | func (aFsm *AlfheimRaftFSMImpl) Restore(r io.ReadCloser) error { 136 | logrus.Info("Start load snapshot") 137 | buff, err := ioutil.ReadAll(r) 138 | if err != nil { 139 | logrus.Fatal("Snapshot load error, ", err) 140 | } 141 | err = store.ADBStore.LoadSnapshot(buff) 142 | if err != nil { 143 | logrus.Fatal("Snapshot load error, ", err) 144 | } 145 | return err 146 | } 147 | -------------------------------------------------------------------------------- /raft/server.go: -------------------------------------------------------------------------------- 1 | /* 2 | * @Descripttion: Alfheim raft server 3 | * @version: 4 | * @Author: cm.d 5 | * @Date: 2021-11-11 18:00:19 6 | * @LastEditors: cm.d 7 | * @LastEditTime: 2021-12-09 17:56:45 8 | */ 9 | 10 | package raft 11 | 12 | import ( 13 | "bytes" 14 | "fmt" 15 | "net" 16 | "os" 17 | "os/exec" 18 | "path/filepath" 19 | "strings" 20 | "time" 21 | 22 | "github.com/AlfheimDB/config" 23 | "github.com/AlfheimDB/log" 24 | "github.com/AlfheimDB/wal" 25 | raftbadger "github.com/BBVA/raft-badger" 26 | 27 | "github.com/hashicorp/raft" 28 | "github.com/sirupsen/logrus" 29 | ) 30 | 31 | //Alfheim raft server 32 | type AlfheimRaftServer struct { 33 | RaftId string 34 | MyIP string 35 | MyPort string 36 | RaftDir string 37 | 38 | RaftFsm raft.BatchingFSM 39 | Raft *raft.Raft 40 | RaftCluster []string 41 | } 42 | 43 | var RaftServer *AlfheimRaftServer 44 | 45 | func Init() { 46 | logrus.Info("Init raft server ") 47 | initRaft(config.Config.RaftAddr, config.Config.RaftDir, config.Config.RaftId) 48 | 49 | } 50 | 51 | func initRaft(address string, raftDir string, raftId string) { 52 | RaftServer = new(AlfheimRaftServer) 53 | RaftServer.RaftCluster = config.Config.RaftCluster 54 | 55 | ip, port, err := net.SplitHostPort(config.Config.RaftAddr) 56 | if err != nil { 57 | logrus.Fatal("Unknow ip and port", config.Config.RaftAddr) 58 | } 59 | logrus.Info("Raft address Ip: ", ip, " ,port: ", port) 60 | 61 | RaftServer.MyIP = ip 62 | RaftServer.MyPort = port 63 | RaftServer.RaftId = raftId 64 | RaftServer.RaftDir = raftDir 65 | 66 | //raft config 67 | raftConfig := raft.DefaultConfig() 68 | raftConfig.LocalID = raft.ServerID(raftId) 69 | raftConfig.BatchApplyCh = true 70 | raftConfig.MaxAppendEntries = config.Config.RaftMaxAppendEntris 71 | raftConfig.TrailingLogs = config.Config.RaftTrailingLogs 72 | raftConfig.LogLevel = config.Config.LogLevel 73 | raftConfig.LogOutput = log.LogWriter 74 | 75 | //If umask is not 0, need chmod 76 | shell(fmt.Sprintf("mkdir %s", config.Config.BaseDir)) 77 | 78 | //Init log db 79 | ldb, err := wal.NewWAL(config.Config.BaseDir) 80 | if err != nil { 81 | logrus.Fatal("Init log db error, ", err) 82 | } 83 | 84 | //Init stable db 85 | sdb, err := raftbadger.NewBadgerStore(filepath.Join(config.Config.BaseDir, "stable.dat")) 86 | if err != nil { 87 | logrus.Fatal("Init stable db error, ", err) 88 | } 89 | 90 | //Init file snapshot store 91 | fss, err := raft.NewFileSnapshotStore(config.Config.BaseDir, 1, os.Stderr) 92 | if err != nil { 93 | logrus.Fatal("Init snapshot dir error, ", err) 94 | } 95 | 96 | //Create raft fsm 97 | RaftServer.RaftFsm = NewAlfheimRaftFSM() 98 | 99 | addr, err := net.ResolveTCPAddr("tcp", config.Config.RaftAddr) 100 | if err != nil { 101 | logrus.Fatal("Raft addr resolve error, ", err) 102 | } 103 | 104 | //Use default net transport in raft lib 105 | transport, err := raft.NewTCPTransport(config.Config.RaftAddr, addr, 100, 5*time.Second, os.Stderr) 106 | if err != nil { 107 | logrus.Fatal("Raft addr create error, ", err) 108 | } 109 | 110 | //Create raft instance 111 | raftIns, err := raft.NewRaft(raftConfig, RaftServer.RaftFsm, ldb, sdb, fss, transport) 112 | if err != nil { 113 | logrus.Fatal("Init raft instance error, ", err) 114 | } 115 | RaftServer.Raft = raftIns 116 | RaftServer.Bootstrap() 117 | 118 | } 119 | 120 | func shell(command string) { 121 | var stdout bytes.Buffer 122 | var stderr bytes.Buffer 123 | cmd := exec.Command("bash", "-c", command) 124 | cmd.Stdout = &stdout 125 | cmd.Stderr = &stderr 126 | err := cmd.Run() 127 | if err != nil { 128 | logrus.Info("err cmd :", command) 129 | logrus.Info("stdout: ", stdout.String()) 130 | logrus.Info("stderr: ", stderr.String()) 131 | logrus.Info(err) 132 | } 133 | logrus.Info("exec cmd done:", command) 134 | logrus.Info("stdout: ", stdout.String()) 135 | logrus.Info("stderr: ", stderr.String()) 136 | } 137 | 138 | //Bootstrap, only run at first startup 139 | func (aServer *AlfheimRaftServer) Bootstrap() { 140 | servers := aServer.Raft.GetConfiguration().Configuration().Servers 141 | if len(servers) > 0 { 142 | logrus.Info("Not first startup, don't need bootstrap") 143 | return 144 | } 145 | logrus.Info("First start, need bootstrap") 146 | var configuration raft.Configuration 147 | for _, peerInfo := range aServer.RaftCluster { 148 | peer := strings.Split(peerInfo, "/") 149 | id := peer[1] 150 | addr := peer[0] 151 | server := raft.Server{ 152 | ID: raft.ServerID(id), 153 | Address: raft.ServerAddress(addr), 154 | } 155 | configuration.Servers = append(configuration.Servers, server) 156 | } 157 | raftFuture := RaftServer.Raft.BootstrapCluster(configuration) 158 | if err := raftFuture.Error(); err != nil { 159 | logrus.Fatal("Bootstrap raft cluster error, ", err) 160 | } 161 | logrus.Info("Bootstrap done") 162 | } 163 | -------------------------------------------------------------------------------- /pb/fsm_log.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-go. DO NOT EDIT. 2 | // versions: 3 | // protoc-gen-go v1.26.0 4 | // protoc v3.17.3 5 | // source: fsm_log.proto 6 | 7 | package pb 8 | 9 | import ( 10 | protoreflect "google.golang.org/protobuf/reflect/protoreflect" 11 | protoimpl "google.golang.org/protobuf/runtime/protoimpl" 12 | reflect "reflect" 13 | sync "sync" 14 | ) 15 | 16 | const ( 17 | // Verify that this generated code is sufficiently up-to-date. 18 | _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) 19 | // Verify that runtime/protoimpl is sufficiently up-to-date. 20 | _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) 21 | ) 22 | 23 | type FsmLog struct { 24 | state protoimpl.MessageState 25 | sizeCache protoimpl.SizeCache 26 | unknownFields protoimpl.UnknownFields 27 | 28 | Cmd string `protobuf:"bytes,1,opt,name=Cmd,proto3" json:"Cmd,omitempty"` 29 | CmdArgs [][]byte `protobuf:"bytes,2,rep,name=CmdArgs,proto3" json:"CmdArgs,omitempty"` 30 | TimeStamp int64 `protobuf:"varint,3,opt,name=TimeStamp,proto3" json:"TimeStamp,omitempty"` 31 | } 32 | 33 | func (x *FsmLog) Reset() { 34 | *x = FsmLog{} 35 | if protoimpl.UnsafeEnabled { 36 | mi := &file_fsm_log_proto_msgTypes[0] 37 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 38 | ms.StoreMessageInfo(mi) 39 | } 40 | } 41 | 42 | func (x *FsmLog) String() string { 43 | return protoimpl.X.MessageStringOf(x) 44 | } 45 | 46 | func (*FsmLog) ProtoMessage() {} 47 | 48 | func (x *FsmLog) ProtoReflect() protoreflect.Message { 49 | mi := &file_fsm_log_proto_msgTypes[0] 50 | if protoimpl.UnsafeEnabled && x != nil { 51 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 52 | if ms.LoadMessageInfo() == nil { 53 | ms.StoreMessageInfo(mi) 54 | } 55 | return ms 56 | } 57 | return mi.MessageOf(x) 58 | } 59 | 60 | // Deprecated: Use FsmLog.ProtoReflect.Descriptor instead. 61 | func (*FsmLog) Descriptor() ([]byte, []int) { 62 | return file_fsm_log_proto_rawDescGZIP(), []int{0} 63 | } 64 | 65 | func (x *FsmLog) GetCmd() string { 66 | if x != nil { 67 | return x.Cmd 68 | } 69 | return "" 70 | } 71 | 72 | func (x *FsmLog) GetCmdArgs() [][]byte { 73 | if x != nil { 74 | return x.CmdArgs 75 | } 76 | return nil 77 | } 78 | 79 | func (x *FsmLog) GetTimeStamp() int64 { 80 | if x != nil { 81 | return x.TimeStamp 82 | } 83 | return 0 84 | } 85 | 86 | var File_fsm_log_proto protoreflect.FileDescriptor 87 | 88 | var file_fsm_log_proto_rawDesc = []byte{ 89 | 0x0a, 0x0d, 0x66, 0x73, 0x6d, 0x5f, 0x6c, 0x6f, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 90 | 0x02, 0x70, 0x62, 0x22, 0x52, 0x0a, 0x06, 0x46, 0x73, 0x6d, 0x4c, 0x6f, 0x67, 0x12, 0x10, 0x0a, 91 | 0x03, 0x43, 0x6d, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x43, 0x6d, 0x64, 0x12, 92 | 0x18, 0x0a, 0x07, 0x43, 0x6d, 0x64, 0x41, 0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 93 | 0x52, 0x07, 0x43, 0x6d, 0x64, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x69, 0x6d, 94 | 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x54, 0x69, 95 | 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x07, 0x5a, 0x05, 0x2e, 0x2f, 0x3b, 0x70, 0x62, 96 | 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 97 | } 98 | 99 | var ( 100 | file_fsm_log_proto_rawDescOnce sync.Once 101 | file_fsm_log_proto_rawDescData = file_fsm_log_proto_rawDesc 102 | ) 103 | 104 | func file_fsm_log_proto_rawDescGZIP() []byte { 105 | file_fsm_log_proto_rawDescOnce.Do(func() { 106 | file_fsm_log_proto_rawDescData = protoimpl.X.CompressGZIP(file_fsm_log_proto_rawDescData) 107 | }) 108 | return file_fsm_log_proto_rawDescData 109 | } 110 | 111 | var file_fsm_log_proto_msgTypes = make([]protoimpl.MessageInfo, 1) 112 | var file_fsm_log_proto_goTypes = []interface{}{ 113 | (*FsmLog)(nil), // 0: pb.FsmLog 114 | } 115 | var file_fsm_log_proto_depIdxs = []int32{ 116 | 0, // [0:0] is the sub-list for method output_type 117 | 0, // [0:0] is the sub-list for method input_type 118 | 0, // [0:0] is the sub-list for extension type_name 119 | 0, // [0:0] is the sub-list for extension extendee 120 | 0, // [0:0] is the sub-list for field type_name 121 | } 122 | 123 | func init() { file_fsm_log_proto_init() } 124 | func file_fsm_log_proto_init() { 125 | if File_fsm_log_proto != nil { 126 | return 127 | } 128 | if !protoimpl.UnsafeEnabled { 129 | file_fsm_log_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { 130 | switch v := v.(*FsmLog); i { 131 | case 0: 132 | return &v.state 133 | case 1: 134 | return &v.sizeCache 135 | case 2: 136 | return &v.unknownFields 137 | default: 138 | return nil 139 | } 140 | } 141 | } 142 | type x struct{} 143 | out := protoimpl.TypeBuilder{ 144 | File: protoimpl.DescBuilder{ 145 | GoPackagePath: reflect.TypeOf(x{}).PkgPath(), 146 | RawDescriptor: file_fsm_log_proto_rawDesc, 147 | NumEnums: 0, 148 | NumMessages: 1, 149 | NumExtensions: 0, 150 | NumServices: 0, 151 | }, 152 | GoTypes: file_fsm_log_proto_goTypes, 153 | DependencyIndexes: file_fsm_log_proto_depIdxs, 154 | MessageInfos: file_fsm_log_proto_msgTypes, 155 | }.Build() 156 | File_fsm_log_proto = out.File 157 | file_fsm_log_proto_rawDesc = nil 158 | file_fsm_log_proto_goTypes = nil 159 | file_fsm_log_proto_depIdxs = nil 160 | } 161 | -------------------------------------------------------------------------------- /resp/resp.go: -------------------------------------------------------------------------------- 1 | /* 2 | * @Descripttion: Redcon server, it implents redis protocol and support complicate. 3 | * @version: 4 | * @Author: cm.d 5 | * @Date: 2021-11-13 01:06:51 6 | * @LastEditors: cm.d 7 | * @LastEditTime: 2021-12-17 14:16:29 8 | */ 9 | package resp 10 | 11 | import ( 12 | "errors" 13 | "reflect" 14 | "strconv" 15 | "strings" 16 | "time" 17 | 18 | "github.com/AlfheimDB/config" 19 | "github.com/AlfheimDB/raft" 20 | "github.com/AlfheimDB/store" 21 | "github.com/sirupsen/logrus" 22 | "github.com/tidwall/redcon" 23 | ) 24 | 25 | const ( 26 | RESP_TEST_TIMEOUT = 3 * time.Second 27 | RESP_SET_TIMEOUT = 10 * time.Second 28 | RESP_GET_TIMEOUT = 10 * time.Second 29 | RESP_INCR_TIMEOUT = 10 * time.Second 30 | ) 31 | 32 | //Init redcon server 33 | func Init() { 34 | logrus.Info("Start resp server, ", config.Config.RespServerAddr) 35 | err := redcon.ListenAndServe(config.Config.RespServerAddr, CommandExec, Accept, Close) 36 | if err != nil { 37 | logrus.Fatal("Resp server start error, ", err) 38 | } 39 | logrus.Info("Start resp server done") 40 | } 41 | 42 | func CommandExec(conn redcon.Conn, cmd redcon.Command) { 43 | switch strings.ToLower(string(cmd.Args[0])) { 44 | default: 45 | execCommand(1, conn, cmd, func(cmd redcon.Command) raft.FsmResponse { 46 | return raft.FsmResponse{Error: errors.New("ERR unknown command '" + string(cmd.Args[0]) + "'")} 47 | }) 48 | case "ping": 49 | execCommand(1, conn, cmd, func(cmd redcon.Command) raft.FsmResponse { 50 | return raft.FsmResponse{Data: "pong"} 51 | }) 52 | case "quit": 53 | execCommand(1, conn, cmd, func(cmd redcon.Command) raft.FsmResponse { 54 | return raft.FsmResponse{Data: "quit ok"} 55 | }) 56 | conn.Close() 57 | case "test": 58 | execCommandByFsm(1, nil, conn, cmd, RESP_TEST_TIMEOUT) 59 | case "incr": 60 | execCommandByFsm(2, nil, conn, cmd, RESP_INCR_TIMEOUT) 61 | case "set": 62 | execCommandByFsm(3, nil, conn, cmd, RESP_SET_TIMEOUT) 63 | case "setex": 64 | execCommandByFsm(4, func(cmd redcon.Command) error { 65 | _, err := strconv.ParseInt(string(cmd.Args[3]), 10, 64) 66 | return err 67 | }, conn, cmd, RESP_SET_TIMEOUT) 68 | case "setnx": 69 | execCommandByFsm(3, nil, conn, cmd, RESP_SET_TIMEOUT) 70 | case "ttl": 71 | execCommand(2, conn, cmd, func(cmd redcon.Command) raft.FsmResponse { 72 | result, err := store.ADBStore.TTL(string(cmd.Args[1])) 73 | return raft.FsmResponse{Data: result, Error: err} 74 | }) 75 | case "keys": 76 | execCommand(2, conn, cmd, func(cmd redcon.Command) raft.FsmResponse { 77 | result, err := store.ADBStore.Keys(string(cmd.Args[1])) 78 | return raft.FsmResponse{Data: result, Error: err} 79 | }) 80 | case "get": 81 | execCommand(2, conn, cmd, func(cmd redcon.Command) raft.FsmResponse { 82 | data, err := store.ADBStore.Get(string(cmd.Args[1])) 83 | return raft.FsmResponse{Data: data, Error: err} 84 | }) 85 | case "del": 86 | execCommandByFsm(2, nil, conn, cmd, RESP_GET_TIMEOUT) 87 | } 88 | } 89 | 90 | func Accept(conn redcon.Conn) bool { 91 | logrus.Debug("Accept client access, address: ", conn.NetConn().RemoteAddr()) 92 | return true 93 | } 94 | 95 | func Close(conn redcon.Conn, err error) { 96 | logrus.Debug("Close client, address: ", conn.NetConn().RemoteAddr()) 97 | } 98 | 99 | //Exec command 100 | func execCommand(argsLength int, conn redcon.Conn, cmd redcon.Command, exec func(cmd redcon.Command) raft.FsmResponse) { 101 | if len(cmd.Args) < argsLength { 102 | conn.WriteError("ERR wrong number of arguments for '" + string(cmd.Args[0]) + "' command") 103 | return 104 | } 105 | response := exec(cmd) 106 | WriteResponse(response, conn) 107 | } 108 | 109 | //Exec command by fsm 110 | func execCommandByFsm(argsLength int, validArgs func(cmd redcon.Command) error, conn redcon.Conn, cmd redcon.Command, timeout time.Duration) { 111 | if len(cmd.Args) < argsLength { 112 | conn.WriteError("ERR wrong number of arguments for '" + string(cmd.Args[0]) + "' command") 113 | return 114 | } 115 | if validArgs != nil { 116 | err := validArgs(cmd) 117 | if err != nil { 118 | conn.WriteError(err.Error()) 119 | return 120 | } 121 | } 122 | fLog := raft.AlfheimRaftFSMLog{ 123 | TimeStamp: time.Now().UnixNano(), 124 | } 125 | fLog.Cmd = strings.ToLower(string(cmd.Args[0])) 126 | fLog.Args = cmd.Args 127 | err := fLog.Encode() 128 | if err != nil { 129 | conn.WriteError("Cmd encode error, " + err.Error()) 130 | } 131 | future := raft.RaftServer.Raft.Apply(fLog.Buff, timeout) 132 | err = future.Error() 133 | if err != nil { 134 | conn.WriteError(err.Error()) 135 | return 136 | } 137 | respInterface := future.Response() 138 | if respInterface == nil { 139 | conn.WriteError("RespInterface is nil, unknow error") 140 | return 141 | } 142 | response := respInterface.(raft.FsmResponse) 143 | WriteResponse(response, conn) 144 | } 145 | 146 | func WriteResponse(response raft.FsmResponse, conn redcon.Conn) { 147 | if response.Error != nil { 148 | conn.WriteError(response.Error.Error()) 149 | return 150 | } 151 | switch response.Data.(type) { 152 | case int: 153 | conn.WriteInt(response.Data.(int)) 154 | case int64: 155 | conn.WriteInt64(response.Data.(int64)) 156 | case *string: 157 | if response.Data == nil { 158 | conn.WriteNull() 159 | } else { 160 | t := reflect.ValueOf(response.Data) 161 | if t.IsNil() { 162 | conn.WriteNull() 163 | } else { 164 | conn.WriteString(*response.Data.(*string)) 165 | } 166 | } 167 | default: 168 | conn.WriteAny(response.Data) 169 | } 170 | } 171 | -------------------------------------------------------------------------------- /pb/badger_value.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-go. DO NOT EDIT. 2 | // versions: 3 | // protoc-gen-go v1.26.0 4 | // protoc v3.17.3 5 | // source: badger_value.proto 6 | 7 | package pb 8 | 9 | import ( 10 | protoreflect "google.golang.org/protobuf/reflect/protoreflect" 11 | protoimpl "google.golang.org/protobuf/runtime/protoimpl" 12 | reflect "reflect" 13 | sync "sync" 14 | ) 15 | 16 | const ( 17 | // Verify that this generated code is sufficiently up-to-date. 18 | _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) 19 | // Verify that runtime/protoimpl is sufficiently up-to-date. 20 | _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) 21 | ) 22 | 23 | type BadgerStringValue struct { 24 | state protoimpl.MessageState 25 | sizeCache protoimpl.SizeCache 26 | unknownFields protoimpl.UnknownFields 27 | 28 | Value []byte `protobuf:"bytes,1,opt,name=Value,proto3" json:"Value,omitempty"` 29 | TimeStamp int64 `protobuf:"varint,2,opt,name=TimeStamp,proto3" json:"TimeStamp,omitempty"` 30 | Timeout int64 `protobuf:"varint,3,opt,name=Timeout,proto3" json:"Timeout,omitempty"` 31 | } 32 | 33 | func (x *BadgerStringValue) Reset() { 34 | *x = BadgerStringValue{} 35 | if protoimpl.UnsafeEnabled { 36 | mi := &file_badger_value_proto_msgTypes[0] 37 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 38 | ms.StoreMessageInfo(mi) 39 | } 40 | } 41 | 42 | func (x *BadgerStringValue) String() string { 43 | return protoimpl.X.MessageStringOf(x) 44 | } 45 | 46 | func (*BadgerStringValue) ProtoMessage() {} 47 | 48 | func (x *BadgerStringValue) ProtoReflect() protoreflect.Message { 49 | mi := &file_badger_value_proto_msgTypes[0] 50 | if protoimpl.UnsafeEnabled && x != nil { 51 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 52 | if ms.LoadMessageInfo() == nil { 53 | ms.StoreMessageInfo(mi) 54 | } 55 | return ms 56 | } 57 | return mi.MessageOf(x) 58 | } 59 | 60 | // Deprecated: Use BadgerStringValue.ProtoReflect.Descriptor instead. 61 | func (*BadgerStringValue) Descriptor() ([]byte, []int) { 62 | return file_badger_value_proto_rawDescGZIP(), []int{0} 63 | } 64 | 65 | func (x *BadgerStringValue) GetValue() []byte { 66 | if x != nil { 67 | return x.Value 68 | } 69 | return nil 70 | } 71 | 72 | func (x *BadgerStringValue) GetTimeStamp() int64 { 73 | if x != nil { 74 | return x.TimeStamp 75 | } 76 | return 0 77 | } 78 | 79 | func (x *BadgerStringValue) GetTimeout() int64 { 80 | if x != nil { 81 | return x.Timeout 82 | } 83 | return 0 84 | } 85 | 86 | var File_badger_value_proto protoreflect.FileDescriptor 87 | 88 | var file_badger_value_proto_rawDesc = []byte{ 89 | 0x0a, 0x12, 0x62, 0x61, 0x64, 0x67, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x70, 90 | 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x22, 0x61, 0x0a, 0x11, 0x42, 0x61, 0x64, 0x67, 91 | 0x65, 0x72, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 92 | 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x56, 0x61, 93 | 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 94 | 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 95 | 0x70, 0x12, 0x18, 0x0a, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 96 | 0x28, 0x03, 0x52, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x07, 0x5a, 0x05, 0x2e, 97 | 0x2f, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 98 | } 99 | 100 | var ( 101 | file_badger_value_proto_rawDescOnce sync.Once 102 | file_badger_value_proto_rawDescData = file_badger_value_proto_rawDesc 103 | ) 104 | 105 | func file_badger_value_proto_rawDescGZIP() []byte { 106 | file_badger_value_proto_rawDescOnce.Do(func() { 107 | file_badger_value_proto_rawDescData = protoimpl.X.CompressGZIP(file_badger_value_proto_rawDescData) 108 | }) 109 | return file_badger_value_proto_rawDescData 110 | } 111 | 112 | var file_badger_value_proto_msgTypes = make([]protoimpl.MessageInfo, 1) 113 | var file_badger_value_proto_goTypes = []interface{}{ 114 | (*BadgerStringValue)(nil), // 0: pb.BadgerStringValue 115 | } 116 | var file_badger_value_proto_depIdxs = []int32{ 117 | 0, // [0:0] is the sub-list for method output_type 118 | 0, // [0:0] is the sub-list for method input_type 119 | 0, // [0:0] is the sub-list for extension type_name 120 | 0, // [0:0] is the sub-list for extension extendee 121 | 0, // [0:0] is the sub-list for field type_name 122 | } 123 | 124 | func init() { file_badger_value_proto_init() } 125 | func file_badger_value_proto_init() { 126 | if File_badger_value_proto != nil { 127 | return 128 | } 129 | if !protoimpl.UnsafeEnabled { 130 | file_badger_value_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { 131 | switch v := v.(*BadgerStringValue); i { 132 | case 0: 133 | return &v.state 134 | case 1: 135 | return &v.sizeCache 136 | case 2: 137 | return &v.unknownFields 138 | default: 139 | return nil 140 | } 141 | } 142 | } 143 | type x struct{} 144 | out := protoimpl.TypeBuilder{ 145 | File: protoimpl.DescBuilder{ 146 | GoPackagePath: reflect.TypeOf(x{}).PkgPath(), 147 | RawDescriptor: file_badger_value_proto_rawDesc, 148 | NumEnums: 0, 149 | NumMessages: 1, 150 | NumExtensions: 0, 151 | NumServices: 0, 152 | }, 153 | GoTypes: file_badger_value_proto_goTypes, 154 | DependencyIndexes: file_badger_value_proto_depIdxs, 155 | MessageInfos: file_badger_value_proto_msgTypes, 156 | }.Build() 157 | File_badger_value_proto = out.File 158 | file_badger_value_proto_rawDesc = nil 159 | file_badger_value_proto_goTypes = nil 160 | file_badger_value_proto_depIdxs = nil 161 | } 162 | -------------------------------------------------------------------------------- /pb/raft_log.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-go. DO NOT EDIT. 2 | // versions: 3 | // protoc-gen-go v1.26.0 4 | // protoc v3.17.3 5 | // source: raft_log.proto 6 | 7 | package pb 8 | 9 | import ( 10 | protoreflect "google.golang.org/protobuf/reflect/protoreflect" 11 | protoimpl "google.golang.org/protobuf/runtime/protoimpl" 12 | timestamppb "google.golang.org/protobuf/types/known/timestamppb" 13 | reflect "reflect" 14 | sync "sync" 15 | ) 16 | 17 | const ( 18 | // Verify that this generated code is sufficiently up-to-date. 19 | _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) 20 | // Verify that runtime/protoimpl is sufficiently up-to-date. 21 | _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) 22 | ) 23 | 24 | // Symbols defined in public import of google/protobuf/timestamp.proto. 25 | 26 | type Timestamp = timestamppb.Timestamp 27 | 28 | type RaftLog struct { 29 | state protoimpl.MessageState 30 | sizeCache protoimpl.SizeCache 31 | unknownFields protoimpl.UnknownFields 32 | 33 | Index uint64 `protobuf:"varint,1,opt,name=Index,proto3" json:"Index,omitempty"` 34 | Term uint64 `protobuf:"varint,2,opt,name=Term,proto3" json:"Term,omitempty"` 35 | Data []byte `protobuf:"bytes,3,opt,name=Data,proto3" json:"Data,omitempty"` 36 | Extensions []byte `protobuf:"bytes,4,opt,name=Extensions,proto3" json:"Extensions,omitempty"` 37 | AppendedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=AppendedAt,proto3" json:"AppendedAt,omitempty"` 38 | Type uint32 `protobuf:"varint,6,opt,name=Type,proto3" json:"Type,omitempty"` 39 | } 40 | 41 | func (x *RaftLog) Reset() { 42 | *x = RaftLog{} 43 | if protoimpl.UnsafeEnabled { 44 | mi := &file_raft_log_proto_msgTypes[0] 45 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 46 | ms.StoreMessageInfo(mi) 47 | } 48 | } 49 | 50 | func (x *RaftLog) String() string { 51 | return protoimpl.X.MessageStringOf(x) 52 | } 53 | 54 | func (*RaftLog) ProtoMessage() {} 55 | 56 | func (x *RaftLog) ProtoReflect() protoreflect.Message { 57 | mi := &file_raft_log_proto_msgTypes[0] 58 | if protoimpl.UnsafeEnabled && x != nil { 59 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 60 | if ms.LoadMessageInfo() == nil { 61 | ms.StoreMessageInfo(mi) 62 | } 63 | return ms 64 | } 65 | return mi.MessageOf(x) 66 | } 67 | 68 | // Deprecated: Use RaftLog.ProtoReflect.Descriptor instead. 69 | func (*RaftLog) Descriptor() ([]byte, []int) { 70 | return file_raft_log_proto_rawDescGZIP(), []int{0} 71 | } 72 | 73 | func (x *RaftLog) GetIndex() uint64 { 74 | if x != nil { 75 | return x.Index 76 | } 77 | return 0 78 | } 79 | 80 | func (x *RaftLog) GetTerm() uint64 { 81 | if x != nil { 82 | return x.Term 83 | } 84 | return 0 85 | } 86 | 87 | func (x *RaftLog) GetData() []byte { 88 | if x != nil { 89 | return x.Data 90 | } 91 | return nil 92 | } 93 | 94 | func (x *RaftLog) GetExtensions() []byte { 95 | if x != nil { 96 | return x.Extensions 97 | } 98 | return nil 99 | } 100 | 101 | func (x *RaftLog) GetAppendedAt() *timestamppb.Timestamp { 102 | if x != nil { 103 | return x.AppendedAt 104 | } 105 | return nil 106 | } 107 | 108 | func (x *RaftLog) GetType() uint32 { 109 | if x != nil { 110 | return x.Type 111 | } 112 | return 0 113 | } 114 | 115 | var File_raft_log_proto protoreflect.FileDescriptor 116 | 117 | var file_raft_log_proto_rawDesc = []byte{ 118 | 0x0a, 0x0e, 0x72, 0x61, 0x66, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 119 | 0x12, 0x02, 0x70, 0x62, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 120 | 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 121 | 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb7, 0x01, 0x0a, 0x07, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x6f, 122 | 0x67, 0x12, 0x14, 0x0a, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 123 | 0x52, 0x05, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x65, 0x72, 0x6d, 0x18, 124 | 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x54, 0x65, 0x72, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x44, 125 | 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 126 | 0x1e, 0x0a, 0x0a, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 127 | 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 128 | 0x3a, 0x0a, 0x0a, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 129 | 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 130 | 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 131 | 0x0a, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x41, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x54, 132 | 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x42, 133 | 0x07, 0x5a, 0x05, 0x2e, 0x2f, 0x3b, 0x70, 0x62, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 134 | 0x6f, 0x33, 135 | } 136 | 137 | var ( 138 | file_raft_log_proto_rawDescOnce sync.Once 139 | file_raft_log_proto_rawDescData = file_raft_log_proto_rawDesc 140 | ) 141 | 142 | func file_raft_log_proto_rawDescGZIP() []byte { 143 | file_raft_log_proto_rawDescOnce.Do(func() { 144 | file_raft_log_proto_rawDescData = protoimpl.X.CompressGZIP(file_raft_log_proto_rawDescData) 145 | }) 146 | return file_raft_log_proto_rawDescData 147 | } 148 | 149 | var file_raft_log_proto_msgTypes = make([]protoimpl.MessageInfo, 1) 150 | var file_raft_log_proto_goTypes = []interface{}{ 151 | (*RaftLog)(nil), // 0: pb.RaftLog 152 | (*timestamppb.Timestamp)(nil), // 1: google.protobuf.Timestamp 153 | } 154 | var file_raft_log_proto_depIdxs = []int32{ 155 | 1, // 0: pb.RaftLog.AppendedAt:type_name -> google.protobuf.Timestamp 156 | 1, // [1:1] is the sub-list for method output_type 157 | 1, // [1:1] is the sub-list for method input_type 158 | 1, // [1:1] is the sub-list for extension type_name 159 | 1, // [1:1] is the sub-list for extension extendee 160 | 0, // [0:1] is the sub-list for field type_name 161 | } 162 | 163 | func init() { file_raft_log_proto_init() } 164 | func file_raft_log_proto_init() { 165 | if File_raft_log_proto != nil { 166 | return 167 | } 168 | if !protoimpl.UnsafeEnabled { 169 | file_raft_log_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { 170 | switch v := v.(*RaftLog); i { 171 | case 0: 172 | return &v.state 173 | case 1: 174 | return &v.sizeCache 175 | case 2: 176 | return &v.unknownFields 177 | default: 178 | return nil 179 | } 180 | } 181 | } 182 | type x struct{} 183 | out := protoimpl.TypeBuilder{ 184 | File: protoimpl.DescBuilder{ 185 | GoPackagePath: reflect.TypeOf(x{}).PkgPath(), 186 | RawDescriptor: file_raft_log_proto_rawDesc, 187 | NumEnums: 0, 188 | NumMessages: 1, 189 | NumExtensions: 0, 190 | NumServices: 0, 191 | }, 192 | GoTypes: file_raft_log_proto_goTypes, 193 | DependencyIndexes: file_raft_log_proto_depIdxs, 194 | MessageInfos: file_raft_log_proto_msgTypes, 195 | }.Build() 196 | File_raft_log_proto = out.File 197 | file_raft_log_proto_rawDesc = nil 198 | file_raft_log_proto_goTypes = nil 199 | file_raft_log_proto_depIdxs = nil 200 | } 201 | -------------------------------------------------------------------------------- /store/badger_store.go: -------------------------------------------------------------------------------- 1 | /* 2 | * @Descripttion: AlfheimdDB store engine by badgerdb 3 | * @version: 4 | * @Author: cm.d 5 | * @Date: 2021-11-30 22:08:26 6 | * @LastEditors: cm.d 7 | * @LastEditTime: 2021-12-17 14:38:06 8 | */ 9 | package store 10 | 11 | import ( 12 | "fmt" 13 | "path/filepath" 14 | "strconv" 15 | "time" 16 | 17 | "github.com/AlfheimDB/pb" 18 | badger "github.com/dgraph-io/badger/v3" 19 | "github.com/sirupsen/logrus" 20 | "google.golang.org/protobuf/proto" 21 | ) 22 | 23 | type BadgerDBStore struct { 24 | DB *badger.DB 25 | } 26 | 27 | type BadgerDBValue struct { 28 | Value []byte 29 | TimeStamp int64 30 | Timeout int64 31 | buff []byte 32 | } 33 | 34 | func NewBadgerDBValue(value []byte, timeStamp, timeout int64) (*BadgerDBValue, error) { 35 | bdsv := BadgerDBValue{ 36 | Value: value, 37 | TimeStamp: timeStamp, 38 | Timeout: timeout, 39 | } 40 | err := bdsv.Encode() 41 | if err != nil { 42 | return nil, err 43 | } 44 | return &bdsv, nil 45 | } 46 | 47 | func (bdsv *BadgerDBValue) Encode() error { 48 | pbBdsv := pb.BadgerStringValue{ 49 | Value: bdsv.Value, 50 | TimeStamp: int64(bdsv.TimeStamp), 51 | Timeout: int64(bdsv.Timeout), 52 | } 53 | var err error 54 | bdsv.buff, err = proto.Marshal(&pbBdsv) 55 | return err 56 | } 57 | 58 | func (bdsv *BadgerDBValue) Decode(buff []byte) error { 59 | pbBdsv := pb.BadgerStringValue{} 60 | err := proto.Unmarshal(buff, &pbBdsv) 61 | if err != nil { 62 | return err 63 | } 64 | bdsv.TimeStamp = pbBdsv.TimeStamp 65 | bdsv.Timeout = pbBdsv.Timeout 66 | bdsv.Value = pbBdsv.Value 67 | bdsv.buff = buff 68 | return nil 69 | } 70 | 71 | func NewBadgerDBStore(basedir string) *BadgerDBStore { 72 | bDBStore := new(BadgerDBStore) 73 | DB, err := badger.Open(badger.DefaultOptions(filepath.Join(basedir, "/badger"))) 74 | if err != nil { 75 | logrus.Fatal("Open badger db error, ", err) 76 | } 77 | bDBStore.DB = DB 78 | return bDBStore 79 | } 80 | 81 | func (bDB *BadgerDBStore) Set(key string, value string, nowTime int64) error { 82 | stringValue, err := NewBadgerDBValue([]byte(value), nowTime/1e6, -1) 83 | if err != nil { 84 | return err 85 | } 86 | err = bDB.DB.Update(func(txn *badger.Txn) error { 87 | return txn.Set([]byte(key), stringValue.buff) 88 | }) 89 | if err != nil { 90 | logrus.Fatal("badgerDB set error, ", err) 91 | } 92 | return nil 93 | } 94 | func (bDB *BadgerDBStore) Get(key string) (*string, error) { 95 | var result *BadgerDBValue 96 | err := bDB.DB.View(func(txn *badger.Txn) error { 97 | item, err := txn.Get([]byte(key)) 98 | if err != nil { 99 | return err 100 | } 101 | return item.Value(func(val []byte) error { 102 | bdsv := BadgerDBValue{} 103 | result = &bdsv 104 | return bdsv.Decode(val) 105 | }) 106 | 107 | }) 108 | if err != nil { 109 | switch err { 110 | case badger.ErrKeyNotFound: 111 | return nil, nil 112 | default: 113 | logrus.Fatal("badgerDB get error, ", err) 114 | } 115 | } 116 | if result.Timeout != -1 && time.Now().UnixNano()/1e6 > result.TimeStamp+result.Timeout { 117 | return nil, nil 118 | } 119 | resultString := string(result.Value) 120 | return &resultString, err 121 | } 122 | 123 | func (bDB *BadgerDBStore) Incr(key string, nowTime int64) (int64, error) { 124 | var resultInt64 int64 125 | var bdsv *BadgerDBValue 126 | err := bDB.DB.Update(func(txn *badger.Txn) error { 127 | item, err := txn.Get([]byte(key)) 128 | if err != nil { 129 | switch err { 130 | case badger.ErrKeyNotFound: 131 | resultInt64 = 0 132 | default: 133 | logrus.Fatal("badgerDB incr get error, ", err) 134 | } 135 | } else { 136 | item.Value(func(val []byte) error { 137 | bdsv = &BadgerDBValue{} 138 | err := bdsv.Decode(val) 139 | if err != nil { 140 | logrus.Fatal("badgerDB get value error, ", err) 141 | } 142 | 143 | if bdsv.Timeout != -1 && nowTime/1e6 > bdsv.TimeStamp+bdsv.Timeout { 144 | return nil 145 | } 146 | 147 | resultInt64, err = strconv.ParseInt(string(bdsv.Value), 10, 64) 148 | if err != nil { 149 | logrus.Fatal("badgerDB incr get value error, ", err) 150 | } 151 | return nil 152 | }) 153 | } 154 | 155 | resultInt64 = resultInt64 + 1 156 | result := fmt.Sprintf("%d", resultInt64) 157 | if bdsv == nil { 158 | bdsv, err = NewBadgerDBValue([]byte(result), nowTime/1e6, -1) 159 | if err != nil { 160 | logrus.Fatal("Incr unknow err, ", err) 161 | } 162 | } else { 163 | bdsv.Value = []byte(result) 164 | err = bdsv.Encode() 165 | if err != nil { 166 | logrus.Fatal("Incr unknow err, ", err) 167 | } 168 | } 169 | 170 | err = txn.Set([]byte(key), bdsv.buff) 171 | if err != nil { 172 | logrus.Fatal("badgerDB incr set value error, ", err) 173 | } 174 | return nil 175 | }) 176 | 177 | return resultInt64, err 178 | } 179 | func (bDB *BadgerDBStore) Del(key string) error { 180 | err := bDB.DB.Update(func(txn *badger.Txn) error { 181 | err := txn.Delete([]byte(key)) 182 | if err != nil { 183 | switch err { 184 | case badger.ErrKeyNotFound: 185 | return nil 186 | default: 187 | logrus.Fatal("badgerDB delete error, ", err) 188 | } 189 | } 190 | return err 191 | }) 192 | return err 193 | } 194 | 195 | func (bDB *BadgerDBStore) Keys(prefix string) ([]string, error) { 196 | result := []string{} 197 | if prefix == "*" { 198 | prefix = "" 199 | } 200 | bDB.DB.View(func(txn *badger.Txn) error { 201 | it := txn.NewIterator(badger.DefaultIteratorOptions) 202 | defer it.Close() 203 | prefix := []byte(prefix) 204 | for it.Seek(prefix); it.ValidForPrefix(prefix); it.Next() { 205 | item := it.Item() 206 | k := item.Key() 207 | value, err := bDB.Get(string(k)) 208 | if err != nil { 209 | return err 210 | } 211 | if value != nil { 212 | result = append(result, string(k)) 213 | } 214 | } 215 | return nil 216 | }) 217 | return result, nil 218 | } 219 | 220 | func (bDB *BadgerDBStore) SetEx(key string, value string, nowTime, timeout int64) (string, error) { 221 | stringValue, err := NewBadgerDBValue([]byte(value), nowTime/1e6, timeout) 222 | if err != nil { 223 | return "", err 224 | } 225 | err = bDB.DB.Update(func(txn *badger.Txn) error { 226 | return txn.Set([]byte(key), stringValue.buff) 227 | }) 228 | if err != nil { 229 | logrus.Fatal("badgerDB set error, ", err) 230 | } 231 | return "ok", nil 232 | } 233 | 234 | func (bDB *BadgerDBStore) TTL(key string) (int64, error) { 235 | var result *BadgerDBValue 236 | err := bDB.DB.View(func(txn *badger.Txn) error { 237 | item, err := txn.Get([]byte(key)) 238 | if err != nil { 239 | return err 240 | } 241 | return item.Value(func(val []byte) error { 242 | bdsv := BadgerDBValue{} 243 | result = &bdsv 244 | return bdsv.Decode(val) 245 | }) 246 | 247 | }) 248 | if err != nil { 249 | switch err { 250 | case badger.ErrKeyNotFound: 251 | return -1, nil 252 | default: 253 | logrus.Fatal("badgerDB get error, ", err) 254 | } 255 | } 256 | 257 | nowTime := time.Now().UnixNano() / 1e6 258 | exTime := result.TimeStamp + result.Timeout 259 | if result.Timeout != -1 && nowTime > exTime { 260 | return -1, nil 261 | } 262 | return exTime - nowTime, err 263 | } 264 | 265 | func (bDB *BadgerDBStore) SetNx(key string, value string, nowTime int64) (int, error) { 266 | result := 0 267 | stringValue, err := NewBadgerDBValue([]byte(value), nowTime/1e6, -1) 268 | if err != nil { 269 | return 0, err 270 | } 271 | err = bDB.DB.Update(func(txn *badger.Txn) error { 272 | _, err := txn.Get([]byte(key)) 273 | if err != nil { 274 | switch err { 275 | case badger.ErrKeyNotFound: 276 | err = txn.Set([]byte(key), stringValue.buff) 277 | if err != nil { 278 | logrus.Fatal("badgerDB incr set value error, ", err) 279 | } 280 | result = 1 281 | return nil 282 | default: 283 | logrus.Fatal("badgerDB incr get error, ", err) 284 | } 285 | } 286 | return nil 287 | }) 288 | return result, err 289 | } 290 | 291 | func (bDB *BadgerDBStore) Expire(key string, nowTime, timeout int64) (int, error) { 292 | result := 0 293 | err := bDB.DB.Update(func(txn *badger.Txn) error { 294 | item, err := txn.Get([]byte(key)) 295 | if err != nil { 296 | switch err { 297 | case badger.ErrKeyNotFound: 298 | default: 299 | logrus.Fatal("badgerDB incr get error, ", err) 300 | } 301 | } else { 302 | var bdsv *BadgerDBValue 303 | err := item.Value(func(val []byte) error { 304 | bdsv = &BadgerDBValue{} 305 | return bdsv.Decode(val) 306 | }) 307 | if err != nil { 308 | logrus.Fatal("Expire: read value error, ", err) 309 | } 310 | bdsv.TimeStamp = nowTime / 1e6 311 | bdsv.Timeout = timeout 312 | err = bdsv.Encode() 313 | if err != nil { 314 | logrus.Fatal("Expire: encode value error, ", err) 315 | } 316 | err = txn.Set(item.Key(), bdsv.buff) 317 | if err != nil { 318 | logrus.Fatal("Expire: write value error, ", err) 319 | } 320 | result = 1 321 | } 322 | return nil 323 | }) 324 | return result, err 325 | } 326 | 327 | //No need snapshot 328 | func (bDB *BadgerDBStore) Snapshot() ([]byte, error) { 329 | return nil, nil 330 | } 331 | 332 | //No need load snapshot 333 | func (bDB *BadgerDBStore) LoadSnapshot(data []byte) error { 334 | return nil 335 | } 336 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 2 | cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 3 | cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= 4 | cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= 5 | cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= 6 | cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= 7 | cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= 8 | cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= 9 | cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= 10 | cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= 11 | cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= 12 | cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= 13 | cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= 14 | cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= 15 | cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= 16 | cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= 17 | cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= 18 | cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= 19 | cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= 20 | cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= 21 | cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= 22 | cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= 23 | dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= 24 | github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= 25 | github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= 26 | github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= 27 | github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= 28 | github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= 29 | github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= 30 | github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= 31 | github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= 32 | github.com/BBVA/raft-badger v1.1.0 h1:YUi1Td/RstJasAn3iuTeMfpNlFKX12MpJBHwluRU7rE= 33 | github.com/BBVA/raft-badger v1.1.0/go.mod h1:6aj0Kov2CDas5dHHKyym9nwfntRUE4J4Q0J/5WaNhwI= 34 | github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= 35 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 36 | github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= 37 | github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= 38 | github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= 39 | github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= 40 | github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= 41 | github.com/Jille/raft-grpc-leader-rpc v1.1.0 h1:u36rmA4tjp+4FSdZ17jg/1sfSCYNQIe5bzzwvW0iVTM= 42 | github.com/Jille/raft-grpc-leader-rpc v1.1.0/go.mod h1:l+pK+uPuqpFDFcPmyUPSng4257UXrST0Vc3Lo4XwVB0= 43 | github.com/Jille/raft-grpc-transport v1.2.0 h1:W/YSPz8IsirEyomjKmDog5Xk71o9+l4KhyMEX2TsgSs= 44 | github.com/Jille/raft-grpc-transport v1.2.0/go.mod h1:GQGUXJfjlzwA390Ox1AyVYpjCLhtGd6yqY9Sb5hpQfc= 45 | github.com/Jille/raftadmin v1.2.0 h1:hMLFUK7iKpeXP+CoIhNMWj+F53XOLSjMDSia0C60cps= 46 | github.com/Jille/raftadmin v1.2.0/go.mod h1:vtVEpToPGTUPVwwunypWDpi69JpdnHMhWRUlc/65U+Y= 47 | github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= 48 | github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= 49 | github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= 50 | github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= 51 | github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 52 | github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 53 | github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 54 | github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 55 | github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= 56 | github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= 57 | github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878 h1:EFSB7Zo9Eg91v7MJPVsifUysc/wPdN+NOnVe6bWbdBM= 58 | github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= 59 | github.com/armon/go-metrics v0.3.8 h1:oOxq3KPj0WhCuy50EhzwiyMyG2ovRQZpZLXQuOh2a/M= 60 | github.com/armon/go-metrics v0.3.8/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= 61 | github.com/armon/go-metrics v0.3.9 h1:O2sNqxBdvq8Eq5xmzljcYzAORli6RWCvEym4cJf9m18= 62 | github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= 63 | github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= 64 | github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= 65 | github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 66 | github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= 67 | github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4= 68 | github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= 69 | github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= 70 | github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= 71 | github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= 72 | github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= 73 | github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 74 | github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= 75 | github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= 76 | github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= 77 | github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= 78 | github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= 79 | github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= 80 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 81 | github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= 82 | github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= 83 | github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= 84 | github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= 85 | github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= 86 | github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= 87 | github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= 88 | github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= 89 | github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= 90 | github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= 91 | github.com/cosiner/argv v0.1.0/go.mod h1:EusR6TucWKX+zFgtdUsKT2Cvg45K5rtpCcWz4hK06d8= 92 | github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= 93 | github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 94 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 95 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 96 | github.com/dgraph-io/badger/v3 v3.2011.1 h1:Hmyof0WMEF/QtutX5SQHzIMnJQxb/IrSzhjckV2SD6g= 97 | github.com/dgraph-io/badger/v3 v3.2011.1/go.mod h1:0rLLrQpKVQAL0or/lBLMQznhr6dWWX7h5AKnmnqx268= 98 | github.com/dgraph-io/badger/v3 v3.2103.2 h1:dpyM5eCJAtQCBcMCZcT4UBZchuTJgCywerHHgmxfxM8= 99 | github.com/dgraph-io/badger/v3 v3.2103.2/go.mod h1:RHo4/GmYcKKh5Lxu63wLEMHJ70Pac2JqZRYGhlyAo2M= 100 | github.com/dgraph-io/ristretto v0.0.4-0.20210122082011-bb5d392ed82d h1:eQYOG6A4td1tht0NdJB9Ls6DsXRGb2Ft6X9REU/MbbE= 101 | github.com/dgraph-io/ristretto v0.0.4-0.20210122082011-bb5d392ed82d/go.mod h1:tv2ec8nA7vRpSYX7/MbP52ihrUMXIHit54CQMq8npXQ= 102 | github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= 103 | github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= 104 | github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= 105 | github.com/dgryski/go-farm v0.0.0-20191112170834-c2139c5d712b/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= 106 | github.com/dj456119/AlfheimDB-WAL v0.0.0-20211121163937-ef8e6becbc16 h1:Cfji2giU9cK8s2ImFal9UGbJCg/iVCGleR/4UgGnT1w= 107 | github.com/dj456119/AlfheimDB-WAL v0.0.0-20211121163937-ef8e6becbc16/go.mod h1:47nL9Uz3WvE9apMpUMhk1r72T4Tma1YCsX3C1bPFNd0= 108 | github.com/dj456119/AlfheimDB-WAL v0.0.0-20211127050158-fcdd0a156f70 h1:PRiTkPWNJmvI3aNHMu0ZUKgjeSRNR4TFhyntsl5Tkpc= 109 | github.com/dj456119/AlfheimDB-WAL v0.0.0-20211127050158-fcdd0a156f70/go.mod h1:47nL9Uz3WvE9apMpUMhk1r72T4Tma1YCsX3C1bPFNd0= 110 | github.com/dj456119/AlfheimDB-WAL v0.0.0-20211129160511-6f954b366408 h1:kGnOwhPOYz0kJMtK9Umk+4WC47OgPnV1KIpBCnTae+U= 111 | github.com/dj456119/AlfheimDB-WAL v0.0.0-20211129160511-6f954b366408/go.mod h1:47nL9Uz3WvE9apMpUMhk1r72T4Tma1YCsX3C1bPFNd0= 112 | github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= 113 | github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= 114 | github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 115 | github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= 116 | github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= 117 | github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 118 | github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 119 | github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= 120 | github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= 121 | github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= 122 | github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= 123 | github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= 124 | github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= 125 | github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= 126 | github.com/fatih/color v1.12.0 h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc= 127 | github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= 128 | github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= 129 | github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= 130 | github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= 131 | github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= 132 | github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 133 | github.com/go-delve/delve v1.5.0/go.mod h1:c6b3a1Gry6x8a4LGCe/CWzrocrfaHvkUxCj3k4bvSUQ= 134 | github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= 135 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= 136 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= 137 | github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 138 | github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 139 | github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= 140 | github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= 141 | github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= 142 | github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= 143 | github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= 144 | github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= 145 | github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= 146 | github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= 147 | github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= 148 | github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= 149 | github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= 150 | github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= 151 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= 152 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= 153 | github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 154 | github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 155 | github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 156 | github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= 157 | github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 158 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 159 | github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 160 | github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= 161 | github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= 162 | github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= 163 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 164 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 165 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 166 | github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= 167 | github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= 168 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= 169 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= 170 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= 171 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= 172 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 173 | github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= 174 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 175 | github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= 176 | github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 177 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 178 | github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= 179 | github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 180 | github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= 181 | github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 182 | github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= 183 | github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 184 | github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 185 | github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 186 | github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= 187 | github.com/google/flatbuffers v1.12.0 h1:/PtAHvnBY4Kqnx/xCQ3OIV9uYcSFGScBsWI3Oogeh6w= 188 | github.com/google/flatbuffers v1.12.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= 189 | github.com/google/flatbuffers v1.12.1 h1:MVlul7pQNoDzWRLTw5imwYsl+usrS1TXG2H4jg6ImGw= 190 | github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= 191 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 192 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 193 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 194 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 195 | github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 196 | github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 197 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 198 | github.com/google/go-dap v0.2.0/go.mod h1:5q8aYQFnHOAZEMP+6vmq25HKYAEwE+LF5yh7JKrrhSQ= 199 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 200 | github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 201 | github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 202 | github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= 203 | github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 204 | github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 205 | github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 206 | github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 207 | github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 208 | github.com/google/pprof v0.0.0-20211108044417-e9b028704de0 h1:rsq1yB2xiFLDYYaYdlGBsSkwVzsCo500wMhxvW5A/bk= 209 | github.com/google/pprof v0.0.0-20211108044417-e9b028704de0/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= 210 | github.com/google/pprof v0.0.0-20211122183932-1daafda22083 h1:c8EUapQFi+kjzedr4c6WqbwMdmB95+oDBWZ5XFHFYxY= 211 | github.com/google/pprof v0.0.0-20211122183932-1daafda22083/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= 212 | github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 213 | github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 214 | github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 215 | github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= 216 | github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= 217 | github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= 218 | github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= 219 | github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 220 | github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= 221 | github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= 222 | github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= 223 | github.com/hashicorp/go-hclog v0.9.1 h1:9PZfAcVEvez4yhLH2TBU64/h/z4xlFI80cWXRrxuKuM= 224 | github.com/hashicorp/go-hclog v0.9.1/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= 225 | github.com/hashicorp/go-hclog v0.16.2 h1:K4ev2ib4LdQETX5cSZBG0DVLk1jwGqSPXBjdah3veNs= 226 | github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= 227 | github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0= 228 | github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= 229 | github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= 230 | github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= 231 | github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= 232 | github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= 233 | github.com/hashicorp/go-msgpack v1.1.5 h1:9byZdVjKTe5mce63pRVNP1L7UAmdHOTEMGehn6KvJWs= 234 | github.com/hashicorp/go-msgpack v1.1.5/go.mod h1:gWVc3sv/wbDmR3rQsj1CAktEZzoz1YNK9NfGLXJ69/4= 235 | github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= 236 | github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 237 | github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo= 238 | github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 239 | github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= 240 | github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 241 | github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= 242 | github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= 243 | github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= 244 | github.com/hashicorp/raft v1.1.0/go.mod h1:4Ak7FSPnuvmb0GV6vgIAJ4vYT4bek9bb6Q+7HVbyzqM= 245 | github.com/hashicorp/raft v1.1.1/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= 246 | github.com/hashicorp/raft v1.1.2/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= 247 | github.com/hashicorp/raft v1.3.1/go.mod h1:4Ak7FSPnuvmb0GV6vgIAJ4vYT4bek9bb6Q+7HVbyzqM= 248 | github.com/hashicorp/raft v1.3.2 h1:j2tqHqFnDdWCepLxzuo3b6WzS2krIweBrvEoqBbWMTo= 249 | github.com/hashicorp/raft v1.3.2/go.mod h1:4Ak7FSPnuvmb0GV6vgIAJ4vYT4bek9bb6Q+7HVbyzqM= 250 | github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea/go.mod h1:pNv7Wc3ycL6F5oOWn+tPGo2gWD4a5X+yp/ntwdKLjRk= 251 | github.com/hashicorp/raft-boltdb v0.0.0-20210422161416-485fa74b0b01 h1:EfDtu7qY4bD9hNY9sIryn1L/Ycvo+/WPEFT2Crwdclg= 252 | github.com/hashicorp/raft-boltdb v0.0.0-20210422161416-485fa74b0b01/go.mod h1:L6EUYfWjwPIkX9uqJBsGb3fppuOcRx3t7z2joJnIf/g= 253 | github.com/hashicorp/raft-boltdb v0.0.0-20211202195631-7d34b9fb3f42 h1:Ye8SofeDHJzu9xvvaMmpMkqHELWW7rTcXwdUR0CWW48= 254 | github.com/hashicorp/raft-boltdb v0.0.0-20211202195631-7d34b9fb3f42/go.mod h1:wcXL8otVu5cpJVLjcmq7pmfdRCdaP+xnvu7WQcKJAhs= 255 | github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= 256 | github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= 257 | github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= 258 | github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= 259 | github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= 260 | github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d h1:uGg2frlt3IcT7kbV6LEp5ONv4vmoO2FW4qSO+my/aoM= 261 | github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= 262 | github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= 263 | github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= 264 | github.com/jinzhu/configor v1.2.1 h1:OKk9dsR8i6HPOCZR8BcMtcEImAFjIhbJFZNyn5GCZko= 265 | github.com/jinzhu/configor v1.2.1/go.mod h1:nX89/MOmDba7ZX7GCyU/VIaQ2Ar2aizBl2d3JLF/rDc= 266 | github.com/josharian/impl v1.1.0 h1:gafhg1OFVMq46ifdkBa8wp4hlGogjktjjA5h/2j4+2k= 267 | github.com/josharian/impl v1.1.0/go.mod h1:SQ6aJMP6xsJpGSD/36IIqrUdigLCYe9bz/9o5AKm6Aw= 268 | github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= 269 | github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 270 | github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 271 | github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= 272 | github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= 273 | github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 274 | github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= 275 | github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= 276 | github.com/klauspost/compress v1.12.3 h1:G5AfA94pHPysR56qqrkO2pxEexdDzrpFJ6yt/VqWxVU= 277 | github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= 278 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 279 | github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 280 | github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= 281 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 282 | github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= 283 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 284 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 285 | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 286 | github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is= 287 | github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkLibYKgg+SwmyFU9dF2hn6MdTj4= 288 | github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible/go.mod h1:ZQnN8lSECaebrkQytbHj4xNgtg8CR7RYXnPok8e0EHA= 289 | github.com/lestrrat-go/strftime v1.0.5 h1:A7H3tT8DhTz8u65w+JRpiBxM4dINQhUXAZnhBa2xeOE= 290 | github.com/lestrrat-go/strftime v1.0.5/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR76fd03sz+Qz4g= 291 | github.com/magefile/mage v1.11.0 h1:C/55Ywp9BpgVVclD3lRnSYCwXTYxmSppIgLeDYlNuls= 292 | github.com/magefile/mage v1.11.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= 293 | github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= 294 | github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 295 | github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 296 | github.com/mattn/go-colorable v0.0.0-20170327083344-ded68f7a9561/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= 297 | github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= 298 | github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= 299 | github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= 300 | github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= 301 | github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= 302 | github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= 303 | github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= 304 | github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= 305 | github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= 306 | github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 307 | github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 308 | github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= 309 | github.com/mmcloughlin/avo v0.0.0-20201105074841-5d2f697d268f/go.mod h1:6aKT4zZIrpGqB3RpFU14ByCSSyKY6LfJz4J/JJChHfI= 310 | github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= 311 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 312 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 313 | github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 314 | github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 315 | github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= 316 | github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 317 | github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= 318 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= 319 | github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= 320 | github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 321 | github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 322 | github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= 323 | github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= 324 | github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= 325 | github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= 326 | github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= 327 | github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= 328 | github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= 329 | github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= 330 | github.com/peterh/liner v0.0.0-20170317030525-88609521dc4b/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= 331 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 332 | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 333 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 334 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 335 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 336 | github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 337 | github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= 338 | github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= 339 | github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= 340 | github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= 341 | github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 342 | github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 343 | github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 344 | github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= 345 | github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 346 | github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= 347 | github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 348 | github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 349 | github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= 350 | github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= 351 | github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= 352 | github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 353 | github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= 354 | github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 355 | github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= 356 | github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= 357 | github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= 358 | github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= 359 | github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= 360 | github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= 361 | github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= 362 | github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= 363 | github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= 364 | github.com/spf13/cobra v0.0.0-20170417170307-b6cb39589372/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= 365 | github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= 366 | github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= 367 | github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 368 | github.com/spf13/pflag v0.0.0-20170417173400-9e4c21054fa1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 369 | github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 370 | github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 371 | github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= 372 | github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= 373 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 374 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 375 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 376 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 377 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 378 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= 379 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 380 | github.com/tidwall/btree v0.6.1 h1:75VVgBeviiDO+3g4U+7+BaNBNhNINxB0ULPT3fs9pMY= 381 | github.com/tidwall/btree v0.6.1/go.mod h1:TzIRzen6yHbibdSfK6t8QimqbUnoxUSrZfeW7Uob0q4= 382 | github.com/tidwall/gjson v1.6.1 h1:LRbvNuNuvAiISWg6gxLEFuCe72UKy5hDqhxW/8183ws= 383 | github.com/tidwall/gjson v1.6.1/go.mod h1:BaHyNc5bjzYkPqgLq7mdVzeiRtULKULXLgZFKsxEHI0= 384 | github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= 385 | github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= 386 | github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= 387 | github.com/tidwall/pretty v1.0.2 h1:Z7S3cePv9Jwm1KwS0513MRaoUe3S01WPbLNV40pwWZU= 388 | github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= 389 | github.com/tidwall/raft-wal v0.1.5 h1:ENv8lLXT+Qd6Kruaes2UrKyDi7ukYfEzijZsJ6I2X54= 390 | github.com/tidwall/raft-wal v0.1.5/go.mod h1:Qgj5etRF+p/3Dnw/7TTVe2C5klD2kltbokISfQrpd5w= 391 | github.com/tidwall/redcon v1.4.2 h1:ap44ooAjFK1poJX+ji1/HJV9JzFCqHCHWb2RpVEnDfw= 392 | github.com/tidwall/redcon v1.4.2/go.mod h1:0LDDaln3mnvTNAsNkoLH4oz3s9UIaFwiMJVJTJZsu5k= 393 | github.com/tidwall/tinylru v1.0.2 h1:W4mp7iUz4cnVMqAvWy2zbzC35ASv5sqdyyEjoQKKBFg= 394 | github.com/tidwall/tinylru v1.0.2/go.mod h1:HDVL7TsWeezQ4g44Um84TOVBMFcq7Xa9giqNc805KJ8= 395 | github.com/tidwall/wal v0.1.3 h1:4641ZiOjDT6hAsdIySfPTctQa5fZBs2/TwPF+EZChas= 396 | github.com/tidwall/wal v0.1.3/go.mod h1:ww7Pd44/KnyETODJPUPKrzLlYjI72GZWlucNKt7pOt0= 397 | github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= 398 | github.com/twitchyliquid64/golang-asm v0.15.0/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= 399 | github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= 400 | github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= 401 | github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 402 | github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 403 | github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= 404 | github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= 405 | github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= 406 | go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= 407 | go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= 408 | go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 409 | go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 410 | go.opencensus.io v0.22.5 h1:dntmOdLpSpHlVqbW5Eay97DelsZHe+55D+xC6i0dDS0= 411 | go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= 412 | go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= 413 | go.starlark.net v0.0.0-20190702223751-32f345186213/go.mod h1:c1/X6cHgvdXj6pUlmWKMkuqRnW4K8x2vwt6JAaaircg= 414 | golang.org/x/arch v0.0.0-20190927153633-4e8777c89be4/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= 415 | golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= 416 | golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 417 | golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 418 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 419 | golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 420 | golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 421 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 422 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 423 | golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 424 | golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= 425 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 426 | golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 427 | golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= 428 | golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= 429 | golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= 430 | golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 431 | golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 432 | golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 433 | golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= 434 | golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= 435 | golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= 436 | golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= 437 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 438 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= 439 | golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 440 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 441 | golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 442 | golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 443 | golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 444 | golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= 445 | golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 446 | golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 447 | golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 448 | golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= 449 | golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= 450 | golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= 451 | golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= 452 | golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 453 | golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 454 | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 455 | golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 456 | golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 457 | golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38= 458 | golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= 459 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 460 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 461 | golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 462 | golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 463 | golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 464 | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 465 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 466 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 467 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 468 | golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 469 | golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 470 | golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= 471 | golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 472 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 473 | golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 474 | golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 475 | golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 476 | golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 477 | golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 478 | golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 479 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 480 | golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 481 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 482 | golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 483 | golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= 484 | golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 485 | golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 486 | golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= 487 | golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 h1:ADo5wSpq2gqaCGQWzk7S5vd//0iyyLeAratkEoG5dLE= 488 | golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 489 | golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI= 490 | golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 491 | golang.org/x/net v0.0.0-20210907225631-ff17edfbf26d h1:kuk8nKPQ25KCDODLCDXt99tnTVeOyOM8HGvtJ0NzAvw= 492 | golang.org/x/net v0.0.0-20210907225631-ff17edfbf26d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 493 | golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY= 494 | golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 495 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 496 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 497 | golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 498 | golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 499 | golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= 500 | golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 501 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 502 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 503 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 504 | golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 505 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 506 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 507 | golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 508 | golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 509 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 510 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 511 | golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 512 | golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 513 | golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 514 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 515 | golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 516 | golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 517 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 518 | golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 519 | golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 520 | golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 521 | golang.org/x/sys v0.0.0-20190523142557-0e01d883c5c5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 522 | golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 523 | golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 524 | golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 525 | golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 526 | golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 527 | golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 528 | golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 529 | golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 530 | golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4= 531 | golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 532 | golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 533 | golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 534 | golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 535 | golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 536 | golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 537 | golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 538 | golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 539 | golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 540 | golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 541 | golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 542 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= 543 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 544 | golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 545 | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 546 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 547 | golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 548 | golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 549 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 550 | golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 551 | golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 h1:RqytpXGR1iVNX7psjB3ff8y7sNFinVFvkx1c8SjBkio= 552 | golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 553 | golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 554 | golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 555 | golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34 h1:GkvMjFtXUmahfDtashnc1mnrCtuBVcwse5QV2lUk/tI= 556 | golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 557 | golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 558 | golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 559 | golang.org/x/sys v0.0.0-20211112164355-7580c6e521dc h1:2D+Fz43FLLdWR7Z5PiJEk6Dt03ldxCHDq3WbEIMGsec= 560 | golang.org/x/sys v0.0.0-20211112164355-7580c6e521dc/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 561 | golang.org/x/sys v0.0.0-20211124211545-fe61309f8881 h1:TyHqChC80pFkXWraUUf6RuB5IqFdQieMLwwCJokV2pc= 562 | golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 563 | golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 564 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 565 | golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 566 | golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 567 | golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= 568 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 569 | golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 570 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 571 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 572 | golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 573 | golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= 574 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 575 | golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= 576 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 577 | golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 578 | golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 579 | golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 580 | golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= 581 | golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 582 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 583 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 584 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= 585 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 586 | golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 587 | golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 588 | golang.org/x/tools v0.0.0-20190424220101-1e8e1cfdf96b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 589 | golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 590 | golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 591 | golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 592 | golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 593 | golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 594 | golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 595 | golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 596 | golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 597 | golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 598 | golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 599 | golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 600 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 601 | golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 602 | golang.org/x/tools v0.0.0-20191127201027-ecd32218bd7f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 603 | golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 604 | golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 605 | golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 606 | golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 607 | golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 608 | golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 609 | golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 610 | golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 611 | golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 612 | golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 613 | golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= 614 | golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 615 | golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 616 | golang.org/x/tools v0.0.0-20201105001634-bc3cf281b174/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 617 | golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 618 | golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 619 | golang.org/x/tools v0.1.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ= 620 | golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= 621 | golang.org/x/tools v0.1.8 h1:P1HhGGuLW4aAclzjtmJdf0mJOjVUZUzOTqkAkWL+l6w= 622 | golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= 623 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 624 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 625 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 626 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= 627 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 628 | google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= 629 | google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= 630 | google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= 631 | google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= 632 | google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 633 | google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 634 | google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 635 | google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 636 | google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 637 | google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 638 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 639 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 640 | google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 641 | google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= 642 | google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= 643 | google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 644 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 645 | google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 646 | google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 647 | google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 648 | google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 649 | google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 650 | google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 651 | google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= 652 | google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 653 | google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 654 | google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 655 | google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 656 | google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 657 | google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 658 | google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= 659 | google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 660 | google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 661 | google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 662 | google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 663 | google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= 664 | google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= 665 | google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154 h1:bFFRpT+e8JJVY7lMMfvezL1ZIwqiwmPl2bsE2yx4HqM= 666 | google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 667 | google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83 h1:3V2dxSZpz4zozWWUq36vUxXEKnSYitEH2LdsAx+RUmg= 668 | google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= 669 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 670 | google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= 671 | google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= 672 | google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 673 | google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= 674 | google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 675 | google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 676 | google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 677 | google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= 678 | google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= 679 | google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= 680 | google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= 681 | google.golang.org/grpc v1.42.0 h1:XT2/MFpuPFsEX2fWh3YQtHkZ+WYZFQRfaUgLZYj/p6A= 682 | google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= 683 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= 684 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= 685 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= 686 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= 687 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= 688 | google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 689 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 690 | google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 691 | google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= 692 | google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= 693 | google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 694 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 695 | google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= 696 | google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 697 | google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= 698 | google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 699 | gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 700 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 701 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 702 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 703 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 704 | gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= 705 | gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= 706 | gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= 707 | gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= 708 | gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 709 | gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= 710 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 711 | gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 712 | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 713 | gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 714 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 715 | gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 716 | gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 717 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 718 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 719 | gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 720 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 721 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 722 | honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 723 | honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 724 | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 725 | honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= 726 | honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= 727 | k8s.io/api v0.22.3/go.mod h1:azgiXFiXqiWyLCfI62/eYBOu19rj2LKmIhFPP4+33fs= 728 | k8s.io/api v0.22.4/go.mod h1:Rgs+9gIGYC5laXQSZZ9JqT5NevNgoGiOdVWi1BAB3qk= 729 | k8s.io/apimachinery v0.22.3 h1:mrvBG5CZnEfwgpVqWcrRKvdsYECTrhAR6cApAgdsflk= 730 | k8s.io/apimachinery v0.22.3/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= 731 | k8s.io/apimachinery v0.22.4/go.mod h1:yU6oA6Gnax9RrxGzVvPFFJ+mpnW6PBSqp0sx0I0HHW0= 732 | k8s.io/client-go v0.22.3 h1:6onkOSc+YNdwq5zXE0wFXicq64rrym+mXwHu/CPVGO4= 733 | k8s.io/client-go v0.22.3/go.mod h1:ElDjYf8gvZsKDYexmsmnMQ0DYO8W9RwBjfQ1PI53yow= 734 | k8s.io/client-go v0.22.4 h1:aAQ1Wk+I3bjCNk35YWUqbaueqrIonkfDPJSPDDe8Kfg= 735 | k8s.io/client-go v0.22.4/go.mod h1:Yzw4e5e7h1LNHA4uqnMVrpEpUs1hJOiuBsJKIlRCHDA= 736 | k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= 737 | k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= 738 | k8s.io/klog/v2 v2.9.0 h1:D7HV+n1V57XeZ0m6tdRkfknthUaM06VFbWldOFh8kzM= 739 | k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= 740 | k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= 741 | k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= 742 | k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= 743 | rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= 744 | rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= 745 | rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= 746 | rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= 747 | sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= 748 | sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= 749 | sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= 750 | --------------------------------------------------------------------------------