From 440864ce87174618321c9d5146221490d8f07b24 Mon Sep 17 00:00:00 2001 From: James Milligan <75740990+james-milligan@users.noreply.github.com> Date: Mon, 20 Mar 2023 17:05:28 +0000 Subject: [PATCH] feat: Introduce flagd kube proxy (#495) ## This PR - introduced flagd Kubernetes proxy as new binary requires testing and documentation ### Related Issues ### Notes ### Follow-up Tasks create issues for certificate handling https://github.com/open-feature/flagd/issues/524 ### How to test Resolves: https://github.com/open-feature/flagd/issues/500 --------- Signed-off-by: James Milligan Signed-off-by: James Milligan <75740990+james-milligan@users.noreply.github.com> Co-authored-by: Michael Beemer Co-authored-by: Kavindu Dodanduwa --- .github/workflows/release-please.yaml | 2 +- config/deployments/kube-flagd-proxy/crb.yaml | 18 + .../kube-flagd-proxy/deployment.yaml | 31 + .../deployments/kube-flagd-proxy/service.yaml | 11 + core/go.sum | 6 - core/pkg/runtime/from_config.go | 4 +- core/pkg/runtime/runtime.go | 9 +- .../{ => flag-evaluation}/connect_service.go | 34 +- .../connect_service_test.go | 5 +- .../connect_service_types.go | 0 core/pkg/service/iservice.go | 15 +- .../service/{ => metrics}/connect_metrics.go | 14 +- .../{ => metrics}/connect_metrics_test.go | 6 +- core/pkg/service/sync/handler.go | 59 + core/pkg/service/sync/server.go | 122 ++ core/pkg/sync-store/sync_store.go | 293 ++++ core/pkg/sync-store/sync_store_test.go | 443 ++++++ flagd/cmd/start.go | 4 +- flagd/go.sum | 1208 ----------------- images/kube-flagd-proxy.png | Bin 0 -> 78658 bytes kube-flagd-proxy/README.md | 60 + kube-flagd-proxy/build.Dockerfile | 36 + kube-flagd-proxy/cmd/root.go | 72 + kube-flagd-proxy/cmd/start.go | 85 ++ kube-flagd-proxy/go.mod | 27 +- kube-flagd-proxy/go.sum | 26 + kube-flagd-proxy/main.go | 33 +- release-please-config.json | 8 +- 28 files changed, 1364 insertions(+), 1267 deletions(-) create mode 100644 config/deployments/kube-flagd-proxy/crb.yaml create mode 100644 config/deployments/kube-flagd-proxy/deployment.yaml create mode 100644 config/deployments/kube-flagd-proxy/service.yaml rename core/pkg/service/{ => flag-evaluation}/connect_service.go (92%) rename core/pkg/service/{ => flag-evaluation}/connect_service_test.go (99%) rename core/pkg/service/{ => flag-evaluation}/connect_service_types.go (100%) rename core/pkg/service/{ => metrics}/connect_metrics.go (96%) rename core/pkg/service/{ => metrics}/connect_metrics_test.go (97%) create mode 100644 core/pkg/service/sync/handler.go create mode 100644 core/pkg/service/sync/server.go create mode 100644 core/pkg/sync-store/sync_store.go create mode 100644 core/pkg/sync-store/sync_store_test.go create mode 100644 images/kube-flagd-proxy.png create mode 100644 kube-flagd-proxy/README.md create mode 100644 kube-flagd-proxy/build.Dockerfile create mode 100644 kube-flagd-proxy/cmd/root.go create mode 100644 kube-flagd-proxy/cmd/start.go diff --git a/.github/workflows/release-please.yaml b/.github/workflows/release-please.yaml index 687bb1ce3..080e31e42 100644 --- a/.github/workflows/release-please.yaml +++ b/.github/workflows/release-please.yaml @@ -5,7 +5,7 @@ on: env: # Stringified list of items that should be published - PUBLISHABLE_ITEMS: '["flagd"]' + PUBLISHABLE_ITEMS: '["flagd","kube-flagd-proxy"]' REGISTRY: ghcr.io REPO_OWNER: ${{ github.repository_owner }} DEFAULT_GO_VERSION: 1.19 diff --git a/config/deployments/kube-flagd-proxy/crb.yaml b/config/deployments/kube-flagd-proxy/crb.yaml new file mode 100644 index 000000000..4bb1118ab --- /dev/null +++ b/config/deployments/kube-flagd-proxy/crb.yaml @@ -0,0 +1,18 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + annotations: + kubectl.kubernetes.io/last-applied-configuration: | + {"apiVersion":"rbac.authorization.k8s.io/v1","kind":"ClusterRoleBinding","metadata":{"annotations":{},"name":"open-feature-operator-flagd-kubernetes-sync"},"roleRef":{"apiGroup":"","kind":"ClusterRole","name":"open-feature-operator-flagd-kubernetes-sync"},"subjects":[{"apiGroup":"","kind":"ServiceAccount","name":"open-feature-operator-controller-manager","namespace":"system"}]} + name: open-feature-operator-flagd-kubernetes-sync +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: open-feature-operator-flagd-kubernetes-sync +subjects: +- kind: ServiceAccount + name: open-feature-operator-controller-manager + namespace: system +- kind: ServiceAccount + name: default + namespace: kube-proxy diff --git a/config/deployments/kube-flagd-proxy/deployment.yaml b/config/deployments/kube-flagd-proxy/deployment.yaml new file mode 100644 index 000000000..2d31add8b --- /dev/null +++ b/config/deployments/kube-flagd-proxy/deployment.yaml @@ -0,0 +1,31 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + namespace: kube-proxy + labels: + app: kube-proxy + name: kube-proxy + annotations: + openfeature.dev/allowkubernetessync: "true" +spec: + replicas: 1 + selector: + matchLabels: + app: kube-proxy + template: + metadata: + creationTimestamp: null + labels: + app.kubernetes.io/name: kube-proxy + app: kube-proxy + annotations: + openfeature.dev/allowkubernetessync: "true" + spec: + containers: + - image: ghcr.io/open-feature/kube-flagd-proxy:v0.1.1 # x-release-please-version + name: kube-flagd-proxy + ports: + - containerPort: 8015 + args: + - start diff --git a/config/deployments/kube-flagd-proxy/service.yaml b/config/deployments/kube-flagd-proxy/service.yaml new file mode 100644 index 000000000..9fe889eb8 --- /dev/null +++ b/config/deployments/kube-flagd-proxy/service.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Service +metadata: + name: kube-proxy-svc + namespace: kube-proxy +spec: + selector: + app.kubernetes.io/name: kube-proxy + ports: + - port: 8015 + targetPort: 8015 \ No newline at end of file diff --git a/core/go.sum b/core/go.sum index e4e63e6c7..60413e062 100644 --- a/core/go.sum +++ b/core/go.sum @@ -1286,18 +1286,12 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh 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.26.2 h1:dM3cinp3PGB6asOySalOZxEG4CZ0IAdJsrYZXE/ovGQ= -k8s.io/api v0.26.2/go.mod h1:1kjMQsFE+QHPfskEcVNgL3+Hp88B80uj0QtSOlj8itU= k8s.io/api v0.26.3 h1:emf74GIQMTik01Aum9dPP0gAypL8JTLl/lHa4V9RFSU= k8s.io/api v0.26.3/go.mod h1:PXsqwPMXBSBcL1lJ9CYDKy7kIReUydukS5JiRlxC3qE= k8s.io/apiextensions-apiserver v0.26.1 h1:cB8h1SRk6e/+i3NOrQgSFij1B2S0Y0wDoNl66bn8RMI= k8s.io/apiextensions-apiserver v0.26.1/go.mod h1:AptjOSXDGuE0JICx/Em15PaoO7buLwTs0dGleIHixSM= -k8s.io/apimachinery v0.26.2 h1:da1u3D5wfR5u2RpLhE/ZtZS2P7QvDgLZTi9wrNZl/tQ= -k8s.io/apimachinery v0.26.2/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= k8s.io/apimachinery v0.26.3 h1:dQx6PNETJ7nODU3XPtrwkfuubs6w7sX0M8n61zHIV/k= k8s.io/apimachinery v0.26.3/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= -k8s.io/client-go v0.26.2 h1:s1WkVujHX3kTp4Zn4yGNFK+dlDXy1bAAkIl+cFAiuYI= -k8s.io/client-go v0.26.2/go.mod h1:u5EjOuSyBa09yqqyY7m3abZeovO/7D/WehVVlZ2qcqU= k8s.io/client-go v0.26.3 h1:k1UY+KXfkxV2ScEL3gilKcF7761xkYsSD6BC9szIu8s= k8s.io/client-go v0.26.3/go.mod h1:ZPNu9lm8/dbRIPAgteN30RSXea6vrCpFvq+MateTUuQ= k8s.io/component-base v0.26.1 h1:4ahudpeQXHZL5kko+iDHqLj/FSGAEUnSVO0EBbgDd+4= diff --git a/core/pkg/runtime/from_config.go b/core/pkg/runtime/from_config.go index d2218e1c7..eb7255704 100644 --- a/core/pkg/runtime/from_config.go +++ b/core/pkg/runtime/from_config.go @@ -11,7 +11,7 @@ import ( "github.com/open-feature/flagd/core/pkg/eval" "github.com/open-feature/flagd/core/pkg/logger" - "github.com/open-feature/flagd/core/pkg/service" + service "github.com/open-feature/flagd/core/pkg/service/flag-evaluation" "github.com/open-feature/flagd/core/pkg/store" "github.com/open-feature/flagd/core/pkg/sync" "github.com/open-feature/flagd/core/pkg/sync/file" @@ -67,8 +67,6 @@ func FromConfig(logger *logger.Logger, config Config) (*Runtime, error) { func (r *Runtime) setService(logger *logger.Logger) { r.Service = &service.ConnectService{ ConnectServiceConfiguration: &service.ConnectServiceConfiguration{ - Port: r.config.ServicePort, - MetricsPort: r.config.MetricsPort, ServerKeyPath: r.config.ServiceKeyPath, ServerCertPath: r.config.ServiceCertPath, ServerSocketPath: r.config.ServiceSocketPath, diff --git a/core/pkg/runtime/runtime.go b/core/pkg/runtime/runtime.go index 14b18d554..82a402220 100644 --- a/core/pkg/runtime/runtime.go +++ b/core/pkg/runtime/runtime.go @@ -18,7 +18,7 @@ import ( type Runtime struct { config Config - Service service.IService + Service service.IFlagEvaluationService SyncImpl []sync.ISync mu msync.Mutex @@ -27,8 +27,8 @@ type Runtime struct { } type Config struct { - ServicePort int32 - MetricsPort int32 + ServicePort uint16 + MetricsPort uint16 ServiceSocketPath string ServiceCertPath string ServiceKeyPath string @@ -37,6 +37,7 @@ type Config struct { CORS []string } +// nolint: funlen func (r *Runtime) Start() error { if r.Service == nil { return errors.New("no service set") @@ -90,6 +91,8 @@ func (r *Runtime) Start() error { g.Go(func() error { return r.Service.Serve(gCtx, r.Evaluator, service.Configuration{ ReadinessProbe: r.isReady, + Port: r.config.ServicePort, + MetricsPort: r.config.MetricsPort, }) }) <-gCtx.Done() diff --git a/core/pkg/service/connect_service.go b/core/pkg/service/flag-evaluation/connect_service.go similarity index 92% rename from core/pkg/service/connect_service.go rename to core/pkg/service/flag-evaluation/connect_service.go index cca118b89..4e1718212 100644 --- a/core/pkg/service/connect_service.go +++ b/core/pkg/service/flag-evaluation/connect_service.go @@ -16,6 +16,8 @@ import ( "github.com/open-feature/flagd/core/pkg/eval" "github.com/open-feature/flagd/core/pkg/logger" "github.com/open-feature/flagd/core/pkg/model" + iservice "github.com/open-feature/flagd/core/pkg/service" + "github.com/open-feature/flagd/core/pkg/service/metrics" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/rs/cors" "github.com/rs/xid" @@ -36,8 +38,6 @@ type ConnectService struct { server http.Server } type ConnectServiceConfiguration struct { - Port int32 - MetricsPort int32 ServerCertPath string ServerKeyPath string ServerSocketPath string @@ -46,13 +46,13 @@ type ConnectServiceConfiguration struct { type eventingConfiguration struct { mu *sync.RWMutex - subs map[interface{}]chan Notification + subs map[interface{}]chan iservice.Notification } -func (s *ConnectService) Serve(ctx context.Context, eval eval.IEvaluator, svcConf Configuration) error { +func (s *ConnectService) Serve(ctx context.Context, eval eval.IEvaluator, svcConf iservice.Configuration) error { s.Eval = eval s.eventingConfiguration = &eventingConfiguration{ - subs: make(map[interface{}]chan Notification), + subs: make(map[interface{}]chan iservice.Notification), mu: &sync.RWMutex{}, } lis, err := s.setupServer(svcConf) @@ -88,14 +88,14 @@ func (s *ConnectService) Serve(ctx context.Context, eval eval.IEvaluator, svcCon } } -func (s *ConnectService) setupServer(svcConf Configuration) (net.Listener, error) { +func (s *ConnectService) setupServer(svcConf iservice.Configuration) (net.Listener, error) { var lis net.Listener var err error mux := http.NewServeMux() if s.ConnectServiceConfiguration.ServerSocketPath != "" { lis, err = net.Listen("unix", s.ConnectServiceConfiguration.ServerSocketPath) } else { - address := fmt.Sprintf(":%d", s.ConnectServiceConfiguration.Port) + address := fmt.Sprintf(":%d", svcConf.Port) lis, err = net.Listen("tcp", address) } if err != nil { @@ -108,12 +108,12 @@ func (s *ConnectService) setupServer(svcConf Configuration) (net.Listener, error return nil, err } - mdlw := New(middlewareConfig{ + mdlw := metrics.New(metrics.MiddlewareConfig{ Service: "openfeature/flagd", MetricReader: exporter, Logger: s.Logger, }) - h := Handler("", mdlw, mux) + h := metrics.Handler("", mdlw, mux) go bindMetrics(s, svcConf) @@ -192,7 +192,7 @@ func (s *ConnectService) EventStream( req *connect.Request[schemaV1.EventStreamRequest], stream *connect.ServerStream[schemaV1.EventStreamResponse], ) error { - requestNotificationChan := make(chan Notification, 1) + requestNotificationChan := make(chan iservice.Notification, 1) s.eventingConfiguration.mu.Lock() s.eventingConfiguration.subs[req] = requestNotificationChan s.eventingConfiguration.mu.Unlock() @@ -201,14 +201,14 @@ func (s *ConnectService) EventStream( delete(s.eventingConfiguration.subs, req) s.eventingConfiguration.mu.Unlock() }() - requestNotificationChan <- Notification{ - Type: ProviderReady, + requestNotificationChan <- iservice.Notification{ + Type: iservice.ProviderReady, } for { select { case <-time.After(20 * time.Second): err := stream.Send(&schemaV1.EventStreamResponse{ - Type: string(KeepAlive), + Type: string(iservice.KeepAlive), }) if err != nil { s.Logger.Error(err.Error()) @@ -231,7 +231,7 @@ func (s *ConnectService) EventStream( } } -func (s *ConnectService) Notify(n Notification) { +func (s *ConnectService) Notify(n iservice.Notification) { s.eventingConfiguration.mu.RLock() defer s.eventingConfiguration.mu.RUnlock() for _, send := range s.eventingConfiguration.subs { @@ -367,10 +367,10 @@ func (s *ConnectService) newCORS() *cors.Cors { }) } -func bindMetrics(s *ConnectService, svcConf Configuration) { - s.Logger.Info(fmt.Sprintf("metrics and probes listening at %d", s.ConnectServiceConfiguration.MetricsPort)) +func bindMetrics(s *ConnectService, svcConf iservice.Configuration) { + s.Logger.Info(fmt.Sprintf("metrics and probes listening at %d", svcConf.MetricsPort)) server := &http.Server{ - Addr: fmt.Sprintf(":%d", s.ConnectServiceConfiguration.MetricsPort), + Addr: fmt.Sprintf(":%d", svcConf.MetricsPort), ReadHeaderTimeout: 3 * time.Second, } server.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { diff --git a/core/pkg/service/connect_service_test.go b/core/pkg/service/flag-evaluation/connect_service_test.go similarity index 99% rename from core/pkg/service/connect_service_test.go rename to core/pkg/service/flag-evaluation/connect_service_test.go index c11276c42..073806673 100644 --- a/core/pkg/service/connect_service_test.go +++ b/core/pkg/service/flag-evaluation/connect_service_test.go @@ -16,7 +16,8 @@ import ( mock "github.com/open-feature/flagd/core/pkg/eval/mock" "github.com/open-feature/flagd/core/pkg/logger" "github.com/open-feature/flagd/core/pkg/model" - service "github.com/open-feature/flagd/core/pkg/service" + iservice "github.com/open-feature/flagd/core/pkg/service" + service "github.com/open-feature/flagd/core/pkg/service/flag-evaluation" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "google.golang.org/protobuf/types/known/structpb" @@ -75,7 +76,7 @@ func TestConnectService_UnixConnection(t *testing.T) { }, Logger: logger.NewLogger(nil, false), } - serveConf := service.Configuration{ + serveConf := iservice.Configuration{ ReadinessProbe: func() bool { return true }, diff --git a/core/pkg/service/connect_service_types.go b/core/pkg/service/flag-evaluation/connect_service_types.go similarity index 100% rename from core/pkg/service/connect_service_types.go rename to core/pkg/service/flag-evaluation/connect_service_types.go diff --git a/core/pkg/service/iservice.go b/core/pkg/service/iservice.go index f0a215a7d..091c401b9 100644 --- a/core/pkg/service/iservice.go +++ b/core/pkg/service/iservice.go @@ -23,12 +23,23 @@ type ReadinessProbe func() bool type Configuration struct { ReadinessProbe ReadinessProbe + Port uint16 + MetricsPort uint16 } /* -IService implementations define handlers for a particular transport, which call the IEvaluator implementation. +IFlagEvaluationService implementations define handlers for a particular transport, +which call the IEvaluator implementation. */ -type IService interface { +type IFlagEvaluationService interface { Serve(ctx context.Context, eval eval.IEvaluator, svcConf Configuration) error Notify(n Notification) } + +/* +IFlagEvaluationService implementations define handlers for a particular transport, +which call the IEvaluator implementation. +*/ +type IKubeSyncService interface { + Serve(ctx context.Context, svcConf Configuration) error +} diff --git a/core/pkg/service/connect_metrics.go b/core/pkg/service/metrics/connect_metrics.go similarity index 96% rename from core/pkg/service/connect_metrics.go rename to core/pkg/service/metrics/connect_metrics.go index 63769f784..7bc6b47cb 100644 --- a/core/pkg/service/connect_metrics.go +++ b/core/pkg/service/metrics/connect_metrics.go @@ -1,4 +1,4 @@ -package service +package metrics import ( "bufio" @@ -91,7 +91,7 @@ func (r OTelMetricsRecorder) OTelInFlightRequestEnd(p HTTPReqProperties) { r.httpRequestsInflight.Add(context.TODO(), -1, r.setAttributes(p)...) } -type middlewareConfig struct { +type MiddlewareConfig struct { recorder Recorder MetricReader metric.Reader Logger *logger.Logger @@ -101,16 +101,16 @@ type middlewareConfig struct { } type Middleware struct { - cfg middlewareConfig + cfg MiddlewareConfig } -func New(cfg middlewareConfig) Middleware { +func New(cfg MiddlewareConfig) Middleware { cfg.defaults() m := Middleware{cfg: cfg} return m } -func (cfg *middlewareConfig) defaults() { +func (cfg *MiddlewareConfig) defaults() { if cfg.Logger == nil { log.Fatal("missing logger") } @@ -120,7 +120,7 @@ func (cfg *middlewareConfig) defaults() { cfg.recorder = cfg.newOTelRecorder(cfg.MetricReader) } -func (cfg *middlewareConfig) getDurationView(name string, bucket []float64) metric.View { +func (cfg *MiddlewareConfig) getDurationView(name string, bucket []float64) metric.View { return metric.NewView( metric.Instrument{ // we change aggregation only for instruments with this name and scope @@ -135,7 +135,7 @@ func (cfg *middlewareConfig) getDurationView(name string, bucket []float64) metr ) } -func (cfg *middlewareConfig) newOTelRecorder(exporter metric.Reader) *OTelMetricsRecorder { +func (cfg *MiddlewareConfig) newOTelRecorder(exporter metric.Reader) *OTelMetricsRecorder { const requestDurationName = "http_request_duration_seconds" const responseSizeName = "http_response_size_bytes" diff --git a/core/pkg/service/connect_metrics_test.go b/core/pkg/service/metrics/connect_metrics_test.go similarity index 97% rename from core/pkg/service/connect_metrics_test.go rename to core/pkg/service/metrics/connect_metrics_test.go index 96e402898..3abe7c081 100644 --- a/core/pkg/service/connect_metrics_test.go +++ b/core/pkg/service/metrics/connect_metrics_test.go @@ -1,4 +1,4 @@ -package service +package metrics import ( "context" @@ -87,7 +87,7 @@ func TestMiddleware(t *testing.T) { const svcName = "mySvc" exp := metric.NewManualReader() l, _ := logger.NewZapLogger(zapcore.DebugLevel, "") - m := New(middlewareConfig{ + m := New(MiddlewareConfig{ MetricReader: exp, Service: svcName, Logger: logger.NewLogger(l, true), @@ -122,7 +122,7 @@ func TestNew_AutowireOTel(t *testing.T) { l, _ := logger.NewZapLogger(zapcore.DebugLevel, "") log := logger.NewLogger(l, true) exp := metric.NewManualReader() - mdw := New(middlewareConfig{ + mdw := New(MiddlewareConfig{ MetricReader: exp, Logger: log, Service: "mySvc", diff --git a/core/pkg/service/sync/handler.go b/core/pkg/service/sync/handler.go new file mode 100644 index 000000000..78c0db633 --- /dev/null +++ b/core/pkg/service/sync/handler.go @@ -0,0 +1,59 @@ +package sync + +import ( + "context" + + syncv1 "buf.build/gen/go/open-feature/flagd/protocolbuffers/go/sync/v1" + "github.com/bufbuild/connect-go" + "github.com/open-feature/flagd/core/pkg/logger" + "github.com/open-feature/flagd/core/pkg/sync" + syncStore "github.com/open-feature/flagd/core/pkg/sync-store" +) + +type handler struct { + syncStore *syncStore.SyncStore + logger *logger.Logger +} + +func (l *handler) FetchAllFlags(ctx context.Context, req *connect.Request[syncv1.FetchAllFlagsRequest]) ( + *connect.Response[syncv1.FetchAllFlagsResponse], + error, +) { + data, err := l.syncStore.FetchAllFlags(ctx, req, req.Msg.GetSelector()) + if err != nil { + return connect.NewResponse(&syncv1.FetchAllFlagsResponse{}), err + } + + return connect.NewResponse(&syncv1.FetchAllFlagsResponse{ + FlagConfiguration: data.FlagData, + }), nil +} + +func (l *handler) SyncFlags( + ctx context.Context, + req *connect.Request[syncv1.SyncFlagsRequest], + stream *connect.ServerStream[syncv1.SyncFlagsResponse], +) error { + errChan := make(chan error) + dataSync := make(chan sync.DataSync) + l.syncStore.RegisterSubscription(ctx, req.Msg.GetSelector(), req, dataSync, errChan) + for { + select { + case e := <-errChan: + return e + case d := <-dataSync: + if err := stream.Send(&syncv1.SyncFlagsResponse{ + FlagConfiguration: d.FlagData, + State: dataSyncToGrpcState(d), + }); err != nil { + return err + } + case <-ctx.Done(): + return nil + } + } +} + +func dataSyncToGrpcState(s sync.DataSync) syncv1.SyncState { + return syncv1.SyncState(s.Type + 1) +} diff --git a/core/pkg/service/sync/server.go b/core/pkg/service/sync/server.go new file mode 100644 index 000000000..a7d7de993 --- /dev/null +++ b/core/pkg/service/sync/server.go @@ -0,0 +1,122 @@ +package sync + +import ( + "context" + "errors" + "fmt" + "net" + "net/http" + "time" + + rpc "buf.build/gen/go/open-feature/flagd/bufbuild/connect-go/sync/v1/syncv1connect" + "github.com/open-feature/flagd/core/pkg/logger" + iservice "github.com/open-feature/flagd/core/pkg/service" + syncStore "github.com/open-feature/flagd/core/pkg/sync-store" + "golang.org/x/net/http2" + "golang.org/x/net/http2/h2c" + "golang.org/x/sync/errgroup" +) + +type Server struct { + server *http.Server + metricsServer *http.Server + Logger *logger.Logger + handler handler + config iservice.Configuration +} + +func NewServer(ctx context.Context, logger *logger.Logger) *Server { + syncStore := syncStore.NewSyncStore(ctx, logger) + return &Server{ + handler: handler{ + logger: logger, + syncStore: syncStore, + }, + Logger: logger, + } +} + +func (s *Server) Serve(ctx context.Context, svcConf iservice.Configuration) error { + s.config = svcConf + + g, gCtx := errgroup.WithContext(ctx) + + g.Go(s.startServer) + g.Go(s.startMetricsServer) + g.Go(func() error { + <-gCtx.Done() + if s.server != nil { + if err := s.server.Shutdown(gCtx); err != nil { + return err + } + } + return nil + }) + g.Go(func() error { + <-gCtx.Done() + if s.metricsServer != nil { + if err := s.metricsServer.Shutdown(gCtx); err != nil { + return err + } + } + return nil + }) + + err := g.Wait() + if err != nil { + return err + } + return nil +} + +func (s *Server) startServer() error { + var lis net.Listener + var err error + mux := http.NewServeMux() + address := fmt.Sprintf(":%d", s.config.Port) + lis, err = net.Listen("tcp", address) + if err != nil { + return err + } + path, handler := rpc.NewFlagSyncServiceHandler(&s.handler) + mux.Handle(path, handler) + + s.server = &http.Server{ + ReadHeaderTimeout: time.Second, + Handler: h2c.NewHandler(mux, &http2.Server{}), + } + + if err := s.server.Serve( + lis, + ); err != nil && !errors.Is(err, http.ErrServerClosed) { + return err + } + + return nil +} + +func (s *Server) startMetricsServer() error { + s.Logger.Info(fmt.Sprintf("binding metrics to %d", s.config.MetricsPort)) + s.metricsServer = &http.Server{ + ReadHeaderTimeout: 3 * time.Second, + Addr: fmt.Sprintf(":%d", s.config.MetricsPort), + } + s.metricsServer.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case "/healthz": + w.WriteHeader(http.StatusOK) + case "/readyz": + if s.config.ReadinessProbe() { + w.WriteHeader(http.StatusOK) + } else { + w.WriteHeader(http.StatusPreconditionFailed) + } + default: + w.WriteHeader(http.StatusNotFound) + } + }) + if err := s.metricsServer.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { + return err + } + return nil +} diff --git a/core/pkg/sync-store/sync_store.go b/core/pkg/sync-store/sync_store.go new file mode 100644 index 000000000..f0d6b5697 --- /dev/null +++ b/core/pkg/sync-store/sync_store.go @@ -0,0 +1,293 @@ +package store + +import ( + "context" + "errors" + "fmt" + "regexp" + "sync" + "time" + + "github.com/open-feature/flagd/core/pkg/logger" + isync "github.com/open-feature/flagd/core/pkg/sync" + "github.com/open-feature/flagd/core/pkg/sync/file" + "github.com/open-feature/flagd/core/pkg/sync/kubernetes" + "go.uber.org/zap" +) + +var ( + regCrd *regexp.Regexp + regFile *regexp.Regexp +) + +func init() { + regCrd = regexp.MustCompile("^core.openfeature.dev/") + regFile = regexp.MustCompile("^file:") +} + +type SyncStore struct { + ctx context.Context + syncHandlers map[string]*syncHandler + logger *logger.Logger + mu *sync.RWMutex + syncBuilder SyncBuilderInterface +} + +type syncHandler struct { + subs map[interface{}]storedChannels + dataSync chan isync.DataSync + cancelFunc context.CancelFunc + syncRef isync.ISync + mu *sync.RWMutex +} + +type storedChannels struct { + errChan chan error + dataSync chan isync.DataSync +} + +// NewSyncStore returns a new sync store +func NewSyncStore(ctx context.Context, logger *logger.Logger) *SyncStore { + ss := SyncStore{ + ctx: ctx, + syncHandlers: map[string]*syncHandler{}, + logger: logger, + mu: &sync.RWMutex{}, + syncBuilder: &SyncBuilder{}, + } + go ss.cleanup() + return &ss +} + +// FetchAllFlags returns a DataSync containing the full set of flag configurations from the SyncStore. +// This will either occur via triggering a resync, or through setting up a new subscription to the resource +func (s *SyncStore) FetchAllFlags(ctx context.Context, key interface{}, target string) (isync.DataSync, error) { + s.logger.Debug(fmt.Sprintf("fetching all flags for target %s", target)) + dataSyncChan := make(chan isync.DataSync, 1) + errChan := make(chan error, 1) + s.mu.RLock() + syncHandler, ok := s.syncHandlers[target] + s.mu.RUnlock() + if !ok { + s.logger.Debug(fmt.Sprintf("sync handler does not exist for target %s, registering a new subscription", target)) + s.RegisterSubscription(ctx, target, key, dataSyncChan, errChan) + } else { + if syncHandler.syncRef == nil { + return isync.DataSync{}, errors.New("sync ref not set") + } + go func() { + s.logger.Debug(fmt.Sprintf("sync handler exists for target %s, triggering a resync", target)) + if err := syncHandler.syncRef.ReSync(ctx, dataSyncChan); err != nil { + errChan <- err + } + }() + } + + select { + case data := <-dataSyncChan: + return data, nil + case err := <-errChan: + return isync.DataSync{}, err + case <-time.After(5 * time.Second): + return isync.DataSync{}, errors.New("fetching all flags timed out after 5 seconds") + } +} + +// RegisterSubscription starts a new subscription to the target resource. +// Once the subscription is set an ALL sync event will be recieved via the DataSync chan. +func (s *SyncStore) RegisterSubscription( + ctx context.Context, + target string, + key interface{}, + dataSync chan isync.DataSync, + errChan chan error, +) { + s.mu.Lock() + defer s.mu.Unlock() + // is there a currently active subscription for this target? + sh, ok := s.syncHandlers[target] + if !ok { + // we need to start a sync for this + s.logger.Debug( + fmt.Sprintf( + "sync handler does not exist for target %s, registering syncHandler with sub %p", + target, + key, + )) + sh = &syncHandler{ + dataSync: make(chan isync.DataSync), + subs: map[interface{}]storedChannels{ + key: { + errChan: errChan, + dataSync: dataSync, + }, + }, + mu: &sync.RWMutex{}, + } + s.syncHandlers[target] = sh + go s.watchResource(target) + } else { + // register our sub in the map + s.logger.Debug(fmt.Sprintf("registering sync subscription %p", key)) + sh.subs[key] = storedChannels{ + errChan: errChan, + dataSync: dataSync, + } + + // access pointer + trigger resync passing the dataSync + if sh.syncRef != nil { + go func() { + s.logger.Debug(fmt.Sprintf("sync handler exists for target %s, triggering a resync", target)) + if err := sh.syncRef.ReSync(ctx, dataSync); err != nil { + errChan <- err + } + }() + } + } + // defer until context close to remove the key + go func() { + <-ctx.Done() + s.mu.Lock() + if s.syncHandlers[target] != nil && s.syncHandlers[target].subs != nil { + s.logger.Debug(fmt.Sprintf("removing sync subscription due to context cancellation %p", key)) + delete(s.syncHandlers[target].subs, key) + } + s.mu.Unlock() + }() +} + +func (s *SyncStore) watchResource(target string) { + s.logger.Debug(fmt.Sprintf("watching resource %s", target)) + ctx, cancel := context.WithCancel(s.ctx) + defer cancel() + sh, ok := s.syncHandlers[target] + if !ok { + s.logger.Error(fmt.Sprintf("no sync handler exists for target %s", target)) + return + } + // this cancel is accessed by the cleanup method shutdown the listener + delete the syncHandler + sh.cancelFunc = cancel + go func() { + <-ctx.Done() + s.mu.Lock() + delete(s.syncHandlers, target) + s.mu.Unlock() + }() + // broadcast any data passed through the core channel to all subscribing channels + go func() { + for { + select { + case <-ctx.Done(): + return + case d := <-sh.dataSync: + sh.writeData(s.logger, d) + } + } + }() + // setup sync, if this fails an error is broadcasted, and the defer results in cleanup + sync, err := s.syncBuilder.SyncFromURI(target, s.logger) + if err != nil { + s.logger.Error(fmt.Sprintf("unable to build sync from URI for target %s: %s", target, err.Error())) + sh.writeError(s.logger, err) + return + } + // init sync, if this fails an error is broadcasted, and the defer results in cleanup + err = sync.Init(ctx) + if err != nil { + s.logger.Error(fmt.Sprintf("unable to initiate sync for target %s: %s", target, err.Error())) + sh.writeError(s.logger, err) + return + } + // sync ref is used to trigger a resync on a single channel when a new subscription is started + // but the associated SyncHandler already exists, i.e. this function is not run + sh.syncRef = sync + err = sync.Sync(ctx, sh.dataSync) + if err != nil { + s.logger.Error(fmt.Sprintf("error from sync for target %s: %s", target, err.Error())) + sh.writeError(s.logger, err) + } +} + +func (h *syncHandler) writeError(logger *logger.Logger, err error) { + h.mu.RLock() + defer h.mu.RUnlock() + for k, ec := range h.subs { + select { + case ec.errChan <- err: + continue + default: + logger.Error(fmt.Sprintf("unable to write error to channel for key %p", k)) + } + } +} + +func (h *syncHandler) writeData(logger *logger.Logger, data isync.DataSync) { + h.mu.RLock() + defer h.mu.RUnlock() + for k, ds := range h.subs { + select { + case ds.dataSync <- data: + continue + default: + logger.Error(fmt.Sprintf("unable to write data to channel for key %p", k)) + } + } +} + +func (s *SyncStore) cleanup() { + for { + select { + case <-s.ctx.Done(): + return + case <-time.After(5 * time.Second): + s.mu.Lock() + for k, v := range s.syncHandlers { + // delete any syncHandlers with 0 active subscriptions through cancelling its context + s.logger.Debug(fmt.Sprintf("syncHandler for target %s has %d subscriptions", k, len(v.subs))) + if len(v.subs) == 0 { + s.logger.Debug(fmt.Sprintf("shutting down syncHandler %s", k)) + s.syncHandlers[k].cancelFunc() + } + } + s.mu.Unlock() + } + } +} + +type SyncBuilderInterface interface { + SyncFromURI(uri string, logger *logger.Logger) (isync.ISync, error) +} + +type SyncBuilder struct{} + +// SyncFromURI builds an ISync interface from the input uri string +func (sb *SyncBuilder) SyncFromURI(uri string, logger *logger.Logger) (isync.ISync, error) { + switch uriB := []byte(uri); { + // filepath may be used for debugging, not recommended in deployment + case regFile.Match(uriB): + return &file.Sync{ + URI: regFile.ReplaceAllString(uri, ""), + Logger: logger.WithFields( + zap.String("component", "sync"), + zap.String("sync", "filepath"), + zap.String("target", "target"), + ), + Mux: &sync.RWMutex{}, + }, nil + case regCrd.Match(uriB): + reader, dynamic, err := kubernetes.GetClients() + if err != nil { + return nil, err + } + return kubernetes.NewK8sSync( + logger.WithFields( + zap.String("component", "sync"), + zap.String("sync", "kubernetes"), + ), + regCrd.ReplaceAllString(uri, ""), + reader, + dynamic, + ), nil + } + return nil, fmt.Errorf("unrecognized URI: %s", uri) +} diff --git a/core/pkg/sync-store/sync_store_test.go b/core/pkg/sync-store/sync_store_test.go new file mode 100644 index 000000000..93a3739b2 --- /dev/null +++ b/core/pkg/sync-store/sync_store_test.go @@ -0,0 +1,443 @@ +package store + +import ( + "context" + "errors" + "reflect" + "sync" + "testing" + "time" + + "github.com/open-feature/flagd/core/pkg/logger" + isync "github.com/open-feature/flagd/core/pkg/sync" +) + +type syncMock struct { + isync.ISync + dataSyncChanIn chan isync.DataSync + errChanIn chan error + resyncData *isync.DataSync + resyncError error + + initError error + ctxCloseError error +} + +func newMockSync() *syncMock { + return &syncMock{ + dataSyncChanIn: make(chan isync.DataSync, 1), + errChanIn: make(chan error, 1), + } +} + +func (s *syncMock) Init(ctx context.Context) error { + return s.initError +} + +func (s *syncMock) Sync(ctx context.Context, dataSync chan<- isync.DataSync) error { + for { + select { + case <-ctx.Done(): + return s.ctxCloseError + case d := <-s.dataSyncChanIn: + dataSync <- d + case e := <-s.errChanIn: + return e + } + } +} + +func (s *syncMock) ReSync(ctx context.Context, dataSync chan<- isync.DataSync) error { + if s.resyncData != nil { + dataSync <- *s.resyncData + } + return s.resyncError +} + +type syncBuilderMock struct { + mock isync.ISync + initError error +} + +func (s *syncBuilderMock) SyncFromURI(uri string, logger *logger.Logger) (isync.ISync, error) { + return s.mock, s.initError +} + +func newSyncHandler() (*syncHandler, interface{}) { + coreDataSyncChan := make(chan isync.DataSync, 1) + dataSyncChan := make(chan isync.DataSync, 1) + errChan := make(chan error, 1) + key := struct{}{} + + return &syncHandler{ + dataSync: coreDataSyncChan, + subs: map[interface{}]storedChannels{ + key: { + errChan: errChan, + dataSync: dataSyncChan, + }, + }, + mu: &sync.RWMutex{}, + }, key +} + +func Test_watchResource(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + syncStore := NewSyncStore(ctx, logger.NewLogger(nil, false)) + syncMock := newMockSync() + syncStore.syncBuilder = &syncBuilderMock{ + mock: syncMock, + } + + target := "test-target" + syncHandler, key := newSyncHandler() + + syncStore.syncHandlers[target] = syncHandler + + go syncStore.watchResource(target) + + // sync update should be broadcasted to all registered sync subs: + in := isync.DataSync{ + FlagData: "im a flag", + Source: "im a flag source", + Type: isync.ALL, + } + syncMock.dataSyncChanIn <- in + + select { + case d := <-syncHandler.subs[key].dataSync: + if !reflect.DeepEqual(d, in) { + t.Error("unexpected sync data", in, d) + } + case <-time.After(3 * time.Second): + t.Errorf("timed out waiting for broadcast of %v", in) + } + + // errors should be broadcasted to all registered sync subs + err := errors.New("very bad error") + syncMock.errChanIn <- err + select { + case e := <-syncHandler.subs[key].errChan: + if !errors.Is(e, err) { + t.Error("unexpected sync error", e, err) + } + case <-time.After(3 * time.Second): + t.Errorf("timed out waiting for broadcast of error") + } + + // no context cancellation should have occurred, and there should still be registered sync sub + syncStore.mu.Lock() + if len(syncHandler.subs) != 1 { + t.Error("incorrect number of subs in syncHandler", syncHandler.subs) + } + syncStore.mu.Unlock() + + // cancellation of context will result in the syncHandler being deleted + cancel() + // allow for the goroutine to catch the lock first + time.Sleep(1 * time.Second) + syncStore.mu.Lock() + if syncStore.syncHandlers[target] != nil { + t.Error("syncHandler has not been closed down after cancellation", syncHandler.subs) + } + syncStore.mu.Unlock() +} + +func Test_watchResource_initFail(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + syncStore := NewSyncStore(ctx, logger.NewLogger(nil, false)) + syncMock := newMockSync() + + // return an error on startup + syncMock.initError = errors.New("a terrible error") + syncStore.syncBuilder = &syncBuilderMock{ + mock: syncMock, + } + + target := "test-target" + syncHandler, key := newSyncHandler() + + syncStore.syncHandlers[target] = syncHandler + + go syncStore.watchResource(target) + + // the error channel should immediately receive an error response and close + select { + case e := <-syncHandler.subs[key].errChan: + if !errors.Is(e, syncMock.initError) { + t.Error("unexpected sync error", e, syncMock.initError) + } + case <-time.After(3 * time.Second): + t.Errorf("timed out waiting for broadcast of error") + } + + // this should then close the internal context and the watcher should be removed + time.Sleep(1 * time.Second) + syncStore.mu.Lock() + if syncStore.syncHandlers[target] != nil { + t.Error("syncHandler has not been closed down after cancellation", syncHandler.subs) + } + syncStore.mu.Unlock() +} + +func Test_watchResource_SyncFromURIFail(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + syncStore := NewSyncStore(ctx, logger.NewLogger(nil, false)) + syncMock := newMockSync() + + // return an error on startup + syncBuilder := &syncBuilderMock{ + mock: syncMock, + initError: errors.New("a terrible error"), + } + syncStore.syncBuilder = syncBuilder + + target := "test-target" + syncHandler, key := newSyncHandler() + + syncStore.syncHandlers[target] = syncHandler + + go syncStore.watchResource(target) + + // the error channel should immediately receive an error response and close + select { + case e := <-syncHandler.subs[key].errChan: + if !errors.Is(e, syncBuilder.initError) { + t.Error("unexpected sync error", e, syncBuilder.initError) + } + case <-time.After(3 * time.Second): + t.Errorf("timed out waiting for broadcast of error") + } + + // this should then close the internal context and the watcher should be removed + time.Sleep(1 * time.Second) + syncStore.mu.Lock() + if syncStore.syncHandlers[target] != nil { + t.Error("syncHandler has not been closed down after cancellation", syncHandler.subs) + } + syncStore.mu.Unlock() +} + +func Test_watchResource_SyncErrorOnClose(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + syncStore := NewSyncStore(ctx, logger.NewLogger(nil, false)) + syncMock := newMockSync() + + // return an error on startup + syncMock.ctxCloseError = errors.New("a terrible error") + syncStore.syncBuilder = &syncBuilderMock{ + mock: syncMock, + } + + target := "test-target" + syncHandler, key := newSyncHandler() + + syncStore.syncHandlers[target] = syncHandler + + go syncStore.watchResource(target) + cancel() + // the error channel should immediately receive an error response and close + select { + case e := <-syncHandler.subs[key].errChan: + if !errors.Is(e, syncMock.ctxCloseError) { + t.Error("unexpected sync error", e, syncMock.initError) + } + case <-time.After(3 * time.Second): + t.Errorf("timed out waiting for broadcast of error") + } + + // this should then close the internal context and the watcher should be removed + time.Sleep(1 * time.Second) + syncStore.mu.Lock() + if syncStore.syncHandlers[target] != nil { + t.Error("syncHandler has not been closed down after cancellation", syncHandler.subs) + } + syncStore.mu.Unlock() +} + +func Test_watchResource_SyncHandlerDoesNotExist(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + syncStore := NewSyncStore(ctx, logger.NewLogger(nil, false)) + syncMock := newMockSync() + + // return an error on startup + syncMock.ctxCloseError = errors.New("a terrible error") + syncStore.syncBuilder = &syncBuilderMock{ + mock: syncMock, + } + + target := "test-target" + + // sync store will early return and not block + syncStore.watchResource(target) +} + +func Test_watchResource_Cleanup(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + syncStore := NewSyncStore(ctx, logger.NewLogger(nil, false)) + syncMock := newMockSync() + + // return an error on startup + syncMock.ctxCloseError = errors.New("a terrible error") + syncStore.syncBuilder = &syncBuilderMock{ + mock: syncMock, + } + + target := "test-target" + + syncHandler, _ := newSyncHandler() + syncHandler.subs = map[interface{}]storedChannels{} + doneChan := make(chan struct{}, 1) + syncHandler.cancelFunc = func() { + doneChan <- struct{}{} + } + syncStore.mu.Lock() + syncStore.syncHandlers[target] = syncHandler + syncStore.mu.Unlock() + go func() { + syncStore.cleanup() + }() + + select { + case <-doneChan: + return + case <-time.After(10 * time.Second): + t.Error("syncHandlers not being cleaned up, timed out after 10 seconds") + } +} + +func Test_FetchAllFlags(t *testing.T) { + tests := map[string]struct { + expectErr bool + mockData *isync.DataSync + mockError error + setMock bool + setHandler bool + }{ + "resync route": { + expectErr: false, + setMock: true, + mockData: &isync.DataSync{ + FlagData: "im a flag", + Source: "im a flag source", + Type: isync.ALL, + }, + setHandler: true, + }, + "resync route sync does not exist": { + expectErr: true, + setMock: false, + mockData: nil, + setHandler: true, + }, + "resync route returns error": { + expectErr: true, + setMock: true, + mockData: nil, + mockError: errors.New("disaster"), + setHandler: true, + }, + "register subscription route timeout": { + expectErr: true, + }, + } + + for name, tt := range tests { + t.Run(name, func(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + syncStore := NewSyncStore(ctx, logger.NewLogger(nil, false)) + syncMock := newMockSync() + syncMock.resyncData = tt.mockData + syncMock.resyncError = tt.mockError + syncStore.syncBuilder = &syncBuilderMock{ + mock: syncMock, + } + + target := "test-target" + syncHandler, key := newSyncHandler() + if tt.setMock { + syncHandler.syncRef = syncMock + } + if tt.setHandler { + syncStore.syncHandlers[target] = syncHandler + } + + data, err := syncStore.FetchAllFlags(ctx, key, target) + if err != nil && !tt.expectErr { + t.Error(err) + } + if err == nil && tt.expectErr { + t.Error("did not receive expected error") + } + if tt.mockData != nil && !reflect.DeepEqual(data.FlagData, tt.mockData.FlagData) { + t.Error("data does not match expected value", tt.mockData.FlagData, data.FlagData) + } + }) + } +} + +func Test_registerSubscriptionResyncPath(t *testing.T) { + tests := map[string]struct { + data *isync.DataSync + err error + expectErr bool + }{ + "happy path": { + data: &isync.DataSync{ + FlagData: "im a flag", + Source: "im a flag source", + Type: isync.ALL, + }, + expectErr: false, + }, + "resync fails": { + err: errors.New("disaster"), + expectErr: true, + }, + } + + for name, tt := range tests { + t.Run(name, func(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + syncStore := NewSyncStore(ctx, logger.NewLogger(nil, false)) + + syncMock := newMockSync() + syncMock.resyncData = tt.data + syncMock.resyncError = tt.err + + syncStore.syncBuilder = &syncBuilderMock{ + mock: syncMock, + } + + target := "test-target" + syncHandler, _ := newSyncHandler() + syncHandler.syncRef = syncMock + key := struct{}{} + syncStore.syncHandlers[target] = syncHandler + dataChan := make(chan isync.DataSync, 1) + errChan := make(chan error, 1) + + go syncStore.RegisterSubscription(ctx, target, key, dataChan, errChan) + + select { + case d := <-dataChan: + if !reflect.DeepEqual(d, *tt.data) { + t.Error("received unexpected data", d, *tt.data) + } + case err := <-errChan: + if !tt.expectErr { + t.Error(err) + } + case <-time.After(3 * time.Second): + t.Error("timed out waiting for data chan") + } + }) + } +} diff --git a/flagd/cmd/start.go b/flagd/cmd/start.go index 5af2f6640..eba55ff50 100644 --- a/flagd/cmd/start.go +++ b/flagd/cmd/start.go @@ -142,10 +142,10 @@ var startCmd = &cobra.Command{ // Build Runtime ----------------------------------------------------------- rt, err := runtime.FromConfig(logger, runtime.Config{ CORS: viper.GetStringSlice(corsFlagName), - MetricsPort: viper.GetInt32(metricsPortFlagName), + MetricsPort: viper.GetUint16(metricsPortFlagName), ServiceCertPath: viper.GetString(serverCertPathFlagName), ServiceKeyPath: viper.GetString(serverKeyPathFlagName), - ServicePort: viper.GetInt32(portFlagName), + ServicePort: viper.GetUint16(portFlagName), ServiceSocketPath: viper.GetString(socketPathFlagName), SyncProviders: syncProviders, }) diff --git a/flagd/go.sum b/flagd/go.sum index af8c07039..2e260ce79 100644 --- a/flagd/go.sum +++ b/flagd/go.sum @@ -1,1296 +1,88 @@ -buf.build/gen/go/grpc-ecosystem/grpc-gateway/grpc/go v1.3.0-20220906183531-bc28b723cd77.1/go.mod h1:9Ec7rvBnjfZvU/TnWjtcSGgiLQ4B+U3B+6SnZgVTA7A= -buf.build/gen/go/grpc-ecosystem/grpc-gateway/protocolbuffers/go v1.28.1-20220906183531-bc28b723cd77.4/go.mod h1:92ejKVTiuvnKoAtRlpJpIxKfloI935DDqhs0NCRx+KM= -buf.build/gen/go/grpc-ecosystem/grpc-gateway/protocolbuffers/go v1.29.1-20220906183531-bc28b723cd77.1/go.mod h1:hhON98gyTBA8hmdzw7bPux2Zerm5Sp2hesfc5t6jpoI= buf.build/gen/go/open-feature/flagd/bufbuild/connect-go v1.5.2-20230222100723-491ee098dd92.1 h1:OGqJyjvn5VQsctIQEwB7JP8dR1mtN/G6LOTntrKzd+Y= -buf.build/gen/go/open-feature/flagd/bufbuild/connect-go v1.5.2-20230222100723-491ee098dd92.1/go.mod h1:wgQMLfjCfOMyzfdWA8HNnD1SA5HWyIJWPpJTc7dsZgw= buf.build/gen/go/open-feature/flagd/grpc/go v1.3.0-20230317150644-afd1cc2ef580.1 h1:ky5p/GKnbkgTqzsI06rkxsgjb0qsljgPcHdd4xGR2dI= -buf.build/gen/go/open-feature/flagd/grpc/go v1.3.0-20230317150644-afd1cc2ef580.1/go.mod h1:c0S/kkQtA/ymDY9p8y4htIbLZ0SebX09rq5JoNJOHlU= -buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.28.1-20230317150644-afd1cc2ef580.4/go.mod h1:+Bnrjo56uVn/aBcLWchTveR8UeCj+KSJN4fE0xSmBNc= buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.29.1-20230317150644-afd1cc2ef580.1 h1:CWgXoLTajc7QagTz76kplcFnjjWIkxhhDdmKYtVShOU= -buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.29.1-20230317150644-afd1cc2ef580.1/go.mod h1:WWnccsJMW7QwvXkdXUuQmg28sx+ZoX36+J2TAjcy6u4= -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 v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= -cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= -cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= -cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= -cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= -cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= -cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= -cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= -cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= -cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= -cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= -cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= -cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= -cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= -cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= -cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= -cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= -cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= -cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= -cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= -cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= -cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= -cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= -cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= -cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= -cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= -cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= -cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= -cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= -cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= -cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= -cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= -cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= -cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= -cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= -cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= -cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= -cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= -cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= -cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= -cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= -cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= -cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= -cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= -cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= -cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= -cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= -cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= -cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= -cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= -cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= -cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= -cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= -cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= -cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= -cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= -cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= -cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= -cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= -cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= -cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= -cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= -cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= -cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= -cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= -cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= -cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= -cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= -cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= -cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= -cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= -cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= -cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= -cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= -cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= -cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= -cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= -cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= -cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= -cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= -cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= -cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= -cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= -cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= -cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= -cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= -cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= -cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= -cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= -cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= -cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= -cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= -cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= -cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= -cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= -cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= -cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= -cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= -cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= -cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= -cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= -cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= -cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= -cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= -cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= -cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= -cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= -cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= -cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= -cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= -cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= -cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= -cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= -cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= -cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= -cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= -cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= -cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= -cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= -cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= -cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= -cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= -cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= -cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= -cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= -cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= -cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= -cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= -cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= -cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= -cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= -cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= -cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= -cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= -cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= -cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= -cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= -cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= -cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= -cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= -cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= -cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= -cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bufbuild/connect-go v1.5.2 h1:G4EZd5gF1U1ZhhbVJXplbuUnfKpBZ5j5izqIwu2g2W8= -github.com/bufbuild/connect-go v1.5.2/go.mod h1:GmMJYR6orFqD0Y6ZgX8pwQ8j9baizDrIQMm1/a6LnHk= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/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/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/common-nighthawk/go-figure v0.0.0-20200609044655-c4b36f998cf2/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be h1:J5BL2kskAlV9ckgEsNQXscjIaLiOYiZ75d4e94E6dcQ= -github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cucumber/gherkin-go/v19 v19.0.3 h1:mMSKu1077ffLbTJULUfM5HPokgeBcIGboyeNUof1MdE= -github.com/cucumber/gherkin-go/v19 v19.0.3/go.mod h1:jY/NP6jUtRSArQQJ5h1FXOUgk5fZK24qtE7vKi776Vw= github.com/cucumber/godog v0.12.6 h1:3IToXviU45G7FgijwTk/LdB4iojn8zUFDfQLj4MMiHc= -github.com/cucumber/godog v0.12.6/go.mod h1:Y02TTpimPXDb70PnG6M3zpODXm1+bjCsuZzcW76xAww= -github.com/cucumber/messages-go/v16 v16.0.0/go.mod h1:EJcyR5Mm5ZuDsKJnT2N9KRnBK30BGjtYotDKpwQ0v6g= github.com/cucumber/messages-go/v16 v16.0.1 h1:fvkpwsLgnIm0qugftrw2YwNlio+ABe2Iu94Ap8GMYIY= -github.com/cucumber/messages-go/v16 v16.0.1/go.mod h1:EJcyR5Mm5ZuDsKJnT2N9KRnBK30BGjtYotDKpwQ0v6g= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/diegoholiveira/jsonlogic/v3 v3.2.7 h1:awX07pFPnlntZzRNBcO4a2Ivxa77NMt+narq/6xcS0E= -github.com/diegoholiveira/jsonlogic/v3 v3.2.7/go.mod h1:9oE8z9G+0OMxOoLHF3fhek3KuqD5CBqM0B6XFL08MSg= github.com/dimiro1/banner v1.1.0 h1:TSfy+FsPIIGLzaMPOt52KrEed/omwFO1P15VA8PMUh0= -github.com/dimiro1/banner v1.1.0/go.mod h1:tbL318TJiUaHxOUNN+jnlvFSgsh/RX7iJaQrGgOiTco= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= -github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -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-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= -github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/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/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -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/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/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/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.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= -github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-memdb v1.3.2 h1:RBKHOsnSszpU6vxq80LzC2BaQjuuvoyaQbkLTf7V7g8= -github.com/hashicorp/go-memdb v1.3.2/go.mod h1:Mluclgwib3R93Hk5fxEfiRhB+6Dar64wWh71LpNSe3g= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.1 h1:5pv5N1lT1fjLg2VQ5KWc7kmucp2x/kvFOnxuVTqZ6x4= -github.com/hashicorp/golang-lru/v2 v2.0.1/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -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/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= 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/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= -github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -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/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= 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.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.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -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 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/open-feature/flagd v0.3.7 h1:cRIcZO2WcLx9y9RibhkV+GDU/pNtMbXoVId1bTDQOnU= -github.com/open-feature/flagd v0.3.7/go.mod h1:IQ/mfi0P0dL+4m9X9prbHc64fthbimr1CdZWppHcf70= github.com/open-feature/go-sdk v1.2.0 h1:2xsUgNUUDITpryB9nFS43CI9gAF415I1He22Q1d4+Po= -github.com/open-feature/go-sdk v1.2.0/go.mod h1:UQJJXUptk92An4F6so2Vd0iRo6EEZ+QGa7HVyQ/GPi0= github.com/open-feature/go-sdk-contrib/providers/flagd v0.1.9 h1:hHa7sjOzohj9ZhYR6ym+Xjk517ogb4q2QIE6ztdLZMg= -github.com/open-feature/go-sdk-contrib/providers/flagd v0.1.9/go.mod h1:IibpAPNmtUIJsJA6T4X1IcD4+BG1hCLw86luG8YQcqA= github.com/open-feature/go-sdk-contrib/tests/flagd v1.2.1 h1:Tg712Egcqb5dsYxOGEaQbfD3g1mqPFdV4tSmKKKxDPk= -github.com/open-feature/go-sdk-contrib/tests/flagd v1.2.1/go.mod h1:zw/xpuDy9ziBEKVA1t4VoQtzFc80btAAQCiZkX6y9oQ= github.com/open-feature/schemas v0.2.8 h1:oA75hJXpOd9SFgmNI2IAxWZkwzQPUDm7Jyyh3q489wM= -github.com/open-feature/schemas v0.2.8/go.mod h1:vj+rfTsOLlh5PtGGkAbitnJmFPYuTHXTjOy13kzNgKQ= github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= -github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.40.0 h1:Afz7EVRqGg2Mqqf4JuF9vdvp1pi220m55Pi9T2JnO4Q= -github.com/prometheus/common v0.40.0/go.mod h1:L65ZJPSmfn/UBWLQIHV7dBrKFidB/wPlF1y5TlSt9OE= github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -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.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= -github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -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.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= -github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= -github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -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.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= -github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.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.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= -github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -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/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= -go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -golang.org/x/crypto v0.0.0-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-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-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/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-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-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-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-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= -golang.org/x/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.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-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-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-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-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-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-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-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-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/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-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-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-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-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.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-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/genproto v0.0.0-20230221151758-ace64dc21148 h1:muK+gVBJBfFb4SejshDBlN2/UgxCCOKH9Y34ljqEGOc= -google.golang.org/genproto v0.0.0-20230221151758-ace64dc21148/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -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.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc= -google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -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-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/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -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.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.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= -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= diff --git a/images/kube-flagd-proxy.png b/images/kube-flagd-proxy.png new file mode 100644 index 0000000000000000000000000000000000000000..f60504848cccf66fbef73a6fc7efb1423c3e0ba7 GIT binary patch literal 78658 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 literal 0 HcmV?d00001 diff --git a/kube-flagd-proxy/README.md b/kube-flagd-proxy/README.md new file mode 100644 index 000000000..e748a7e12 --- /dev/null +++ b/kube-flagd-proxy/README.md @@ -0,0 +1,60 @@ +# Kube Flagd Proxy + +[![experimental](http://badges.github.io/stability-badges/dist/experimental.svg)](http://github.com/badges/stability-badges) + +The kube flagd proxy acts as a pub sub for deployed flagd sidecar containers to subscribe to change events in FeatureFlagConfiguration CRs. + +

+ +

+ +On request, the flagd-kube-proxy will spawn a goroutine to watch the CR using the `core` package kubernetes sync. Each further request for the same resource will add a new new stream to the broadcast list. Once all streams have been closed, and there are no longer any listeners for a given resource, the sync will be closed. + +The kube-flagd-proxy API follows the flagd grpc spec, found in the [buf schema registry](https://buf.build/open-feature/flagd), as such the existing grpc sync can be used to subscribe to the the CR changes. + +## Deployment + +The proxy can be deployed to any namespace, provided that the associated service account has been added to the `flagd-kubernetes-sync` cluster role binding. A sample deployment can be found in `/config/deployments/kube-flagd-proxy` requiring the namespace `kube-proxy` to be deployed. + +```sh +kubectl create namespace kube-proxy +kubectl apply -f ./config/deployments/kube-flagd-proxy +``` + +Once the kube-proxy has been deployed any flagd instance subscribe to flag changes using the grpc sync, providing the target resource uri using the `selector` configuration field. + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: flagd +spec: + containers: + - name: flagd + image: ghcr.io/open-feature/flagd:v0.4.4 + ports: + - containerPort: 8013 + args: + - start + - --sources + - '[{"uri":"grpc://kube-proxy-svc.kube-proxy.svc.cluster.local:8015","provider":"grpc","selector":"core.openfeature.dev/NAMESPACE/NAME"}]' + - --debug +--- +apiVersion: core.openfeature.dev/v1alpha2 +kind: FeatureFlagConfiguration +metadata: + name: end-to-end +spec: + featureFlagSpec: + flags: + color: + state: ENABLED + variants: + red: CC0000 + green: 00CC00 + blue: 0000CC + yellow: yellow + defaultVariant: yellow +``` + +Once deployed, the client flagd instance will be receiving almost instant flag configuration change events. diff --git a/kube-flagd-proxy/build.Dockerfile b/kube-flagd-proxy/build.Dockerfile new file mode 100644 index 000000000..9a526ec20 --- /dev/null +++ b/kube-flagd-proxy/build.Dockerfile @@ -0,0 +1,36 @@ +# Main Dockerfile for flagd builds +# Build the manager binary +FROM --platform=$BUILDPLATFORM golang:1.20-alpine AS builder + +WORKDIR /workspace +ARG TARGETOS +ARG TARGETARCH +ARG VERSION +ARG COMMIT +ARG DATE + +# Copy source code +COPY kube-flagd-proxy/ kube-flagd-proxy +COPY core/ core +COPY flagd/ flagd + +# Setup go workspace +RUN go work init +RUN go work use ./kube-flagd-proxy +RUN go work use ./core +RUN go work use ./flagd + +# Go get dependencies +RUN cd kube-flagd-proxy && go mod download + +# # Build +RUN CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -a -ldflags "-X main.version=${VERSION} -X main.commit=${COMMIT} -X main.date=${DATE}" -o flagd-build kube-flagd-proxy/main.go + +# # Use distroless as minimal base image to package the manager binary +# # Refer to https://github.com/GoogleContainerTools/distroless for more details +FROM gcr.io/distroless/static:nonroot +WORKDIR / +COPY --from=builder /workspace/flagd-build . +USER 65532:65532 + +ENTRYPOINT ["/flagd-build"] diff --git a/kube-flagd-proxy/cmd/root.go b/kube-flagd-proxy/cmd/root.go new file mode 100644 index 000000000..dcf47a890 --- /dev/null +++ b/kube-flagd-proxy/cmd/root.go @@ -0,0 +1,72 @@ +package cmd + +import ( + "fmt" + "log" + "os" + + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +var ( + cfgFile string + Version string + Commit string + Date string + Debug bool +) + +var rootCmd = &cobra.Command{ + Use: "flagd", + Short: "Flagd-kube-proxy allows flagd to subscribe to CRD changes without the required permissions.", + Long: ``, + DisableAutoGenTag: true, +} + +// Execute adds all child commands to the root command and sets flags appropriately. +// This is called by main.main(). It only needs to happen once to the rootCmd. +func Execute(version string, commit string, date string) { + Version = version + Commit = commit + Date = date + err := rootCmd.Execute() + if err != nil { + log.Fatal(err) + } +} + +func init() { + cobra.OnInitialize(initConfig) + + // Here you will define your flags and configuration settings. + // Cobra supports persistent flags, which, if defined here, + // will be global for your application. + rootCmd.PersistentFlags().BoolVarP(&Debug, "debug", "x", false, "verbose logging") + rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.agent.yaml)") + rootCmd.AddCommand(startCmd) +} + +// initConfig reads in config file and ENV variables if set. +func initConfig() { + if cfgFile != "" { + // Use config file from the flag. + viper.SetConfigFile(cfgFile) + } else { + // Find home directory. + home, err := os.UserHomeDir() + cobra.CheckErr(err) + + // Search config in home directory with name ".agent" (without extension). + viper.AddConfigPath(home) + viper.SetConfigType("yaml") + viper.SetConfigName(".agent") + } + + viper.AutomaticEnv() // read in environment variables that match + + // If a config file is found, read it in. + if err := viper.ReadInConfig(); err == nil { + fmt.Fprintln(os.Stderr, "using config file:", viper.ConfigFileUsed()) + } +} diff --git a/kube-flagd-proxy/cmd/start.go b/kube-flagd-proxy/cmd/start.go new file mode 100644 index 000000000..f662d0535 --- /dev/null +++ b/kube-flagd-proxy/cmd/start.go @@ -0,0 +1,85 @@ +package cmd + +import ( + "context" + "errors" + "fmt" + "log" + "net/http" + "os" + "os/signal" + "syscall" + + "github.com/open-feature/flagd/core/pkg/logger" + "github.com/open-feature/flagd/core/pkg/service" + syncServer "github.com/open-feature/flagd/core/pkg/service/sync" + "github.com/spf13/cobra" + "github.com/spf13/viper" + "go.uber.org/zap/zapcore" +) + +// start + +const ( + logFormatFlagName = "log-format" + metricsPortFlagName = "metrics-port" + portFlagName = "port" +) + +func init() { + flags := startCmd.Flags() + + // allows environment variables to use _ instead of - + flags.Int32P(portFlagName, "p", 8015, "Port to listen on") + flags.Int32P(metricsPortFlagName, "m", 8016, "Metrics port to listen on") + flags.StringP(logFormatFlagName, "z", "console", "Set the logging format, e.g. console or json ") + + _ = viper.BindPFlag(logFormatFlagName, flags.Lookup(logFormatFlagName)) + _ = viper.BindPFlag(metricsPortFlagName, flags.Lookup(metricsPortFlagName)) + _ = viper.BindPFlag(portFlagName, flags.Lookup(portFlagName)) +} + +// startCmd represents the start command +var startCmd = &cobra.Command{ + Use: "start", + Short: "Start flagd-kube-proxy", + Long: ``, + Run: func(cmd *cobra.Command, args []string) { + // Configure loggers ------------------------------------------------------- + var level zapcore.Level + var err error + if Debug { + level = zapcore.DebugLevel + } else { + level = zapcore.InfoLevel + } + l, err := logger.NewZapLogger(level, viper.GetString(logFormatFlagName)) + if err != nil { + log.Fatalf("can't initialize zap logger: %v", err) + } + logger := logger.NewLogger(l, Debug) + + ctx, _ := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) + + s := syncServer.NewServer(ctx, logger) + cfg := service.Configuration{ + ReadinessProbe: func() bool { return true }, + Port: viper.GetUint16(portFlagName), + MetricsPort: viper.GetUint16(metricsPortFlagName), + } + errChan := make(chan error, 1) + go func() { + if err := s.Serve(ctx, cfg); err != nil && !errors.Is(err, http.ErrServerClosed) { + errChan <- err + } + }() + + logger.Info(fmt.Sprintf("listening for connections on %d", cfg.Port)) + select { + case <-ctx.Done(): + return + case err := <-errChan: + logger.Fatal(err.Error()) + } + }, +} diff --git a/kube-flagd-proxy/go.mod b/kube-flagd-proxy/go.mod index fe6b17390..702152cd9 100644 --- a/kube-flagd-proxy/go.mod +++ b/kube-flagd-proxy/go.mod @@ -2,12 +2,35 @@ module github.com/open-feature/flagd/kube-flagd-proxy go 1.19 -require go.uber.org/zap v1.24.0 +require ( + github.com/dimiro1/banner v1.1.0 + github.com/mattn/go-colorable v0.1.13 + github.com/spf13/cobra v1.6.1 + github.com/spf13/viper v1.15.0 + go.uber.org/zap v1.24.0 +) require ( - github.com/pkg/errors v0.9.1 // indirect + github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/spf13/afero v1.9.3 // indirect + github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/testify v1.8.2 // indirect + github.com/subosito/gotenv v1.4.2 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/goleak v1.2.0 // indirect go.uber.org/multierr v1.9.0 // indirect + golang.org/x/sys v0.6.0 // indirect + golang.org/x/text v0.8.0 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/kube-flagd-proxy/go.sum b/kube-flagd-proxy/go.sum index b607987c1..079db42a9 100644 --- a/kube-flagd-proxy/go.sum +++ b/kube-flagd-proxy/go.sum @@ -1,10 +1,36 @@ github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be h1:J5BL2kskAlV9ckgEsNQXscjIaLiOYiZ75d4e94E6dcQ= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/dimiro1/banner v1.1.0 h1:TSfy+FsPIIGLzaMPOt52KrEed/omwFO1P15VA8PMUh0= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/kube-flagd-proxy/main.go b/kube-flagd-proxy/main.go index 77cbe61de..fb69f6dd2 100644 --- a/kube-flagd-proxy/main.go +++ b/kube-flagd-proxy/main.go @@ -1,17 +1,32 @@ package main import ( - "log" + "bytes" - "github.com/open-feature/flagd/core/pkg/logger" - "go.uber.org/zap/zapcore" + "github.com/dimiro1/banner" + "github.com/mattn/go-colorable" + "github.com/open-feature/flagd/kube-flagd-proxy/cmd" ) -func main() { - l, err := logger.NewZapLogger(zapcore.DebugLevel, "console") - if err != nil { - log.Fatalf("initialize zap logger: %v", err) - } +var ( + version = "dev" + commit = "HEAD" + date = "unknown" + bannerText = ` + {{ .AnsiColor.BrightRed }} ______ __ ________ _______ ______ + {{ .AnsiColor.BrightRed }} /_____/\ /_/\ /_______/\ /______/\ /_____/\ + {{ .AnsiColor.BrightRed }} \::::_\/_\:\ \ \::: _ \ \\::::__\/__\:::_ \ \ + {{ .AnsiColor.BrightRed }} \:\/___/\\:\ \ \::(_) \ \\:\ /____/\\:\ \ \ \ + {{ .AnsiColor.BrightRed }} \:::._\/ \:\ \____\:: __ \ \\:\\_ _\/ \:\ \ \ \ + {{ .AnsiColor.BrightRed }} \:\ \ \:\/___/\\:.\ \ \ \\:\_\ \ \ \:\/.:| | + {{ .AnsiColor.BrightRed }} \_\/ \_____\/ \__\/\__\/ \_____\/ \____/_/ + {{ .AnsiColor.BrightRed }} Kubernetes Proxy +{{ .AnsiColor.Default }} +` +) - l.Info("kube-flagd-proxy") +func main() { + banner.Init(colorable.NewColorableStdout(), true, true, + bytes.NewBufferString(bannerText)) + cmd.Execute(version, commit, date) } diff --git a/release-please-config.json b/release-please-config.json index c31548761..b9204a5f6 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -10,7 +10,8 @@ "bump-patch-for-minor-pre-major": true, "versioning": "default", "extra-files": [ - "snap/snapcraft.yaml" + "snap/snapcraft.yaml", + "kube-flagd-proxy/README.md" ] }, "kube-flagd-proxy": { @@ -18,7 +19,10 @@ "package-name": "kube-flagd-proxy", "versioning": "default", "bump-minor-pre-major": true, - "bump-patch-for-minor-pre-major": true + "bump-patch-for-minor-pre-major": true, + "extra-files": [ + "config/deployments/deployment.yaml" + ] }, "core": { "release-type": "go",