From b33dc0ba1d40120ff4136c422744e200377c0c83 Mon Sep 17 00:00:00 2001 From: Mohammadreza Khani Date: Sun, 9 Mar 2025 02:17:59 +0330 Subject: [PATCH 1/8] fix: resolve finalize is not working in some cases --- internal/crd/new.go | 9 ++++++--- internal/crd/watch.go | 4 +--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/internal/crd/new.go b/internal/crd/new.go index 9fd55d9..a0d3c2a 100644 --- a/internal/crd/new.go +++ b/internal/crd/new.go @@ -4,6 +4,7 @@ import ( "flink-kube-operator/internal/crd/v1alpha1" "os" + "github.com/reactivex/rxgo/v2" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/dynamic" "k8s.io/client-go/rest" @@ -48,11 +49,13 @@ func New() *Crd { runtimeClient: runtimeClient, } - // Watch for FlinkJob creation - jobEventObservable := crd.watchFlinkJobs() + jobEventCh := make(chan rxgo.Item) // add finalizer to new resources - go crd.manageFinalizer(jobEventObservable) + go crd.manageFinalizer(rxgo.FromChannel(jobEventCh)) + + // Watch for FlinkJob creation + crd.watchFlinkJobs(jobEventCh) return &crd } diff --git a/internal/crd/watch.go b/internal/crd/watch.go index b2aa5b1..164c665 100644 --- a/internal/crd/watch.go +++ b/internal/crd/watch.go @@ -15,9 +15,7 @@ import ( "k8s.io/apimachinery/pkg/watch" ) -func (crd Crd) watchFlinkJobs() rxgo.Observable { - - ch := make(chan rxgo.Item) +func (crd Crd) watchFlinkJobs(ch chan rxgo.Item) rxgo.Observable { go func() { pkg.Logger.Debug("[crd] starting watch") From 6f91ad607f038d3d76b09d0880b869d7831bfd28 Mon Sep 17 00:00:00 2001 From: Mohammadreza Khani Date: Wed, 12 Mar 2025 21:20:57 +0330 Subject: [PATCH 2/8] perf: remove go-nanoid and rxgo --- .vscode/settings.json | 1 - go.mod | 26 +- go.sum | 795 +------------------------------- internal/crd/finalizer.go | 6 +- internal/crd/new.go | 5 +- internal/crd/watch.go | 14 +- internal/jar/jar.go | 7 +- internal/managed_job/manager.go | 2 - 8 files changed, 17 insertions(+), 839 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 5d2e4a2..37077b5 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -14,7 +14,6 @@ "nindent", "reactivex", "repsert", - "rxgo", "tolerations" ] } \ No newline at end of file diff --git a/go.mod b/go.mod index 6b16cd7..8d95d45 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,9 @@ module flink-kube-operator go 1.23.2 require ( + github.com/danielgtaylor/huma/v2 v2.27.0 + github.com/gofiber/fiber/v2 v2.52.6 github.com/logi-camp/go-flink-client v0.2.0 - github.com/matoous/go-nanoid/v2 v2.1.0 github.com/samber/lo v1.47.0 go.uber.org/zap v1.27.0 k8s.io/apimachinery v0.31.3 @@ -12,48 +13,30 @@ require ( ) require ( - github.com/Jeffail/gabs/v2 v2.7.0 // indirect github.com/andybalholm/brotli v1.1.1 // indirect - github.com/danielgtaylor/casing v1.0.0 // indirect - github.com/danielgtaylor/huma/v2 v2.27.0 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/evanphx/json-patch/v5 v5.9.0 // indirect - github.com/fatih/color v1.18.0 // indirect - github.com/fatih/structs v1.1.0 // indirect - github.com/go-chi/chi v4.1.2+incompatible // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.23.0 // indirect - github.com/goccy/go-yaml v1.15.13 // indirect - github.com/gofiber/fiber/v2 v2.52.6 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/gnostic-models v0.6.9 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/graphql-go/graphql v0.8.1 // indirect - github.com/graphql-go/handler v0.2.4 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/klauspost/compress v1.17.11 // indirect - github.com/koron-go/gqlcost v0.3.1 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/tent/http-link-go v0.0.0-20130702225549-ac974c61c2f9 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.58.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect - github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect - github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect - github.com/xeipuuv/gojsonschema v1.2.0 // indirect golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect - golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect google.golang.org/protobuf v1.35.1 // indirect ) require ( - github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/emirpasic/gods v1.12.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect @@ -66,12 +49,7 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/reactivex/rxgo/v2 v2.5.0 github.com/spf13/pflag v1.0.5 // indirect - github.com/stretchr/objx v0.5.2 // indirect - github.com/stretchr/testify v1.9.0 // indirect - github.com/teivah/onecontext v0.0.0-20200513185103-40f981bfd775 // indirect github.com/x448/float16 v0.8.4 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/net v0.31.0 // indirect diff --git a/go.sum b/go.sum index 4e5feb2..f198182 100644 --- a/go.sum +++ b/go.sum @@ -1,112 +1,6 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/Jeffail/gabs/v2 v2.6.1/go.mod h1:xCn81vdHKxFUuWWAaD5jCTQDNPBMh5pPs9IJ+NcziBI= -github.com/Jeffail/gabs/v2 v2.7.0 h1:Y2edYaTcE8ZpRsR2AtmPu5xQdFDIthFG0jYhu5PY8kg= -github.com/Jeffail/gabs/v2 v2.7.0/go.mod h1:dp5ocw1FvBBQYssgHsG7I1WYsiLRtkUaB1FEtSwvNUw= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/cenkalti/backoff/v4 v4.0.0/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= -github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= -github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/danielgtaylor/casing v0.0.0-20210126043903-4e55e6373ac3/go.mod h1:eFdYmNxcuLDrRNW0efVoxSaApmvGXfHZ9k2CT/RSUF0= -github.com/danielgtaylor/casing v1.0.0 h1:uX+PewTv0zbXeTluwRwlyPMRQEduVP9svLHpbDsQYkw= -github.com/danielgtaylor/casing v1.0.0/go.mod h1:eFdYmNxcuLDrRNW0efVoxSaApmvGXfHZ9k2CT/RSUF0= -github.com/danielgtaylor/huma v1.14.3 h1:CqmODzN6xA1zxzHMND3cFuyaVWNPAPc3bI8mvgyC9qM= -github.com/danielgtaylor/huma v1.14.3/go.mod h1:I/19C1eNQd7ojMIQvynPe3lbuD5KfQEinH+ivIqjqmg= github.com/danielgtaylor/huma/v2 v2.27.0 h1:yxgJ8GqYqKeXw/EnQ4ZNc2NBpmn49AlhxL2+ksSXjUI= github.com/danielgtaylor/huma/v2 v2.27.0/go.mod h1:NbSFXRoOMh3BVmiLJQ9EbUpnPas7D9BeOxF/pZBAGa0= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -115,44 +9,10 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= -github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= -github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= -github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec= -github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= @@ -165,172 +25,36 @@ github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= -github.com/goccy/go-yaml v1.9.5/go.mod h1:U/jl18uSupI5rdI2jmuCswEA2htH9eXfferR3KfscvA= -github.com/goccy/go-yaml v1.15.13 h1:Xd87Yddmr2rC1SLLTm2MNDcTjeO/GYo0JGiww6gSTDg= -github.com/goccy/go-yaml v1.15.13/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofiber/fiber/v2 v2.52.6 h1:Rfp+ILPiYSvvVuIPvxrBns+HJp8qGLDnLJawAu27XVI= github.com/gofiber/fiber/v2 v2.52.6/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k= github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/graphql-go/graphql v0.7.9/go.mod h1:k6yrAYQaSP59DC5UVxbgxESlmVyojThKdORUqGDGmrI= -github.com/graphql-go/graphql v0.8.0/go.mod h1:nKiHzRM0qopJEwCITUuIsxk9PlVlwIiiI8pnJEhordQ= -github.com/graphql-go/graphql v0.8.1 h1:p7/Ou/WpmulocJeEx7wjQy611rtXGQaAcXGqanuMMgc= -github.com/graphql-go/graphql v0.8.1/go.mod h1:nKiHzRM0qopJEwCITUuIsxk9PlVlwIiiI8pnJEhordQ= -github.com/graphql-go/handler v0.2.3/go.mod h1:leLF6RpV5uZMN1CdImAxuiayrYYhOk33bZciaUGaXeU= -github.com/graphql-go/handler v0.2.4 h1:gz9q11TUHPNUpqzV8LMa+rkqM5NUuH/nkE3oF2LS3rI= -github.com/graphql-go/handler v0.2.4/go.mod h1:gsQlb4gDvURR0bgN8vWQEh+s5vJALM2lYL3n3cf6OxQ= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/koron-go/gqlcost v0.2.2/go.mod h1:8ZAmWla8nXCH0lBTxMZ+gbvgHhCCvTX3V4pEkC3obQA= -github.com/koron-go/gqlcost v0.3.1 h1:fDtZEKcVGXYiluykjgaik86CWgLR+wrD0w1cgbHRyko= -github.com/koron-go/gqlcost v0.3.1/go.mod h1:cOxXxn2nXTbklsLbUdAcZTRJbNqMP6qIQ/+aaMeUo0w= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -338,135 +62,51 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/logi-camp/go-flink-client v0.2.0 h1:PIyfJq7FjW28bnvemReCicIuQD7JzVgJDk2xPTZUS2s= github.com/logi-camp/go-flink-client v0.2.0/go.mod h1:A79abedX6wGQI0FoICdZI7SRoGHj15QwMwWowgsKYFI= -github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/matoous/go-nanoid/v2 v2.1.0 h1:P64+dmq21hhWdtvZfEAofnvJULaRR1Yib0+PnU669bE= -github.com/matoous/go-nanoid/v2 v2.1.0/go.mod h1:KlbGNQ+FhrUNIHUxZdL63t7tl4LaPkZNpUULS8H4uVM= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/reactivex/rxgo/v2 v2.5.0 h1:FhPgHwX9vKdNQB2gq9EPt+EKk9QrrzoeztGbEEnZam4= -github.com/reactivex/rxgo/v2 v2.5.0/go.mod h1:bs4fVZxcb5ZckLIOeIeVH942yunJLWDABWGbrHAW+qU= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.4.0/go.mod h1:ALv2SRj7GxYV4HO9elxH9nS6M9gW+xDNxqmyJ6RfDFM= github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc= github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= -github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/teivah/onecontext v0.0.0-20200513185103-40f981bfd775 h1:BLNsFR8l/hj/oGjnJXkd4Vi3s4kQD3/3x8HSAE4bzN0= -github.com/teivah/onecontext v0.0.0-20200513185103-40f981bfd775/go.mod h1:XUZ4x3oGhWfiOnUvTslnKKs39AWUct3g3yJvXTQSJOQ= -github.com/tent/http-link-go v0.0.0-20130702225549-ac974c61c2f9 h1:/Bsw4C+DEdqPjt8vAqaC9LAqpAQnaCQQqmolqq3S1T4= -github.com/tent/http-link-go v0.0.0-20130702225549-ac974c61c2f9/go.mod h1:RHkNRtSLfOK7qBTHaeSX1D6BNpI3qw7NTxsmNr4RvN8= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.58.0 h1:GGB2dWxSbEprU9j0iMJHgdKYJVDyjrOwF9RE59PbRuE= @@ -475,502 +115,73 @@ github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVS github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o= golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= -golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= -golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU= golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= -golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.31.3 h1:umzm5o8lFbdN/hIXbrK9oRpOproJO62CV1zqxXrLgk8= k8s.io/api v0.31.3/go.mod h1:UJrkIp9pnMOI9K2nlL6vwpxRzzEX5sWgn8kGQe92kCE= k8s.io/apiextensions-apiserver v0.31.0 h1:fZgCVhGwsclj3qCw1buVXCV6khjRzKC5eCFt24kyLSk= @@ -985,10 +196,6 @@ k8s.io/kube-openapi v0.0.0-20241127205056-99599406b04f h1:nLHvOvs1CZ+FAEwR4EqLeR k8s.io/kube-openapi v0.0.0-20241127205056-99599406b04f/go.mod h1:iZjdMQzunI7O/sUrf/5WRX1gvaAIam32lKx9+paoLbU= k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078 h1:jGnCPejIetjiy2gqaJ5V0NLwTpF4wbQ6cZIItJCSHno= k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/controller-runtime v0.19.2 h1:3sPrF58XQEPzbE8T81TN6selQIMGbtYwuaJ6eDssDF8= sigs.k8s.io/controller-runtime v0.19.2/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= diff --git a/internal/crd/finalizer.go b/internal/crd/finalizer.go index b556852..2d376bf 100644 --- a/internal/crd/finalizer.go +++ b/internal/crd/finalizer.go @@ -5,7 +5,6 @@ import ( "flink-kube-operator/internal/crd/v1alpha1" "flink-kube-operator/pkg" - "github.com/reactivex/rxgo/v2" "go.uber.org/zap" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" @@ -13,11 +12,10 @@ import ( var FinalizerChannel chan (types.UID) = make(chan (types.UID)) -func (crd Crd) manageFinalizer(jobEventObservable rxgo.Observable) { +func (crd Crd) manageFinalizer(jobEventChannel chan FlinkJobCrdEvent) { finalizerName := "flink-operator.logicamp.tech/finalizer" - for j := range jobEventObservable.Observe() { - jobEvent := j.V.(*FlinkJobCrdEvent) + for jobEvent := range jobEventChannel { pkg.Logger.Debug("[crd] [manage-finalizer] main loop", zap.String("name", jobEvent.Job.Name)) go func() { if jobEvent.Job.GetDeletionTimestamp() != nil { diff --git a/internal/crd/new.go b/internal/crd/new.go index a0d3c2a..eaaa59c 100644 --- a/internal/crd/new.go +++ b/internal/crd/new.go @@ -4,7 +4,6 @@ import ( "flink-kube-operator/internal/crd/v1alpha1" "os" - "github.com/reactivex/rxgo/v2" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/dynamic" "k8s.io/client-go/rest" @@ -49,10 +48,10 @@ func New() *Crd { runtimeClient: runtimeClient, } - jobEventCh := make(chan rxgo.Item) + jobEventCh := make(chan FlinkJobCrdEvent) // add finalizer to new resources - go crd.manageFinalizer(rxgo.FromChannel(jobEventCh)) + go crd.manageFinalizer(jobEventCh) // Watch for FlinkJob creation crd.watchFlinkJobs(jobEventCh) diff --git a/internal/crd/watch.go b/internal/crd/watch.go index 164c665..417c762 100644 --- a/internal/crd/watch.go +++ b/internal/crd/watch.go @@ -7,7 +7,6 @@ import ( "flink-kube-operator/pkg" - "github.com/reactivex/rxgo/v2" "go.uber.org/zap" metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -15,7 +14,7 @@ import ( "k8s.io/apimachinery/pkg/watch" ) -func (crd Crd) watchFlinkJobs(ch chan rxgo.Item) rxgo.Observable { +func (crd Crd) watchFlinkJobs(ch chan FlinkJobCrdEvent) { go func() { pkg.Logger.Debug("[crd] starting watch") @@ -45,14 +44,12 @@ func (crd Crd) watchFlinkJobs(ch chan rxgo.Item) rxgo.Observable { } go func() { - ch <- rxgo.Item{ - V: &FlinkJobCrdEvent{ - EventType: event.Type, - Job: job, - }, + ch <- FlinkJobCrdEvent{ + EventType: event.Type, + Job: job, } }() - pkg.Logger.Debug("[crd] [watch] change in", zap.String("name", job.Name)) + pkg.Logger.Debug("[crd] [watch] change in", zap.String("name", job.Name), zap.String("operation", string(event.Type))) switch event.Type { case watch.Bookmark: case watch.Modified: @@ -68,5 +65,4 @@ func (crd Crd) watchFlinkJobs(ch chan rxgo.Item) rxgo.Observable { }() - return rxgo.FromChannel(ch) } diff --git a/internal/jar/jar.go b/internal/jar/jar.go index 438624b..2fafc9b 100644 --- a/internal/jar/jar.go +++ b/internal/jar/jar.go @@ -1,6 +1,8 @@ package jar import ( + "crypto/rand" + "encoding/hex" "errors" "io" "net/http" @@ -10,7 +12,6 @@ import ( "flink-kube-operator/pkg" api "github.com/logi-camp/go-flink-client" - gonanoid "github.com/matoous/go-nanoid/v2" "go.uber.org/zap" ) @@ -46,7 +47,9 @@ func (jarFile *JarFile) Upload(flinkClient *api.Client) (fileName string, err er } func (jarFile *JarFile) Download() error { - fileName, _ := gonanoid.New() + randBytes := make([]byte, 16) + rand.Read(randBytes) + fileName := hex.EncodeToString(randBytes) jarFile.filePath = "/tmp/" + fileName + ".jar" out, err := os.Create(jarFile.filePath) if err != nil { diff --git a/internal/managed_job/manager.go b/internal/managed_job/manager.go index 4227691..98cc25f 100644 --- a/internal/managed_job/manager.go +++ b/internal/managed_job/manager.go @@ -96,8 +96,6 @@ func (mgr *Manager) cycle(client *api.Client, crdInstance *crd.Crd) { } - pkg.Logger.Debug("[manager] [cycle] finding job", zap.Any("name", managedJob.def.Name)) - jobManagerJobOverview, jobFound := lo.Find(jobManagerJobOverviews.Jobs, func(job api.JobOverview) bool { jobId := managedJob.GetJobId() if jobId != nil { From 4d6b06efe770b8a7b96e0ef4c1927e7f79910db8 Mon Sep 17 00:00:00 2001 From: Mohammadreza Khani Date: Wed, 12 Mar 2025 23:27:40 +0330 Subject: [PATCH 3/8] fix: restore watcher if channel is closed --- internal/crd/watch.go | 86 ++++++++++++++++++++++--------------------- 1 file changed, 44 insertions(+), 42 deletions(-) diff --git a/internal/crd/watch.go b/internal/crd/watch.go index 417c762..53abe7a 100644 --- a/internal/crd/watch.go +++ b/internal/crd/watch.go @@ -17,52 +17,54 @@ import ( func (crd Crd) watchFlinkJobs(ch chan FlinkJobCrdEvent) { go func() { - pkg.Logger.Debug("[crd] starting watch") - watcher, err := crd.client.Watch(context.Background(), metaV1.ListOptions{}) - if err != nil { - panic(err) - } - defer watcher.Stop() - namespace := os.Getenv("NAMESPACE") - pkg.Logger.Debug("[crd] [watch]", zap.String("namespace", namespace)) - for event := range watcher.ResultChan() { - unstructuredJob := event.Object.(*unstructured.Unstructured) - unstructuredMap, _, err := unstructured.NestedMap(unstructuredJob.Object) + for { + pkg.Logger.Debug("[crd] starting watch") + watcher, err := crd.client.Watch(context.Background(), metaV1.ListOptions{}) if err != nil { - pkg.Logger.Error("[crd] [watch]cannot create unstructured map", zap.Error(err)) - continue + panic(err) } - job := &v1alpha1.FlinkJob{} - - err = runtime.DefaultUnstructuredConverter.FromUnstructured(unstructuredMap, job) - if err != nil { - pkg.Logger.Error("[crd] [watch]cannot convert unstructured to structured", zap.Error(err)) - continue - } - if job.Namespace != namespace { - continue - } - - go func() { - ch <- FlinkJobCrdEvent{ - EventType: event.Type, - Job: job, + namespace := os.Getenv("NAMESPACE") + pkg.Logger.Debug("[crd] [watch]", zap.String("namespace", namespace)) + for event := range watcher.ResultChan() { + unstructuredJob := event.Object.(*unstructured.Unstructured) + unstructuredMap, _, err := unstructured.NestedMap(unstructuredJob.Object) + if err != nil { + pkg.Logger.Error("[crd] [watch]cannot create unstructured map", zap.Error(err)) + continue } - }() - pkg.Logger.Debug("[crd] [watch] change in", zap.String("name", job.Name), zap.String("operation", string(event.Type))) - switch event.Type { - case watch.Bookmark: - case watch.Modified: - //pkg.Logger.Info("[crd] [watch] flink job modified", zap.String("jobName", job.GetName())) - crd.repsert(job) - case watch.Added: - //pkg.Logger.Info("[crd] [watch] new flink job created") - crd.repsert(job) - case watch.Deleted: - crd.remove(job.UID) - } - } + job := &v1alpha1.FlinkJob{} + err = runtime.DefaultUnstructuredConverter.FromUnstructured(unstructuredMap, job) + if err != nil { + pkg.Logger.Error("[crd] [watch]cannot convert unstructured to structured", zap.Error(err)) + continue + } + if job.Namespace != namespace { + continue + } + + go func() { + ch <- FlinkJobCrdEvent{ + EventType: event.Type, + Job: job, + } + }() + pkg.Logger.Debug("[crd] [watch] change in", zap.String("name", job.Name), zap.String("operation", string(event.Type))) + switch event.Type { + case watch.Bookmark: + case watch.Modified: + //pkg.Logger.Info("[crd] [watch] flink job modified", zap.String("jobName", job.GetName())) + crd.repsert(job) + case watch.Added: + //pkg.Logger.Info("[crd] [watch] new flink job created") + crd.repsert(job) + case watch.Deleted: + crd.remove(job.UID) + } + } + defer watcher.Stop() + pkg.Logger.Warn("[crd] [watch] Watcher stopped, restarting...") + } }() } From f2b627cee2ab954a8b8b67c71462310af6f9e5d0 Mon Sep 17 00:00:00 2001 From: Mohammadreza Khani Date: Wed, 12 Mar 2025 23:33:09 +0330 Subject: [PATCH 4/8] feat: add LOG_LEVEL to envs --- pkg/logger.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/logger.go b/pkg/logger.go index 67ff770..9e1ff4d 100644 --- a/pkg/logger.go +++ b/pkg/logger.go @@ -2,6 +2,8 @@ package pkg import ( "context" + "os" + "strconv" "github.com/mattn/go-colorable" "go.uber.org/zap" @@ -82,8 +84,10 @@ func OverrideLoggerConfig(config LoggerConfig) { Logger = createOrUpdateInstance(config) } +var level, err = strconv.Atoi(os.Getenv("LOG_LEVEL")) + var Logger = GetLogger(context.Background(), LoggerConfig{ - Level: zap.DebugLevel, + Level: zapcore.Level(level), Filename: "./tmp/error.log", MaxSize: 100, MaxAge: 90, From 7f78faeed76a9bf16f172074025975d0e1b1a7a5 Mon Sep 17 00:00:00 2001 From: Mohammadreza Khani Date: Fri, 4 Apr 2025 13:51:57 +0330 Subject: [PATCH 5/8] fix(helm): missing task-manager and job-manager configs in values --- helm/chart/Chart.yaml | 2 +- helm/chart/templates/flink/deploy.yaml | 13 +++++----- helm/chart/values.yaml | 12 +++++++++- helm/flink-kube-operator-0.1.14.tgz | Bin 0 -> 5926 bytes helm/index.yaml | 32 ++++++++++++++++--------- 5 files changed, 39 insertions(+), 20 deletions(-) create mode 100644 helm/flink-kube-operator-0.1.14.tgz diff --git a/helm/chart/Chart.yaml b/helm/chart/Chart.yaml index 196e63a..9fc1a17 100644 --- a/helm/chart/Chart.yaml +++ b/helm/chart/Chart.yaml @@ -2,5 +2,5 @@ apiVersion: v2 name: flink-kube-operator description: Helm chart for flink kube operator type: application -version: 0.1.13 +version: 0.1.14 appVersion: "0.1.0" diff --git a/helm/chart/templates/flink/deploy.yaml b/helm/chart/templates/flink/deploy.yaml index c8f619a..5a7c74e 100644 --- a/helm/chart/templates/flink/deploy.yaml +++ b/helm/chart/templates/flink/deploy.yaml @@ -6,8 +6,8 @@ - name: FLINK_PROPERTIES value: | jobmanager.rpc.address: localhost - jobmanager.memory.process.size: 2048m - taskmanager.memory.process.size: 2048m + jobmanager.memory.process.size: {{ .Values.flink.jobManager.processMemory }} + taskmanager.memory.process.size: {{ .Values.flink.taskManager.processMemory }} taskmanager.data.port: 6125 taskmanager.numberOfTaskSlots: {{ .Values.flink.taskManager.numberOfTaskSlots }} parallelism.default: {{ .Values.flink.parallelism.default }} @@ -18,15 +18,15 @@ high-availability.type: kubernetes kubernetes.namespace: {{ .Release.Namespace }} kubernetes.cluster-id: {{ .Values.clusterId | default (print .Release.Name "-cluster") }} - execution.checkpointing.interval: 5min - execution.checkpointing.mode: EXACTLY_ONCE + execution.checkpointing.interval: {{ .Values.flink.checkpoint.interval }} + execution.checkpointing.mode: {{ .Values.flink.checkpoint.mode }} web.upload.dir: {{ .Values.flink.state.data.dir }}/web-upload state.checkpoints.dir: file://{{ .Values.flink.state.data.dir }}/checkpoints state.backend.rocksdb.localdir: file://{{ .Values.flink.state.data.dir }}/rocksdb high-availability.storageDir: file://{{ .Values.flink.state.ha.dir }} state.savepoints.dir: file://{{ .Values.flink.state.savepoints.dir }} - state.backend.incremental: false - rest.profiling.enabled: true + state.backend.incremental: {{ .Values.flink.state.incremental }} + rest.profiling.enabled: true {{- end }} {{- define "flink.volumeMounts" -}} @@ -110,7 +110,6 @@ spec: fieldPath: status.podIP volumeMounts: {{- include "flink.volumeMounts" . | nindent 12 }} - - name: taskmanager image: {{ .Values.flink.image.repository }}:{{ .Values.flink.image.tag }} imagePullPolicy: Always diff --git a/helm/chart/values.yaml b/helm/chart/values.yaml index f1d0a90..a9ec791 100644 --- a/helm/chart/values.yaml +++ b/helm/chart/values.yaml @@ -121,9 +121,14 @@ flink: parallelism: default: 1 # Default parallelism for Flink jobs + + checkpoint: + interval: 5min + mode: EXACTLY_ONCE state: backend: rocksdb # Use RocksDB for state backend + incremental: true savepoints: dir: "/opt/flink/savepoints" # Directory to store savepoints pvcName: flink-savepoints-pvc # PVC for savepoints persistence @@ -136,8 +141,13 @@ flink: dir: "/opt/flink/ha" # Directory to store ha data pvcName: flink-ha-pvc # PVC for ha size: 10Gi # PVC size for ha + + jobManager: + processMemory: 4096m # Size of job manager process memory + taskManager: - numberOfTaskSlots: 100 # Number of task slots for TaskManager + numberOfTaskSlots: 12 # Number of task slots for TaskManager + processMemory: 4096m # Size of task manager process memory # clusterId: some-id \ No newline at end of file diff --git a/helm/flink-kube-operator-0.1.14.tgz b/helm/flink-kube-operator-0.1.14.tgz new file mode 100644 index 0000000000000000000000000000000000000000..34661e2a2f42cc037b601f491e445469ce3d4f31 GIT binary patch literal 5926 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 IlK_YS0HR-?lK=n! literal 0 HcmV?d00001 diff --git a/helm/index.yaml b/helm/index.yaml index 347073e..678c5d9 100644 --- a/helm/index.yaml +++ b/helm/index.yaml @@ -1,6 +1,16 @@ apiVersion: v1 entries: flink-kube-operator: + - apiVersion: v2 + appVersion: 0.1.0 + created: "2025-04-04T13:50:27.971040367+03:30" + description: Helm chart for flink kube operator + digest: 00acef7878bcf372d036fabaac400913097d678087a756102b54a28428197bdf + name: flink-kube-operator + type: application + urls: + - flink-kube-operator-0.1.14.tgz + version: 0.1.14 - apiVersion: v2 appVersion: 0.1.0 created: "2025-03-04T23:13:19.698003661+03:30" @@ -43,7 +53,7 @@ entries: version: 0.1.10 - apiVersion: v2 appVersion: 0.1.0 - created: "2025-03-04T18:04:35.495842696+03:30" + created: "2025-04-04T13:50:27.975218534+03:30" description: Helm chart for flink kube operator digest: abc08853c65ba36ff3485f182555522408e150f2508d4cac672d588972ddca3c name: flink-kube-operator @@ -53,7 +63,7 @@ entries: version: 0.1.9 - apiVersion: v2 appVersion: 0.1.0 - created: "2025-03-04T18:04:35.495392608+03:30" + created: "2025-04-04T13:50:27.974750898+03:30" description: Helm chart for flink kube operator digest: 3986a0a2348db1e17a1524eb0d87eabf6d64050d4007c5b393f723393cc4b675 name: flink-kube-operator @@ -63,7 +73,7 @@ entries: version: 0.1.8 - apiVersion: v2 appVersion: 0.1.0 - created: "2025-03-04T18:04:35.494948853+03:30" + created: "2025-04-04T13:50:27.974306458+03:30" description: Helm chart for flink kube operator digest: 1bbeb92ecd10e36fa7d742a61cced0d842139ada0cfeff6fa1b0cf8718189235 name: flink-kube-operator @@ -73,7 +83,7 @@ entries: version: 0.1.7 - apiVersion: v2 appVersion: 0.1.0 - created: "2025-03-04T18:04:35.49450822+03:30" + created: "2025-04-04T13:50:27.973833587+03:30" description: Helm chart for flink kube operator digest: 4031f4a79e65f6c5e60b6ebf9dd7e2a663b1fb6f893056ad81ca33660f94406e name: flink-kube-operator @@ -83,7 +93,7 @@ entries: version: 0.1.6 - apiVersion: v2 appVersion: 0.1.0 - created: "2025-03-04T18:04:35.494040193+03:30" + created: "2025-04-04T13:50:27.972800097+03:30" description: Helm chart for flink kube operator digest: 22ed155c8538ca5e7dc26863304eb9f76b09c454edbf709a891d7ccc440f35f6 name: flink-kube-operator @@ -93,7 +103,7 @@ entries: version: 0.1.5 - apiVersion: v2 appVersion: 0.1.0 - created: "2025-03-04T18:04:35.493584927+03:30" + created: "2025-04-04T13:50:27.972374168+03:30" description: Helm chart for flink kube operator digest: b548a64ef89bbcd12d92fefffd1fd37758e8fccda02aecd97c7519a08f10fa4a name: flink-kube-operator @@ -103,7 +113,7 @@ entries: version: 0.1.4 - apiVersion: v2 appVersion: 0.1.0 - created: "2025-03-04T18:04:35.493138547+03:30" + created: "2025-04-04T13:50:27.971952322+03:30" description: Helm chart for flink kube operator digest: 05a9664f574e2d5d1cca764efb6481ad21b9176663b907973a8ef5264f15a91f name: flink-kube-operator @@ -113,7 +123,7 @@ entries: version: 0.1.3 - apiVersion: v2 appVersion: 0.1.0 - created: "2025-03-04T18:04:35.492696005+03:30" + created: "2025-04-04T13:50:27.971461428+03:30" description: Helm chart for flink kube operator digest: 89345b1a9a79aa18b646705aeb8cfdc547629600cb8a00708a3f64d188f296f2 name: flink-kube-operator @@ -123,7 +133,7 @@ entries: version: 0.1.2 - apiVersion: v2 appVersion: 0.1.0 - created: "2025-03-04T18:04:35.490170385+03:30" + created: "2025-04-04T13:50:27.968770748+03:30" description: Helm chart for flink kube operator digest: 1d2af9af6b9889cc2962d627946464766f1b65b05629073b7fffb9a98cd957e2 name: flink-kube-operator @@ -133,7 +143,7 @@ entries: version: 0.1.1 - apiVersion: v2 appVersion: 0.1.0 - created: "2025-03-04T18:04:35.489734651+03:30" + created: "2025-04-04T13:50:27.968266924+03:30" description: Helm chart for flink kube operator digest: 0890d955904e6a3b2155c086a933b27e45266d896fb69eaad0e811dea40414da name: flink-kube-operator @@ -141,4 +151,4 @@ entries: urls: - flink-kube-operator-0.1.0.tgz version: 0.1.0 -generated: "2025-03-04T23:13:19.694944031+03:30" +generated: "2025-04-04T13:50:27.967565847+03:30" From 830e265162827c9605f290264bc289254ff25689 Mon Sep 17 00:00:00 2001 From: Mohammadreza Khani Date: Sat, 5 Apr 2025 01:39:02 +0330 Subject: [PATCH 6/8] feat: apply new helm structure use minio s3 for savepoint and checkpoint path separate task-manager, job-manager and operator use statefulset for task-manager to handle replication support basic credential for download jar request update to flink 1.20.1 --- .vscode/settings.json | 1 + Dockerfile | 3 +- Dockerfile.flink | 9 +- crds.yaml | 4 + example-job.yaml | 13 +- helm/chart/Chart.lock | 6 + helm/chart/Chart.yaml | 4 + helm/chart/charts/minio-16.0.2.tgz | Bin 0 -> 57792 bytes helm/chart/templates/NOTES.txt | 4 +- helm/chart/templates/flink/config.yaml | 33 ++++ helm/chart/templates/flink/data.pvc.yaml | 10 -- helm/chart/templates/flink/deploy.yaml | 165 ------------------ helm/chart/templates/flink/ha.pvc.yaml | 2 +- .../templates/flink/job-manager-deploy.yaml | 84 +++++++++ .../templates/flink/job-manager-service.yaml | 28 +++ helm/chart/templates/flink/savepoint.pvc.yaml | 10 -- helm/chart/templates/flink/service.yaml | 19 -- .../flink/task-manager-statefulset.yaml | 58 ++++++ helm/chart/templates/operator/deployment.yaml | 0 helm/chart/templates/operator/service.yaml | 8 +- .../chart/templates/operator/statefulset.yaml | 66 +++++++ helm/chart/values.yaml | 23 +-- helm/index.yaml | 20 +-- internal/crd/v1alpha1/flink_job.go | 16 +- internal/jar/jar.go | 54 +++++- internal/managed_job/jar.go | 2 +- 26 files changed, 386 insertions(+), 256 deletions(-) create mode 100644 helm/chart/Chart.lock create mode 100644 helm/chart/charts/minio-16.0.2.tgz create mode 100644 helm/chart/templates/flink/config.yaml delete mode 100644 helm/chart/templates/flink/data.pvc.yaml delete mode 100644 helm/chart/templates/flink/deploy.yaml create mode 100644 helm/chart/templates/flink/job-manager-deploy.yaml create mode 100644 helm/chart/templates/flink/job-manager-service.yaml delete mode 100644 helm/chart/templates/flink/savepoint.pvc.yaml delete mode 100644 helm/chart/templates/flink/service.yaml create mode 100644 helm/chart/templates/flink/task-manager-statefulset.yaml delete mode 100644 helm/chart/templates/operator/deployment.yaml create mode 100644 helm/chart/templates/operator/statefulset.yaml diff --git a/.vscode/settings.json b/.vscode/settings.json index 37077b5..54a8d12 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -14,6 +14,7 @@ "nindent", "reactivex", "repsert", + "taskmanager", "tolerations" ] } \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index beb8f96..3ad486a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ FROM public.ecr.aws/docker/library/golang:1.23.4-bookworm AS build ARG upx_version=4.2.4 -RUN apt-get update && apt-get install -y --no-install-recommends xz-utils && \ +RUN apt-get update && apt-get install -y --no-install-recommends xz-utils ca-certificates && \ curl -Ls https://github.com/upx/upx/releases/download/v${upx_version}/upx-${upx_version}-amd64_linux.tar.xz -o - | tar xvJf - -C /tmp && \ cp /tmp/upx-${upx_version}-amd64_linux/upx /usr/local/bin/ && \ chmod +x /usr/local/bin/upx && \ @@ -27,6 +27,7 @@ FROM public.ecr.aws/docker/library/busybox:1.37.0 AS final COPY --from=build /flink-kube-operator /flink-kube-operator +COPY --from=build /etc/ssl/certs /etc/ssl/certs EXPOSE 8083 diff --git a/Dockerfile.flink b/Dockerfile.flink index 584fb83..8a10ef3 100644 --- a/Dockerfile.flink +++ b/Dockerfile.flink @@ -1,4 +1,4 @@ -FROM public.ecr.aws/docker/library/flink:1.20.0-scala_2.12-java17 +FROM public.ecr.aws/docker/library/flink:1.20.1-scala_2.12-java17 # Set working directory WORKDIR /opt/flink @@ -15,17 +15,18 @@ RUN chmod +x /opt/flink/bin/start-cluster.sh RUN wget -q https://repo1.maven.org/maven2/org/apache/flink/flink-connector-kafka/3.4.0-1.20/flink-connector-kafka-3.4.0-1.20.jar -P /opt/flink/lib/ RUN wget -q https://repo1.maven.org/maven2/org/apache/kafka/kafka-clients/3.9.0/kafka-clients-3.9.0.jar -P /opt/flink/lib/ -RUN wget -q https://repo1.maven.org/maven2/org/apache/flink/flink-avro/1.20.0/flink-avro-1.20.0.jar -P /opt/flink/lib/ -RUN wget -q https://repo1.maven.org/maven2/org/apache/flink/flink-avro-confluent-registry/1.20.0/flink-avro-confluent-registry-1.20.0.jar -P /opt/flink/lib/ +RUN wget -q https://repo1.maven.org/maven2/org/apache/flink/flink-avro/1.20.1/flink-avro-1.20.1.jar -P /opt/flink/lib/ +RUN wget -q https://repo1.maven.org/maven2/org/apache/flink/flink-avro-confluent-registry/1.20.1/flink-avro-confluent-registry-1.20.1.jar -P /opt/flink/lib/ RUN wget -q https://repo1.maven.org/maven2/name/nkonev/flink/flink-sql-connector-clickhouse/1.17.1-8/flink-sql-connector-clickhouse-1.17.1-8.jar -P /opt/flink/lib/ RUN wget -q https://repo1.maven.org/maven2/org/apache/flink/flink-sql-connector-postgres-cdc/3.2.1/flink-sql-connector-postgres-cdc-3.2.1.jar -P /opt/flink/lib/ RUN wget -q https://repo1.maven.org/maven2/org/apache/avro/avro/1.8.2/avro-1.8.2.jar -P /opt/flink/lib/ RUN wget -q https://repo1.maven.org/maven2/net/objecthunter/exp4j/0.4.5/exp4j-0.4.5.jar -P /opt/flink/lib/ RUN wget -q https://jdbc.postgresql.org/download/postgresql-42.7.4.jar -P /opt/flink/lib/ -RUN wget -q https://repo1.maven.org/maven2/org/apache/flink/flink-sql-jdbc-driver/1.20.0/flink-sql-jdbc-driver-1.20.0.jar -P /opt/flink/lib/ +RUN wget -q https://repo1.maven.org/maven2/org/apache/flink/flink-sql-jdbc-driver/1.20.1/flink-sql-jdbc-driver-1.20.1.jar -P /opt/flink/lib/ RUN wget -q https://repo1.maven.org/maven2/org/apache/flink/flink-jdbc_2.12/1.10.3/flink-jdbc_2.12-1.10.3.jar -P /opt/flink/lib/ RUN wget -q https://repo1.maven.org/maven2/com/aventrix/jnanoid/jnanoid/2.0.0/jnanoid-2.0.0.jar -P /opt/flink/lib/ RUN wget -q https://repo1.maven.org/maven2/org/apache/flink/flink-connector-jdbc/3.2.0-1.19/flink-connector-jdbc-3.2.0-1.19.jar -P /opt/flink/lib/ +RUN wget -q https://repo1.maven.org/maven2/org/apache/flink/flink-s3-fs-presto/1.20.1/flink-s3-fs-presto-1.20.1.jar -P /opt/flink/lib/ # Command to start Flink JobManager and TaskManager in a mini-cluster setup CMD ["bin/start-cluster.sh"] \ No newline at end of file diff --git a/crds.yaml b/crds.yaml index c044377..5de3b21 100644 --- a/crds.yaml +++ b/crds.yaml @@ -36,6 +36,10 @@ spec: type: integer jarUri: type: string + jarURIBasicAuthUsername: + type: string + jarURIBasicAuthPassword: + type: string args: type: array items: diff --git a/example-job.yaml b/example-job.yaml index ebd74a2..a1b3068 100644 --- a/example-job.yaml +++ b/example-job.yaml @@ -3,13 +3,14 @@ apiVersion: flink.logicamp.tech/v1alpha1 kind: FlinkJob metadata: name: my-flink-job - namespace: default spec: key: word-count name: "Word Count Example" - entryClass: "org.apache.flink.examples.java.wordcount.WordCount" - parallelism: 2 - jarUri: "http://192.168.7.7:8080/product-enrichment-processor.jar" + entryClass: "tech.logicamp.logiline.FacilityEnrichment" + parallelism: 1 + jarUri: "https://git.logicamp.tech/api/packages/logiline/generic/facility-enrichment/1.0.0/facility-enrichment.jar" + jarURIBasicAuthUsername: logiline-actrunner + jarURIBasicAuthPassword: daeweeb7ohpaiw3oojiCoong flinkConfiguration: - taskmanager.numberOfTaskSlots: "2" - parallelism.default: "2" \ No newline at end of file + taskmanager.numberOfTaskSlots: "1" + parallelism.default: "1" \ No newline at end of file diff --git a/helm/chart/Chart.lock b/helm/chart/Chart.lock new file mode 100644 index 0000000..f6368ff --- /dev/null +++ b/helm/chart/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: minio + repository: https://charts.bitnami.com/bitnami + version: 16.0.2 +digest: sha256:9a822e9c5a4eee1b6515c143150c1dd6f84ceb080a7be4573e09396c5916f7d3 +generated: "2025-04-04T14:42:09.771390014+03:30" diff --git a/helm/chart/Chart.yaml b/helm/chart/Chart.yaml index 9fc1a17..7bf5006 100644 --- a/helm/chart/Chart.yaml +++ b/helm/chart/Chart.yaml @@ -4,3 +4,7 @@ description: Helm chart for flink kube operator type: application version: 0.1.14 appVersion: "0.1.0" +dependencies: + - name: minio + repository: https://charts.bitnami.com/bitnami + version: 16.0.2 \ No newline at end of file diff --git a/helm/chart/charts/minio-16.0.2.tgz b/helm/chart/charts/minio-16.0.2.tgz new file mode 100644 index 0000000000000000000000000000000000000000..624d25b9aab91a620c87730427984c93387cfeb0 GIT binary patch literal 57792 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�F37GNcwUb%=DPO%xix;y`0FXyotRl{6E_AsRc)~Ka5nWVc!1~D6}+00B* zNM71wL#RF5Q%ZaGHfEIeSfh_p+RO0lC*A81G8~PQp#GXtD&4EBcTdYp1AqE;r8G0q zLMo^?rx}HJRL&u=UTe=N$nH$&`r>9Y1HED`DfRs$7T)IYOd|hrUHZflV1@km zoJxJB{I|W;TFQTmcpi)VC+|>R0hJxTAc^VflgeoSQ``_yHf`JlX{qTf7eX1&W67aP zSzhkqCA;G(ym%1<ph0vLvM`#%e${aDd(@+I=E>b`1daEv!qI%PC5r@cvJ4rZ!vijSOJn9!0lp=T@f zRI(S<1tnk3oF((B**=|xSLotq+Jz}ruAD1iR4x6@Z+1}i(IAj2p-iJP%Mo1RwWaR< zz+*aVFj&%mnIkL3_5_&DBY9RtYe+Wl1=ZmrIcnU;QPzSbM_@LW_C-}peU|byh%l>l z4`{N%RF1J4+qq#Kle2}g0AwRmh2zXkTQPxhs>TjDKlRl7gn>G6Pji&!&3@TRDn5t_ z=6za4RY5DWs;YRie-&j_nNWA13Xc0*ZZoT_#5()Jl~zS!_7^#;^;K62mz-I7HG%$T z7^kDFB$)gXutNW{v(?Jk|8H(C?f)0@JQn?rokR43E`$&f785+Hl=P0{E2oS{C`8Lk z(`D<4Om6D22L9{Dm#+9$#w*Z2jB*?AP!6SC`1NwM(DgF#3;*%=7b?4;s6Qz#CI zh!r^xeFYY~*xb~IQz9}H_AzP0bC%APAx=m!)5+*14b3Q~tCRJ(C3PXs35Zj1B%g2! z(5BFA<6fmbg}co`;Hy2Nd*L2g(Kk{fT+KmH^_pLrC3H*FHJ1G;MwjghdX~Dfl2IXP z=XN1`kN3byRAu&btVC_$i>6}hc;?65R76k6>GC$$rA^J5->JO~r)PQATaz!CTnfij zK{5p-F*KIBN)Kh_{@QjOb)N~&|6PheKk6m^q!u7m{y#fyGymJx#`CS^`F|15<39h- z;p~@D?LYi8 zOxA-TJ&4eqjzwJdDP&4^$Nke|k%zV19z+l{??rI}N^aHeB>%>L znX%w>w;%*P0;dE_`t zNjXaVDDC?^-DNMlybLfR76g>znKc0lnefQx8Igcd`;ek!6kG+lWJiaXCEEyRCq4`D zK_)Hd)-ZTmR>bIYlOx#a%KzWq)$BA3!{9qlfy#v)N~wgjr`YsJX_m+t03@w6)FZ!uGsH-Oc!=L(P^HL1n>(pe5DnS2I`F>bOD-8Ib4FBTbnm;Sgg(o$K=E=<3;}`WClnj-4sSvql);0xwfca#Fx4+257Q`sv`tdk^D%QZ?|_RlP8Q`iL#oNf!vZB_VmEo1ryu t^CvAkLSDK}35exJq-<3o`!H~Cu0GVCJvIzu7{mAn;}g|fn27+K1pwz1dUyZ; literal 0 HcmV?d00001 diff --git a/helm/chart/templates/NOTES.txt b/helm/chart/templates/NOTES.txt index 8236e73..6d4a21d 100644 --- a/helm/chart/templates/NOTES.txt +++ b/helm/chart/templates/NOTES.txt @@ -17,6 +17,6 @@ {{- else if contains "ClusterIP" .Values.service.type }} export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "flink-kube-operator.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") - echo "Visit http://127.0.0.1:8080 to use your application" - kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT + echo "Visit http://127.0.0.1:8081 to use your application" + kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8081:$CONTAINER_PORT {{- end }} diff --git a/helm/chart/templates/flink/config.yaml b/helm/chart/templates/flink/config.yaml new file mode 100644 index 0000000..d7d77dc --- /dev/null +++ b/helm/chart/templates/flink/config.yaml @@ -0,0 +1,33 @@ +{{- define "flink.env" -}} +- name: JOB_MANAGER_RPC_ADDRESS + value: "localhost" +- name: NAMESPACE + value: {{ .Release.Namespace }} +- name: FLINK_PROPERTIES + value: | + jobmanager.rpc.address: {{ .Release.Name }}-flink-job-manager + jobmanager.memory.process.size: {{ .Values.flink.jobManager.processMemory }} + taskmanager.memory.process.size: {{ .Values.flink.taskManager.processMemory }} + taskmanager.data.port: 6125 + taskmanager.numberOfTaskSlots: {{ .Values.flink.taskManager.numberOfTaskSlots }} + parallelism.default: {{ .Values.flink.parallelism.default }} + state.backend: {{ .Values.flink.state.backend }} + rest.port: 8081 + rootLogger.level = DEBUG + rootLogger.appenderRef.console.ref = ConsoleAppender + high-availability.type: kubernetes + kubernetes.namespace: {{ .Release.Namespace }} + kubernetes.cluster-id: {{ .Values.clusterId | default (print .Release.Name "-cluster") }} + execution.checkpointing.interval: {{ .Values.flink.checkpoint.interval }} + execution.checkpointing.mode: {{ .Values.flink.checkpoint.mode }} + state.checkpoints.dir: s3://{{ .Release.Name }}-minio:9000/checkpoints + state.backend.rocksdb.localdir: /opt/flink/rocksdb + high-availability.storageDir: /opt/flink/ha + state.savepoints.dir: s3://{{ .Release.Name }}-minio:9000/savepoints + state.backend.incremental: {{ .Values.flink.state.incremental }} + rest.profiling.enabled: true + s3.endpoint: http://{{ .Release.Name }}-minio:9000 # Use Kubernetes service name + s3.path.style.access: true + s3.fs.hadoop.impl: org.apache.hadoop.fs.s3a.S3AFileSystem # Keep for compatibility + fs.s3a.aws.credentials.provider: com.amazonaws.auth.DefaultAWSCredentialsProviderChain +{{- end }} diff --git a/helm/chart/templates/flink/data.pvc.yaml b/helm/chart/templates/flink/data.pvc.yaml deleted file mode 100644 index e09bdea..0000000 --- a/helm/chart/templates/flink/data.pvc.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ .Values.flink.state.data.pvcName }} -spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: {{ .Values.flink.state.data.size }} # Use size defined in values.yaml diff --git a/helm/chart/templates/flink/deploy.yaml b/helm/chart/templates/flink/deploy.yaml deleted file mode 100644 index 5a7c74e..0000000 --- a/helm/chart/templates/flink/deploy.yaml +++ /dev/null @@ -1,165 +0,0 @@ -{{- define "flink.env" -}} -- name: JOB_MANAGER_RPC_ADDRESS - value: "localhost" -- name: NAMESPACE - value: {{ .Release.Namespace }} -- name: FLINK_PROPERTIES - value: | - jobmanager.rpc.address: localhost - jobmanager.memory.process.size: {{ .Values.flink.jobManager.processMemory }} - taskmanager.memory.process.size: {{ .Values.flink.taskManager.processMemory }} - taskmanager.data.port: 6125 - taskmanager.numberOfTaskSlots: {{ .Values.flink.taskManager.numberOfTaskSlots }} - parallelism.default: {{ .Values.flink.parallelism.default }} - state.backend: {{ .Values.flink.state.backend }} - rest.port: 8081 - rootLogger.level = DEBUG - rootLogger.appenderRef.console.ref = ConsoleAppender - high-availability.type: kubernetes - kubernetes.namespace: {{ .Release.Namespace }} - kubernetes.cluster-id: {{ .Values.clusterId | default (print .Release.Name "-cluster") }} - execution.checkpointing.interval: {{ .Values.flink.checkpoint.interval }} - execution.checkpointing.mode: {{ .Values.flink.checkpoint.mode }} - web.upload.dir: {{ .Values.flink.state.data.dir }}/web-upload - state.checkpoints.dir: file://{{ .Values.flink.state.data.dir }}/checkpoints - state.backend.rocksdb.localdir: file://{{ .Values.flink.state.data.dir }}/rocksdb - high-availability.storageDir: file://{{ .Values.flink.state.ha.dir }} - state.savepoints.dir: file://{{ .Values.flink.state.savepoints.dir }} - state.backend.incremental: {{ .Values.flink.state.incremental }} - rest.profiling.enabled: true -{{- end }} - -{{- define "flink.volumeMounts" -}} -- name: flink-data - mountPath: {{ .Values.flink.state.data.dir }}/data -- name: flink-data - mountPath: {{ .Values.flink.state.data.dir }}/rocksdb - subPath: rocksdb -- name: flink-data - mountPath: {{ .Values.flink.state.data.dir }}/checkpoints - subPath: checkpoints -- name: flink-data - mountPath: {{ .Values.flink.state.data.dir }}/web-upload - subPath: web-upload -- name: flink-ha - mountPath: {{ .Values.flink.state.ha.dir }} -- name: flink-savepoints - mountPath: {{ .Values.flink.state.savepoints.dir }} -{{- end }} - -{{- define "flink.volumes" -}} -- name: flink-data - persistentVolumeClaim: - claimName: {{ .Values.flink.state.data.pvcName }} -- name: flink-savepoints - persistentVolumeClaim: - claimName: {{ .Values.flink.state.savepoints.pvcName }} -- name: flink-ha - persistentVolumeClaim: - claimName: {{ .Values.flink.state.ha.pvcName }} -{{- end }} - -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ .Release.Name }}-flink - labels: - app.kubernetes.io/name: {{ .Release.Name }}-flink - app.kubernetes.io/instance: {{ .Release.Name }} -spec: - replicas: 1 - strategy: - type: Recreate - selector: - matchLabels: - app.kubernetes.io/name: {{ .Release.Name }}-flink - app.kubernetes.io/instance: {{ .Release.Name }} - template: - metadata: - labels: - app.kubernetes.io/name: {{ .Release.Name }}-flink - app.kubernetes.io/instance: {{ .Release.Name }} - spec: - serviceAccountName: {{ include "flink-kube-operator.serviceAccountName" . }} - initContainers: - - name: volume-mount-hack - image: {{ .Values.flink.image.repository }}:{{ .Values.flink.image.tag }} - runAsUser: 0 - command: ["sh", "-c", "chown -R flink {{ .Values.flink.state.data.dir }}/data {{ .Values.flink.state.data.dir }}/rocksdb {{ .Values.flink.state.data.dir }}/checkpoints {{ .Values.flink.state.data.dir }}/web-upload {{ .Values.flink.state.ha.dir }} {{ .Values.flink.state.savepoints.dir }}"] - volumeMounts: - {{- include "flink.volumeMounts" . | nindent 12 }} - containers: - - name: jobmanager - image: {{ .Values.flink.image.repository }}:{{ .Values.flink.image.tag }} - imagePullPolicy: Always - args: ["jobmanager"] - ports: - - containerPort: 6123 # JobManager RPC port - name: rpc - - containerPort: 6124 # JobManager blob server port - name: blob - - containerPort: 6125 # JobManager queryable state port - name: query - - containerPort: 8081 # JobManager Web UI port - name: ui - env: - {{- include "flink.env" . | nindent 12 }} - - name: POD_IP - valueFrom: - fieldRef: - fieldPath: status.podIP - volumeMounts: - {{- include "flink.volumeMounts" . | nindent 12 }} - - name: taskmanager - image: {{ .Values.flink.image.repository }}:{{ .Values.flink.image.tag }} - imagePullPolicy: Always - args: ["taskmanager"] - ports: - - containerPort: 6121 # TaskManager data port - name: data - - containerPort: 6122 # TaskManager RPC port - name: rpc - env: - {{- include "flink.env" . | nindent 12 }} - - name: POD_IP - valueFrom: - fieldRef: - fieldPath: status.podIP - volumeMounts: - {{- include "flink.volumeMounts" . | nindent 12 }} - - name: operator - securityContext: - {{- toYaml .Values.securityContext | nindent 12 }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - ports: - - name: http - containerPort: {{ .Values.service.port }} - protocol: TCP - env: - - name: FLINK_API_URL - value: localhost:8081 - - name: SAVEPOINT_PATH - value: file://{{ .Values.flink.state.savepoints.dir }} - - name: NAMESPACE - value: "{{ .Release.Namespace }}" - - resources: - {{- toYaml .Values.resources | nindent 12 }} - volumeMounts: - {{- include "flink.volumeMounts" . | nindent 12 }} - volumes: - {{- include "flink.volumes" . | nindent 8 }} - - {{- with .Values.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} diff --git a/helm/chart/templates/flink/ha.pvc.yaml b/helm/chart/templates/flink/ha.pvc.yaml index fcff631..ee3b672 100644 --- a/helm/chart/templates/flink/ha.pvc.yaml +++ b/helm/chart/templates/flink/ha.pvc.yaml @@ -1,7 +1,7 @@ apiVersion: v1 kind: PersistentVolumeClaim metadata: - name: {{ .Values.flink.state.ha.pvcName }} + name: {{ .Release.Name }}-{{ .Values.flink.state.ha.pvcName }} spec: accessModes: - ReadWriteOnce diff --git a/helm/chart/templates/flink/job-manager-deploy.yaml b/helm/chart/templates/flink/job-manager-deploy.yaml new file mode 100644 index 0000000..017bef4 --- /dev/null +++ b/helm/chart/templates/flink/job-manager-deploy.yaml @@ -0,0 +1,84 @@ + +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Release.Name }}-flink-job-manager + labels: + app: {{ .Release.Name }}-flink-operator + component: {{ .Release.Name }}-flink-job-manager +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app: {{ .Release.Name }}-flink-operator + component: {{ .Release.Name }}-flink-job-manager + template: + metadata: + labels: + app: {{ .Release.Name }}-flink-operator + component: {{ .Release.Name }}-flink-job-manager + spec: + serviceAccountName: {{ include "flink-kube-operator.serviceAccountName" . }} + initContainers: + - name: volume-mount-hack + image: {{ .Values.flink.image.repository }}:{{ .Values.flink.image.tag }} + runAsUser: 0 + command: ["sh", "-c", "chown -R flink {{ .Values.flink.state.ha.dir }}"] + volumeMounts: + - name: flink-ha + mountPath: {{ .Values.flink.state.ha.dir }} + containers: + - name: jobmanager + image: {{ .Values.flink.image.repository }}:{{ .Values.flink.image.tag }} + imagePullPolicy: Always + args: ["jobmanager"] + ports: + - containerPort: 6123 # JobManager RPC port + name: rpc + - containerPort: 6124 # JobManager blob server port + name: blob + - containerPort: 6125 # JobManager queryable state port + name: query + - containerPort: 8081 # JobManager Web UI port + name: ui + env: + {{- include "flink.env" . | nindent 12 }} + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: S3_ENDPOINT + value: "http://minio-service:9000" + - name: AWS_ACCESS_KEY_ID + valueFrom: + secretKeyRef: + name: {{ .Release.Name }}-flink-secrets + key: minio_access_key + - name: AWS_SECRET_ACCESS_KEY + valueFrom: + secretKeyRef: + name: {{ .Release.Name }}-flink-secrets + key: minio_secret_key + volumeMounts: + - name: flink-ha + mountPath: {{ .Values.flink.state.ha.dir }} + + volumes: + - name: flink-ha + persistentVolumeClaim: + claimName: {{ .Release.Name }}-{{ .Values.flink.state.ha.pvcName }} + + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/helm/chart/templates/flink/job-manager-service.yaml b/helm/chart/templates/flink/job-manager-service.yaml new file mode 100644 index 0000000..c7d3af3 --- /dev/null +++ b/helm/chart/templates/flink/job-manager-service.yaml @@ -0,0 +1,28 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Release.Name }}-flink-job-manager + labels: + app.kubernetes.io/name: {{ .Release.Name }}-flink-job-manager + app.kubernetes.io/instance: {{ .Release.Name }} +spec: + ports: + - name: flink-web-ui + port: 8081 + targetPort: 8081 + - name: rpc + port: 6123 + targetPort: 6123 + - name: blob + port: 6124 + targetPort: 6124 + - name: query + port: 6125 + targetPort: 6125 + - name: operator + port: 3000 + targetPort: 3000 + selector: + app: {{ .Release.Name }}-flink-operator + component: {{ .Release.Name }}-flink-job-manager + type: ClusterIP # Change to LoadBalancer if you want external access diff --git a/helm/chart/templates/flink/savepoint.pvc.yaml b/helm/chart/templates/flink/savepoint.pvc.yaml deleted file mode 100644 index 6906af1..0000000 --- a/helm/chart/templates/flink/savepoint.pvc.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ .Values.flink.state.savepoints.pvcName }} -spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: {{ .Values.flink.state.savepoints.size }} # Use size defined in values.yaml diff --git a/helm/chart/templates/flink/service.yaml b/helm/chart/templates/flink/service.yaml deleted file mode 100644 index 5a7cc1b..0000000 --- a/helm/chart/templates/flink/service.yaml +++ /dev/null @@ -1,19 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: flink - labels: - app.kubernetes.io/name: {{ .Release.Name }}-flink - app.kubernetes.io/instance: {{ .Release.Name }} -spec: - ports: - - port: 8081 - name: flink-web-ui - targetPort: 8081 - - port: 3000 - name: operator - targetPort: 3000 - selector: - app.kubernetes.io/name: {{ .Release.Name }}-flink - app.kubernetes.io/instance: {{ .Release.Name }} - type: ClusterIP # Change to LoadBalancer if you want external access diff --git a/helm/chart/templates/flink/task-manager-statefulset.yaml b/helm/chart/templates/flink/task-manager-statefulset.yaml new file mode 100644 index 0000000..cd260a9 --- /dev/null +++ b/helm/chart/templates/flink/task-manager-statefulset.yaml @@ -0,0 +1,58 @@ + +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ .Release.Name }}-flink-task-manager + labels: + app: {{ .Release.Name }}-flink-operator + component: taskmanager +spec: + serviceName: {{ .Release.Name }}-flink-task-manager + replicas: {{ .Values.flink.taskManager.replicas }} + selector: + matchLabels: + app: {{ .Release.Name }}-flink-operator + component: {{ .Release.Name }}-flink-task-manager + template: + metadata: + labels: + app: {{ .Release.Name }}-flink-operator + component: {{ .Release.Name }}-flink-task-manager + spec: + serviceAccountName: {{ include "flink-kube-operator.serviceAccountName" . }} + containers: + - name: task-manager + image: {{ .Values.flink.image.repository }}:{{ .Values.flink.image.tag }} + imagePullPolicy: Always + args: ["taskmanager"] + env: + {{- include "flink.env" . | nindent 8 }} + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: S3_ENDPOINT + value: "http://minio-service:9000" + - name: AWS_ACCESS_KEY_ID + valueFrom: + secretKeyRef: + name: {{ .Release.Name }}-flink-secrets + key: minio_access_key + - name: AWS_SECRET_ACCESS_KEY + valueFrom: + secretKeyRef: + name: {{ .Release.Name }}-flink-secrets + key: minio_secret_key + volumeMounts: + - name: rocksdb-storage + mountPath: /opt/flink/rocksdb + resources: + {{- toYaml .Values.flink.taskManager.resources | nindent 10 }} + volumeClaimTemplates: + - metadata: + name: rocksdb-storage + spec: + accessModes: [ ReadWriteOnce ] + resources: + requests: + storage: {{ .Values.flink.taskManager.storage.rocksDb.size }} diff --git a/helm/chart/templates/operator/deployment.yaml b/helm/chart/templates/operator/deployment.yaml deleted file mode 100644 index e69de29..0000000 diff --git a/helm/chart/templates/operator/service.yaml b/helm/chart/templates/operator/service.yaml index 887cfb0..cef229a 100644 --- a/helm/chart/templates/operator/service.yaml +++ b/helm/chart/templates/operator/service.yaml @@ -1,9 +1,10 @@ apiVersion: v1 kind: Service metadata: - name: {{ include "flink-kube-operator.fullname" . }} + name: {{ .Release.Name }}-flink-operator labels: - {{- include "flink-kube-operator.labels" . | nindent 4 }} + app: {{ .Release.Name }}-flink-operator + component: {{ .Release.Name }}-flink-operator spec: type: {{ .Values.service.type }} ports: @@ -12,4 +13,5 @@ spec: protocol: TCP name: http selector: - {{- include "flink-kube-operator.selectorLabels" . | nindent 4 }} + app: {{ .Release.Name }}-flink-operator + component: {{ .Release.Name }}-flink-operator diff --git a/helm/chart/templates/operator/statefulset.yaml b/helm/chart/templates/operator/statefulset.yaml new file mode 100644 index 0000000..4b90465 --- /dev/null +++ b/helm/chart/templates/operator/statefulset.yaml @@ -0,0 +1,66 @@ + +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ .Release.Name }}-flink-operator + labels: + app: {{ .Release.Name }}-flink-operator + component: {{ .Release.Name }}-flink-operator +spec: + serviceName: {{ .Release.Name }}-flink-operator + replicas: 1 + selector: + matchLabels: + app: {{ .Release.Name }}-flink-operator + component: {{ .Release.Name }}-flink-operator + template: + metadata: + labels: + app: {{ .Release.Name }}-flink-operator + component: {{ .Release.Name }}-flink-operator + spec: + serviceAccountName: {{ include "flink-kube-operator.serviceAccountName" . }} + initContainers: + - name: wait-for-jobmanager + image: curlimages/curl:8.5.0 # Lightweight curl image + command: + - sh + - -c + - | + echo "Waiting for Flink JobManager to be ready..." + until curl -sSf "http://{{ .Release.Name }}-flink-job-manager:8081/taskmanagers"; do + echo "JobManager not ready yet - retrying in 5s..." + sleep 5 + done + echo "JobManager is ready!" + containers: + - name: operator + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - name: http + containerPort: {{ .Values.service.port }} + protocol: TCP + env: + - name: FLINK_API_URL + value: {{ .Release.Name }}-flink-job-manager:8081 + - name: SAVEPOINT_PATH + value: s3://{{ .Release.Name }}-minio:9000/savepoints + - name: NAMESPACE + value: "{{ .Release.Namespace }}" + - name: S3_ENDPOINT + value: "http://{{ .Release.Name }}-minio:9000" + - name: AWS_ACCESS_KEY_ID + valueFrom: + secretKeyRef: + name: {{ .Release.Name }}-minio + key: root-user + - name: AWS_SECRET_ACCESS_KEY + valueFrom: + secretKeyRef: + name: {{ .Release.Name }}-minio + key: root-password + + diff --git a/helm/chart/values.yaml b/helm/chart/values.yaml index a9ec791..0bf2e4a 100644 --- a/helm/chart/values.yaml +++ b/helm/chart/values.yaml @@ -117,7 +117,7 @@ affinity: {} flink: image: repository: lcr.logicamp.tech/library/flink - tag: 1.20.0-scala_2.12-java17-minicluster + tag: 1.20.1-scala_2.12-java17-minicluster parallelism: default: 1 # Default parallelism for Flink jobs @@ -129,14 +129,6 @@ flink: state: backend: rocksdb # Use RocksDB for state backend incremental: true - savepoints: - dir: "/opt/flink/savepoints" # Directory to store savepoints - pvcName: flink-savepoints-pvc # PVC for savepoints persistence - size: 10Gi # PVC size for savepoints storage - data: - dir: "/opt/flink/data" # Directory to store checkpoints/web-upload/rocksdb - pvcName: flink-data-pvc # PVC for checkpoints/web-upload/rocksdb - size: 10Gi # PVC size for checkpoints/web-upload/rocksdb ha: dir: "/opt/flink/ha" # Directory to store ha data pvcName: flink-ha-pvc # PVC for ha @@ -149,5 +141,14 @@ flink: taskManager: numberOfTaskSlots: 12 # Number of task slots for TaskManager processMemory: 4096m # Size of task manager process memory - -# clusterId: some-id \ No newline at end of file + replicas: 1 + storage: + rocksDb: + size: 4Gi + resources: + limits: + cpu: 3 + memory: 4Gi + requests: + cpu: 1 + memory: 2Gi \ No newline at end of file diff --git a/helm/index.yaml b/helm/index.yaml index 678c5d9..f07333c 100644 --- a/helm/index.yaml +++ b/helm/index.yaml @@ -53,7 +53,7 @@ entries: version: 0.1.10 - apiVersion: v2 appVersion: 0.1.0 - created: "2025-04-04T13:50:27.975218534+03:30" + created: "2025-03-04T18:04:35.495842696+03:30" description: Helm chart for flink kube operator digest: abc08853c65ba36ff3485f182555522408e150f2508d4cac672d588972ddca3c name: flink-kube-operator @@ -63,7 +63,7 @@ entries: version: 0.1.9 - apiVersion: v2 appVersion: 0.1.0 - created: "2025-04-04T13:50:27.974750898+03:30" + created: "2025-03-04T18:04:35.495392608+03:30" description: Helm chart for flink kube operator digest: 3986a0a2348db1e17a1524eb0d87eabf6d64050d4007c5b393f723393cc4b675 name: flink-kube-operator @@ -73,7 +73,7 @@ entries: version: 0.1.8 - apiVersion: v2 appVersion: 0.1.0 - created: "2025-04-04T13:50:27.974306458+03:30" + created: "2025-03-04T18:04:35.494948853+03:30" description: Helm chart for flink kube operator digest: 1bbeb92ecd10e36fa7d742a61cced0d842139ada0cfeff6fa1b0cf8718189235 name: flink-kube-operator @@ -83,7 +83,7 @@ entries: version: 0.1.7 - apiVersion: v2 appVersion: 0.1.0 - created: "2025-04-04T13:50:27.973833587+03:30" + created: "2025-03-04T18:04:35.49450822+03:30" description: Helm chart for flink kube operator digest: 4031f4a79e65f6c5e60b6ebf9dd7e2a663b1fb6f893056ad81ca33660f94406e name: flink-kube-operator @@ -93,7 +93,7 @@ entries: version: 0.1.6 - apiVersion: v2 appVersion: 0.1.0 - created: "2025-04-04T13:50:27.972800097+03:30" + created: "2025-03-04T18:04:35.494040193+03:30" description: Helm chart for flink kube operator digest: 22ed155c8538ca5e7dc26863304eb9f76b09c454edbf709a891d7ccc440f35f6 name: flink-kube-operator @@ -103,7 +103,7 @@ entries: version: 0.1.5 - apiVersion: v2 appVersion: 0.1.0 - created: "2025-04-04T13:50:27.972374168+03:30" + created: "2025-03-04T18:04:35.493584927+03:30" description: Helm chart for flink kube operator digest: b548a64ef89bbcd12d92fefffd1fd37758e8fccda02aecd97c7519a08f10fa4a name: flink-kube-operator @@ -113,7 +113,7 @@ entries: version: 0.1.4 - apiVersion: v2 appVersion: 0.1.0 - created: "2025-04-04T13:50:27.971952322+03:30" + created: "2025-03-04T18:04:35.493138547+03:30" description: Helm chart for flink kube operator digest: 05a9664f574e2d5d1cca764efb6481ad21b9176663b907973a8ef5264f15a91f name: flink-kube-operator @@ -123,7 +123,7 @@ entries: version: 0.1.3 - apiVersion: v2 appVersion: 0.1.0 - created: "2025-04-04T13:50:27.971461428+03:30" + created: "2025-03-04T18:04:35.492696005+03:30" description: Helm chart for flink kube operator digest: 89345b1a9a79aa18b646705aeb8cfdc547629600cb8a00708a3f64d188f296f2 name: flink-kube-operator @@ -133,7 +133,7 @@ entries: version: 0.1.2 - apiVersion: v2 appVersion: 0.1.0 - created: "2025-04-04T13:50:27.968770748+03:30" + created: "2025-03-04T18:04:35.490170385+03:30" description: Helm chart for flink kube operator digest: 1d2af9af6b9889cc2962d627946464766f1b65b05629073b7fffb9a98cd957e2 name: flink-kube-operator @@ -143,7 +143,7 @@ entries: version: 0.1.1 - apiVersion: v2 appVersion: 0.1.0 - created: "2025-04-04T13:50:27.968266924+03:30" + created: "2025-03-04T18:04:35.489734651+03:30" description: Helm chart for flink kube operator digest: 0890d955904e6a3b2155c086a933b27e45266d896fb69eaad0e811dea40414da name: flink-kube-operator diff --git a/internal/crd/v1alpha1/flink_job.go b/internal/crd/v1alpha1/flink_job.go index 930da8c..e0dfe8a 100644 --- a/internal/crd/v1alpha1/flink_job.go +++ b/internal/crd/v1alpha1/flink_job.go @@ -10,13 +10,15 @@ import ( //go:generate go run sigs.k8s.io/controller-tools/cmd/controller-gen object paths=$GOFILE type FlinkJobSpec struct { - Key string `json:"key"` - Name string `json:"name"` - Parallelism int `json:"parallelism"` - JarURI string `json:"jarUri"` - SavepointInterval metaV1.Duration `json:"savepointInterval"` - EntryClass string `json:"entryClass"` - Args []string `json:"args"` + Key string `json:"key"` + Name string `json:"name"` + Parallelism int `json:"parallelism"` + JarURI string `json:"jarUri"` + JarURIBasicAuthUsername *string `json:"jarURIBasicAuthUsername"` + JarURIBasicAuthPassword *string `json:"jarURIBasicAuthPassword"` + SavepointInterval metaV1.Duration `json:"savepointInterval"` + EntryClass string `json:"entryClass"` + Args []string `json:"args"` } type FlinkJobStatus struct { diff --git a/internal/jar/jar.go b/internal/jar/jar.go index 2fafc9b..78de3d4 100644 --- a/internal/jar/jar.go +++ b/internal/jar/jar.go @@ -2,10 +2,12 @@ package jar import ( "crypto/rand" + "encoding/base64" "encoding/hex" "errors" "io" "net/http" + "net/http/cookiejar" "os" "strings" @@ -16,13 +18,17 @@ import ( ) type JarFile struct { - uri string - filePath string + uri string + filePath string + basicAuthUsername *string + basicAuthPassword *string } -func NewJarFile(URI string) (*JarFile, error) { +func NewJarFile(URI string, basicAuthUsername *string, basicAuthPassword *string) (*JarFile, error) { jarFile := &JarFile{ - uri: URI, + uri: URI, + basicAuthUsername: basicAuthUsername, + basicAuthPassword: basicAuthPassword, } err := jarFile.Download() if err != nil { @@ -57,9 +63,45 @@ func (jarFile *JarFile) Download() error { } defer out.Close() - resp, err := http.Get(jarFile.uri) - if err != nil || resp.StatusCode > 299 { + + var resp *http.Response + if jarFile.basicAuthPassword != nil && jarFile.basicAuthUsername != nil { + + basicAuth := func(username, password string) string { + auth := username + ":" + password + return base64.StdEncoding.EncodeToString([]byte(auth)) + } + + redirectPolicyFunc := func(req *http.Request, via []*http.Request) error { + req.Header.Add("Authorization", "Basic "+basicAuth(*jarFile.basicAuthUsername, *jarFile.basicAuthPassword)) + return nil + } + + client := &http.Client{ + Jar: &cookiejar.Jar{}, + CheckRedirect: redirectPolicyFunc, + } + + req, err := http.NewRequest("GET", jarFile.uri, nil) + if err != nil { + jarFile.delete() + return err + } + req.Header.Add("Authorization", "Basic "+basicAuth(*jarFile.basicAuthUsername, *jarFile.basicAuthPassword)) + resp, err = client.Do(req) + } else { + resp, err = http.Get(jarFile.uri) + } + if err != nil { jarFile.delete() + pkg.Logger.Error("error in downloading jar", zap.Error(err)) + return err + } + if resp.StatusCode > 299 { + respBody := []byte{} + resp.Body.Read(respBody) + err = errors.New(string(respBody) + " status:" + resp.Status) + pkg.Logger.Error("error in downloading jar", zap.Error(err)) return err } diff --git a/internal/managed_job/jar.go b/internal/managed_job/jar.go index 515081e..0f376b4 100644 --- a/internal/managed_job/jar.go +++ b/internal/managed_job/jar.go @@ -9,7 +9,7 @@ import ( // upload jar file and set the jarId for later usages func (job *ManagedJob) upload() error { - jarFile, err := jar.NewJarFile(job.def.Spec.JarURI) + jarFile, err := jar.NewJarFile(job.def.Spec.JarURI, job.def.Spec.JarURIBasicAuthUsername, job.def.Spec.JarURIBasicAuthPassword) if err != nil { pkg.Logger.Debug("[manage-job] [upload] error on download jar", zap.Error(err)) return err From 54008669cbdcf7a27cdabc3ccec3b93ec5897df8 Mon Sep 17 00:00:00 2001 From: Mohammadreza Khani Date: Sun, 6 Apr 2025 01:49:00 +0330 Subject: [PATCH 7/8] fix(helm): wrong savepoint and checkpoint s3 configs --- helm/chart/templates/flink/config.yaml | 8 +++----- helm/chart/templates/operator/statefulset.yaml | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/helm/chart/templates/flink/config.yaml b/helm/chart/templates/flink/config.yaml index d7d77dc..d128807 100644 --- a/helm/chart/templates/flink/config.yaml +++ b/helm/chart/templates/flink/config.yaml @@ -20,14 +20,12 @@ kubernetes.cluster-id: {{ .Values.clusterId | default (print .Release.Name "-cluster") }} execution.checkpointing.interval: {{ .Values.flink.checkpoint.interval }} execution.checkpointing.mode: {{ .Values.flink.checkpoint.mode }} - state.checkpoints.dir: s3://{{ .Release.Name }}-minio:9000/checkpoints + state.checkpoints.dir: s3://flink/checkpoints/ state.backend.rocksdb.localdir: /opt/flink/rocksdb high-availability.storageDir: /opt/flink/ha - state.savepoints.dir: s3://{{ .Release.Name }}-minio:9000/savepoints + state.savepoints.dir: s3://flink/savepoints/ state.backend.incremental: {{ .Values.flink.state.incremental }} rest.profiling.enabled: true - s3.endpoint: http://{{ .Release.Name }}-minio:9000 # Use Kubernetes service name + s3.endpoint: http://{{ .Release.Name }}-minio:9000 s3.path.style.access: true - s3.fs.hadoop.impl: org.apache.hadoop.fs.s3a.S3AFileSystem # Keep for compatibility - fs.s3a.aws.credentials.provider: com.amazonaws.auth.DefaultAWSCredentialsProviderChain {{- end }} diff --git a/helm/chart/templates/operator/statefulset.yaml b/helm/chart/templates/operator/statefulset.yaml index 4b90465..c50f097 100644 --- a/helm/chart/templates/operator/statefulset.yaml +++ b/helm/chart/templates/operator/statefulset.yaml @@ -47,7 +47,7 @@ spec: - name: FLINK_API_URL value: {{ .Release.Name }}-flink-job-manager:8081 - name: SAVEPOINT_PATH - value: s3://{{ .Release.Name }}-minio:9000/savepoints + value: s3://flink/savepoints/ - name: NAMESPACE value: "{{ .Release.Namespace }}" - name: S3_ENDPOINT From 1c32bfbbe03a48fbc1c0ae6b68c5bde807583626 Mon Sep 17 00:00:00 2001 From: Mohammadreza Khani Date: Sun, 6 Apr 2025 01:53:33 +0330 Subject: [PATCH 8/8] chore: create index and chart package --- helm/chart/Chart.yaml | 4 ++-- helm/flink-kube-operator-1.0.0.tgz | Bin 0 -> 64193 bytes helm/index.yaml | 16 +++++++++++++++- 3 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 helm/flink-kube-operator-1.0.0.tgz diff --git a/helm/chart/Chart.yaml b/helm/chart/Chart.yaml index 7bf5006..855edaa 100644 --- a/helm/chart/Chart.yaml +++ b/helm/chart/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: flink-kube-operator description: Helm chart for flink kube operator type: application -version: 0.1.14 -appVersion: "0.1.0" +version: 1.0.0 +appVersion: "0.1.1" dependencies: - name: minio repository: https://charts.bitnami.com/bitnami diff --git a/helm/flink-kube-operator-1.0.0.tgz b/helm/flink-kube-operator-1.0.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..2985ed83cc7d8a640c4c793198d2e8a0c0cfb62f GIT binary patch literal 64193 zcmV)bK&ihUiwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PMYgciXnID7ydFr@)c3Z|xqFlKd;J?(2EavE9_CiS1`Q?b)}h zD}hKzLQN4Y0oqa1ywCm?ei8sliLxCh?H1SGjYR^30WcWM3~kP{e!(d@o&H1_y6th?(hC%u=o7=-tNx9&S3u^{lR|!VE-SW z|2WMrehSK9{*V5H+wwd27kOZYe?mFMBprg=oes=0^Rpig!a*lS8A@Z6Mi|jyCjcp& zp&^*z6q61BIm!sdjO6nnm@<~pVXqf)@}c1fvlPy77?D{|{oMiJRzn{gg#B=*6C)bs zIAh}74=9-dQ5}p)4g_riPMbi}W=A$(L$w_?&(ILSEK6_%IlNBUR@e{wozFegU*yxg z{u2`2JWd-+*Z*F>vi|p;uh;)mJfC`b;|Zc{2>mujh2QM#pl_pnxQ7rLj1Kk( z`_W);cd*}&2622a{$?*iqy9I2_@27O(%o z;9#e+{&#nF*6aT%o(*t}#;`~jkh5NHye?6Moegk3#S~x)Ao$ne>sP^;Ii-V%5$T6GuR0Dx(fc84-&7piT6m)Twp$LyLqTp_d*c9aeR#2l;QY0}) zCdv`tw>v=nH3Td#kN|X8Fv2m9V3P1@^#g2RhbUN=T5!!V)$cLxB-Ys!^c zLQ7M^#5jnVfN{+KsTnt3zbrchA3mzpg2Y?_GOitMMnFMPD9WCWK}wilTQH4P&jbnN z1=Ts+xdjxIlQ##fXWnqb4p8Ekpa5r`P{bIo_oJDl_N+ncflfx^LvIw9qW%hwQ1ZlBC!) zi36IUC=jjk9hl^72zKpB9&tUqW~#+roKA8?<)=@HvTCQ-QGf6WM=6)^;vpErgmOBK z5=iNp=3jNZm5;XDw1O9kx;zEGzIAL(nsCWRYt@AE&(f45bo#warDGd=k0Ui-jF1!9{l2X*ysD zRja>5b3->>hh-;6loWY{%6;f(1PWS+Eip$Cnaxldi`|A1Km|^7BYc_KVjE%vBnaMe z;e$)-Twsq#N+V1PiB>cvd~Iq0te_|lCAGnX5`a^_kx@iBs%a$u<;x;3Qb1CG(p#L9 zl#dXX+u0N(n6X4LD~-xFphYz0&A-Me=F=JS{c=tU5EF0*Q>Q0ZwIY?hmBP-LBni30 z=|n(JaLS9o__uGIMj|i>1Y93xMHWazdL3Qlg8$}S=FPrDOs*z-9ZBxRKX(kcm1=onZ_WNzFhV0J zG=#@j2`%Woj`gFK-OX@%snkZUCIT>n@2wa8zEFJf31UYVZ{9GR;6DVK7buT7Ynh-S z_@*x?MizT5sHVAON6s2YMksoR8Ge%|$`(HSrvJ^L)9IunMpr075hJ-2a2QFr8ZC0+;;f@e4_%ytpo@T8eVHjU+~x17HgEHWcH02)aFzF*!uNDeQ`# z;atq$T<{CV$$Sby3>nm$*==-Y9fM3^kljXL16=%cBv6^^f)xLOI4!=!>MMWY7U=*! zRXQ`-N3yP^q%>52@aFOr7|prBmnw4wMSzQCFpcT3^Wj4P@EC+Y z$&&&t#;Z*deEcX%Spdq?p^((&TfTdL_`n-_=GSEjFGD|k z09-2m_;J|lefS`o5^%xCj~_lrU}X!kXvhCEp@_Gk#3Ks2XCy`!BxhZNvQmmdq0I_- z=slNPz}fln$=i$b%j@r+ZSqAFu>?#I13{3&8KN1C5a5VhqJ&G-;hA~+@goQb_>Gd3 zBl%tTL&!zpP-ud`^nVRgg~Z3M)}<+jgwrS~Vg$N%HhOJQ>Vgn_{J7!m~iDIUo;B< z0M4R@;FN(GoC5}L5P)Ee?zntbFiW7ZL4wl@bus~OAx=2ahL$D>{zVEQP2NEkO#x;U z$bQ;O;;WUXo8CqsxLa`&zbYs3>g4jL)1#Vs6oA`cuv*g~2=q<>x*tAtKYUPYbQ7mB zdJpvEC)UX71q%9GVhM&~9m>_#{a8a1Wv7N5ZEvPUzZ=)7vE#H@s2AtQZ_f^2pLj!; zk+|&&NI(~6S?H<~yyADuhP52h?J5MEQpShwJHKTdS7==-etq)^U7=}IQp znP$=UVJG;LE5>OA4tB+#cy?8c$M`+y23=27>j+Gbm|aCGvXnS^Y&pZCMmfEHx9ky@e=9c&@TV|y@V&76pIy*>+g*KWk=cx-5?k61 zTUl13J4MMXq*Li0I9w`fs*Z*dmBnSLGHAY1&4m_asbM%Y4k!FuRmw7ciCliDRQVJ9 zUJ!=7VW~oqMy5Cz&4-R4qFfbfhgDl+R~lHq$3ZPR(pjLr^jQN!OP|AvV6}+){f(mD zMWSt2Z8wjzChq1I3zesZx7}>E)o!+$;HGxZE&ifg=&C;|8b>XF3J>|*yM6UpEdNQn zv^;pYzdz^_`ETcWf8ff0JN@0~gSGtk6i;P&hA6$2D^NRw|M&Tex33S+4qu*JzP-FS zdV6?$e0g$p)dBL%Xb8IE40}o_>zYbj`MSC|JUS_hHK}f<&iAiQ&whM+ae01ma(R7v zVzuz6u+IEOM#{_|=2@ieOtq{lkaYbU83i-zB*B6pZSJ8uF9@a4-!ehS!6?s0Lgy4h zo1Yk@H>*Lk&PSGm6e_+vAUzoD>{q_moUJTuuu@((YMr8m=A5kps-~0%AdbI6b5K^P z>U`IgazvTxo;bgh$1#MxA`^~nf^Ja)z5~Z6FW$WLKf+90T*xocIE+Y2NrJ*0jlp-| zNd7uh1>~t4o=gK}?86CW^H911mAj!RW^InfIl^-s&su3b*)2C^|4{r)Y;v!S4kab%4R6MMGc6RpX%^(4s07J*ec^vaZbiK z;e%;B1%e}8Yi|3Ag!-2WVOZZPNG7yJ!nC}ls9q?n;Rxr? zAg@GS2%p(y4H`;p9^g_5{=_3|uE|v{6&iZZCzOwHiIOv5;$+z$Dd&_~=*7EyYyWSf zse{XlBT>~GMcMm2i)oDjAf)Rgp_Anhu0pyEN+_5o7td@&^ zx%M2#e}fCJ%*emsEO8d?H)TD`lF-nezAsP~F*gVvwH@oCLRreby>P$QKDU7Vg+Ht6 zf7-!r6$NmK{x{g|@A&%P^S!nI&yzg0_8)bg{dj6$)4_F1jbznxYpuap@}tYo@6aeP zvX6HFp|5RSxUYkX{AkW)c5CXH*FjZ0G!^&iEABZJZOP9&3aZrHcWQd-pmn*pT3Nkz z72;2-uvczlbJ_K1Dm;uCas9Qiyf-Q?jiUDq*@o>%HAM~{0{|wTbas%L^%D6}< zY8@hS>HVJr@BYuuUVm>L|LIAd1@^xyHPcsUH3OhcE{|gYw2r(DZ&!jyvyfejOlcil zcuua1Ns01vSP4D6zW_6#htVgu6IM-FdS9zx0zQcWYnk~<8?P+tw5(T-HKmOuBbGI=FNyfJG>lwpVS+ahR9IJYFKqT=pA&;$+%saJ z*IZ3ksyD9}ofzA_Q>8+6J6s&E?~^>9o3$17 z#Jm1R^V#BvVI(kz z=90O3ytZVla$KUUFmGf7HtUt3toH1qz+1!_uJy68%k41tEY3?uVnO_!dk%&bgX9Uu zqXqtdl}ich=gFRy`@fF6aW5HQ+5SJ++w=DS!S2p_|9_HaNhFuR+x*L*km1cY@@Abj z7oEzgU(S|abH=E=^dh~T2>$)ty~J6tZR{WE$0~5j)BQ5mA`BEVdqC)Bxq?L9OQJM zPu`LU^HV`lm?{jqUf9p3KtpA}GvhT-h7NLT%Q@D;Lj4kD5Ycj0-TKbx$w%Ls@yr5N zbY1sZbyYp{8wC0^sLr25ToDrBpEZSJY3$Kj!1${@E%*PNB&(hI+t0G|pML+jum2wm z*7?7lRm=qPP;5Ra&7Sohj1G1#ZVPbB^i;zZ9K^d7DKmyDy z%10K&31a5&1k>_|aZ{H+i!8Q(#wbD7&kV9?YJT0RU-oc-U%Kji!is76OIP0Rp23WE zw?Q`}vG`ZVoKrO<%Dl9|iI8)?PURs(&?2w`pu)JHK{1K@fC0_gJ1Ua2n%u^0=$C z#cfy-($)OFo1$C>im-43m|A&29?7s*$OI2^@jL!YhbGU*BaA@nF*r$SA-WFhv$bFf za4NrWMq!|K_#Uflk`}Xl1k^QYE+C=Ly$!9O&-ApE|L)`VX`UtWU;p5_fB$c=yR-KH ze3IwU{68(Hl23Z)&(zR{7iQG$#u%WEAEvhpos4mahNZ{mT8{=WG4%NuE|=wtOqF&nUE@^#v-1HHKNQ zkB?{zHtFcxak(ZpD6L~T1_fR3=?!OX*Z=BXzvZ)J{qODWSMLAstn4kBU4|*>d@x!*9aWYrK*5_nmM`mNZmK`#aCq@&BIW*#H-iF_g?b zMnD!#aXQ%sIZ7bIw@CQHSnpvPcQ!zZCNjg=W|pHdeve|Qod3sG2+q@F4oE6$a+E-Z za*^>h?1aZxZ?721QD+0FK=nTzU4axutL^gH3`kGv=Tt6xkfJ^mm4lisGi z63_@nH$?`37BiNJ0bMjj!yrmI|QSYz7bL!T=%=Rm>UR-p@Cpm%i!vALl@W{$27qa zN+}w*sMwIuBQ00t3+`!q^GlhwnQvqEU`BdA;B@PEXG_FSoe5 z22()9!MeULr{bS&3qt~Ac$6T?xesUX50ZkbT@WRth&#Zkfg`jHW)O4ME>fe&T)89{ z8J$x@V6jMW3pRDm@N7yLq1)gV$B58vKKNuJdGt0wEDE>6&Xmlo9M7t&VMJyf9P$3> zFY!EKzt85$x8LsG-G&0oaZXYerik?*rHIiUWiYzYJP*$%`m!s39qjD%-|y`1g;_f3 z+@Lv^D8+0^;tzC(JAoRrpnO4hI|0yHjrlkjwO3E}i=4nXBC~C9nnocwOcHR3CsRhj zB@$yEhaCWlJSjUg!E9QLcux)4s=2oprEy&fmRIbt9HAb^&s|_0Lob7aupjRH6}GhX zv%=GI|4&GCbMH2m$^W~1JC*%^e|`S{B+sYWfUI3+w;%R9F`gjGhJa4t&i=u0?*NYD z@$+vHLjwrJPn#JOo|7mj?ZvVDRnr&hD`P?Xceu`}_UH4?Aqu;lU zh3kK?zq{M__5bJ3ch~FxNgl2RXY*W~leCdUHo(=z@&5#`q$C`i#wcZYj8Q%WhZl!O zKb#1exU;bV{vV1Wq3OR&$OtAP#mo#blvDmyy*w5yL`vgci3?%u+Xg9N#+wpTnMIN4 z6oYJvDwVg@u@sjuZT7}R*K~|0LfTYmXLhPrlpZgpKzSz4vXsYpPX0+{Ep2BJFG zxUz88K=qM_^NkDjWzq;Br2sL6l9~ss(*UC2ii-fl{ACm?Y%xG!?(msZhfC(j<2j&>Ng(;>=D^$Sun8SmjTa zNAA_CLokL3mE8nKN|h72bpVWErX6AUgj%^#vjnm+$!7-n$gXL6uo&KXhEh7kW2TCW ze~5mmP5+gFaGDBD`A~qr@(%hA`Ag+??S4_*i0Zo@u?g$IdBF_c2xc&=sJ8}dk>@AJ z5kqlsy92I{j)ovdGjfZ{5c1pdPvLDXR{hxeJ3$gNJ(!vS;apA>*MZgIIz6T#xFD1Y zJmeNEBX59Bm}SWvVBHIbI7TKdy;3!~3U4sq+UDaQA+VXDT(r!qmeT{E2yC^r4Ps2? zz2D84h!bL6p)9;*=1Dt6)Xam#)!7APykz)NGL_l6 z%oRuDIsrDt_Mr7_(N8-yFK0*{yD_m+T|C6eUkx%c({Mc^r4zq`?*Q={sU+fU*G8qY zye%J=*OUYxomhbShYry)QOf|u%5uSX-i}>s2tItQ06er@=Ip=Qg0|{-@VOwW zkI=stG%NjZZDypC?QRy758DqYnSlsqGDR3hl&=j=yA&}o-xf@Nc;sR^CY)fvv08jq zQ+hSUqJ-#xU1g{X$W&$)Wb~fpP)3dchkTFaY)8D*qrpc>j*#Rt7OC=fEC6Ebv6qst z)BUd;P5!sPoL)#h%r0TJ2Ht;OCP(Aak~A$wT8)dyte3mipB{q~+OxW)T_co0@ry|n zczN>j^y>QZUn1%LuhsTzgqMn&g$?cE{Oa`jT)~sb)I!yj<@ns-43zE}mE!#6CZ5d- zCZsyvIg#l*N1QCVoEUFa5R|HG6_|Rjn9LoVYvmTgFbqQ_zG~?e({ie|Ie}8dwrgZr z1}7B^EZ2}zDS8%30y6QYwy+ihuQC+j@mv|XgH_}})ps;1CI$>11NkB$6AI{*6iEz5 z2&h;QoNA?2UDyq@P-ct-o;ATWGYXq^X&3j82(dqA{hExuLNRn!GT4f9puQ%UO2GbZOBt`E4$-%pr?sdkhxsT#yDgPCs?p4N}19UU6V_Pe^jen zb&0-#p~l|DtsZ~f`jz&D1N{Hx9qQMoXQ$_HFVD}f-@dszxikaM)w~fBy<`F@ zoKn3W`~i4ZGg9yTnKKA9_!S|%6yL#M1hFa>ku0kvgF~lHe_+3K z58dPyu3}MAKW|PAB_lEtuo&kOCy7mHwW8^>9=sTeGj#VOno~89Vx8K(+~h+m*M-7( z%ecN!?Qb9pg!FW0aFS&SE(_R*TjUpQLi%Pei-|;V{96%|fM=oiS(BgeJY!?rP-Ey0&mxZ?-rqDX_E`9}g@lD>8Jo*5+9Jsa=<#}d@T|z<4(STv{Up8p3FZ`>2uZ$ZqHAdbN)^qc*WgI3h}STab{N!*w-5K|^@0IV z^m3)=Xf@ClVYtRO&Rw;k$_$tJ!a4A`NTdU=++I`wBB{%6g+exxYAL5mZIhFkPVG^G z`GnTABwpXE8I>-f(UeshQHdngcMWEWRx4Z-SmN`-*}TCw!Zu z!p0bwLLBH)O^d z(wKtN6v$nJZkv4)Oz~1gR`%uQ5 zx>CuWW#or4Znwz-En-EiXd)^{g)f4fBw~Io3hiyk)&tcFRvV0EL~+s6b`%v$nj{HM zCvS9cFa9OB-x;$Dn8Ei~MLt18u(SV9`|X?5oK=_KxKvkZw~_QxUr(d}GG3 z;8Zh%pEO=$uFRbCmQj2uZlZFK7chrOf|8bo&VrGgD<5W>1DJ_B-JCb|Mv&sjq$~>r z31lP=N>qZZv>S^^F_mE)dMMQlzPd(!B!sOq5kQs8h@4xBJ1l>2y+P^{o~^@LLsGE_ z!BuHk=L}z%BmV0T}EVo@imhMfZ)GH+Qwyi zi33^OlfLHr_LaCXEw=Cx8j~D>Xo{j64)-Gj|pPSMG zVYSo(De2O;8cr(C=}IW6c3NX3^P=4YEmd(5ZdJpS-)@QK&j=J$p52-QGU0_{8Je{% zrOcehshSaxAb6{ex&+^fNJ=A23dIAWDZvpEsB->ZP?U%ACN4}U0XXHdJlAZaDNG~z zuaNHwaeQhS9H=xzB$%1IbK025)Vq$++*B)4*0t*cNKu3+h51}u3)XIQ!Zuap$sCNhQb_?EGn9j`$}qZLh0R1^ zN{MrM2DH>GSFSbYQAF}sIb3nUEK;6nvf8Hh#nWDQDM`^bNMTC0!3;+^*#>k5lVlsr zP>hS&Hb`JTLEGTH`gceEv8CpS|4$tm;c)}XK%5&fu-W|CI(F6jMO+9YiaKfnuep3- z85>*N7we4@GIFnd$uFAOZ=s>t`2v+; zG0KV|*eQR@Hiuw;u=5)0*Ai#H)^4@dpue-Hs&$HeWE35iWl9c%=WG2qBnsAPN(t}O`WV~r0G z5r_QYFC&X|VV(}*9Uao$;c#dURJv|S7@3R9eto(-e2LT%%PS()!ESxISD31TOAEXf zGA+#6n@o^Z_rX2teeE^6A)UJ|2GkWVy5LXHJx1xgQeMd{!U!l!7!OEg7meL2Xgo#{ zGk{ka)58(T{ZVKbwPO(-{ags34Mkoew(vV2c(1Vw&bAtgUljG=B9h9@ztSn`dHV|A zpvouyaG)|wMYs05X!zL&KCAjf{-d1G(!jAuj*&;v)~c2-oHF1DreK8RV2H{vLB=OUj8SF|&_w|glgAX$UgwTtEo%C# zM=vuN-{qJg_cfQANP-Sa*Ax9E#&D7n%5X%>4;$cTF2K{$Eo~cMb()r=EP)XcZp?<$ z8aG|DtilR3(SdF0=3my6Cu}f|r6I)jc(6cFBrQ(ZzNH~YdpQ+(6R(_(@z_75q(8Ia00leVD94W7OmxPY1(U1&q^#LhueP;!wTSPP;4zBkQG&KbPCh7&8*oxb1=?Y2 z2{lM(+*)#&Nvk|~rCWUfESyLa9r%Aa-b=A+rcpUA64o{E`TcQXPz}{jW{4jEO?$z6 z%SX*)MY9vsZ+8X&=}FD`Z$SeDDGLTRc`iF1wu)BN8`VP;3l-<8pyJB5{PiZ4-hsA~ z;b}Zp1z+uPR?zn(cdxB(0~iV0IT#U=AebtY_%3vZl4M)EOyvavGnhHDBX8M4T-^2K zi^@aE!Qc@bybZK+rTv%aSY%hi z(ya_DZLB~zk2!pXS$Uis$3t+9D7z3^-}CqqF_aq5J)`zXrBEw0;)h$Hal7FUdY|EZ zUePFHIHyDK+<(0Rj^Uhw|2V(=4`4YSSl@-~fe3^$2nPIr*Zuxb{O|u%H06|}5lJH% z;^0`cxcddnhuATk5!sLi(J9PhKpEfU?nr)P?yDsjQZOn+I;|LGITGHBTYxX}1i^gs zKLMFx1}OeR9V9EbQn;fwX9J?t5DfY+@r&}cj-qBt-JtnkD47IjewuqO+&!gE;W;_- zH!F)q@-|7}C@Gc2R`PaPuEN?S7cYB7vZ}d9mbCf20%m&Z7$V~`%7ME6Eek#DxK-cZ z7q8HJ*4vRT~YVX|C{^K5}vy1eET z{Z7bpHCystZGeFM@9D8Q(5jrXRVzz}DC2;kb`bz-27L$)MK}YQ!$6LhqFex~-7}vQ zD9#4@g9@3KhZSE0vAaXo#Cc?q#e^SQZv0=ZumT#vQ}ha_#d~=oOTjPF1z|fa65;js ztDvW=6H!RBAAnQvkS>`39PYtVO^3=@9rtZUl5e|qUY1Je>J6Qd^pX(oAoDBQ(3C2D zkH)eb-{J&KP`tdUvh00&g<#C(3y$aaB|}->zuJ2DKtLSrUg$2I&D^oN(T)9Br3%Q&r+k@LHN5H#O44m0cE~ z4mUx$^bC&$)-v&5DuTAamc&QmJ~~G1cXy zMA^M8Qif+p>848XKGb>_IN};+k;w!xIK^~|V({N&v|ta7WR=4)L%FWvac}x)aMgta zP9yRfg^+WFPa#W`XTMXU-M+WPIh(OWIC+c}P~)LihoeVs#Ob7`{tUDgu5<;IACx5GMfP(28tsz4Fe;q$Mf8KQ?uzP(Ibybh zXjNBWt477bIC;-dp2Fm0k|U}jizy4EjN}tV(%X9uav`@0$L5>~lZOoRLz%h@B5d{s zs~YgDVkl(I(^R7Ni}0xX6&%K~i4!5ei0tp$_UVk5Zb~`$%fBt4=B3UIYQF(izRZd__Zjb7nZU578I>a?LG=ZI z$-*=Qr)g6eWx{LvEYjt>9g*Z}Pk z*sCuRBpmGLYVO^>I`vps7JD* zyj*I79Lj9;L-1{1?9{3S@w;-Zqs}1ndCW={Z@QlyX(51nT6Gq~T+NKL5LOGjO`H0w z8pi$(W9IZ(9O3@>jR~EWX)uNGmS+?53UEP$`7V`aUS1q95(^%C8 z@5i-HwP^7Zn4?;>dN2D^tL5+r1}9r$Xv6pF3{6!tQ;m_S*2Gk2U|M2cT5epbnwEUS zQk_|;!KmbHI!#vzT_H;BRF8a(P;N}M5rVxtgZAGIxV5&#EXK{cjHnT8jx)?Zj>kB~ zY_6^giTjM|mAVTQg46Qi&O80_ow}?ORy?~EZlPN&obatH zr{czGZ$n5j;H8a0$rNa8l|U+ic+^$5F`3_WEU z+tu!_uNcs{G;~)~A%Dx79a5WephRgi2@U<`4>6+RhBe>It;8kj23od{&ZToKf$ z_BN{Tgt};gS2YcQH&9uQiI6`NNT~?0;SIo7)gm(fi1*Uld~+$&m0<1Q9qJ>9MAjQA zgo~>Yqj{zIRp~~DI#+E3q76YUK1wwqylf3oA41h#+Sd$<U%g1*{_gyf-kj%at#WH#^uJp-=%3-9ynRdFy(7Qj z-jLsL?#FM`-HzX|@5XO9H{&;I@5S50qc_?kZ7kIJQ?hc0P4KM@MwaDdgdT2yEZ=L$ z0pBCA_)D}wdmC0|@y41sUF(8>@J|MukBya71ma_qz!2GjpO# z%3zK60K>NkQZNnYTK>ETASDc3Pjf`4B#FWI@&#b#O?zOp5FQF8uq*ju39ydyqRzNf zGZQi*SLQ~$dbOKH6=pcd5L z7F0`mZwsy^#aF;}+&7O+^Ml8vd2vgm$ONKa3fbE@`9yDjYpSvu!MB09l-SzQoYfNl zYAN|npmF!SMhE71;d!C?=cLG0jFk9r>*I*)a?1H$^T$^N#xGz3(@5plIn(9r zp`%Nh*4?ddUibVlP09cv=QxsWvt-Z_yTiAWQZp;<*6DPK3Vl2`+EdI7wjB7I#sUI0_@&K}x#V3VlrVH-pVDPj}34eJiN__pfhm9W=b!c=4?kK-IsDpGMkCL;T2)8Cy8h$4HBsY6ok4d~{8(?a~R zL%i1no)*IvsNhO@FvdB$gGtic&h)kiVEbpfmIyAp~r{!T|C~`ss8VxZxfgT-^8dc>2 z5I%V--iSmfz?trLZ7&QjZ|Zms#j;l3EHXiX2;!9yY9$Ag)U%nAd?q9)aW-ON=e$!p z+B?a;wk(ts{Km0|?VMH|5)qc@$O@1qvY4_e!*td>Bhn+4%NHa~<}IU>w_Dg6vO9Nr z9AI5!?jI106Rsc7>Q=7mO;r*9Mw1>q{e9sm@==+3ZMheQs_r_aiGbHO7d-U&ljJd+ zzlcLe>%J13`ngTi1{VsOdXWi$Z!TZ0c3@mH^a`n-lrhac5?k&TFMW%F?u?b0!}QA# zopGfHOH&Z&X3AJ;Do>xjKg9(MlRMoF2oocQA|}sLOzLz^Ggj<1Z#U3Qs(;H9%~R`z zoFwfOV67B9Q(nqqDm0dxRxrFlIQZs2x2&~>sm@*^qY?UL)j^la=cuv_i`aBCB4`Mv z;&95rZwB)lc_z>C(8?{J0{a|$`6?YHWYXK|@AP~9y3NV9nk%FpZeOU1AuX8UrnA-E=rK{)vb`BI4d^+du}N6QQjnfuo$Mj5v8U zrGto@1;MyT5@VpyVKL1VTD3TQk-nLty8KPnfoe(onuiAI1gGzaL}-9%f)P*Ef{Z z-KjiBG$Uy&a{#+!;=ud?B{K__o!QhGLaPOLt71u8u~6S_!-D64@Zl^fTd z2s!tBKQ=5VB6+NCUNs^(F-coTbJ44kN9yJlAti+P9|&bs>_|1%Qa$0?aVjFWC@=Mc z3c@CF0%gKqBAL4+E#l=G(nKjKCev*hbxi6b=$4BwLbechIEB8;w?hUhR55x2AjB~4)(C!BDuu3mv0#WqT`44iglok)`847185A5NeYp@-`y z8!V}0JJi^lk)0AZ`$bSkijoVQ`IH*y2K2~XC(YxgV@*rfx36*)D_U?vA(fE3)ZrdR zt}ucmSN7t#n$Z|iCyBUlPv?4pBNK^3=S(R*DY!U!4W#>*tRt4cx~G}o6mf-7OcJzu zF9eElk&6UtMP_aAr(@3YG1bbHXkYbHWsGt}4b3WwR5K4qO}Jp4o!sWWT(1%M$n=Vp z?A8l0I6J?t!2%%6JF?x(zcnM22*s*xj?V7Ez6f8b+7=B9mq{ZjT3OapoeHu#b);Y- zsJn26<)Sp-`h>%sgnVH{OK^E|c>MY#oJj;`o(G>b7s{JWuOvTIdxhZ|G8PNKxp)AS z%%$)(A3DGQUdSgdMPLd`tT&M=TJVBLuo4+opyh4Rel1fFs5)$6s2RP#FL7*~_>qqC zCZ8&Ywpef_5~`dN)m%VtBfo%%!r{Nv^*BBbACi4hXIzhHQ98Uh{iN0;nBmhpgHrka zem14Ui_;eNB&(GtG$~oFuB}Q>ZB?=c|5F*3tR}uB+meUYBbt{i$WLcsf*EdH%WDJE z+Q9Ug4NMj}-rvSl!>pdx%v8rM*OsQ1mL`WSenG}2Tee!;n_AkN{6SlroIZug$sgsl z)v2}B$>BC@!_(UE^!GPB`P^b{d;0vgr-f0eA3rAb#zv z6AoJH{SxAg#3&I=HOmquwb;q?RMtC^CUY5g!npeh(Kce*HBv@=5zIp7qg2DK4R|Ui zrEo2jmN2Xckjr*Rxh4`(!ZzQYH)Ila@+hfhyf0oolDe%?f5#aBR`=meJas z;aF|(9xYUN6%j8?cO$htLR{|Zx_6D8P7LOz2+UqI?&j#oi=!{MiM_lUY%lKelBmne zV=ga@xV${xa>lbn5>wb%M>Ev^@^ zr3Fxiwf|VXTRRu;;k9^onVSrWk{bs_q}H z0 zQddPXG}y{N^Q2O(LejJ`u$@5(B%+a9wkUG2ETH924GI~*eQLJWu)93#Zhg1lD+Eh@{62d2G7Ot@HHir6YQ=klY#9-6{Q?Ftp<9~6`LT=CgX#l zkBeJS{1niQ*)6HR%ls!P|5<<`a2Q4LFkKSc*wLke5+DO{kmo!(>v>L9(?o*=3?z{5 zOh&cTYNl!8_j^F&a<>|L3XRH(U0-d>X{k_RfnPQd_U&($RhZ!`LTca)jgL~kl}{8C zR(h0&8C_Pzg5MSf%jZqi^E_l=vH*WDrMI!fL(agns~6xBc)F%Z%Nx?wSc_NnhcWSRX7N8{R9(R~{pX44Qghfn%{m5? zI@dlPKER9B14n0>c&*H(#*)9D+ukr&QFth;dF1@0xO3gmoIkGk=29YWJI_$3e?v>? zt!@ZZMfb!sbX4Yh*Fi1A)xoSOY_wjo0GL zLXE_|!|UPhadoDT#`w-!m>3 z0J3E1n}KvHl#ZDki2Cj7j(bF`2UJ@0NzRuZ4}x9ZewD*OYsT6a!0b~)H>jt1jb$=Z zJ*Yl$k9)*A%ms-;0cl*Ou4z#l61RcV7a z$Rw(DCW*iBe$!*`+U{#H(ljy8Q-CPoT`1KoS#`+>=xw#KJ>v=+te0_#*z@3Iv?7FP z=FW~PrXRQABPe$-?=f#_buMYql9vibmNf1;cfM~gOIfRQD~cV^Pqz*i+e5*a^1`R%|ZHoy-Rm~|zeN11j~rWQb?TFNOO_l{M0pj;9IBi$$;Mmx0>Iyyf{ z@?$AIxeH5KkhV2dd$TkeaYVps*-ud=XZM$9ajb1zKC4Ljp>d%QUThROYAA>Hf=8L_ zbR*F;`~v29!v#%LvO{`uWjePL9$y1Pe$M2q2ELXFt4>I^=>&HoC&&&*1K#`?(Ggy7 zm|Vt5(0yjGsBSzCfpI2w&|-fSX|80g9Z$`70ZSap(AWYKS3k1YGhv-X&IXl(NJ_?v z|DL}5ZnWge$uAQ{&80Uvm**5$9{Ic7+AM`N6NxJswH6LPP93K>o-a@o)nbg1_J>;e z8fjJ~4K3~wB*_yl`f1v##0qiWqVL6i9&O(GwFi^bfe|wdCy>-OG<+cz*0YZ0ki&>4 zmcV*iw#SJ|tQ(;zdy-p_?$og0v*C@{=O&en9!6C0I+O;Ea|hs7hL&YAMBP8fcXd)X zgMMi3t1>>Mr^MXTWiuvJ zwYBVF$*A)PN8cmnM2gl{Fh6mpL-ws3L#${cGDh@^Vg|B0VL%uk4I0SZqRrkCQ`^(r zUrd6JP5i^1^zskdM}4IjU2j4Hb1fWn?1B#C2u3E zn9!JHyMNc8{~O43M7P?{6*cgl=+;(D>_IOM%1=V_Fc$H?9VH9j$jJ>V@SWK}Omg7_ z?7hDWf8?P3Dk3mTG)=y!V5hclSMbDXXa~Hb(L`vYm4(l{z@s}<0s~}!ml<-3TP1n$ z4HjP@_uJ*QS}O_9_4{7o1kldb>|de5lf;kS4Pe0dHckf|fG{N7>9y$!-9J&F71JyI z?P=W^HAb-F5B--7M-g)#P|uz7qq02?CU`lym|T72)Qj@UeL58Es`A{>oXl`ZH)15ynLMk+=_^mXoZlpo zzIJ(F)yBzyN4R#ZU{edcd&frO=5uPwWtzv@YKh^ZSd7XZdW(UuZN3|H4U8dG@h^l8)AYLxTV}-RSn6|kEzUDz{u~Cbwben$ zVzm2J=RCKIY~g^;pNoEkuqKZp%O3+5>gtVr^JcYt>g!zR{9G@ zG-Pw>_|yzqI~Z5;(=9jud~pi0d#o*Vxs|#%v^0 zdd&>{qV+xOkbO`vAhPj)?Jb>hN(Mdxqeo!nm$E$_5vOE8ELgJoeHhU|IKa-dFpWfu z2+ZfLI?EGBSD^)bJYMz&JL8D^*?7hayx#7}{3}ccrD+(6GLEb=B&U;Kl`XN5CPqTO<9Fdug1MPk@DuIdfV5yJR#Gz;WeE}PwGrwT3T>@$d zzWBakY=z?=P)Mk2*C*S{p!=UC&PRRY9R7}4afdaTNZ|wgdj0F$sJ^aVKDK*1J3D9c zfd7|hl+%6U{Q(34l;H#fv8DryfV-`q(*UvWLO9s$M~Aa$qh~CYGL+sS#4u`xZSVp+ zT7_{x1@PBfYT&&#Mp#Z&)BzAyZx5yf1G0=o8kfj88M%LNXm1Xgs$YKf#%Jr}wP9gz z_YTLVaA>)3EI<_21$a7_p$6P2lMubig+Yz=Ov$-!&;UZBbqAA}D_FZ@(o!#7L>A z`5&BUl3)?zks8pOb$?81^Cs(RlkrkA3J>4PemIr-on;;ws1Q*q1 z>?T%CbfFoo>Lf);-Y3%s7HCoKd%?Lc|ik`>~^5RZC?Aa!F@VXNH`+UUte>M2m0 zeAjd&TE(0#Qmiw@tE}aWofY{!u}ZKt5pX+e$|DKP`t6Y+1OAis z(VF!79c$#7DGPq4amXAghsp!O4`1h6x`Q20x|g_dRpISz1iZ9^-6q*;uwZGzcRn5# z`fJGl8T6vNLZo3`iDy;`rG68tca6DunEvr4n^@#US8N8Nf@hwbH->^xnf#z7JDCWF z`M9Ob4lZ7Y664;Iz9wW<&#~4g(?S1W*p^kl{>JK%Hj{j6A^aN=&Wy2!efPt9D zj>DqC^Z0i{7Eu=_S3N56qb=TpQ-UByo3z$L*uFWHsD5O&VlrNRm6ScxJhY4btdC&@ zK08y}5af|bLTT<|t!Y$rj?GnRd>Rb^^zgFJUTPkGw&kHYi&Z}HG3=k8AD4o>KagGp zos!C2r6G-j5b$O4%EMl7^N`ZWWb%j>y<-N%y%eFs2#I~~pb9R35WJ9HK=CnD~ ze7-t+C`TGbgADv%?wGoDjk)gs<4t?Cr$i#M%6Uj^dblaazdM2rN#WVcY9@$;kgGa9iaMeIszuoSr+6WP7ZYm|(%fO!8u7-0=4Ga`XCn zK0gghTA`ZAQbxks*O#f1mX0V?b>7L-C(7yi$@lhl6-Nc^(AvJtwtnAAcCmdj!i$w6 zD)?_Ucfk#jSTDP$o4dEm&-?lKDJp4VIF&A{Le_3$Hdeufpf{)xUh<4^?BK?6|0YDh zF74!G<-1XqqtgTUdQ=_Maq%WM*24fdwYWM8sn5@+zG1XJ+`m0PKY5rq2xCvKh;^ka z+Qr+(dTy@0x=}4Bdr7bbh99R{=m50b?@Q#;-knTM*=FNlOqFZKyvK%Gh(kFl#ljxT z{mydc$u)NxwCq%!?Z}GnvBg}1SJ65I1m3=Gr>ZX6n6?Q39!^_b>l^)ceKWTALq~5j zh=)h4Sgb_uLh1yy=gUW!5qWc`QL$2MjA&l|b1 zbN-8!_CwY3)rWKx|MNf_wOF#=p~+#t^rZr_im}zYmYA;MFaqLqf3;qlOM<(2IQ#_@ z>ciO5-!N7&X2S)duzl>R;;nk(Gpj4RNzvb;y(@{Gy|x+Bo{KeXPg+Sz(>A&fMd0c_}m|kVEVzp%@bRNP-s7Bkb<5S|-Ui zw0<0}>a5MTXB_wu>nl*Yk)ayDGmqEKBw|zb5ctBBr6vPS`XXcG3TV_u=!>4@%Ro;M z8t-@_(FvmJ5z=EiC}%Yjj$+vwrZ}Ndc^Tv%#`twm8-+1%=j1wVTufxf(BBU>fS>h{ zUxIjofbuyIiS{5BhoRqe%c~GM_}#mdQ6T@szk{OfH^!JMf&ly)MSMCUf4VZ9*s$Iw zDczm%s$YO|Swd^iXGu5h7r{p`pCi3(Dp%?~p4HYiNWpVu8m!)rDZ##!E-Jn%samZg zy2(de+;Fhsij$7}J&pCaB#?@IwrSCplVbr%@kwQ^%HI+A5A+L#F5;#<${3@6sVmG68l<$v(e%HKu9$4yZmDmYtdV!{?KKckcK|i&5iy17g za_RkA<#*2OiNn-jdfZ)=BPhm}h;Uv{u5&_SeV-<-^^q{0j?w>OX2utA-6Tl230%w| z(%yV^$s2kR{D20W_}+Y-$OGTrzfO|)iE|IX%DP32m|Wk?q%{C{`&ck)UAU2SuoF4f z1+*_yy(c-d=5GIbp*QOv?Z@}5j4ao#z8eTSE8F*qt@bHP+k+~i2S4ZqHc#d&o4mPy z;Jd{PwW;8T|4pp&TacJK980Ols>q?&Lrp*T+LrfRZzH8r$C2mO84BtYqO@EN=H}1dEiI~+)syjh4|B!2SQbtHwlsUlH+8S~ zRz1}=C;1WebuNg5uLUjpL}$Y=TNf~~f^iR_^$zPmbV=!#=|fxgKiz%RW`U3Z2pwpR zIf#1EZ`R56<=Z>(%fP+n8+P&l@!m^!1WTKEm%&X88(S1@XXTT^b`@-KbwcT2W6sW8Vr z(jRkwc1Yc<`PzDUT&@5h0=Kc6X9ec*(Ru5$dV(pMi%!G{-Nq{R;6T;GNe(K%P7RPt z66UysecdG>IvNBgx{KwtbPIFX=}*3vy zpC?GE%`4+=KEit~LbCTEYac&>$I3sVj0Z z4XwLLK4)b!#HXYTZe){KrJ7Cp4cwfk!w%pm?)YbQ0Ef=>Ho+H z_l+51yk6>e8?mnndEi#0U0p;R1vGRJH(wi^cz$z8_wwO8U?U6$UW#kQ2%@;Uzms4` z*J1ygScod7hSEaGJnP-@?K#Wb(MHr0*w!o)c`epBwkZ-sC0C?6&(e?<4TzP zcRfv%IhT0YF}6IMwe~*8|FyC4nO-X}E~(i3=7uU}(-~NXz{<{u7OBMz&ae%9d4}@U z2kz|XegOHW9)>P~$lUz5(Tm89z|O{gb8f*v+~do1Y?H&tBkmmf2+q>@Ni>3fGNoc! z($Pz9e6t4LBbOsV$;i~@!_a8K;U?~pws5`t&uE2{AS*i|-R>?hdql~D9Dr(Vz?vrCj>noMzq`BoiX_`(aYxPXE`oXOv_^gD`N!29LG1tPNDbH z`}dgI8@)KJr?s2Mv5cDcwqRrIHDAk)?%35kf4c2*j-39hdzo=3PaiK=U(fgbsqg;o z#>&YEmA%3=l71I&#ndWSvL=2|NN;A8rAxJYq3s0!{>k|2~1nRFkU| z-Rms!;BDUBNbQsd7f)kKx8(%QynJbm{H!~O8E)C`eM<0*pm9XJGqLTf0&Q(V#)FEt ztE-`-|gZ3c>Z{J>6IeZLgNz0YSNGt=UR0%u4NwXdyml2Q}QS?vHHGNmo!=XUj?})uKlk@c&_gG2R$VS4uwWowpmT$s9 zPC!=}afW{CCW ztQn9@3Da`L#%t@R%`^uErE^AqCySb~#HlNZJ6-W>M4=A(FB0W5WO8Z!^=+k>meX!k z-53W@R^|Fv-oX?>%-?_IE!q6M3%DjHAxqcLKZ?@w)0&CVsyUF*`-`mKuFzrE8({h| zRI~0)zwY15(djV8sN1mg)FBW3>h7r)4lF5z{pE@HcDL`3jO0dl*ZcDPynNT2yZ?4u z{MNe}fI*uItAPekPN_v+Y8D=i>Qzry`1wa)Jbq@W{w-11rxj^r_r*oZ1);L;{1uo7balUZ>(BhpDs1`I8-i3j6E_pK%MZ!+ia*w0bNHA)O34#F z#~I-0>;)qZk|j)OtPKj@LRk<{II|KdAn3UdQ`bHG5B2#@Q5h}5D%}U!3l=5W5g~_E zAV<54vfuJJJEQd=pWBqWH&jYfp|_$t zqM_MsD0dDC5$}juWM#f!lvR7JZsW%y$Vsk-oRqW^mntI2@&qT&(m*?vz<&%`0)(<> z+mrD!Es2t4ha1eaa!@b5Fnd2i*>596!@IaDr)o%dI?Oed;!$#Qh?*`_y~?FIWT7-G z%CB|sgNqeSl=k9O-xg-G=8WBzJhsZ}RhPuwBFWx?*cOm9^r$NpW*>{N{;!Z$?KDgy zH;rRHpNx1haejUEqs>Qc47f_VqyDa$=J44nj|J=EYvGu^reT+Of(nSLGq7vb5*F6`-U zE!5A3Rs^5eRGSI&s0RTmS?kPAbWqNC7gwpT?G%WzU%QU!r* z)K*Kz1QfJ-%QMW_mDF-KYn;2rl!zrR;;ZD*0?*S}iQ$U8C#6a{^IY`KeWwmpi38)5 zZ+l*jD;2SCR5^4`;H5oZX0wm#w+CxI6R?jtY2 z^{tD#r`|G;+-0D8LVPm&Rg+o;PVQQs`uO`fSnZ)Nz;In8P~h9v@NVkvcE@gU3(n@Fb`!v~&%s4Qzj21n1( zOq4K=6s%KqhH>>Lkp1VeA|U`j0|U}Co~U(POq53kmSan5{e`C#+am>k$y+HN2zL#M zMYdY_O^?ZPtQFQ=DW36%_*c-7&N4pVouM{b+yiLy7Gf}U|M$q1;ys?|1q3#w0_!z(hVfZWF zkt}_SXedfoH5aUrXN9mzVuS@^$)z{ttlBiymR;hFcuOiu#5@r5jeOroOl*O$RyBgW z5fe2CvIxO)G}84EO1N=m<&!oLvL0xO?pEu*86UVv{cA3NbL5>G_RrW}3-6P*b2%xm zp>7|D87B|}T$wi5{qRRbg0cpD^XSW#fIP5E`tQ1>yXJ_Q-A)8#cPyoz2>{?_x2OLG zcOr9_|An$a^5yV!dh%6q+?}kMe%qCcH?Lz?YLcH9+k+?ytdvC(1U|@B`2l|(08juD zzf1AE$0_=4BPUjDzg)OLQMFuT%t6p(FS$7ce&^ydFK=4EATFJ<^CVr|!)D0xC9N?^ z<=})ty{1I`6>tG@GPOMJSzpiGIAK zJu>}VU#NXQf5K-&KA^l>KGdF__uFsn5tOODukHiJ>E#e1_`d1Y@(vq)^|riSEhlw+ zx!(Z2sb;nnI;qM|EnbcSu`FH|*FPk`8H&gPD^zA z;uZ2t%xVrW#%H6-qZ~sdh@#~>(S}dKk)mXkBhMo9PVvFj|3l6C;_{m2CLKed0)=(O zv<-sD8iij<7@cR&EHe0G8AJ&&5slsu*hpT;l0q(Oi6sUWePodbX&z#qk6k8WG19)N zhzBNLz+AWQFWKbq4*l5@2th;XGASk7q|w4XG)9cO?z(<;w)Soz86Jzfjf=p@$mlc4 z(-~kx%-a?8y(PBW&m$!~94cppoPljL3|lxBa)-nFFsL{Wm+X>0-n~K{kKe({>s&(*H#^d565GKJl8%k4~_?AeMhW*(4!xn0+fTWKPc0)?$tzIiIP$iJn06r^3Ya%zG8dXGX2djqF@E z=q*3B=T0(~BA1{_9mAM+c|P`)cUBc07gBR(9$KE;Y&<0>4IeK}k8Q`+FZzh%-J5*2 zE|5%>3qRQM>GY2L-w^cv)$)<^)AVkcI~S_8Ka$6f2TqnBb=xM@iOK3oa&*0ghEJbJ zE>DRgs(XBW?~TgLFu%*pwSwtjZ|bQeEXJA`9VqF)1MA2S3kBE{*`^!M=mkU1!KK?^onP_8|Ye;AyRSBdq4tNq@qklwG z9txwHP)2}w{@RP0R@4SV0Q zuZ(r$GB(1R%Zum2<^(@gk>A&q$+1a z2iMB1n=0wvuKyX~A2njZ;-DbzUSC=2qzl=!-ARFDO-TGTbANT*dk+#7=W8;Ity|&O z&D*~&AoHUZK${ez#BSwhcCgF*9p~$_KaQLJ7?ia;F^nB%jp1848cq^@`k1&Ln~U`( z|16AyppEAl5ZRR*C{C>3(~3Rt}Str^^k?6 z9%pc#1DoNAwFsy1G`5TSJThL#fb=|#Vis`pZH7{p10**&R}PnsHOIaCF4oCa_Uh54 zb~`Mlhq?$$!FbU8DSe)qCrpEChb@qaU$j*UaUNc>tc!tn|5>771k@Y?4r=<^rx?Uj zya+0A<*8ly@7Vb{+XFk3PVBDzlZ8|CRrpMjqdsGp1gk6(k{3kf6@h}G>Sn!pB6E zOXW)3!OCypO<+JTP{QIw>5EZQ(`DYgXWdJIw`{Ao0_W^U@W>WRaC5>mRcSqmWt#d8 z!G>mrx+lS-AY5uC^ySP)(b8NSx{MnJl_hhndQY%GeZVP`Le5_bn|~$|3+^P#tqKRD zc!;!q+1f0EW|BSrmMiWoLi6VydP;_{J=A8>N!`m0aq~@q(7c5g^M^{ERJ+xgFhq-b z`DRn3nN;9X*aBp!L(B0|+Cc8J6?L*;emiB`Iu^dGJ z{FajREBoRsXYaCA&xVYMbHbA$t@RlZUbH1EjxkHs=QU&sF=My1O8pNs&%?SD{im1> zrgZ5{+5W0s3Y{|5-iZpBS{R^a)XZ}iF1nMdd7%=tu#r^m965UNUH2lUSFWwCJ!hA` zh0tG7_Jp0vq7GcY0Nmfdx#g2l>chDoE*kFdF(bOOlvG+D>qA5*yPbtoADt&7v@ZPy z(B}2IYtFTf>Hrw;qb~v3WwvF8rmHD1KQ;Q=c-bnvQ(YwJEm?${CrrtZJJrmFh7Hv~ zi&B5@%WGaJ!b)aV6eb3IuIL?k%aiBzf}dQqxIPvP?~!8d!gvxuI=)r|ZwHsB{h=Mp z+p)5z#~zJ)yJOC?(F)dWZ#=X&qIxhThZajO4h8zJn- zQBu*M*}kFf^c~R)-%Ia)Uwf&*=KOXAu|RS(F0o)?*v2UuEE?&z?xi`ufWuNnE2ohFLIpGH4#hN%S|W_2vEWaQF0a>#hnr%sUKPq{)j_-Wm-| zscY{_`;n>zZOP4^xQfE_8K?-{OA>fr>HUg4j3!5fPZ%t}0)Y~eix&{eeQ~&08@zfK zrEGrR7+JTQNc%pBBE&aamMl{iR69AG$&UqZ{e~C;Spn&}>MD=DS&ffnlv`akg))Y& zl2dcS%mt=^w^Rg%coKvd8%;Ea{4t1QZ)3VWg*j7F#Qp-WzuA6`*@poJdxj?}kLh?R z~tQ`2v2+lxMWeyfw&(B5fv`uJQqI>?&3 zWh@j{qcqfGxDiEpV+3|AhW)s2FUZmo9g6#9MozWze&SMLE>RrlAV_pK&wj>#%& zq!CCq0IoKQA&8w5&YPOIf9eG*=W%!0;C*vPp3Ic5boi?no+nL=MXtQ7GM*SRSA;`m zp=7b~_j25TKFcelP8V-;{;&N?ry~OI3v7#FO`C6?#zhGFd;uknau2m^Ov*VzVP}`d z{@W<=7y{O=)uMRJ5&n5Tc05+ZnHX$2}bfZ+GGla_(cymMJEG;u5 zeSK3-t2INh6h(dg!%yrMi|ZYp=Ssn25MP^8&?Fwl*%a-ZVn@}`T9qHIA^fSwnEIP& z8!-peT8_$#8G*hVBm1bi1ugq<*K7WfJ=e33WhyM_u`dpW{tRot@%+zW41F;Gr0Z1i%EjIh(Q=>cIFWMGY`klg61fPK(`@PmNwLuoLCgXfr9yJIlGZrll%`6y?j z-v2Hu_hO17DhjF}mgmkw9+-oK|2p)Q29p}7^g;k>-R3B7D`R(4Ci7jes;JVWtwL3R zQ6S%Qo97Uar8-rpExqd7pdWhCM#lbG06v{kZIeBjSOHtWcE_+pc~cQm#rcvk8_Ow0 zOxQ&w1Xa{d-AqS%UKrbS7gIeyY;bwkV~~_VBwN^e>}y8QdnJI6f{S2*f&6%*2SC@i zk9%*<;>rhCG@GszcUYVdtEWeySYkSFu~&GQkE@uN=KHbHY&B%3OKL;7Kydp!YF@x(4lur&iPbQz2@NDusn|+3!ue_{_=GdtuSEonfY}`Q;i!d+aOQtu9~ZL2q>oYH~yXE#;j?Q=FZ)PTP6=$kQd> ziDL|5?MKHrmVK6jXYk4|9mg<{4{IC8pFN!;biMQ?VFUxF8(krP=;m&?;itoGC=37{ za*N9)z2nn%;PK5l6`3TT#fN#n&%=^vOr>DgT193Sm|8&WJLUx|Ov^Evt9)il`*jt0 zy!(Ti?(e;F-?ySP9G2UBSFlzP47?Sqv;h^4o(C-S>HRpPn=YBm^87|PG+kWj%oABN zO=85#onz5NbFi?-LW=?W+`rf(QDba#vsp2i(NoiJ zHxwh@!`riq6`;p;3`hh=≠c*U)(l-Q!L#DHk4p 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 u4qgczb)Nq7