├── website
├── .npmrc
├── .env.development
├── .env.production
├── static
│ └── favicon.png
├── .prettierignore
├── postcss.config.cjs
├── .gitignore
├── vite.config.js
├── .eslintignore
├── svelte.config.js
├── .prettierrc
├── src
│ ├── routes
│ │ ├── +page.server.js
│ │ ├── templates
│ │ │ ├── +page.server.js
│ │ │ └── +page.svelte
│ │ ├── daily.svelte
│ │ ├── today.svelte
│ │ ├── +page.svelte
│ │ ├── +layout.svelte
│ │ └── livings.svelte
│ ├── app.css
│ └── app.html
├── Dockerfile
├── .eslintrc.cjs
├── tailwind.config.cjs
├── package.json
└── README.md
├── .env
├── tgbot
├── Dockerfile
├── go.mod
├── sim_test.go
├── main_test.go
├── main.go
├── chats.go
├── nominate.go
├── laohuangli.go
└── go.sum
├── dev_server
└── server.go
├── Makefile
├── docker-compose.yml
├── .gitignore
├── LICENSE
└── README.md
/website/.npmrc:
--------------------------------------------------------------------------------
1 | engine-strict=true
2 |
--------------------------------------------------------------------------------
/website/.env.development:
--------------------------------------------------------------------------------
1 | VITE_DATA_URL=localhost
2 |
--------------------------------------------------------------------------------
/website/.env.production:
--------------------------------------------------------------------------------
1 | VITE_DATA_URL=laohuangli-bot
2 |
--------------------------------------------------------------------------------
/website/static/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/szres/laohuangli-lite-go/HEAD/website/static/favicon.png
--------------------------------------------------------------------------------
/website/.prettierignore:
--------------------------------------------------------------------------------
1 | # Ignore files for PNPM, NPM and YARN
2 | pnpm-lock.yaml
3 | package-lock.json
4 | yarn.lock
5 |
--------------------------------------------------------------------------------
/website/postcss.config.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: [require('tailwindcss'), require('autoprefixer')]
3 | };
4 |
--------------------------------------------------------------------------------
/.env:
--------------------------------------------------------------------------------
1 | BOT_TOKEN='YOUR_BOT_TOKEN'
2 | BOT_ADMIN_ID='YOUR_TELEGRAM_ID'
3 | # Uptime Kuma monitoring tool url
4 | KUMA_PUSH_URL=''
5 | WEB_DOMAIN=''
6 | TZ='Asia/Hong_Kong'
7 |
--------------------------------------------------------------------------------
/website/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /build
4 | /.svelte-kit
5 | /package
6 | .env
7 | !.env.example
8 | vite.config.js.timestamp-*
9 | vite.config.ts.timestamp-*
10 |
--------------------------------------------------------------------------------
/website/vite.config.js:
--------------------------------------------------------------------------------
1 | import { sveltekit } from '@sveltejs/kit/vite';
2 | import { defineConfig } from 'vite';
3 |
4 | export default defineConfig({
5 | plugins: [sveltekit()]
6 | });
7 |
--------------------------------------------------------------------------------
/website/.eslintignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /build
4 | /.svelte-kit
5 | /package
6 | .env
7 | .env.*
8 | !.env.example
9 |
10 | # Ignore files for PNPM, NPM and YARN
11 | pnpm-lock.yaml
12 | package-lock.json
13 | yarn.lock
14 |
--------------------------------------------------------------------------------
/website/svelte.config.js:
--------------------------------------------------------------------------------
1 | import adapter from '@sveltejs/adapter-node';
2 |
3 | /** @type {import('@sveltejs/kit').Config} */
4 | const config = {
5 | kit: {
6 | adapter: adapter()
7 | }
8 | };
9 |
10 | export default config;
11 |
--------------------------------------------------------------------------------
/website/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "useTabs": true,
3 | "singleQuote": true,
4 | "trailingComma": "none",
5 | "printWidth": 100,
6 | "plugins": ["prettier-plugin-svelte"],
7 | "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }]
8 | }
9 |
--------------------------------------------------------------------------------
/website/src/routes/+page.server.js:
--------------------------------------------------------------------------------
1 | export const load = async () => {
2 | const fetchJSON = async () => {
3 | const res = await fetch(`http://` + import.meta.env.VITE_DATA_URL + `/cache.json`);
4 | const data = await res.json();
5 | return data;
6 | };
7 |
8 | return fetchJSON();
9 | };
10 |
--------------------------------------------------------------------------------
/website/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM node:18-alpine AS builder
2 | WORKDIR /app
3 | COPY . .
4 | RUN npm ci
5 | RUN npm run build
6 |
7 | FROM node:18-alpine
8 | WORKDIR /app
9 | COPY --from=builder /app/build ./build
10 | COPY --from=builder /app/package*.json ./
11 | USER node:node
12 | CMD ["node","./build/index.js"]
13 |
--------------------------------------------------------------------------------
/tgbot/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM golang:alpine AS builder
2 | LABEL stage=builder
3 | WORKDIR $GOPATH/src/mypackage/myapp/
4 | COPY ./* ./
5 | RUN go mod tidy
6 | RUN GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o /app
7 |
8 | FROM scratch
9 | COPY --from=builder /app /app/laohuangli
10 | VOLUME /db
11 | ENTRYPOINT ["/app/laohuangli"]
12 |
--------------------------------------------------------------------------------
/dev_server/server.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "net/http"
6 | )
7 |
8 | func main() {
9 | fmt.Println("listening on port 80")
10 | http.Handle("/", http.FileServer(http.Dir("../db/datas")))
11 | err := http.ListenAndServe(":80", nil)
12 | if err != nil {
13 | panic(err)
14 | }
15 | fmt.Println("server down")
16 | }
17 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 |
2 |
3 | .PHONY: default down upgrade clean
4 |
5 | default:
6 | docker compose up $(service) -d
7 |
8 | down:
9 | docker compose down $(service)
10 |
11 | upgrade:
12 | docker compose build $(service)
13 | docker compose down $(service)
14 | docker compose up $(service) -d
15 | docker image prune -f
16 |
17 | clean:
18 | docker compose down -v --rmi all
19 |
--------------------------------------------------------------------------------
/website/.eslintrc.cjs:
--------------------------------------------------------------------------------
1 | /** @type { import("eslint").Linter.Config } */
2 | module.exports = {
3 | root: true,
4 | extends: ['eslint:recommended', 'plugin:svelte/recommended', 'prettier'],
5 | parserOptions: {
6 | sourceType: 'module',
7 | ecmaVersion: 2020,
8 | extraFileExtensions: ['.svelte']
9 | },
10 | env: {
11 | browser: true,
12 | es2017: true,
13 | node: true
14 | }
15 | };
16 |
--------------------------------------------------------------------------------
/website/src/app.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 |
4 | html {
5 | -ms-overflow-style: none; /* Internet Explorer 10+ */
6 | scrollbar-width: none; /* Firefox */
7 | }
8 | ::-webkit-scrollbar {
9 | display: none;
10 | }
11 |
12 | .tooltip {
13 | @apply invisible absolute;
14 | }
15 |
16 | .has-tooltip:hover .tooltip {
17 | @apply visible z-50;
18 | }
19 |
20 | @tailwind utilities;
21 |
--------------------------------------------------------------------------------
/website/src/app.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | %sveltekit.head%
8 |
9 |
10 | %sveltekit.body%
11 |
12 |
13 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '3'
2 |
3 | services:
4 | tgbot:
5 | container_name: laohuangli-bot
6 | build: ./tgbot
7 | volumes:
8 | - ./db:/db
9 | - /etc/ssl/certs:/etc/ssl/certs
10 | env_file:
11 | - .env
12 | restart: unless-stopped
13 | website:
14 | container_name: laohuangli-website
15 | build: ./website
16 | user: "node"
17 | environment:
18 | - NODE_ENV=production
19 | restart: unless-stopped
20 | ports:
21 | - 4090:3000
22 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # If you prefer the allow list template instead of the deny list, see community template:
2 | # https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
3 | #
4 | # Binaries for programs and plugins
5 | *.exe
6 | *.exe~
7 | *.dll
8 | *.so
9 | *.dylib
10 |
11 | # Test binary, built with `go test -c`
12 | *.test
13 |
14 | # Output of the go coverage tool, specifically when used with LiteIDE
15 | *.out
16 |
17 | # Dependency directories (remove the comment below to include it)
18 | # vendor/
19 |
20 | # Go workspace file
21 | go.work
22 | test*
23 |
24 | db
25 |
--------------------------------------------------------------------------------
/tgbot/go.mod:
--------------------------------------------------------------------------------
1 | module laohuangli-lite-go
2 |
3 | go 1.22
4 |
5 | require (
6 | github.com/Nigh/kuma-push v0.1.0
7 | github.com/adrg/strutil v0.3.1
8 | github.com/nanobox-io/golang-scribble v0.0.0-20190309225732-aa3e7c118975
9 | github.com/satori/go.uuid v1.2.0
10 | github.com/valyala/fasttemplate v1.2.2
11 | golang.org/x/sync v0.0.0-20220513210516-0976fa681c29
12 | gonum.org/v1/gonum v0.14.0
13 | gopkg.in/telebot.v3 v3.2.1
14 | )
15 |
16 | require (
17 | github.com/jcelliott/lumber v0.0.0-20160324203708-dd349441af25 // indirect
18 | github.com/valyala/bytebufferpool v1.0.0 // indirect
19 | )
20 |
--------------------------------------------------------------------------------
/website/src/routes/templates/+page.server.js:
--------------------------------------------------------------------------------
1 | export const load = async () => {
2 | const fetchJSON = async () => {
3 | const res1 = await fetch(`http://` + import.meta.env.VITE_DATA_URL + `/templates.json`);
4 | const res2 = await fetch(`http://` + import.meta.env.VITE_DATA_URL + `/laohuangli.json`);
5 | const res3 = await fetch(`http://` + import.meta.env.VITE_DATA_URL + `/laohuangli-user.json`);
6 | const templates = await res1.json();
7 | const entrys = await res2.json();
8 | const entrysUser = await res3.json();
9 | return { templates, entrys, entrysUser };
10 | };
11 |
12 | return fetchJSON();
13 | };
14 |
--------------------------------------------------------------------------------
/website/src/routes/daily.svelte:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
{title}
9 |
10 |
11 |
12 | 宜
13 |
14 |
{positive}
15 |
16 |
17 |
18 | 忌
19 |
20 |
{negative}
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/website/tailwind.config.cjs:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | module.exports = {
3 | content: ['./src/routes/**/*.{svelte,js}'],
4 | plugins: [require('daisyui')],
5 | daisyui: {
6 | themes: [
7 | {
8 | darkpink: {
9 | primary: '#fecdd3',
10 | secondary: '#7dd3fc',
11 | accent: '#fca5a5',
12 | neutral: '#44403c',
13 | 'base-100': '#292524',
14 | info: '#93c5fd',
15 | success: '#10b981',
16 | warning: '#a16207',
17 | error: '#7f1d1d'
18 | }
19 | },
20 | {
21 | lightpink: {
22 | primary: '#fda4af',
23 | secondary: '#60a5fa',
24 | accent: '#f472b6',
25 | neutral: '#44403c',
26 | 'base-100': '#f3f4f6',
27 | info: '#06b6d4',
28 | success: '#34d399',
29 | warning: '#f59e0b',
30 | error: '#dc2626'
31 | }
32 | }
33 | ]
34 | }
35 | };
36 |
--------------------------------------------------------------------------------
/website/src/routes/today.svelte:
--------------------------------------------------------------------------------
1 |
25 |
26 | 今日
27 | {date}
28 |
29 |
30 | {#each Object.entries(today) as [k, v]}
31 |
32 | {/each}
33 |
34 |
35 |
--------------------------------------------------------------------------------
/website/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "laohuangli-page",
3 | "version": "0.0.1",
4 | "private": true,
5 | "scripts": {
6 | "dev": "vite dev --host",
7 | "build": "vite build",
8 | "preview": "vite preview",
9 | "lint": "prettier --check . && eslint .",
10 | "format": "prettier --write ."
11 | },
12 | "devDependencies": {
13 | "@sveltejs/adapter-node": "^4.0.1",
14 | "@sveltejs/kit": "^2.0.0",
15 | "@sveltejs/vite-plugin-svelte": "^3.0.0",
16 | "@types/eslint": "8.56.0",
17 | "autoprefixer": "^10.4.17",
18 | "daisyui": "^4.7.2",
19 | "eslint": "^8.56.0",
20 | "eslint-config-prettier": "^9.1.0",
21 | "eslint-plugin-svelte": "^2.35.1",
22 | "postcss": "^8.4.35",
23 | "prettier": "^3.1.1",
24 | "prettier-plugin-svelte": "^3.1.2",
25 | "svelte": "^4.2.7",
26 | "tailwindcss": "^3.4.1",
27 | "vite": "^5.0.3"
28 | },
29 | "type": "module"
30 | }
31 |
--------------------------------------------------------------------------------
/website/src/routes/+page.svelte:
--------------------------------------------------------------------------------
1 |
24 |
25 |
26 |
27 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/tgbot/sim_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "testing"
6 |
7 | "github.com/adrg/strutil"
8 | "github.com/adrg/strutil/metrics"
9 | )
10 |
11 | func similarity() []float64 {
12 | // method := metrics.NewSorensenDice()
13 | // method := metrics.NewHamming()
14 | // method := metrics.NewJaccard()
15 | method := metrics.NewJaro()
16 | // method := metrics.NewJaroWinkler()
17 |
18 | method.CaseSensitive = false
19 | similarity := make([]float64, 0)
20 | similarity = append(similarity, strutil.Similarity("新老黄历测试条目 - 001", "新老黄历测试条", method))
21 | similarity = append(similarity, strutil.Similarity("新老黄历测试条目 - 001", "新老黄历测试", method))
22 | similarity = append(similarity, strutil.Similarity("新老黄历测试条目 - 001", "新老黄历测", method))
23 | similarity = append(similarity, strutil.Similarity("新老黄历测试条目 - 001", "旧老黄历目", method))
24 | return similarity
25 | }
26 | func TestSimilarity(t *testing.T) {
27 | fmt.Println(similarity())
28 | }
29 | func BenchmarkSimilarity(b *testing.B) {
30 | for i := 0; i < b.N; i++ {
31 | similarity()
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/website/README.md:
--------------------------------------------------------------------------------
1 | # create-svelte
2 |
3 | Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/main/packages/create-svelte).
4 |
5 | ## Creating a project
6 |
7 | If you're seeing this, you've probably already done this step. Congrats!
8 |
9 | ```bash
10 | # create a new project in the current directory
11 | npm create svelte@latest
12 |
13 | # create a new project in my-app
14 | npm create svelte@latest my-app
15 | ```
16 |
17 | ## Developing
18 |
19 | Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:
20 |
21 | ```bash
22 | npm run dev
23 |
24 | # or start the server and open the app in a new browser tab
25 | npm run dev -- --open
26 | ```
27 |
28 | ## Building
29 |
30 | To create a production version of your app:
31 |
32 | ```bash
33 | npm run build
34 | ```
35 |
36 | You can preview the production build with `npm run preview`.
37 |
38 | > To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment.
39 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 xianii
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 |
--------------------------------------------------------------------------------
/website/src/routes/+layout.svelte:
--------------------------------------------------------------------------------
1 |
4 |
5 |
50 |
--------------------------------------------------------------------------------
/website/src/routes/livings.svelte:
--------------------------------------------------------------------------------
1 |
73 |
74 | 众生
75 |
76 | {#if livingList.length > 0}
77 | {#each livingList as content (content.id)}
78 |
84 |
{content.name}
85 |
{content.result}
86 |
87 | {/each}
88 | {:else}
89 |
众生命途未定,请稍候片刻
90 | {/if}
91 |
92 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | # 老黄历Go
6 |
7 | [](https://t.me/LuckyYUI_bot)
8 | 
9 | [](LICENSE)
10 | 
11 |
12 | 这个项目是对 [青年老黄历Bot](https://github.com/HerbertGao/laohuangli_bot) 项目的精简复刻。仅保留了每日老黄历功能。并增加了提名新词条功能,可以通过投票添加新的词条。
13 |
14 | ## 部署
15 |
16 | > tips: 要使得 bot 正常工作需要在 `bot father` 处打开 bot 的 `inline` 功能
17 |
18 | 1. 在 `.env` 中设置必要信息
19 | 1. `BOT_TOKEN`: Telegram的bot token **[必填项]**
20 | 2. `BOT_ADMIN_ID`: 机器人管理员的Telegram ID,配置为管理员的ID可以使用更多命令 **[可留空]**
21 | 3. `KUMA_PUSH_URL`: 使用 [kuma-push](https://github.com/Nigh/kuma-push) 驱动的 [uptime-Kuma](https://github.com/louislam/uptime-kuma "uptimeKuma") 监控服务的推送地址,不带参数 **[可留空]**
22 | 4. `WEB_DOMAIN`: 老黄历网页的托管地址 **[可留空]**
23 | 2. 根据需要运行下面的命令
24 |
25 | ```shell
26 | # 初次运行
27 | make
28 | # 拉取源码升级
29 | git pull
30 | make upgrade
31 | # 移除容器
32 | make clean
33 | ```
34 |
35 | 3. `website` 容器包含了一个 `node` 驱动的前端页面用于展示当日算命信息与查看模板词条信息,方便用户提名含有模板的词条。前端页面默认暴露于 `4090` 端口。
36 |
37 | ## 数据
38 |
39 | 词条与历史均使用[scribble](https://github.com/nanobox-io/golang-scribble)数据库保存。存放在项目根目录下。目录结构如下:
40 |
41 | ```
42 | db/
43 | ├── datas/
44 | │ ├── laohuangli-user.json #用户提名词条
45 | │ ├── laohuangli.json #本地词条
46 | │ └── templates.json #词条模板
47 | └── history/
48 | └── $date.json #历史记录
49 | ```
50 |
51 | #### 词条结构
52 |
53 | ```json
54 | {
55 | "uuid": "唯一ID",
56 | "content": "词条内容",
57 | "nominator": "提名人昵称"
58 | }
59 | ```
60 |
61 | #### 模板结构
62 |
63 | ```json
64 | "模板变量名": {
65 | "desc": "模板描述",
66 | "values": [
67 | "模板内容数组1",
68 | "模板内容数组2",
69 | "模板内容数组3",
70 | "......"
71 | ]
72 | }
73 | ```
74 |
75 | ### 词条示例
76 |
77 | templates.json
78 |
79 | ```json
80 | {
81 | "haircolor": {
82 | "desc": "适用于发色的单字颜色",
83 | "values": [
84 | "红",
85 | "粉",
86 | "黄",
87 | "蓝",
88 | "绿",
89 | "白",
90 | "金"
91 | ]
92 | }
93 | }
94 | ```
95 |
96 | laohuangli-user.json
97 |
98 | ```json
99 | {
100 | "uuid": "1",
101 | "content": "给老黄历提名新词条",
102 | "nominator": "匿名"
103 | },
104 | {
105 | "uuid": "2",
106 | "content": "染成{{haircolor}}毛",
107 | "nominator": "倪明"
108 | }
109 | ```
110 |
--------------------------------------------------------------------------------
/tgbot/main_test.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "crypto/rand"
5 | "fmt"
6 | "math/big"
7 | "strconv"
8 | "strings"
9 | "testing"
10 |
11 | scribble "github.com/nanobox-io/golang-scribble"
12 | "gonum.org/v1/gonum/stat/combin"
13 | )
14 |
15 | func init() {
16 | // db, _ = scribble.New("../db", nil)
17 | // laoHL.init(db)
18 | // laoHL.cache.New()
19 | // laoHL.cache.Save()
20 | }
21 | func TestBase(t *testing.T) {
22 | fmt.Println(laoHL.cache.Today.String())
23 | }
24 | func TestRandom(t *testing.T) {
25 | fmt.Println("Length of entries", len(laoHL.entries))
26 | fmt.Println("Length of entriesBanlanced", len(laoHL.entriesBanlanced))
27 | for i := 0; i < 10; i++ {
28 | a, err := laoHL.randomThenDelete()
29 | b, _ := laoHL.randomThenDelete()
30 | if err != nil {
31 | fmt.Printf("Err:[%s]\n", err.Error())
32 | } else {
33 | fmt.Printf("宜:[%s]\n忌:[%s]\n", a, b)
34 | }
35 | }
36 | db.Write("datas", "laohuangliBanlanced", laoHL.entriesBanlanced)
37 | }
38 | func TestUserRandom16(t *testing.T) {
39 | db, _ = scribble.New("../db", nil)
40 | laoHL.init(db)
41 | for k, v := range laoHL.cache.Caches {
42 | fmt.Println(k, v)
43 | }
44 | for i := 0; i < 13; i++ {
45 | userID := strconv.Itoa(1000 + i)
46 | userName := "TEST USER[" + userID + "]"
47 | fmt.Println(userName + " " + laoHL.randomToday(int64(1000+i), userName))
48 | }
49 | }
50 | func TestRegexp(t *testing.T) {
51 | var list []string = []string{
52 | `_`, `*`, `[`, `]`, `(`, `)`, `~`, "`", `>`, `#`, `+`, `-`, `=`, `|`, `{`, `}`, `.`, `!`, `\`,
53 | }
54 | testStr := "_*[]#12345(test)~测试`>#+-=|{}\n.!\\t"
55 |
56 | prefix := ""
57 | result := ""
58 | for _, c := range testStr {
59 | if strings.ContainsRune(strings.Join(list, ""), rune(c)) && prefix != `\` {
60 | result += `\` + string(c)
61 | } else {
62 | result += string(c)
63 | }
64 | prefix = string(c)
65 | }
66 | fmt.Println(result)
67 | }
68 | func TestRandomSliceSlice(t *testing.T) {
69 | getRandomNFromSlice := func(slice []string) (ret []string) {
70 | // [0, len(slice)^2)
71 | randInt, _ := rand.Int(rand.Reader, big.NewInt(int64(len(slice)*len(slice))))
72 | // (-len(slice), 0]
73 | randInt.Sqrt(randInt).Neg(randInt)
74 | // (0, len(slice)]
75 | randInt.Add(randInt, big.NewInt(int64(len(slice))))
76 | // pick (0, len(slice)] elements from slice
77 | list := combin.Combinations(len(slice), int(randInt.Int64()))
78 | randInt, _ = rand.Int(rand.Reader, big.NewInt(int64(len(list))))
79 | listPick := list[randInt.Int64()]
80 | for _, k := range listPick {
81 | ret = append(ret, slice[k])
82 | }
83 | return
84 | }
85 | for i := 0; i < 10; i++ {
86 | fmt.Println(getRandomNFromSlice([]string{"a", "b", "c", "d", "e", "f"}))
87 | }
88 | }
89 | func BenchmarkRandom(b *testing.B) {
90 | for i := 0; i < b.N; i++ {
91 | laoHL.randomThenDelete()
92 | }
93 | }
94 |
95 | // func BenchmarkRandomStable(b *testing.B) {
96 | // for i := 0; i < b.N; i++ {
97 | // id := int64(i)
98 | // laoHL.randomStable(time.Now().Format("20060102") + "-" + strconv.FormatInt(id, 10))
99 | // }
100 | // }
101 |
--------------------------------------------------------------------------------
/tgbot/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "log"
6 | "net/http"
7 | "os"
8 | "os/signal"
9 | "strconv"
10 | "syscall"
11 | "time"
12 | _ "time/tzdata"
13 |
14 | kuma "github.com/Nigh/kuma-push"
15 | "github.com/adrg/strutil/metrics"
16 | scribble "github.com/nanobox-io/golang-scribble"
17 | tele "gopkg.in/telebot.v3"
18 | )
19 |
20 | type testenv struct {
21 | Token string `json:"token"`
22 | AdminID string `json:"adminid"`
23 | KumaURL string `json:"kumaurl"`
24 | }
25 |
26 | var testEnv testenv
27 |
28 | type entry struct {
29 | UUID string `json:"uuid"`
30 | Content string `json:"content"`
31 | Nominator string `json:"nominator"`
32 | }
33 | type laohuangliTemplate struct {
34 | Desc string `json:"desc"`
35 | Values []string `json:"values"`
36 | }
37 | type laohuangliResult struct {
38 | Name string `json:"name"`
39 | Result string `json:"result"`
40 | }
41 |
42 | var (
43 | gTimeFormat string = "2006-01-02 15:04"
44 | gAdminID int64
45 | gKumaPushURL string
46 | gToken string
47 |
48 | gStrCompareAlgo *metrics.Jaro
49 | )
50 |
51 | var db *scribble.Driver
52 |
53 | func init() {
54 | db, _ = scribble.New("../db", nil)
55 |
56 | laoHL.init(db)
57 | laoHL.start()
58 |
59 | db.Read("test", "env", &testEnv)
60 | if testEnv.Token != "" {
61 | gToken = testEnv.Token
62 | gAdminID, _ = strconv.ParseInt(testEnv.AdminID, 10, 64)
63 | gKumaPushURL = testEnv.KumaURL
64 | } else {
65 | gToken = os.Getenv("BOT_TOKEN")
66 | gAdminID, _ = strconv.ParseInt(os.Getenv("BOT_ADMIN_ID"), 10, 64)
67 | gKumaPushURL = os.Getenv("KUMA_PUSH_URL")
68 | }
69 | gStrCompareAlgo = metrics.NewJaro()
70 | gStrCompareAlgo.CaseSensitive = false
71 | fmt.Printf("gToken:%s\ngAdminID:%d\ngKumaPushURL:%s\n", gToken, gAdminID, gKumaPushURL)
72 | k := kuma.New(gKumaPushURL)
73 | k.Start()
74 | go func() {
75 | http.Handle("/", http.FileServer(http.Dir("../db/datas")))
76 | err := http.ListenAndServe(":80", nil)
77 | if err != nil {
78 | panic(err)
79 | }
80 | }()
81 | }
82 |
83 | var b *tele.Bot
84 |
85 | func fullName(u *tele.User) string {
86 | if u.FirstName == "" || u.LastName == "" {
87 | return u.FirstName + u.LastName
88 | }
89 | return u.FirstName + " " + u.LastName
90 | }
91 |
92 | func main() {
93 | fmt.Println("老黄历启动!")
94 | pref := tele.Settings{
95 | Token: gToken,
96 | Poller: &tele.LongPoller{Timeout: 5 * time.Second},
97 | }
98 | var err error
99 | b, err = tele.NewBot(pref)
100 | if err != nil {
101 | log.Fatal(err)
102 | return
103 | }
104 |
105 | for _, s := range chatCMD {
106 | b.Handle(s, func(c tele.Context) error {
107 | return cmdInChatHandler(c)
108 | })
109 | }
110 |
111 | b.Handle(tele.OnText, func(c tele.Context) error {
112 | return msgInChatHandler(c)
113 | })
114 |
115 | mk := &tele.ReplyMarkup{ResizeKeyboard: true}
116 | voteApproveBtn := mk.Data("赞成", "voteApproveBtn")
117 | voteRefuseBtn := mk.Data("反对", "voteRefuseBtn")
118 | deleteBtn := mk.Data("删除", "deleteBtn")
119 | b.Handle(&voteApproveBtn, voteApprove())
120 | b.Handle(&voteRefuseBtn, voteRefuse())
121 | b.Handle(&deleteBtn, msgDelete())
122 |
123 | b.Handle(tele.OnQuery, func(c tele.Context) error {
124 | results := make(tele.Results, 0)
125 | for _, v := range nominations {
126 | if v.NominatorID == c.Sender().ID {
127 | results = append(results, buildVotes(v))
128 | }
129 | }
130 | results = append(results, &tele.ArticleResult{
131 | Title: "今日众生老黄历",
132 | Text: "今天是" + time.Now().Format("2006年01月02日") + "。\n" + laoHL.cache.Today.String(),
133 | })
134 | results = append(results, &tele.ArticleResult{
135 | Title: "今日我的老黄历",
136 | Text: fullName(c.Sender()) + " " + laoHL.randomToday(c.Sender().ID, fullName(c.Sender())),
137 | })
138 | return c.Answer(&tele.QueryResponse{
139 | Results: results,
140 | CacheTime: 3,
141 | IsPersonal: true,
142 | SwitchPMText: "提名新词条",
143 | SwitchPMParameter: "nominate",
144 | })
145 | })
146 |
147 | fmt.Println("上线!")
148 | go b.Start()
149 |
150 | sc := make(chan os.Signal, 1)
151 | signal.Notify(sc, os.Interrupt, syscall.SIGTERM)
152 | <-sc
153 | b.Stop()
154 | fmt.Println("由于即将关闭,进行数据备份")
155 | laoHL.save()
156 | <-time.After(time.Second * 1)
157 | fmt.Println("下线!")
158 | }
159 |
--------------------------------------------------------------------------------
/tgbot/chats.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "os"
6 | "slices"
7 | "strings"
8 | "time"
9 | _ "time/tzdata"
10 |
11 | uuid "github.com/satori/go.uuid"
12 | "golang.org/x/sync/syncmap"
13 | tele "gopkg.in/telebot.v3"
14 | )
15 |
16 | const (
17 | IDLE int = iota
18 | NOMINATE
19 | )
20 |
21 | type privateChat struct {
22 | State int
23 | Timeout int
24 | }
25 |
26 | var chats = syncmap.Map{}
27 | var adminCMD []string
28 | var userCMD []string
29 | var chatCMD []string
30 |
31 | func escapeNominate(s string) (ret string) {
32 | var list []string = []string{
33 | `_`, `*`, `[`, `]`, `(`, `)`, `~`, "`", `>`, `#`, `+`, `-`, `=`, `|`, `.`, `!`, `\`,
34 | }
35 | for _, v := range list {
36 | if strings.Contains(s, v) {
37 | ret += v
38 | }
39 | }
40 | return
41 | }
42 | func escape(s string) string {
43 | var escapeList string = `_*[]()~` + "`" + `>#+-=|{}.!`
44 | prefix := ""
45 | result := ""
46 | for _, c := range s {
47 | char := string(c)
48 | if strings.ContainsRune(escapeList, rune(c)) && prefix != `\` {
49 | result += `\` + char
50 | } else {
51 | result += char
52 | }
53 | prefix = char
54 | }
55 | return result
56 | }
57 | func chatLoad(id int64) privateChat {
58 | var chat privateChat
59 | chatx, _ := chats.Load(id)
60 | chat = chatx.(privateChat)
61 | return chat
62 | }
63 |
64 | func init() {
65 | adminCMD = []string{
66 | "/listall", "/forcereadlocal", "/random", "/randommore",
67 | }
68 | userCMD = []string{
69 | "/help", "/start", "/nominate", "/list",
70 | }
71 | chatCMD = slices.Concat(adminCMD, userCMD)
72 | chats = syncmap.Map{}
73 | go updateChats()
74 | }
75 | func msgDelete() func(c tele.Context) error {
76 | return func(c tele.Context) error {
77 | n := nominations.pickByID(c.Message().ID)
78 | if n != nil {
79 | c.Send("提名词条 \"`"+n.Content+"`\" 已被删除,投票立即失效", tele.ModeMarkdownV2)
80 | nominations.remove(c.Message().ID)
81 | }
82 | defer func() {
83 | c.Delete()
84 | }()
85 | return nil
86 | }
87 | }
88 | func msg2User(userID int64, what any) error {
89 | chat, chaterr := b.ChatByID(userID)
90 | if chaterr == nil {
91 | _, err := b.Send(chat, what, tele.ParseMode(tele.ModeMarkdownV2))
92 | return err
93 | }
94 | return chaterr
95 | }
96 |
97 | func cmdInChatHandler(c tele.Context) error {
98 | if _, ok := chats.Load(c.Chat().ID); !ok {
99 | chats.Store(c.Chat().ID, privateChat{
100 | State: IDLE,
101 | })
102 | }
103 | chat := chatLoad(c.Chat().ID)
104 | defer func() {
105 | chat.Timeout = 9
106 | chats.Store(c.Chat().ID, chat)
107 | }()
108 |
109 | if slices.Contains(adminCMD, c.Text()) {
110 | if c.Sender().ID != gAdminID {
111 | return c.Send("您没有权限使用此命令")
112 | }
113 | }
114 |
115 | randLaoHuangLi := func() string {
116 | a, err := laoHL.randomNotDelete()
117 | b, _ := laoHL.randomNotDelete()
118 | if err != nil {
119 | return fmt.Sprintf("错误:\\[`%s`\\]", err.Error())
120 | }
121 | return fmt.Sprintf("宜`%s` 忌`%s`", a, b)
122 | }
123 |
124 | switch c.Text() {
125 | case "/start":
126 | fallthrough
127 | case "/help":
128 | chat.State = IDLE
129 | help := "提名新词条请发送 /nominate\n列举提名词条请发送 /list"
130 | webDomain := os.Getenv("WEB_DOMAIN")
131 | if webDomain != "" {
132 | help += "\n\n查看其他信息请访问老黄历网站: " + webDomain
133 | }
134 | if c.Sender().ID == gAdminID {
135 | help += "\n\n以下为管理员命令:\n列出所有提名词条请发送 /listall\n强制读取本地词条请发送 /forcereadlocal\n获取一个随机提名词条请发送 /random\n获取多个随机提名词条请发送 /randommore"
136 | }
137 | return c.Send(help)
138 | case "/list":
139 | chat.State = IDLE
140 | existNomination := 0
141 | var msg string
142 | for _, v := range nominations {
143 | if v.NominatorID == c.Sender().ID {
144 | existNomination++
145 | msg += fmt.Sprintf("提名词条 \"`%s`\" 赞成 `%d` 票,反对 `%d` 票\n", v.Content, len(v.ApprovedUsers), len(v.RefusedUsers))
146 | }
147 | }
148 | if existNomination == 0 {
149 | return c.Send("你还没有提名任何词条,请发送 /nominate 提名新词条")
150 | } else {
151 | return c.Send(msg, tele.ModeMarkdownV2)
152 | }
153 | case "/nominate":
154 | existNomination := 0
155 | for _, v := range nominations {
156 | if v.NominatorID == c.Sender().ID {
157 | existNomination++
158 | }
159 | }
160 | if existNomination >= 5 {
161 | chat.State = IDLE
162 | return c.Send("你已经提名过太多词条了,请等待提名投票结束再提交新词条吧!")
163 | }
164 | chat.State = NOMINATE
165 | return c.Send("请输入你要提名的词条内容:")
166 |
167 | case "/forcereadlocal":
168 | laoHL.init(db)
169 | nominations.init()
170 | return c.Send("已强制读取本地储存", tele.ModeMarkdownV2)
171 | case "/random":
172 | return c.Send(randLaoHuangLi(), tele.ModeMarkdownV2)
173 | case "/randommore":
174 | ret := "Result:"
175 | for i := 0; i < 10; i++ {
176 | ret += fmt.Sprintf("\n%02d: %s", i, randLaoHuangLi())
177 | }
178 | return c.Send(ret, tele.ModeMarkdownV2)
179 | case "/listall":
180 | var msg string
181 | for i, v := range nominations {
182 | msg += fmt.Sprintf("%d\\. `%s` 提名词条 \"`%s`\" 赞成 `%d` 票,反对 `%d` 票\n结束时间: `%s`\n", i+1, v.NominatorName, v.Content, len(v.ApprovedUsers), len(v.RefusedUsers), v.voteEndTimeString())
183 | }
184 | if msg == "" {
185 | msg = "当前没有提名任何词条"
186 | }
187 | return c.Send(msg, tele.ModeMarkdownV2)
188 | }
189 | return nil
190 | }
191 | func msgInChatHandler(c tele.Context) error {
192 | senderName := escape(fullName(c.Sender()))
193 | if _, ok := chats.Load(c.Chat().ID); !ok {
194 | chats.Store(c.Chat().ID, privateChat{
195 | State: IDLE,
196 | })
197 | }
198 | chat := chatLoad(c.Chat().ID)
199 | defer func() {
200 | chat.Timeout = 9
201 | chats.Store(c.Chat().ID, chat)
202 | }()
203 |
204 | switch chat.State {
205 | case NOMINATE:
206 | nominate := strings.TrimSpace(c.Text())
207 | if len([]rune(nominate)) < 1 {
208 | return c.Send("提名内容太短,请重新提名。")
209 | }
210 | if nominate[0] == '/' {
211 | return c.Send("格式错误,请重新提名。")
212 | }
213 | escapeSequence := escapeNominate(nominate)
214 | if len(escapeSequence) > 0 {
215 | resp := "提名词条中不可以含有以下字符:\n"
216 | for i, v := range escapeSequence {
217 | if i > 0 {
218 | resp += "、"
219 | }
220 | resp += fmt.Sprintf("'\\%c'", v)
221 | }
222 | resp += "\n请修改后重新提名。"
223 | return c.Send(resp, tele.ModeMarkdownV2)
224 | }
225 | success, reason := nominationValidCheck(nominate)
226 | for _, v := range reason {
227 | err := c.Send(v, tele.ModeMarkdownV2)
228 | if err != nil {
229 | fmt.Println(err, v)
230 | }
231 | }
232 | chat.State = IDLE
233 | if success == -1 {
234 | chat.State = NOMINATE
235 | }
236 | if success == 0 {
237 | mk := &tele.ReplyMarkup{ResizeKeyboard: true}
238 | publishBtn := mk.Query("发布", "nominate")
239 | deleteBtn := mk.Data("删除", "deleteBtn")
240 |
241 | mk.Inline(mk.Row(publishBtn, deleteBtn))
242 | newNomination := nomination{
243 | Content: nominate,
244 | CID: c.Chat().ID,
245 | NominatorName: senderName,
246 | NominatorID: c.Sender().ID,
247 | Time: time.Now().Unix(),
248 | ApprovedUsers: make([]int64, 0),
249 | RefusedUsers: make([]int64, 0),
250 | }
251 | msg, err := b.Send(c.Chat(), newNomination.buildVotingText(), mk, tele.ModeMarkdownV2)
252 | if err != nil {
253 | fmt.Println(err)
254 | b.Send(c.Chat(), err.Error())
255 | } else {
256 | newNomination.UUID = uuid.NewV4().String()
257 | newNomination.ID = msg.ID
258 | nominations.add(newNomination)
259 | }
260 | return err
261 | }
262 | }
263 | return nil
264 | }
265 |
266 | func updateChats() {
267 | second := time.NewTicker(10 * time.Second)
268 | for range second.C {
269 | chats.Range(func(i, v any) bool {
270 | chat := v.(privateChat)
271 | if chat.Timeout <= 0 {
272 | if chatLoad(i.(int64)).State == NOMINATE {
273 | msg2User(i.(int64), "提名已超时,若需重新提名,请再次发送 /nominate。")
274 | }
275 | chats.Delete(i)
276 | } else {
277 | chat.Timeout--
278 | chats.Store(i, chat)
279 | }
280 | return true
281 | })
282 | }
283 | }
284 |
--------------------------------------------------------------------------------
/website/src/routes/templates/+page.svelte:
--------------------------------------------------------------------------------
1 |
132 |
133 |
134 |
135 |
136 |
提名助手
137 |
138 |
144 | {#if rollerRunning == true}
145 | roller.stop()}>停止
146 | {:else}
147 | templateTest(sentence)}>试试
148 | {/if}
149 |
150 | {#if error}
151 |
154 |
{errTitle}
155 |
{errContent}
156 |
157 | {:else if templateResult.length > 0}
158 |
161 |
162 |
163 | {#each templateSlice as t}
164 | {#if t.isTemplate}
165 |
166 | {t.content}
167 |
168 | {:else}
169 |
170 | {t.content}
171 |
172 | {/if}
173 | {/each}
174 |
175 | {#key templateSlice}
176 |
181 | {#each templateSlice as t}
182 | {#if t.isTemplate}
183 |
184 | {t.content}
185 |
186 | {:else}
187 |
188 | {t.content}
189 |
190 | {/if}
191 | {/each}
192 |
193 | {/key}
194 |
195 | {/if}
196 |
197 |
198 |
词条统计
199 |
200 |
201 |
元词条数量
202 |
{entryMetaCount}
203 |
204 |
205 |
词条数量
206 |
{entryCount}
207 |
208 |
209 |
用户提名元词条数量
210 |
{entryMetaCountUser}
211 |
212 |
213 |
用户提名词条数量
214 |
{entryCountUser}
215 |
216 |
217 |
218 |
219 |
模板列表
220 |
221 | {#each Object.entries(templates) as [name, content]}
222 |
{
225 | templateView.name = name;
226 | templateView.desc = content.desc;
227 | templateView.values = content.values;
228 | }}
229 | onclick="template_content.showModal()"
230 | >
231 |
232 | {'{{'}{name}{'}}'}
233 |
234 | {content.desc}
235 |
236 | {/each}
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 | {'{{'}{templateView.name}{'}}'}
248 | x{templateView.values.length}
249 |
250 |
{templateView.desc}
251 |
252 |
253 | {#each templateView.values as v}
254 |
255 | {v}
256 |
257 | {/each}
258 |
259 |
260 |
263 |
264 |
--------------------------------------------------------------------------------
/tgbot/nominate.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "slices"
6 | "sort"
7 | "strconv"
8 | "time"
9 | _ "time/tzdata"
10 |
11 | "github.com/adrg/strutil"
12 | "github.com/valyala/fasttemplate"
13 | tele "gopkg.in/telebot.v3"
14 | )
15 |
16 | type nomination struct {
17 | UUID string `json:"uuid"`
18 | ID int `json:"id"`
19 | CID int64 `json:"cid"`
20 | LastVoteID int `json:"lastvoteid"`
21 | Content string `json:"content"`
22 | NominatorName string `json:"nominator"`
23 | NominatorID int64 `json:"nominatorID"`
24 | Time int64 `json:"time"`
25 | ApprovedUsers []int64 `json:"approvedUsers"`
26 | RefusedUsers []int64 `json:"refusedUsers"`
27 | }
28 | type nominationSlice []nomination
29 |
30 | func (n *nomination) approvedBy(user int64) int {
31 | nominations.lazySave()
32 | n.RefusedUsers = removeUserFromList(user, n.RefusedUsers)
33 | if isUserExistInList(user, n.ApprovedUsers) {
34 | n.ApprovedUsers = removeUserFromList(user, n.ApprovedUsers)
35 | return 0
36 | }
37 | n.ApprovedUsers = addUserToList(user, n.ApprovedUsers)
38 | return 1
39 | }
40 | func (n *nomination) refusedBy(user int64) int {
41 | nominations.lazySave()
42 | n.ApprovedUsers = removeUserFromList(user, n.ApprovedUsers)
43 | if isUserExistInList(user, n.RefusedUsers) {
44 | n.RefusedUsers = removeUserFromList(user, n.RefusedUsers)
45 | return 0
46 | }
47 | n.RefusedUsers = addUserToList(user, n.RefusedUsers)
48 | return 1
49 | }
50 |
51 | const (
52 | passMinUsers = 5
53 | passMinAgreeRatio = 0.66
54 | quickpassMinUsers = 7
55 | quickpassMinAgreeRatio = 0.75
56 | )
57 |
58 | func (n *nomination) isPassed() bool {
59 | if len(n.ApprovedUsers) >= passMinUsers && float64(len(n.ApprovedUsers))/float64(len(n.RefusedUsers)+len(n.ApprovedUsers)) > passMinAgreeRatio {
60 | return true
61 | }
62 | return false
63 | }
64 | func (n *nomination) isQuickPassed() bool {
65 | if len(n.ApprovedUsers)+len(n.RefusedUsers) >= quickpassMinUsers && float64(len(n.ApprovedUsers))/float64(len(n.RefusedUsers)+len(n.ApprovedUsers)) > quickpassMinAgreeRatio {
66 | return true
67 | }
68 | return false
69 | }
70 | func (n *nomination) isQuickRefused() bool {
71 | if len(n.ApprovedUsers)+len(n.RefusedUsers) >= 5 && len(n.RefusedUsers) > len(n.ApprovedUsers) {
72 | return true
73 | }
74 | return false
75 | }
76 | func (n *nomination) voteEndTimeString() string {
77 | return time.Unix(n.Time+86400, 0).Format(gTimeFormat)
78 | }
79 | func (n nomination) MessageSig() (messageID string, chatID int64) {
80 | return strconv.Itoa(n.ID), n.CID
81 | }
82 |
83 | func removeUserFromList(user int64, list []int64) []int64 {
84 | for i, v := range list {
85 | if v == user {
86 | return slices.Concat(list[:i], list[i+1:])
87 | }
88 | }
89 | return list
90 | }
91 | func addUserToList(user int64, list []int64) []int64 {
92 | for _, v := range list {
93 | if v == user {
94 | return list
95 | }
96 | }
97 | return append(list, user)
98 | }
99 | func isUserExistInList(user int64, list []int64) bool {
100 | for _, v := range list {
101 | if v == user {
102 | return true
103 | }
104 | }
105 | return false
106 | }
107 |
108 | var nominations nominationSlice
109 |
110 | func (ns *nominationSlice) init() {
111 | *ns = make(nominationSlice, 0)
112 | db.Read("datas", "nominations", ns)
113 | }
114 | func (ns *nominationSlice) add(n nomination) {
115 | *ns = append(*ns, n)
116 | ns.save()
117 | }
118 | func (ns *nominationSlice) remove(id int) {
119 | for i, n := range *ns {
120 | if n.ID == id {
121 | *ns = slices.Delete(*ns, i, i+1)
122 | break
123 | }
124 | }
125 | ns.save()
126 | }
127 |
128 | func (ns *nominationSlice) pickByID(id int) *nomination {
129 | for _, v := range *ns {
130 | if v.ID == id {
131 | return &v
132 | }
133 | }
134 | return nil
135 | }
136 |
137 | func (ns *nominationSlice) save() {
138 | db.Write("datas", "nominations", ns)
139 | }
140 |
141 | var isNominationUpdated bool = false
142 |
143 | func (ns nominationSlice) lazySave() {
144 | isNominationUpdated = true
145 | }
146 | func (ns *nominationSlice) saveRoutine() {
147 | if isNominationUpdated {
148 | ns.save()
149 | isNominationUpdated = false
150 | }
151 | }
152 |
153 | func (ns *nominationSlice) update() {
154 | minute := time.NewTicker(60 * time.Second)
155 | for range minute.C {
156 | newNominations := make(nominationSlice, 0)
157 | laohuangliUpdated := false
158 | for _, v := range *ns {
159 | if time.Now().Unix() < v.Time+86400 && !v.isQuickPassed() && !v.isQuickRefused() {
160 | newNominations = append(newNominations, v)
161 | } else {
162 | if time.Now().Unix() >= v.Time+86400 && v.isPassed() || v.isQuickPassed() {
163 | laoHL.add(entry{UUID: v.UUID, Content: v.Content, Nominator: v.NominatorName})
164 | laoHL.pushBanlancedEntries(entry{UUID: v.UUID, Content: v.Content, Nominator: v.NominatorName})
165 | laohuangliUpdated = true
166 | }
167 | msg2User(v.NominatorID, v.buildResultMsgText())
168 | // TODO: Should edit last vote msg there
169 | b.Edit(v, v.buildVoteResultText(), tele.ModeMarkdownV2)
170 | ns.lazySave()
171 | }
172 | }
173 | if laohuangliUpdated {
174 | laoHL.saveUser()
175 | }
176 | *ns = newNominations
177 | ns.saveRoutine()
178 | }
179 | }
180 |
181 | func init() {
182 | nominations.init()
183 | go nominations.update()
184 | }
185 |
186 | type similarContent struct {
187 | Similarity float64
188 | Content string
189 | Nominator string
190 | }
191 |
192 | func nominationValidCheck(content string) (result int, response []string) {
193 | response = make([]string, 0)
194 | if len([]rune(content)) > 64 {
195 | result = -1
196 | response = append(response, "提名内容过长,请控制在 64 个字以内")
197 | return
198 | }
199 | templateDepth := laoHL.getTemplateDepth(content)
200 | hasTemplate := templateDepth > 1
201 | if templateDepth <= 0 {
202 | result = -1
203 | response = append(response, "错误的模板格式或者不存在的模板变量,请检查更正后重新提交。")
204 | return
205 | }
206 | similarNominations := make([]similarContent, 0)
207 | similarSort := func() {
208 | sort.Slice(similarNominations, func(i, j int) bool {
209 | return similarNominations[i].Similarity > similarNominations[j].Similarity
210 | })
211 | }
212 | similarPush := func(v similarContent) {
213 | if v.Similarity > 0.5 {
214 | similarNominations = append(similarNominations, v)
215 | similarSort()
216 | if len(similarNominations) > 3 {
217 | similarNominations = similarNominations[:3]
218 | }
219 | }
220 | }
221 |
222 | var cmpContent string
223 | // 含有模板的字符串使用其最简实例运行查重
224 | if hasTemplate {
225 | cmpContent = laoHL.getTemplateExample(content)
226 | } else {
227 | cmpContent = content
228 | }
229 | for _, v := range slices.Concat(laoHL.entries, laoHL.entriesUser) {
230 | similarity := strutil.Similarity(cmpContent, laoHL.getTemplateExample(v.Content), gStrCompareAlgo)
231 | similarPush(similarContent{
232 | Similarity: similarity,
233 | Content: v.Content,
234 | Nominator: v.Nominator,
235 | })
236 | }
237 | for _, v := range nominations {
238 | similarity := strutil.Similarity(cmpContent, laoHL.getTemplateExample(v.Content), gStrCompareAlgo)
239 | similarPush(similarContent{
240 | Similarity: similarity,
241 | Content: v.Content,
242 | Nominator: v.NominatorName,
243 | })
244 | }
245 | if !hasTemplate {
246 | for _, t := range laoHL.templates {
247 | for _, v := range t.Values {
248 | similarity := strutil.Similarity(cmpContent, v, gStrCompareAlgo)
249 | similarPush(similarContent{
250 | Similarity: similarity,
251 | Content: v,
252 | Nominator: "{{" + t.Desc + "}}模板",
253 | })
254 | }
255 | }
256 | }
257 | if len(similarNominations) > 0 && similarNominations[0].Similarity > 0.9 {
258 | result = -1
259 | response = append(response, "提名内容与 `"+similarNominations[0].Nominator+"` 提名的 \"`"+similarNominations[0].Content+"`\" 相似度过高,请更换提名的词条")
260 | return
261 | }
262 |
263 | result = 0
264 | if len(similarNominations) > 0 {
265 | resp := "提名词条与以下词条相似:\n"
266 | for i, v := range similarNominations {
267 | resp += strconv.Itoa(i+1) + "\\. 由 `" + v.Nominator + "` 提名的 \"`" + v.Content + "`\" \\- 相似度 " + strconv.FormatFloat(v.Similarity*100, 'f', 0, 64) + "%\n"
268 | }
269 | resp += "请确认词条无重复后再发布投票。"
270 | response = append(response, resp)
271 | }
272 | resp := "提名词条 \"`" + content + "`\" 投票已生成,发布投票后将进入投票阶段。\n"
273 | resp += fmt.Sprintf("获得不少于 `%d` 个赞成票且赞成率超过 `%.0f%%` 的提名在24小时后可上线。\n", passMinUsers, passMinAgreeRatio*100)
274 | resp += fmt.Sprintf("获得不少于 `%d` 个投票且赞成率超过 `%.0f%%` 的提名可立即上线。", quickpassMinUsers, quickpassMinAgreeRatio*100)
275 | response = append(response, resp)
276 | return
277 | }
278 |
279 | func (n nomination) buildVoteMarkup() *tele.ReplyMarkup {
280 | mk := &tele.ReplyMarkup{ResizeKeyboard: true}
281 | voteApproveBtn := mk.Data("赞成", "voteApproveBtn", n.UUID)
282 | voteRefuseBtn := mk.Data("反对", "voteRefuseBtn", n.UUID)
283 | mk.Inline(mk.Row(voteApproveBtn, voteRefuseBtn))
284 | b.Handle(&voteApproveBtn, voteApprove())
285 | b.Handle(&voteRefuseBtn, voteRefuse())
286 | return mk
287 | }
288 |
289 | func (n nomination) buildVotingText() string {
290 | ret := fmt.Sprintf("由 %s 提名的新词条 \"`%s`\" 已开始投票。\n", fmt.Sprintf("[%s](tg://user?id=%d)", n.NominatorName, n.NominatorID), n.Content)
291 | templateDepth := laoHL.getTemplateDepth(n.Content)
292 | if templateDepth > 1 {
293 | ret += "本词条含有模板,其可能出现的结果有:\n"
294 | for i := 1; i <= 3 && i <= templateDepth; i++ {
295 | ret += fmt.Sprintf("%d\\. %s \n", i, buildStrFromTmplWithInlineTmpl(fasttemplate.New(n.Content, "{{", "}}"), laoHL.templates))
296 | }
297 | }
298 | ret += fmt.Sprintf("请为此词条是否可以加入老黄历每日算命结果投出神圣的一票吧!\n\n赞成:`%d` 票\n反对:`%d` 票\n\n投票将于 `%s` 结束", len(n.ApprovedUsers), len(n.RefusedUsers), n.voteEndTimeString())
299 | return ret
300 | }
301 |
302 | func (n nomination) buildVoteResultText() string {
303 | if n.isQuickPassed() {
304 | return fmt.Sprintf("由 %s 提名的新词条 \"`%s`\" 已达到快速过审标准。\n\n赞成:`%d` 票\n反对:`%d` 票\n\n词条已于 `%s` 上线。", fmt.Sprintf("[%s](tg://user?id=%d)", n.NominatorName, n.NominatorID), n.Content, len(n.ApprovedUsers), len(n.RefusedUsers), time.Now().Format(gTimeFormat))
305 | }
306 | if n.isQuickRefused() {
307 | return fmt.Sprintf("由 %s 提名的新词条 \"`%s`\" 已达到快速否决条件。\n\n赞成:`%d` 票\n反对:`%d` 票\n\n词条已被系统否决。", fmt.Sprintf("[%s](tg://user?id=%d)", n.NominatorName, n.NominatorID), n.Content, len(n.ApprovedUsers), len(n.RefusedUsers))
308 | }
309 | if n.isPassed() {
310 | return fmt.Sprintf("由 %s 提名的新词条 \"`%s`\" 已达到过审标准。\n\n赞成:`%d` 票\n反对:`%d` 票\n\n词条已于 `%s` 上线。", fmt.Sprintf("[%s](tg://user?id=%d)", n.NominatorName, n.NominatorID), n.Content, len(n.ApprovedUsers), len(n.RefusedUsers), time.Now().Format(gTimeFormat))
311 | }
312 | return ""
313 | }
314 |
315 | func (n nomination) buildResultMsgText() string {
316 | if n.isQuickPassed() {
317 | return fmt.Sprintf("恭喜你提名的词条 \"`%s`\" 获得赞成票 `%d` 票,反对票 `%d` 票,达到快速上线要求。现在已经正式上线。", n.Content, len(n.ApprovedUsers), len(n.RefusedUsers))
318 | }
319 | if n.isQuickRefused() {
320 | return fmt.Sprintf("非常遗憾,你提名的词条 \"`%s`\" 获得赞成票 `%d` 票,反对票 `%d` 票,达到快速否决条件,已经被系统拒绝。", n.Content, len(n.ApprovedUsers), len(n.RefusedUsers))
321 | }
322 | if n.isPassed() {
323 | return fmt.Sprintf("恭喜你提名的词条 \"`%s`\" 最终投票结果为赞成票 `%d` 票,反对票 `%d` 票,达到上线要求。现在已经正式上线。", n.Content, len(n.ApprovedUsers), len(n.RefusedUsers))
324 | }
325 | return fmt.Sprintf("非常遗憾,你提名的词条 \"`%s`\" 最终投票结果为赞成票 `%d` 票,反对票 `%d` 票,未达到上线要求,无法上线。", n.Content, len(n.ApprovedUsers), len(n.RefusedUsers))
326 | }
327 |
328 | func buildVotes(n nomination) (result *tele.ArticleResult) {
329 | result = &tele.ArticleResult{}
330 | result.Title = "发布词条 " + n.Content + " 的投票"
331 | result.Text = n.buildVotingText()
332 | result.ParseMode = tele.ModeMarkdownV2
333 |
334 | mk := &tele.ReplyMarkup{ResizeKeyboard: true}
335 | voteApproveBtn := mk.Data("赞成", "voteApproveBtn", n.UUID)
336 | voteRefuseBtn := mk.Data("反对", "voteRefuseBtn", n.UUID)
337 | mk.Inline(mk.Row(voteApproveBtn, voteRefuseBtn))
338 |
339 | result.ReplyMarkup = mk
340 | return
341 | }
342 |
343 | func buildVoteResultSimple(uuid string) string {
344 | for _, v := range laoHL.entriesUser {
345 | if v.UUID == uuid {
346 | return fmt.Sprintf("由 %s 提名的新词条 \"`%s`\" 已经通过投票正式上线。", v.Nominator, v.Content)
347 | }
348 | }
349 | return "投票已结束,词条未通过。"
350 | }
351 |
352 | func voteApprove() func(c tele.Context) error {
353 | return func(c tele.Context) (err error) {
354 | for idx, n := range nominations {
355 | if n.UUID == c.Data() {
356 | res := nominations[idx].approvedBy(c.Sender().ID)
357 | if res == 0 {
358 | c.Respond(&tele.CallbackResponse{
359 | Text: "您取消了赞成票",
360 | })
361 | err = c.Edit(nominations[idx].buildVotingText(), nominations[idx].buildVoteMarkup(), tele.ModeMarkdownV2)
362 | return
363 | } else {
364 | c.Respond(&tele.CallbackResponse{
365 | Text: "您投出了赞成票",
366 | })
367 | err = c.Edit(nominations[idx].buildVotingText(), nominations[idx].buildVoteMarkup(), tele.ModeMarkdownV2)
368 | return
369 | }
370 | }
371 | }
372 | c.Edit(buildVoteResultSimple(c.Data()), tele.ModeMarkdownV2)
373 | return c.Respond(&tele.CallbackResponse{
374 | Text: "投票已结束",
375 | })
376 | }
377 | }
378 | func voteRefuse() func(c tele.Context) error {
379 | return func(c tele.Context) (err error) {
380 | for idx, n := range nominations {
381 | if n.UUID == c.Data() {
382 | res := nominations[idx].refusedBy(c.Sender().ID)
383 | if res == 0 {
384 | c.Respond(&tele.CallbackResponse{
385 | Text: "您取消了反对票",
386 | })
387 | err = c.Edit(nominations[idx].buildVotingText(), nominations[idx].buildVoteMarkup(), tele.ModeMarkdownV2)
388 | return
389 | } else {
390 | c.Respond(&tele.CallbackResponse{
391 | Text: "您投出了反对票",
392 | })
393 | err = c.Edit(nominations[idx].buildVotingText(), nominations[idx].buildVoteMarkup(), tele.ModeMarkdownV2)
394 | return
395 | }
396 | }
397 | }
398 | c.Edit(buildVoteResultSimple(c.Data()), tele.ModeMarkdownV2)
399 | return c.Respond(&tele.CallbackResponse{
400 | Text: "投票已结束",
401 | })
402 | }
403 | }
404 |
--------------------------------------------------------------------------------
/tgbot/laohuangli.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "crypto/rand"
5 | "errors"
6 | "fmt"
7 | "io"
8 | "math"
9 | "math/big"
10 | "slices"
11 | "sort"
12 | "time"
13 | _ "time/tzdata"
14 |
15 | "github.com/adrg/strutil"
16 | scribble "github.com/nanobox-io/golang-scribble"
17 | "github.com/valyala/fasttemplate"
18 | "gonum.org/v1/gonum/stat/combin"
19 | )
20 |
21 | type laohuangli struct {
22 | // 数据库
23 | db *scribble.Driver
24 | // 本地词条
25 | entries []entry
26 | // 用户提名词条
27 | entriesUser []entry
28 | // 频次均衡后的词条
29 | entriesBanlanced []entry
30 | templates map[string]laohuangliTemplate
31 | cache laohuangliCache
32 | }
33 |
34 | var laoHL laohuangli
35 |
36 | type banlancedEntriesSave struct {
37 | Date string `json:"date"`
38 | Entries []entry `json:"entries"`
39 | }
40 |
41 | func (lhl *laohuangli) init(db *scribble.Driver) {
42 | *lhl = laohuangli{
43 | db: db,
44 | }
45 | lhl.db.Read("datas", "laohuangli", &lhl.entries)
46 | lhl.db.Read("datas", "templates", &lhl.templates)
47 | lhl.db.Read("datas", "laohuangli-user", &lhl.entriesUser)
48 | lhl.cache.Init()
49 |
50 | var lhlBanlancedEntries banlancedEntriesSave
51 | lhl.db.Read("datas", "laohuangliBanlancedEntries", &lhlBanlancedEntries)
52 | if lhlBanlancedEntries.Date == time.Now().Format("2006-01-02") {
53 | fmt.Println("加权词条库缓存有效")
54 | lhl.entriesBanlanced = lhlBanlancedEntries.Entries
55 | } else {
56 | fmt.Println("加权词条库缓存失效,生成加权词条库")
57 | lhl.createBanlancedEntries()
58 | }
59 | }
60 |
61 | func (lhl *laohuangli) save() {
62 | err := lhl.db.Write("datas", "templates", lhl.templates)
63 | if err == nil {
64 | fmt.Println("保存模板成功")
65 | } else {
66 | fmt.Println("保存模板失败:" + err.Error())
67 | }
68 | err = lhl.db.Write("datas", "laohuangli-user", lhl.entriesUser)
69 | if err == nil {
70 | fmt.Println("保存用户词条成功")
71 | } else {
72 | fmt.Println("保存用户词条失败:" + err.Error())
73 | }
74 | var lhlBanlancedEntries banlancedEntriesSave
75 | lhlBanlancedEntries.Date = time.Now().Format("2006-01-02")
76 | lhlBanlancedEntries.Entries = lhl.entriesBanlanced
77 | err = lhl.db.Write("datas", "laohuangliBanlancedEntries", lhlBanlancedEntries)
78 | if err == nil {
79 | fmt.Println("加权词条保存成功")
80 | } else {
81 | fmt.Println("加权词条保存失败:" + err.Error())
82 | }
83 | }
84 |
85 | // 计算字符串的模板实例深度之和
86 | func (lhl *laohuangli) getTemplateDepth(s string) int {
87 | depth := 1
88 | sTmpl := fasttemplate.New(s, "{{", "}}")
89 | sTmpl.ExecuteFuncStringWithErr(func(w io.Writer, tag string) (int, error) {
90 | if _, ok := lhl.templates[tag]; ok {
91 | depth += len(lhl.templates[tag].Values)
92 | return w.Write([]byte(""))
93 | }
94 | depth = 0
95 | return 0, errors.New("invalid template")
96 | })
97 | return depth
98 | }
99 |
100 | // 返回模板字符串的最简实例(以模板首个元素填充)
101 | func (lhl *laohuangli) getTemplateExample(s string) string {
102 | sTmpl := fasttemplate.New(s, "{{", "}}")
103 | result, err := sTmpl.ExecuteFuncStringWithErr(func(w io.Writer, tag string) (int, error) {
104 | if _, ok := lhl.templates[tag]; ok {
105 | return w.Write([]byte(lhl.templates[tag].Values[0]))
106 | }
107 | return 0, errors.New("invalid template")
108 | })
109 | if err != nil {
110 | return s
111 | }
112 | return result
113 | }
114 |
115 | // 由原始词条库生成均衡词条库
116 | func (lhl *laohuangli) createBanlancedEntries() {
117 | lhl.entriesBanlanced = make([]entry, 0)
118 |
119 | // 用户提名词条2倍权重
120 | for i := 0; i < 2; i++ {
121 | lhl.entriesBanlanced = slices.Concat(lhl.entriesBanlanced, lhl.entriesUser)
122 | }
123 |
124 | for _, v := range lhl.entries {
125 | depth := lhl.getTemplateDepth(v.Content)
126 | if depth > 0 {
127 | lhl.entriesBanlanced = append(lhl.entriesBanlanced, v)
128 | if depth > 1 {
129 | for i := 0; i < int(math.Round(math.Log(float64(depth)))); i++ {
130 | lhl.entriesBanlanced = append(lhl.entriesBanlanced, v)
131 | }
132 | }
133 | }
134 | }
135 | }
136 | func (lhl *laohuangli) pushBanlancedEntries(e entry) {
137 | // 新词条当日7倍权重
138 | for i := 0; i < 7; i++ {
139 | lhl.entriesBanlanced = append(lhl.entriesBanlanced, e)
140 | }
141 | }
142 | func removeDuplicate[T comparable](sliceList []T) []T {
143 | allKeys := make(map[T]bool)
144 | list := []T{}
145 | for _, item := range sliceList {
146 | if _, value := allKeys[item]; !value {
147 | allKeys[item] = true
148 | list = append(list, item)
149 | }
150 | }
151 | return list
152 | }
153 |
154 | // 均衡词条库移除
155 | func (lhl *laohuangli) deleteBanlancedEntries(s []int64) {
156 | s = removeDuplicate(s)
157 | sort.Slice(s, func(i, j int) bool {
158 | return s[i] > s[j]
159 | })
160 |
161 | for _, v := range s {
162 | if v >= int64(len(lhl.entriesBanlanced)) {
163 | continue
164 | }
165 | lhl.entriesBanlanced = slices.Concat(lhl.entriesBanlanced[:v], lhl.entriesBanlanced[v+1:])
166 | }
167 | }
168 |
169 | func (lhl *laohuangli) add(l entry) {
170 | lhl.entriesUser = append(lhl.entriesUser, l)
171 | }
172 | func (lhl *laohuangli) saveUser() {
173 | lhl.db.Write("datas", "laohuangli-user", lhl.entriesUser)
174 | lhl.db.Write("datas", "templates", lhl.templates)
175 | }
176 | func (lhl *laohuangli) remove(c string) bool {
177 | // TODO:
178 | return false
179 | }
180 |
181 | func (lhl *laohuangli) randomEntryIndex() (idx int64, err error) {
182 | if len(lhl.entriesBanlanced) == 0 {
183 | lhl.createBanlancedEntries()
184 | if len(lhl.entriesBanlanced) == 0 {
185 | return 0, errors.New("没有词条")
186 | }
187 | }
188 | max := big.NewInt(int64(len(lhl.entriesBanlanced)))
189 | i, _ := rand.Int(rand.Reader, max)
190 | idx = i.Int64()
191 | return
192 | }
193 |
194 | func buildStrFromTmplWithInlineTmpl(t *fasttemplate.Template, tmpl map[string]laohuangliTemplate) string {
195 | return t.ExecuteFuncString(func(w io.Writer, tag string) (int, error) {
196 | if _, ok := tmpl[tag]; ok {
197 | p, _ := rand.Int(rand.Reader, big.NewInt(int64(len(tmpl[tag].Values))))
198 | return w.Write([]byte("`" + tmpl[tag].Values[p.Int64()] + "`"))
199 | }
200 | return w.Write([]byte("`错误模板`"))
201 | })
202 | }
203 | func buildStrFromTmpl(t *fasttemplate.Template, tmpl map[string]laohuangliTemplate) string {
204 | return t.ExecuteFuncString(func(w io.Writer, tag string) (int, error) {
205 | if _, ok := tmpl[tag]; ok {
206 | p, _ := rand.Int(rand.Reader, big.NewInt(int64(len(tmpl[tag].Values))))
207 | return w.Write([]byte(tmpl[tag].Values[p.Int64()]))
208 | }
209 | return w.Write([]byte("`错误模板`"))
210 | })
211 | }
212 | func buildStrFromTmplWoDup(t *fasttemplate.Template, tmpl map[string]laohuangliTemplate) string {
213 | // 此方法会移除掉模板中选中的项,使得每个模板项只会被选择一次
214 | return t.ExecuteFuncString(func(w io.Writer, tag string) (int, error) {
215 | if _, ok := tmpl[tag]; ok {
216 | p, _ := rand.Int(rand.Reader, big.NewInt(int64(len(tmpl[tag].Values))))
217 | ret := tmpl[tag].Values[p.Int64()]
218 | temp := tmpl[tag]
219 |
220 | temp.Values = slices.Delete(temp.Values, int(p.Int64()), int(p.Int64())+1)
221 | tmpl[tag] = temp
222 | return w.Write([]byte(ret))
223 | }
224 | return w.Write([]byte("`错误模板`"))
225 | })
226 | }
227 |
228 | func (lhl *laohuangli) randomStringAndIndex() (idx int64, str string, err error) {
229 | idx, err = lhl.randomEntryIndex()
230 | if err != nil {
231 | return
232 | }
233 | str = lhl.entriesBanlanced[idx].Content
234 |
235 | if lhl.getTemplateDepth(str) > 0 {
236 | posTmpl := fasttemplate.New(str, "{{", "}}")
237 | str = buildStrFromTmpl(posTmpl, lhl.templates)
238 | } else {
239 | err = errors.New(str)
240 | return
241 | }
242 | return
243 | }
244 | func (lhl *laohuangli) randomNotDelete() (str string, err error) {
245 | _, str, err = lhl.randomStringAndIndex()
246 | return
247 | }
248 | func (lhl *laohuangli) randomThenDelete() (str string, err error) {
249 | n, str, err := lhl.randomStringAndIndex()
250 | lhl.deleteBanlancedEntries([]int64{n})
251 | return
252 | }
253 |
254 | func (lhl *laohuangli) randomToday(id int64, name string) string {
255 | r := lhl.cache.Exist(id)
256 | if len(r) == 0 {
257 | head := ""
258 | body := ""
259 | pp := 1
260 | np := 1
261 | switch len(lhl.cache.Caches) {
262 | case 0:
263 | pp = 4
264 | np = 1
265 | head = "作为今日第一位祈求命运之人,洞察到了清晰的命运,今日:\n"
266 | case 1:
267 | pp = 3
268 | np = 1
269 | head = "为今日第二位老黄历用户,祈求的命运已开始模糊,今日:\n"
270 | case 12:
271 | pp = 1
272 | np = 5
273 | head = "作为第十三位祈求命运之人,命运的天平将为他倾斜,今日:\n"
274 | default:
275 | pp = 1
276 | np = 1
277 | randInt, _ := rand.Int(rand.Reader, big.NewInt(int64(100000)))
278 | if randInt.Cmp(big.NewInt(95000)) >= 0 {
279 | pp += 1
280 | }
281 | randInt, _ = rand.Int(rand.Reader, big.NewInt(int64(100000)))
282 | if randInt.Cmp(big.NewInt(95000)) >= 0 {
283 | np += 1
284 | }
285 | head = "今日:\n"
286 | }
287 | strSlice := make([]string, 0)
288 | for i := 0; i < pp+np; i++ {
289 | str, err := lhl.randomThenDelete()
290 | if err != nil {
291 | return "发现错误,请上报管理员:\n[ERROR]" + err.Error()
292 | }
293 | strSlice = append(strSlice, str)
294 | if i > 0 {
295 | body += ","
296 | }
297 | if i < pp {
298 | body += "宜"
299 | } else {
300 | body += "忌"
301 | }
302 | body += str
303 | }
304 | body += "。"
305 | // TODO: 重新实现
306 | if strutil.Similarity(strSlice[0], strSlice[1], gStrCompareAlgo) > 0.95 {
307 | randInt, _ := rand.Int(rand.Reader, big.NewInt(int64(25600)))
308 | if randInt.Cmp(big.NewInt(12800)) >= 0 {
309 | body = "诸事不宜。请谨慎行事。"
310 | } else {
311 | body = "诸事皆宜。愿好运与你同行。"
312 | }
313 | }
314 | lhl.cache.Push(id, name, head+body)
315 | lhl.cache.Save()
316 | return head + body
317 | }
318 | return r
319 | }
320 | func (lhl *laohuangli) update() {
321 | ticker := time.NewTicker(5 * time.Second)
322 | for range ticker.C {
323 | date := time.Now().Format("2006-01-02")
324 | if date != lhl.cache.Date {
325 | if len(lhl.cache.Caches) > 0 {
326 | lhl.cache.Backup(lhl.cache.Date)
327 | }
328 | lhl.cache.New()
329 | lhl.cache.Save()
330 | lhl.createBanlancedEntries()
331 | }
332 | }
333 | }
334 | func (lhl *laohuangli) start() {
335 | go lhl.update()
336 | }
337 | func (lhl *laohuangli) stop() {
338 | // TODO:
339 | }
340 |
341 | type results struct {
342 | Positive string `json:"positive"`
343 | Negative string `json:"negative"`
344 | }
345 | type todayResults struct {
346 | Clothing results `json:"clothing"`
347 | Food results `json:"food"`
348 | Travel results `json:"travel"`
349 | }
350 | type laohuangliCache struct {
351 | Date string `json:"date"`
352 | Today todayResults `json:"today"`
353 | Caches map[int64]laohuangliResult `json:"caches"`
354 | }
355 |
356 | func (tr todayResults) String() (output string) {
357 | sh := []string{
358 | "未分配内存中的随机比特揭示了今日的运程",
359 | "磁盘坏道中的损坏数据揭示了今日的运势",
360 | "泄漏的群聊内容预示了今天的命运走向",
361 | "麦克风收集到的隐私录音预测了今天的最佳策略",
362 | "网络延迟的随机波动预示着命运的流转",
363 | "摄像头的噪点似乎诉说着今日的命运",
364 | }
365 | randInt, _ := rand.Int(rand.Reader, big.NewInt(int64(len(sh))))
366 | output = sh[randInt.Int64()] + ":\n\n"
367 | output += "👗今日穿搭👗\n宜" + tr.Clothing.Positive + ",\n忌" + tr.Clothing.Negative + "。\n\n"
368 | output += "🍔今日饮食🍔\n宜" + tr.Food.Positive + ",\n忌" + tr.Food.Negative + "。\n\n"
369 | output += "🚗今日出行🚗\n宜" + tr.Travel.Positive + ",\n忌" + tr.Travel.Negative + "。"
370 | return
371 | }
372 |
373 | func (tr *todayResults) NewRand() {
374 | *tr = todayResults{
375 | Clothing: results{
376 | Positive: "穿衣",
377 | Negative: "全裸"},
378 | Food: results{
379 | Positive: "吃饭",
380 | Negative: "辟谷"},
381 | Travel: results{
382 | Positive: "直立",
383 | Negative: "蠕动"}}
384 |
385 | // 衣 - 互斥特征组
386 | headWear := [][]string{
387 | {
388 | "{{haircolor}}色头发",
389 | "{{haircolor}}色{{hairstyle}}",
390 | "{{hairstyle}}",
391 | },
392 | {
393 | "{{hat}}",
394 | "{{color1c}}色{{hat}}",
395 | "{{color1c}}色帽子",
396 | },
397 | }
398 | bodyWear := [][]string{
399 | {
400 | "{{topwear}}",
401 | "{{color1c}}色上衣",
402 | "{{color1c}}色{{topwear}}",
403 | },
404 | {
405 | "{{bottomwear}}",
406 | "{{color1c}}色下装",
407 | "{{color1c}}色{{bottomwear}}",
408 | },
409 | }
410 | fullbodyWear := []string{
411 | "{{bodywear}}",
412 | "{{color1c}}色{{bodywear}}",
413 | "{{color1c}}色套装",
414 | }
415 | underWear := []string{
416 | "{{underwear}}",
417 | "{{color1c}}色{{underwear}}",
418 | "{{color1c}}色内衣",
419 | }
420 | legWear := []string{
421 | "{{socks}}",
422 | "{{color1c}}色{{socks}}",
423 | "{{color1c}}色袜子",
424 | }
425 | footWear := []string{
426 | "{{shoe}}",
427 | "{{color1c}}色{{shoe}}",
428 | "{{color1c}}色鞋子",
429 | }
430 |
431 | var randInt *big.Int
432 | // 从[]slice中随机选取n个不重复的slice n>0
433 | getRandomFromSliceSlice := func(slice [][]string) (ret []string) {
434 | randInt, _ = rand.Int(rand.Reader, big.NewInt(int64(len(slice))))
435 | list := combin.Combinations(len(slice), int(randInt.Int64())+1)
436 | randInt, _ = rand.Int(rand.Reader, big.NewInt(int64(len(list))))
437 | listPick := list[randInt.Int64()]
438 | for _, k := range listPick {
439 | randInt, _ = rand.Int(rand.Reader, big.NewInt(int64(len(slice[k]))))
440 | ret = append(ret, slice[k][randInt.Int64()])
441 | }
442 | return
443 | }
444 | getRandomOneFromSlice := func(slice []string) (ret string) {
445 | randInt, _ = rand.Int(rand.Reader, big.NewInt(int64(len(slice))))
446 | return slice[randInt.Int64()]
447 | }
448 | getRandomNFromSlice := func(slice []string) (ret []string) {
449 | // [0, len(slice)^2)
450 | randInt, _ := rand.Int(rand.Reader, big.NewInt(int64(len(slice)*len(slice))))
451 | // (-len(slice), 0]
452 | randInt.Sqrt(randInt).Neg(randInt)
453 | // (0, len(slice)]
454 | randInt.Add(randInt, big.NewInt(int64(len(slice))))
455 | // pick (0, len(slice)] elements from slice
456 | list := combin.Combinations(len(slice), int(randInt.Int64()))
457 | randInt, _ = rand.Int(rand.Reader, big.NewInt(int64(len(list))))
458 | listPick := list[randInt.Int64()]
459 | for _, k := range listPick {
460 | ret = append(ret, slice[k])
461 | }
462 | return
463 | }
464 |
465 | // 食 - 互斥特征组
466 | food := []string{
467 | "吃{{food}}",
468 | "喝{{drink}}",
469 | "去{{wheretoeat}}吃{{food}}",
470 | "去{{wheretoeat}}喝{{drink}}",
471 | "吃{{food}}喝{{drink}}",
472 | "就着{{drink}}吃{{food}}",
473 | "{{food}}与{{food}}同食",
474 | "{{drink}}与{{drink}}同饮",
475 | }
476 | // 行 - 互斥特征组
477 | travel := []string{
478 | "{{transport}}",
479 | "{{transport}}",
480 | "{{transport}}",
481 | "{{transport}}转{{transportwo}}",
482 | }
483 |
484 | wearStr := []string{}
485 | foodStr := []string{}
486 | travelStr := []string{}
487 | for i := 0; i < 2; i++ {
488 | wearList := make([]string, 0)
489 | wearList = slices.Concat(wearList, getRandomFromSliceSlice(headWear))
490 | randInt, _ = rand.Int(rand.Reader, big.NewInt(int64(25600)))
491 | if randInt.Cmp(big.NewInt(19200)) >= 0 {
492 | wearList = slices.Concat(wearList, getRandomFromSliceSlice(bodyWear))
493 | } else {
494 | wearList = append(wearList, getRandomOneFromSlice(fullbodyWear))
495 | }
496 | wearList = slices.Concat(wearList, []string{getRandomOneFromSlice(underWear), getRandomOneFromSlice(legWear), getRandomOneFromSlice(footWear)})
497 | wearList = getRandomNFromSlice(wearList)
498 |
499 | wearStr = append(wearStr, "")
500 | for k, v := range wearList {
501 | conc := ""
502 | if k >= 1 {
503 | if k == len(wearList)-1 {
504 | conc = "和"
505 | } else {
506 | conc = "、"
507 | }
508 | }
509 | wearStr[i] += conc + v
510 | }
511 | randInt, _ = rand.Int(rand.Reader, big.NewInt(int64(len(food))))
512 | foodStr = append(foodStr, food[randInt.Int64()])
513 | randInt, _ = rand.Int(rand.Reader, big.NewInt(int64(len(travel))))
514 | travelStr = append(travelStr, travel[randInt.Int64()])
515 | if laoHL.getTemplateDepth(wearStr[i]) <= 1 || laoHL.getTemplateDepth(foodStr[i]) <= 1 || laoHL.getTemplateDepth(travelStr[i]) <= 1 {
516 | // 无法生成今日指引,直接返回
517 | return
518 | }
519 | }
520 | tmpl := make(map[string]laohuangliTemplate)
521 | laoHL.db.Read("datas", "templates", &tmpl)
522 | wearStrPos := buildStrFromTmplWoDup(fasttemplate.New(wearStr[0], "{{", "}}"), tmpl)
523 | foodStrPos := buildStrFromTmplWoDup(fasttemplate.New(foodStr[0], "{{", "}}"), tmpl)
524 | travelStrPos := buildStrFromTmplWoDup(fasttemplate.New(travelStr[0], "{{", "}}"), tmpl)
525 | wearStrNeg := buildStrFromTmplWoDup(fasttemplate.New(wearStr[1], "{{", "}}"), tmpl)
526 | foodStrNeg := buildStrFromTmplWoDup(fasttemplate.New(foodStr[1], "{{", "}}"), tmpl)
527 | travelStrNeg := buildStrFromTmplWoDup(fasttemplate.New(travelStr[1], "{{", "}}"), tmpl)
528 | *tr = todayResults{
529 | Clothing: results{
530 | Positive: wearStrPos,
531 | Negative: wearStrNeg},
532 | Food: results{
533 | Positive: foodStrPos,
534 | Negative: foodStrNeg},
535 | Travel: results{
536 | Positive: travelStrPos,
537 | Negative: travelStrNeg},
538 | }
539 | }
540 | func (c *laohuangliCache) Init() {
541 | db.Read("datas", "cache", c)
542 | }
543 | func (c *laohuangliCache) New() {
544 | *c = laohuangliCache{Date: time.Now().Format("2006-01-02"), Caches: make(map[int64]laohuangliResult), Today: todayResults{}}
545 | c.Today.NewRand()
546 | }
547 | func (c *laohuangliCache) Save() {
548 | db.Write("datas", "cache", c)
549 | }
550 | func (c *laohuangliCache) Backup(date string) {
551 | db.Write("history", date, c)
552 | }
553 | func (c *laohuangliCache) Exist(id int64) string {
554 | _, exist := c.Caches[id]
555 | if exist {
556 | return c.Caches[id].Result
557 | }
558 | return ""
559 | }
560 | func (c *laohuangliCache) Push(id int64, name string, content string) {
561 | result := laohuangliResult{Name: name, Result: content}
562 | c.Caches[id] = result
563 | }
564 |
--------------------------------------------------------------------------------
/tgbot/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.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
7 | cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
8 | cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
9 | cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
10 | cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
11 | cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
12 | cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
13 | cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
14 | cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
15 | cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
16 | cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
17 | cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
18 | cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
19 | cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY=
20 | cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
21 | cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
22 | cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
23 | cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY=
24 | cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM=
25 | cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY=
26 | cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=
27 | cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=
28 | cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4=
29 | cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc=
30 | cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA=
31 | cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A=
32 | cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
33 | cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
34 | cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
35 | cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
36 | cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
37 | cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
38 | cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow=
39 | cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM=
40 | cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M=
41 | cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s=
42 | cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU=
43 | cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
44 | cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
45 | cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY=
46 | cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
47 | cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
48 | cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
49 | cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
50 | cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
51 | cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
52 | cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
53 | cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
54 | cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
55 | cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
56 | dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
57 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
58 | github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
59 | github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
60 | github.com/Nigh/kuma-push v0.1.0 h1:EtuEuLIxUpwOY6om/gWllSz587Ecj/Iu2m0k8XGFj2M=
61 | github.com/Nigh/kuma-push v0.1.0/go.mod h1:e/WsNOed5np3Z1Olmrz7SP/vnq6SA0jZAdvZQpWry+o=
62 | github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
63 | github.com/adrg/strutil v0.3.1 h1:OLvSS7CSJO8lBii4YmBt8jiK9QOtB9CzCzwl4Ic/Fz4=
64 | github.com/adrg/strutil v0.3.1/go.mod h1:8h90y18QLrs11IBffcGX3NW/GFBXCMcNg4M7H6MspPA=
65 | github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
66 | github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
67 | github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
68 | github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
69 | github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
70 | github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
71 | github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
72 | github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
73 | github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
74 | github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
75 | github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
76 | github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
77 | github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
78 | github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
79 | github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
80 | github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
81 | github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
82 | github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
83 | github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
84 | github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
85 | github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
86 | github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
87 | github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
88 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
89 | github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
90 | github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
91 | github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
92 | github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
93 | github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
94 | github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
95 | github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
96 | github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
97 | github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
98 | github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
99 | github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
100 | github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
101 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
102 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
103 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
104 | github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
105 | github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
106 | github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
107 | github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
108 | github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
109 | github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
110 | github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
111 | github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
112 | github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
113 | github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
114 | github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
115 | github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
116 | github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
117 | github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
118 | github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
119 | github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps=
120 | github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
121 | github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
122 | github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
123 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
124 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
125 | github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
126 | github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
127 | github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
128 | github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
129 | github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
130 | github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
131 | github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
132 | github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
133 | github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
134 | github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
135 | github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
136 | github.com/goccy/go-yaml v1.9.5/go.mod h1:U/jl18uSupI5rdI2jmuCswEA2htH9eXfferR3KfscvA=
137 | github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
138 | github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
139 | github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
140 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
141 | github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
142 | github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
143 | github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
144 | github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
145 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
146 | github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
147 | github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
148 | github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
149 | github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
150 | github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
151 | github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
152 | github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
153 | github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
154 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
155 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
156 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
157 | github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
158 | github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
159 | github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
160 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
161 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
162 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
163 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
164 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
165 | github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
166 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
167 | github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
168 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
169 | github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
170 | github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
171 | github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
172 | github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
173 | github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
174 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
175 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
176 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
177 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
178 | github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
179 | github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
180 | github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
181 | github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
182 | github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
183 | github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
184 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
185 | github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
186 | github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
187 | github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
188 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
189 | github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
190 | github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
191 | github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
192 | github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
193 | github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
194 | github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
195 | github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
196 | github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
197 | github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
198 | github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
199 | github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
200 | github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
201 | github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
202 | github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
203 | github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
204 | github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
205 | github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
206 | github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
207 | github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
208 | github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
209 | github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
210 | github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
211 | github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
212 | github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
213 | github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM=
214 | github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM=
215 | github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM=
216 | github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c=
217 | github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
218 | github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
219 | github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
220 | github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0=
221 | github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=
222 | github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
223 | github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
224 | github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
225 | github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
226 | github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
227 | github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
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/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
230 | github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
231 | github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
232 | github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
233 | github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
234 | github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
235 | github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
236 | github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
237 | github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
238 | github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
239 | github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
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/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
242 | github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
243 | github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
244 | github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=
245 | github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=
246 | github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4=
247 | github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4=
248 | github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
249 | github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
250 | github.com/jcelliott/lumber v0.0.0-20160324203708-dd349441af25 h1:EFT6MH3igZK/dIVqgGbTqWVvkZ7wJ5iGN03SVtvvdd8=
251 | github.com/jcelliott/lumber v0.0.0-20160324203708-dd349441af25/go.mod h1:sWkGw/wsaHtRsT9zGQ/WyJCotGWG/Anow/9hsAcBWRw=
252 | github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
253 | github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
254 | github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
255 | github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
256 | github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
257 | github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
258 | github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
259 | github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
260 | github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
261 | github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
262 | github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
263 | github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
264 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
265 | github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
266 | github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
267 | github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
268 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
269 | github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
270 | github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
271 | github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
272 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
273 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
274 | github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
275 | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
276 | github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
277 | github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
278 | github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
279 | github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
280 | github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
281 | github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
282 | github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
283 | github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
284 | github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
285 | github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
286 | github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
287 | github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
288 | github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
289 | github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
290 | github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
291 | github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
292 | github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
293 | github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=
294 | github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
295 | github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
296 | github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
297 | github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
298 | github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
299 | github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
300 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
301 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
302 | github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
303 | github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
304 | github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
305 | github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
306 | github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
307 | github.com/nanobox-io/golang-scribble v0.0.0-20190309225732-aa3e7c118975 h1:zm/Rb2OsnLWCY88Njoqgo4X6yt/lx3oBNWhepX0AOMU=
308 | github.com/nanobox-io/golang-scribble v0.0.0-20190309225732-aa3e7c118975/go.mod h1:4Mct/lWCFf1jzQTTAaWtOI7sXqmG+wBeiBfT4CxoaJk=
309 | github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
310 | github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
311 | github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
312 | github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas=
313 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
314 | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
315 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
316 | github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
317 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
318 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
319 | github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
320 | github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
321 | github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
322 | github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
323 | github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
324 | github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
325 | github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
326 | github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
327 | github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
328 | github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
329 | github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
330 | github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
331 | github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
332 | github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
333 | github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
334 | github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
335 | github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
336 | github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
337 | github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
338 | github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
339 | github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
340 | github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
341 | github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k=
342 | github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
343 | github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
344 | github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8=
345 | github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
346 | github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
347 | github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
348 | github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
349 | github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
350 | github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
351 | github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
352 | github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo=
353 | github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU=
354 | github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
355 | github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
356 | github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw=
357 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
358 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
359 | github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
360 | github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
361 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
362 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
363 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
364 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
365 | github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
366 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
367 | github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
368 | github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
369 | github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
370 | github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
371 | github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
372 | github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
373 | github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
374 | github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
375 | github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
376 | github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
377 | github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
378 | github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
379 | github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
380 | github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
381 | github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
382 | github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
383 | go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A=
384 | go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
385 | go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU=
386 | go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY=
387 | go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
388 | go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
389 | go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
390 | go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
391 | go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
392 | go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
393 | go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
394 | go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
395 | go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
396 | go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
397 | go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
398 | golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
399 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
400 | golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
401 | golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
402 | golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
403 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
404 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
405 | golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
406 | golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
407 | golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
408 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
409 | golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
410 | golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
411 | golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
412 | golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
413 | golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
414 | golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
415 | golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
416 | golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
417 | golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
418 | golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
419 | golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
420 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
421 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
422 | golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
423 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
424 | golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
425 | golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
426 | golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
427 | golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
428 | golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
429 | golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
430 | golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
431 | golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
432 | golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
433 | golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
434 | golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
435 | golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
436 | golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
437 | golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
438 | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
439 | golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
440 | golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
441 | golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
442 | golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
443 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
444 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
445 | golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
446 | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
447 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
448 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
449 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
450 | golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
451 | golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
452 | golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
453 | golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
454 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
455 | golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
456 | golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
457 | golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
458 | golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
459 | golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
460 | golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
461 | golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
462 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
463 | golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
464 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
465 | golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
466 | golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
467 | golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
468 | golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
469 | golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
470 | golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
471 | golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
472 | golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
473 | golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
474 | golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
475 | golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
476 | golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
477 | golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
478 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
479 | golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
480 | golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
481 | golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=
482 | golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
483 | golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
484 | golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
485 | golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
486 | golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
487 | golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
488 | golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
489 | golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
490 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
491 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
492 | golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
493 | golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
494 | golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
495 | golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
496 | golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
497 | golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
498 | golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
499 | golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
500 | golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
501 | golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
502 | golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
503 | golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
504 | golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
505 | golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
506 | golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
507 | golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
508 | golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
509 | golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
510 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
511 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
512 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
513 | golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
514 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
515 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
516 | golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
517 | golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
518 | golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
519 | golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
520 | golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
521 | golang.org/x/sync v0.0.0-20220513210516-0976fa681c29 h1:w8s32wxx3sY+OjLlv9qltkLU5yvJzxjjgiHWLjdIcw4=
522 | golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
523 | golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
524 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
525 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
526 | golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
527 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
528 | golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
529 | golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
530 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
531 | golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
532 | golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
533 | golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
534 | golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
535 | golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
536 | golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
537 | golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
538 | golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
539 | golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
540 | golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
541 | golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
542 | golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
543 | golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
544 | golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
545 | golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
546 | golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
547 | golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
548 | golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
549 | golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
550 | golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
551 | golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
552 | golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
553 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
554 | golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
555 | golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
556 | golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
557 | golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
558 | golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
559 | golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
560 | golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
561 | golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
562 | golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
563 | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
564 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
565 | golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
566 | golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
567 | golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
568 | golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
569 | golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
570 | golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
571 | golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
572 | golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
573 | golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
574 | golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
575 | golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
576 | golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
577 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
578 | golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
579 | golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
580 | golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
581 | golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
582 | golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
583 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
584 | golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
585 | golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
586 | golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
587 | golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
588 | golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
589 | golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
590 | golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
591 | golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
592 | golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
593 | golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
594 | golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
595 | golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
596 | golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
597 | golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
598 | golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
599 | golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
600 | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
601 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
602 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
603 | golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
604 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
605 | golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
606 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
607 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
608 | golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
609 | golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
610 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
611 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
612 | golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
613 | golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
614 | golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
615 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
616 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
617 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
618 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
619 | golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
620 | golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
621 | golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
622 | golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
623 | golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
624 | golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
625 | golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
626 | golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
627 | golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
628 | golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
629 | golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
630 | golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
631 | golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
632 | golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
633 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
634 | golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
635 | golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
636 | golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
637 | golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
638 | golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
639 | golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
640 | golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
641 | golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
642 | golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
643 | golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
644 | golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
645 | golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
646 | golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
647 | golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
648 | golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
649 | golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
650 | golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
651 | golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
652 | golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
653 | golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
654 | golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
655 | golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
656 | golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
657 | golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
658 | golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
659 | golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
660 | golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
661 | golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
662 | golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
663 | golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
664 | golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
665 | golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
666 | golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
667 | golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
668 | golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
669 | golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
670 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
671 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
672 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
673 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
674 | golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
675 | golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
676 | gonum.org/v1/gonum v0.14.0 h1:2NiG67LD1tEH0D7kM+ps2V+fXmsAnpUeec7n8tcr4S0=
677 | gonum.org/v1/gonum v0.14.0/go.mod h1:AoWeoz0becf9QMWtE8iWXNXc27fK4fNeHNf/oMejGfU=
678 | google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
679 | google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
680 | google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
681 | google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
682 | google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
683 | google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
684 | google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
685 | google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
686 | google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
687 | google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
688 | google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
689 | google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
690 | google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
691 | google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
692 | google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
693 | google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
694 | google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
695 | google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
696 | google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
697 | google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
698 | google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
699 | google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo=
700 | google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4=
701 | google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw=
702 | google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU=
703 | google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k=
704 | google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
705 | google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
706 | google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI=
707 | google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU=
708 | google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I=
709 | google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo=
710 | google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g=
711 | google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA=
712 | google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8=
713 | google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs=
714 | google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA=
715 | google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw=
716 | google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko=
717 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
718 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
719 | google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
720 | google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
721 | google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
722 | google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
723 | google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
724 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
725 | google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
726 | google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
727 | google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
728 | google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
729 | google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
730 | google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
731 | google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
732 | google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
733 | google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
734 | google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
735 | google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
736 | google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
737 | google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
738 | google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
739 | google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
740 | google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
741 | google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
742 | google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
743 | google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
744 | google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
745 | google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
746 | google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
747 | google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
748 | google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
749 | google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
750 | google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
751 | google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
752 | google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
753 | google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
754 | google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
755 | google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
756 | google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
757 | google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
758 | google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
759 | google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
760 | google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
761 | google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
762 | google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
763 | google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
764 | google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
765 | google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
766 | google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
767 | google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
768 | google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
769 | google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
770 | google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24=
771 | google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
772 | google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
773 | google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
774 | google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
775 | google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w=
776 | google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
777 | google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
778 | google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
779 | google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
780 | google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
781 | google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
782 | google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
783 | google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
784 | google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
785 | google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
786 | google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
787 | google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
788 | google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
789 | google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
790 | google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
791 | google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
792 | google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
793 | google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
794 | google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E=
795 | google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
796 | google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
797 | google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
798 | google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
799 | google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
800 | google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
801 | google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
802 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
803 | google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
804 | google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
805 | google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
806 | google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
807 | google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
808 | google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
809 | google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
810 | google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
811 | google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
812 | google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
813 | google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
814 | google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
815 | google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
816 | google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
817 | google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
818 | google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
819 | google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
820 | google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
821 | google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
822 | google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
823 | google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
824 | google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
825 | google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
826 | google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
827 | google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
828 | google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
829 | google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
830 | google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
831 | google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
832 | google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
833 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
834 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
835 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
836 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
837 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
838 | google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
839 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
840 | google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
841 | google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
842 | google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
843 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
844 | google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
845 | google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
846 | google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
847 | gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
848 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
849 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
850 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
851 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
852 | gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
853 | gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
854 | gopkg.in/telebot.v3 v3.2.1 h1:3I4LohaAyJBiivGmkfB+CiVu7QFOWkuZ4+KHgO/G3rs=
855 | gopkg.in/telebot.v3 v3.2.1/go.mod h1:GJKwwWqp9nSkIVN51eRKU78aB5f5OnQuWdwiIZfPbko=
856 | gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
857 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
858 | gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
859 | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
860 | gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
861 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
862 | gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
863 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
864 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
865 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
866 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
867 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
868 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
869 | honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
870 | honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
871 | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
872 | honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
873 | honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
874 | honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
875 | rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
876 | rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
877 | rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
878 | sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
879 |
--------------------------------------------------------------------------------