From 6bac5365611039e2904a596d186d931d75d9ad59 Mon Sep 17 00:00:00 2001 From: Henning Perl Date: Thu, 8 Sep 2022 16:52:27 +0200 Subject: [PATCH] refactor: use koanf configuration system (#999) Closes https://github.com/ory/oathkeeper/issues/757 Co-authored-by: Patrik --- .github/workflows/ci.yml | 22 +- .schema/embed.go | 9 + Makefile | 5 +- api/credential.go | 14 +- api/credential_test.go | 20 +- api/decision.go | 16 +- api/decision_test.go | 15 +- api/health.go | 34 +- api/health_test.go | 19 +- api/rule.go | 38 +- cmd/credentials_generate.go | 2 +- cmd/health.go | 2 +- cmd/health_alive.go | 2 +- cmd/root.go | 25 +- cmd/serve.go | 11 +- cmd/server/server.go | 101 +- codecov.yml | 2 + credentials/fetcher_default.go | 10 +- credentials/fetcher_default_test.go | 4 +- doc.go | 28 +- driver/configuration/config_keys.go | 78 + driver/configuration/provider.go | 20 +- driver/configuration/provider_koanf.go | 444 +++++ ...test.go => provider_koanf_private_test.go} | 9 +- ..._test.go => provider_koanf_public_test.go} | 153 +- driver/configuration/provider_viper.go | 461 ----- driver/driver_default.go | 13 +- driver/health/event_manager_default.go | 3 +- driver/registry_memory.go | 22 +- go.mod | 83 +- go.sum | 1575 +++++++++++++++-- internal/driver.go | 25 +- internal/httpclient/client/api/api_client.go | 132 +- .../client/api/decisions_parameters.go | 44 +- .../client/api/decisions_responses.go | 161 +- .../client/api/get_rule_parameters.go | 46 +- .../client/api/get_rule_responses.go | 97 +- .../client/api/get_version_parameters.go | 44 +- .../client/api/get_version_responses.go | 33 +- ...get_well_known_json_web_keys_parameters.go | 44 +- .../get_well_known_json_web_keys_responses.go | 65 +- .../api/is_instance_alive_parameters.go | 44 +- .../client/api/is_instance_alive_responses.go | 65 +- .../api/is_instance_ready_parameters.go | 44 +- .../client/api/is_instance_ready_responses.go | 65 +- .../client/api/list_rules_parameters.go | 63 +- .../client/api/list_rules_responses.go | 65 +- internal/httpclient/models/generic_error.go | 9 +- .../models/health_not_ready_status.go | 7 + internal/httpclient/models/health_status.go | 7 + internal/httpclient/models/json_web_key.go | 9 +- .../httpclient/models/json_web_key_set.go | 40 +- internal/httpclient/models/rule.go | 134 +- internal/httpclient/models/rule_handler.go | 9 +- internal/httpclient/models/rule_match.go | 9 +- internal/httpclient/models/upstream.go | 9 +- internal/httpclient/models/uuid.go | 7 + internal/httpclient/models/version.go | 7 + metrics/middleware_test.go | 19 +- .../authn/authenticator_anonymous_test.go | 8 +- .../authenticator_cookie_session_test.go | 42 +- pipeline/authn/authenticator_jwt_test.go | 1 - pipeline/authn/authenticator_noop_test.go | 7 +- ...authenticator_oauth2_client_credentials.go | 5 +- ...or_oauth2_client_credentials_cache_test.go | 20 +- ...nticator_oauth2_client_credentials_test.go | 55 +- .../authenticator_oauth2_introspection.go | 6 +- ...ticator_oauth2_introspection_cache_test.go | 19 +- ...authenticator_oauth2_introspection_test.go | 31 +- .../authn/authenticator_unauthorized_test.go | 7 +- pipeline/authz/authorizer_allow_test.go | 8 +- pipeline/authz/authorizer_deny_test.go | 8 +- pipeline/authz/keto_engine_acp_ory.go | 21 +- pipeline/authz/keto_engine_acp_ory_test.go | 22 +- pipeline/authz/remote.go | 7 +- pipeline/authz/remote_json.go | 21 +- pipeline/authz/remote_json_test.go | 46 +- pipeline/authz/remote_test.go | 26 +- pipeline/mutate/mutator_broken_test.go | 1 + pipeline/mutate/mutator_cookie_test.go | 6 +- pipeline/mutate/mutator_header_test.go | 10 +- pipeline/mutate/mutator_hydrator.go | 17 +- pipeline/mutate/mutator_hydrator_test.go | 15 +- pipeline/mutate/mutator_id_token_test.go | 23 +- pipeline/mutate/mutator_noop_test.go | 8 +- proxy/proxy_test.go | 27 +- proxy/request_handler_test.go | 191 +- rule/fetcher_default.go | 129 +- rule/fetcher_default_test.go | 254 +-- rule/validator_test.go | 16 +- spec/api.json | 30 +- spec/swagger.json | 34 +- test/e2e/run.sh | 13 +- test/update/config_no_repo.yaml | 2 +- x/testhelper.go | 21 + 95 files changed, 3957 insertions(+), 1743 deletions(-) create mode 100644 .schema/embed.go create mode 100644 codecov.yml create mode 100644 driver/configuration/config_keys.go create mode 100644 driver/configuration/provider_koanf.go rename driver/configuration/{provider_viper_private_test.go => provider_koanf_private_test.go} (80%) rename driver/configuration/{provider_viper_public_test.go => provider_koanf_public_test.go} (78%) delete mode 100644 driver/configuration/provider_viper.go create mode 100644 x/testhelper.go diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5a58fe8a69..7a794b6fcf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -58,22 +58,6 @@ jobs: run: | bash <(curl -s https://codecov.io/bash) - setup-tests: - runs-on: ubuntu-latest - name: Setup tests - steps: - - uses: ory/ci/checkout@master - - uses: actions/setup-go@v2 - with: - go-version: "1.18" - - run: make install - - uses: actions/cache@v2 - with: - path: ~/go/bin/oathkeeper - key: oathkeeper-${{ hashFiles('~/go/bin/oathkeeper') }} - restore-keys: | - oathkeeper- - test: runs-on: ubuntu-latest name: Run tests @@ -82,7 +66,6 @@ jobs: name: ["reload", "e2e", "forwarded-header"] needs: - sdk-generate - - setup-tests steps: - uses: ory/ci/checkout@master - uses: actions/setup-go@v2 @@ -92,7 +75,10 @@ jobs: with: path: ~/go/bin/oathkeeper key: oathkeeper-${{ hashFiles('~/go/bin/oathkeeper') }} - - run: ./test/${{ matrix.name }}/run.sh + - run: | + make install + go version -m $(which oathkeeper) | grep "\w*build" + ./test/${{ matrix.name }}/run.sh docs-cli: runs-on: ubuntu-latest diff --git a/.schema/embed.go b/.schema/embed.go new file mode 100644 index 0000000000..3e2c96e3c6 --- /dev/null +++ b/.schema/embed.go @@ -0,0 +1,9 @@ +package schema + +import "embed" + +//go:embed *.json all:pipeline +var FS embed.FS + +//go:embed config.schema.json +var Config []byte diff --git a/Makefile b/Makefile index e2b82f1a97..ef36ee69f7 100644 --- a/Makefile +++ b/Makefile @@ -38,6 +38,9 @@ format: .bin/goimports node_modules # Generates the SDK .PHONY: sdk sdk: .bin/swagger .bin/ory node_modules + rm -rf internal/httpclient + mkdir -p internal/httpclient + swagger generate spec -m -o spec/swagger.json \ -c github.com/ory/oathkeeper \ -c github.com/ory/x/healthx @@ -50,8 +53,6 @@ sdk: .bin/swagger .bin/ory node_modules -p file://.schema/openapi/patches/meta.yaml \ spec/swagger.json spec/api.json - rm -rf internal/httpclient - mkdir -p internal/httpclient swagger generate client -f ./spec/swagger.json -t internal/httpclient -A Ory_Oathkeeper make format diff --git a/api/credential.go b/api/credential.go index 2ef9f5b9ae..2e40495fa7 100644 --- a/api/credential.go +++ b/api/credential.go @@ -43,18 +43,18 @@ func (h *CredentialsHandler) SetRoutes(r *x.RouterAPI) { // swagger:route GET /.well-known/jwks.json api getWellKnownJSONWebKeys // -// Lists Cryptographic Keys +// # Lists Cryptographic Keys // // This endpoint returns cryptographic keys that are required to, for example, verify signatures of ID Tokens. // -// Produces: -// - application/json +// Produces: +// - application/json // -// Schemes: http, https +// Schemes: http, https // -// Responses: -// 200: jsonWebKeySet -// 500: genericError +// Responses: +// 200: jsonWebKeySet +// 500: genericError func (h *CredentialsHandler) wellKnown(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { urls, err := h.jwksURLs() if err != nil { diff --git a/api/credential_test.go b/api/credential_test.go index 66a485ac8f..60db695a04 100644 --- a/api/credential_test.go +++ b/api/credential_test.go @@ -12,7 +12,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/ory/viper" + "github.com/ory/x/configx" "github.com/ory/oathkeeper/driver/configuration" "github.com/ory/oathkeeper/internal" @@ -21,13 +21,25 @@ import ( ) func TestCredentialsHandler(t *testing.T) { - conf := internal.NewConfigurationWithDefaults() - viper.Set(configuration.ViperKeyMutatorIDTokenJWKSURL, "file://../test/stub/jwks-rsa-multiple.json") + conf := internal.NewConfigurationWithDefaults(configx.SkipValidation()) + conf.SetForTest(t, configuration.MutatorIDTokenJWKSURL, "file://../test/stub/jwks-rsa-multiple.json") + r := internal.NewRegistry(conf) require.NoError(t, r.RuleRepository().Set( context.Background(), - []rule.Rule{{Mutators: []rule.Handler{{Handler: "id_token", Config: json.RawMessage(`{"jwks_url":"file://../test/stub/jwks-rsa-single.json"}`)}}}}), + []rule.Rule{{ + Match: &rule.Match{URL: "http://example.com/*"}, + Authenticators: []rule.Handler{{Handler: "anonymous"}}, + Authorizer: rule.Handler{Handler: "allow"}, + Mutators: []rule.Handler{{ + Handler: "id_token", + Config: json.RawMessage(` +{ + "jwks_url": "file://../test/stub/jwks-rsa-single.json", + "issuer_url": "https://example.com" +} +`)}}}}), ) router := x.NewAPIRouter() diff --git a/api/decision.go b/api/decision.go index fd0be57249..7a1582ee71 100644 --- a/api/decision.go +++ b/api/decision.go @@ -72,7 +72,7 @@ func (h *DecisionHandler) ServeHTTP(w http.ResponseWriter, r *http.Request, next // swagger:route GET /decisions api decisions // -// Access Control Decision API +// # Access Control Decision API // // > This endpoint works with all HTTP Methods (GET, POST, PUT, ...) and matches every path prefixed with /decision. // @@ -80,14 +80,14 @@ func (h *DecisionHandler) ServeHTTP(w http.ResponseWriter, r *http.Request, next // request to the upstream server, returns 200 (request should be allowed), 401 (unauthorized), or 403 (forbidden) // status codes. This endpoint can be used to integrate with other API Proxies like Ambassador, Kong, Envoy, and many more. // -// Schemes: http, https +// Schemes: http, https // -// Responses: -// 200: emptyResponse -// 401: genericError -// 403: genericError -// 404: genericError -// 500: genericError +// Responses: +// 200: emptyResponse +// 401: genericError +// 403: genericError +// 404: genericError +// 500: genericError func (h *DecisionHandler) decisions(w http.ResponseWriter, r *http.Request) { fields := map[string]interface{}{ "http_method": r.Method, diff --git a/api/decision_test.go b/api/decision_test.go index dcb44a574f..d640b59cdf 100644 --- a/api/decision_test.go +++ b/api/decision_test.go @@ -45,19 +45,18 @@ import ( "github.com/ory/oathkeeper/pipeline/authn" "github.com/ory/oathkeeper/proxy" "github.com/ory/oathkeeper/rule" - "github.com/ory/viper" "github.com/ory/x/logrusx" ) func TestDecisionAPI(t *testing.T) { conf := internal.NewConfigurationWithDefaults() - viper.Set(configuration.ViperKeyAuthenticatorNoopIsEnabled, true) - viper.Set(configuration.ViperKeyAuthenticatorUnauthorizedIsEnabled, true) - viper.Set(configuration.ViperKeyAuthenticatorAnonymousIsEnabled, true) - viper.Set(configuration.ViperKeyAuthorizerAllowIsEnabled, true) - viper.Set(configuration.ViperKeyAuthorizerDenyIsEnabled, true) - viper.Set(configuration.ViperKeyMutatorNoopIsEnabled, true) - viper.Set(configuration.ViperKeyErrorsWWWAuthenticateIsEnabled, true) + conf.SetForTest(t, configuration.AuthenticatorNoopIsEnabled, true) + conf.SetForTest(t, configuration.AuthenticatorUnauthorizedIsEnabled, true) + conf.SetForTest(t, configuration.AuthenticatorAnonymousIsEnabled, true) + conf.SetForTest(t, configuration.AuthorizerAllowIsEnabled, true) + conf.SetForTest(t, configuration.AuthorizerDenyIsEnabled, true) + conf.SetForTest(t, configuration.MutatorNoopIsEnabled, true) + conf.SetForTest(t, configuration.ErrorsWWWAuthenticateIsEnabled, true) reg := internal.NewRegistry(conf).WithBrokenPipelineMutator() d := reg.DecisionHandler() diff --git a/api/health.go b/api/health.go index a7d1640da9..060d6a9250 100644 --- a/api/health.go +++ b/api/health.go @@ -4,7 +4,7 @@ package api // // swagger:route GET /health/alive api isInstanceAlive // -// Check Alive Status +// # Check Alive Status // // This endpoint returns a 200 status code when the HTTP server is up running. // This status does currently not include checks whether the database connection is working. @@ -15,19 +15,19 @@ package api // Be aware that if you are running multiple nodes of this service, the health status will never // refer to the cluster state, only to a single instance. // -// Produces: -// - application/json +// Produces: +// - application/json // -// Responses: -// 200: healthStatus -// 500: genericError +// Responses: +// 200: healthStatus +// 500: genericError func swaggerIsInstanceAlive() {} // Ready returns an ok status if the instance is ready to handle HTTP requests and all ReadyCheckers are ok. // // swagger:route GET /health/ready api isInstanceReady // -// Check Readiness Status +// # Check Readiness Status // // This endpoint returns a 200 status code when the HTTP server is up running and the environment dependencies (e.g. // the database) are responsive as well. @@ -38,19 +38,19 @@ func swaggerIsInstanceAlive() {} // Be aware that if you are running multiple nodes of this service, the health status will never // refer to the cluster state, only to a single instance. // -// Produces: -// - application/json +// Produces: +// - application/json // -// Responses: -// 200: healthStatus -// 503: healthNotReadyStatus +// Responses: +// 200: healthStatus +// 503: healthNotReadyStatus func swaggerIsInstanceReady() {} // Version returns this service's versions. // // swagger:route GET /version api getVersion // -// Get Service Version +// # Get Service Version // // This endpoint returns the service version typically notated using semantic versioning. // @@ -60,9 +60,9 @@ func swaggerIsInstanceReady() {} // Be aware that if you are running multiple nodes of this service, the health status will never // refer to the cluster state, only to a single instance. // -// Produces: -// - application/json +// Produces: +// - application/json // -// Responses: -// 200: version +// Responses: +// 200: version func swaggerGetVersion() {} diff --git a/api/health_test.go b/api/health_test.go index 5440a2b77f..165c7a7c1e 100644 --- a/api/health_test.go +++ b/api/health_test.go @@ -19,7 +19,13 @@ type statusResult struct { // Status should contains "ok" in case of success Status string `json:"status"` // Otherwise a map of error messages is returned - Errors map[string]string `json:"errors"` + Error *statusError `json:"error"` +} + +type statusError struct { + Code int `json:"code"` + Status string `json:"status"` + Message string `json:"message"` } func TestHealth(t *testing.T) { @@ -27,7 +33,7 @@ func TestHealth(t *testing.T) { r := internal.NewRegistry(conf) router := x.NewAPIRouter() - r.HealthHandler().SetRoutes(router.Router, true) + r.HealthHandler().SetHealthRoutes(router.Router, true) server := httptest.NewServer(router) defer server.Close() @@ -40,7 +46,7 @@ func TestHealth(t *testing.T) { require.Equal(t, http.StatusOK, res.StatusCode) require.NoError(t, json.NewDecoder(res.Body).Decode(&result)) assert.Equal(t, "ok", result.Status) - assert.Len(t, result.Errors, 0) + assert.Nil(t, result.Error) result = statusResult{} res, err = server.Client().Get(server.URL + "/health/ready") @@ -49,8 +55,7 @@ func TestHealth(t *testing.T) { require.Equal(t, http.StatusServiceUnavailable, res.StatusCode) require.NoError(t, json.NewDecoder(res.Body).Decode(&result)) assert.Empty(t, result.Status) - assert.Len(t, result.Errors, 1) - assert.Equal(t, rulereadiness.ErrRuleNotYetLoaded.Error(), result.Errors[rulereadiness.ProbeName]) + assert.Equal(t, rulereadiness.ErrRuleNotYetLoaded.Error(), result.Error.Message) r.Init() // Waiting for rule load and health event propagation @@ -64,7 +69,7 @@ func TestHealth(t *testing.T) { require.Equal(t, http.StatusOK, res.StatusCode) require.NoError(t, json.NewDecoder(res.Body).Decode(&result)) assert.Equal(t, "ok", result.Status) - assert.Len(t, result.Errors, 0) + assert.Nil(t, result.Error) result = statusResult{} res, err = server.Client().Get(server.URL + "/health/ready") @@ -73,5 +78,5 @@ func TestHealth(t *testing.T) { require.Equal(t, http.StatusOK, res.StatusCode) require.NoError(t, json.NewDecoder(res.Body).Decode(&result)) assert.Equal(t, "ok", result.Status) - assert.Len(t, result.Errors, 0) + assert.Nil(t, result.Error) } diff --git a/api/rule.go b/api/rule.go index 6af86a953e..ddb1bbda35 100644 --- a/api/rule.go +++ b/api/rule.go @@ -57,22 +57,22 @@ func (h *RuleHandler) SetRoutes(r *x.RouterAPI) { // swagger:route GET /rules api listRules // -// List All Rules +// # List All Rules // // This method returns an array of all rules that are stored in the backend. This is useful if you want to get a full // view of what rules you have currently in place. // -// Consumes: -// - application/json +// Consumes: +// - application/json // -// Produces: -// - application/json +// Produces: +// - application/json // -// Schemes: http, https +// Schemes: http, https // -// Responses: -// 200: rules -// 500: genericError +// Responses: +// 200: rules +// 500: genericError func (h *RuleHandler) listRules(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { limit, offset := pagination.Parse(r, 50, 0, 500) rules, err := h.r.RuleRepository().List(r.Context(), limit, offset) @@ -90,22 +90,22 @@ func (h *RuleHandler) listRules(w http.ResponseWriter, r *http.Request, _ httpro // swagger:route GET /rules/{id} api getRule // -// Retrieve a Rule +// # Retrieve a Rule // // Use this method to retrieve a rule from the storage. If it does not exist you will receive a 404 error. // -// Consumes: -// - application/json +// Consumes: +// - application/json // -// Produces: -// - application/json +// Produces: +// - application/json // -// Schemes: http, https +// Schemes: http, https // -// Responses: -// 200: rule -// 404: genericError -// 500: genericError +// Responses: +// 200: rule +// 404: genericError +// 500: genericError func (h *RuleHandler) getRules(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { rl, err := h.r.RuleRepository().Get(r.Context(), ps.ByName("id")) if errors.Cause(err) == helper.ErrResourceNotFound { diff --git a/cmd/credentials_generate.go b/cmd/credentials_generate.go index 6223b28fd0..e01a5a3636 100644 --- a/cmd/credentials_generate.go +++ b/cmd/credentials_generate.go @@ -35,7 +35,7 @@ var credentialsGenerateCmd = &cobra.Command{ $ oathkeeper credentials generate --alg ES256 > jwks.json $ oathkeeper credentials generate --alg RS256 > jwks.json $ oathkeeper credentials generate --alg RS256 --bits 4096 > jwks.json`, - Run: func(cmd *cobra.Command, args []string) { + Run: func(cmd *cobra.Command, _ []string) { key, err := jwksx.GenerateSigningKeys( flagx.MustGetString(cmd, "kid"), flagx.MustGetString(cmd, "alg"), diff --git a/cmd/health.go b/cmd/health.go index 37c8a2d916..c5bec24e3f 100644 --- a/cmd/health.go +++ b/cmd/health.go @@ -14,7 +14,7 @@ var healthCmd = &cobra.Command{ The endpoint URL should point to a single ORY Oathkeeper deployment. If the endpoint URL points to a Load Balancer, these commands will effective test the Load Balancer. `, - Run: func(cmd *cobra.Command, args []string) { + Run: func(cmd *cobra.Command, _ []string) { fmt.Println(cmd.UsageString()) }, } diff --git a/cmd/health_alive.go b/cmd/health_alive.go index 6d8705fc39..8111d932c6 100644 --- a/cmd/health_alive.go +++ b/cmd/health_alive.go @@ -22,7 +22,7 @@ Note: The endpoint URL should point to a single ORY Oathkeeper deployment. If the endpoint URL points to a Load Balancer, these commands will effective test the Load Balancer. `, - Run: func(cmd *cobra.Command, args []string) { + Run: func(cmd *cobra.Command, _ []string) { client := newClient(cmd) r, err := client.API.IsInstanceAlive(api.NewIsInstanceAliveParams()) diff --git a/cmd/root.go b/cmd/root.go index 4a82b06e4f..10c21f440a 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -23,21 +23,23 @@ package cmd import ( "fmt" "os" + "runtime" "github.com/gobuffalo/packr/v2" "github.com/spf13/cobra" + "github.com/ory/x/configx" + "github.com/ory/x/logrusx" _ "github.com/ory/jsonschema/v3/fileloader" _ "github.com/ory/jsonschema/v3/httploader" - - "github.com/ory/x/viperx" ) var logger *logrusx.Logger var schemas = packr.New("schemas", "../.schema") +var ConfigFlag string // RootCmd represents the base command when called without any subcommands var RootCmd = &cobra.Command{ @@ -54,14 +56,17 @@ func Execute() { } } -func watchAndValidateViper() { - schema, err := schemas.Find("config.schema.json") - if err != nil { - logger.WithError(err).Fatal("Unable to open configuration JSON Schema.") - } - viperx.WatchAndValidateViper(logger, schema, "ORY Oathkeeper", []string{"serve", "profiling", "log"}, "") +func init() { + configx.RegisterFlags(RootCmd.PersistentFlags()) } -func init() { - viperx.RegisterConfigFlag(RootCmd, "oathkeeper") +func userHomeDir() string { + if runtime.GOOS == "windows" { + home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH") + if home == "" { + home = os.Getenv("USERPROFILE") + } + return home + } + return os.Getenv("HOME") } diff --git a/cmd/serve.go b/cmd/serve.go index b714d3d055..8caa9e07ec 100644 --- a/cmd/serve.go +++ b/cmd/serve.go @@ -21,9 +21,6 @@ package cmd import ( - "github.com/ory/x/logrusx" - "github.com/ory/x/viperx" - "github.com/spf13/cobra" "github.com/ory/oathkeeper/cmd/server" @@ -43,9 +40,6 @@ on configuration options, open the configuration documentation: >> https://www.ory.sh/oathkeeper/docs/configuration << `, Run: func(cmd *cobra.Command, args []string) { - logger = viperx.InitializeConfig("oathkeeper", "", logger) - - watchAndValidateViper() server.RunServe(x.Version, x.Commit, x.Date)(cmd, args) }, } @@ -53,7 +47,6 @@ on configuration options, open the configuration documentation: func init() { RootCmd.AddCommand(serveCmd) - disableTelemetryEnv := viperx.GetBool(logrusx.New("ORY Oathkeeper", x.Version), "sqa.opt_out", false, "DISABLE_TELEMETRY") - serveCmd.PersistentFlags().Bool("disable-telemetry", disableTelemetryEnv, "Disable anonymized telemetry reports - for more information please visit https://www.ory.sh/docs/ecosystem/sqa") - serveCmd.PersistentFlags().Bool("sqa-opt-out", disableTelemetryEnv, "Disable anonymized telemetry reports - for more information please visit https://www.ory.sh/docs/ecosystem/sqa") + serveCmd.PersistentFlags().Bool("disable-telemetry", false, "Disable anonymized telemetry reports - for more information please visit https://www.ory.sh/docs/ecosystem/sqa") + serveCmd.PersistentFlags().Bool("sqa-opt-out", false, "Disable anonymized telemetry reports - for more information please visit https://www.ory.sh/docs/ecosystem/sqa") } diff --git a/cmd/server/server.go b/cmd/server/server.go index baba348953..577059f46a 100644 --- a/cmd/server/server.go +++ b/cmd/server/server.go @@ -2,6 +2,7 @@ package server import ( "bytes" + "context" "crypto/tls" "encoding/json" "fmt" @@ -12,17 +13,16 @@ import ( "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus/promhttp" + "github.com/rs/cors" "github.com/spf13/cobra" "github.com/urfave/negroni" "github.com/ory/analytics-go/v4" "github.com/ory/graceful" - "github.com/ory/viper" - "github.com/ory/x/corsx" "github.com/ory/x/healthx" "github.com/ory/x/logrusx" - telemetry "github.com/ory/x/metricsx" + "github.com/ory/x/metricsx" "github.com/ory/x/reqlog" "github.com/ory/x/tlsx" @@ -40,7 +40,7 @@ func runProxy(d driver.Driver, n *negroni.Negroni, logger *logrusx.Logger, prom handler := &httputil.ReverseProxy{ Director: proxy.Director, Transport: proxy, - ErrorHandler: func(w http.ResponseWriter, r *http.Request, err error) { + ErrorHandler: func(w http.ResponseWriter, _ *http.Request, err error) { logger.WithError(err).Errorf("http: proxy error: %v", err) w.WriteHeader(http.StatusBadGateway) }, @@ -50,15 +50,18 @@ func runProxy(d driver.Driver, n *negroni.Negroni, logger *logrusx.Logger, prom promCollapsePaths := d.Configuration().PrometheusCollapseRequestPaths() n.Use(metrics.NewMiddleware(prom, "oathkeeper-proxy").ExcludePaths(healthx.ReadyCheckPath, healthx.AliveCheckPath).HidePaths(promHidePaths).CollapsePaths(promCollapsePaths)) n.Use(reqlog.NewMiddlewareFromLogger(logger, "oathkeeper-proxy").ExcludePaths(healthx.ReadyCheckPath, healthx.AliveCheckPath)) + n.Use(corsx.ContextualizedMiddleware(func(ctx context.Context) (opts cors.Options, enabled bool) { + return d.Configuration().CORS("proxy") + })) + n.UseHandler(handler) - h := corsx.Initialize(n, logger, "serve.proxy") - certs := cert("proxy", logger) + certs := cert(d.Configuration(), "proxy", logger) addr := d.Configuration().ProxyServeAddress() server := graceful.WithDefaults(&http.Server{ Addr: addr, - Handler: h, + Handler: n, TLSConfig: &tls.Config{Certificates: certs}, ReadTimeout: d.Configuration().ProxyReadTimeout(), WriteTimeout: d.Configuration().ProxyWriteTimeout(), @@ -84,7 +87,7 @@ func runAPI(d driver.Driver, n *negroni.Negroni, logger *logrusx.Logger, prom *m return func() { router := x.NewAPIRouter() d.Registry().RuleHandler().SetRoutes(router) - d.Registry().HealthHandler().SetRoutes(router.Router, true) + d.Registry().HealthHandler().SetHealthRoutes(router.Router, true) d.Registry().CredentialHandler().SetRoutes(router) promHidePaths := d.Configuration().PrometheusHideRequestPaths() @@ -93,15 +96,17 @@ func runAPI(d driver.Driver, n *negroni.Negroni, logger *logrusx.Logger, prom *m n.Use(metrics.NewMiddleware(prom, "oathkeeper-api").ExcludePaths(healthx.ReadyCheckPath, healthx.AliveCheckPath).HidePaths(promHidePaths).CollapsePaths(promCollapsePaths)) n.Use(reqlog.NewMiddlewareFromLogger(logger, "oathkeeper-api").ExcludePaths(healthx.ReadyCheckPath, healthx.AliveCheckPath)) n.Use(d.Registry().DecisionHandler()) // This needs to be the last entry, otherwise the judge API won't work + n.Use(corsx.ContextualizedMiddleware(func(ctx context.Context) (opts cors.Options, enabled bool) { + return d.Configuration().CORS("api") + })) n.UseHandler(router) - h := corsx.Initialize(n, logger, "serve.api") - certs := cert("api", logger) + certs := cert(d.Configuration(), "api", logger) addr := d.Configuration().APIServeAddress() server := graceful.WithDefaults(&http.Server{ Addr: addr, - Handler: h, + Handler: n, TLSConfig: &tls.Config{Certificates: certs}, ReadTimeout: d.Configuration().APIReadTimeout(), WriteTimeout: d.Configuration().APIWriteTimeout(), @@ -146,12 +151,14 @@ func runPrometheus(d driver.Driver, logger *logrusx.Logger, prom *metrics.Promet } } -func cert(daemon string, logger *logrusx.Logger) []tls.Certificate { +func cert(config configuration.Provider, daemon string, logger *logrusx.Logger) []tls.Certificate { + tlsCfg := config.TLSConfig(daemon) + cert, err := tlsx.Certificate( - viper.GetString("serve."+daemon+".tls.cert.base64"), - viper.GetString("serve."+daemon+".tls.key.base64"), - viper.GetString("serve."+daemon+".tls.cert.path"), - viper.GetString("serve."+daemon+".tls.key.path"), + tlsCfg.Cert.Base64, + tlsCfg.Key.Base64, + tlsCfg.Cert.Path, + tlsCfg.Key.Path, ) if err == nil { @@ -167,15 +174,15 @@ func cert(daemon string, logger *logrusx.Logger) []tls.Certificate { func clusterID(c configuration.Provider) string { var id bytes.Buffer - if err := json.NewEncoder(&id).Encode(viper.AllSettings()); err != nil { + if err := json.NewEncoder(&id).Encode(c.AllSettings()); err != nil { for _, repo := range c.AccessRuleRepositories() { _, _ = id.WriteString(repo.String()) } _, _ = id.WriteString(c.ProxyServeAddress()) _, _ = id.WriteString(c.APIServeAddress()) - _, _ = id.WriteString(viper.GetString("mutators.id_token.config.jwks_url")) - _, _ = id.WriteString(viper.GetString("mutators.id_token.config.issuer_url")) - _, _ = id.WriteString(viper.GetString("authenticators.jwt.config.jwks_urls")) + _, _ = id.WriteString(c.String("mutators.id_token.config.jwks_url")) + _, _ = id.WriteString(c.String("mutators.id_token.config.issuer_url")) + _, _ = id.WriteString(c.String("authenticators.jwt.config.jwks_urls")) } return id.String() @@ -186,43 +193,41 @@ func isDevelopment(c configuration.Provider) bool { } func RunServe(version, build, date string) func(cmd *cobra.Command, args []string) { - return func(cmd *cobra.Command, args []string) { + return func(cmd *cobra.Command, _ []string) { fmt.Println(banner(version)) logger := logrusx.New("ORY Oathkeeper", version) - d := driver.NewDefaultDriver(logger, version, build, date) + d := driver.NewDefaultDriver(logger, version, build, date, cmd.Flags()) d.Registry().Init() adminmw := negroni.New() publicmw := negroni.New() - telemetry := telemetry.New(cmd, logger, - &telemetry.Options{ - Service: "ory-oathkeeper", - ClusterID: telemetry.Hash(clusterID(d.Configuration())), - IsDevelopment: isDevelopment(d.Configuration()), - WriteKey: "xRVRP48SAKw6ViJEnvB0u2PY8bVlsO6O", - WhitelistedPaths: []string{ - "/", - api.CredentialsPath, - api.DecisionPath, - api.RulesPath, - healthx.VersionPath, - healthx.AliveCheckPath, - healthx.ReadyCheckPath, - }, - BuildVersion: version, - BuildTime: build, - BuildHash: date, - Config: &analytics.Config{ - Endpoint: "https://sqa.ory.sh", - GzipCompressionLevel: 6, - BatchMaxSize: 500 * 1000, - BatchSize: 250, - Interval: time.Hour * 24, - }, + telemetry := metricsx.New(cmd, logger, d.Configuration().Source(), &metricsx.Options{ + Service: "ory-oathkeeper", + ClusterID: metricsx.Hash(clusterID(d.Configuration())), + IsDevelopment: isDevelopment(d.Configuration()), + WriteKey: "xRVRP48SAKw6ViJEnvB0u2PY8bVlsO6O", + WhitelistedPaths: []string{ + "/", + api.CredentialsPath, + api.DecisionPath, + api.RulesPath, + healthx.VersionPath, + healthx.AliveCheckPath, + healthx.ReadyCheckPath, }, - ) + BuildVersion: version, + BuildTime: build, + BuildHash: date, + Config: &analytics.Config{ + Endpoint: "https://sqa.ory.sh", + GzipCompressionLevel: 6, + BatchMaxSize: 500 * 1000, + BatchSize: 250, + Interval: time.Hour * 24, + }, + }) adminmw.Use(telemetry) publicmw.Use(telemetry) diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 0000000000..0a405f8884 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,2 @@ +ignore: + - "internal/httpclient" # autogenerated code. diff --git a/credentials/fetcher_default.go b/credentials/fetcher_default.go index f4ca2c3ba8..2425c0551d 100644 --- a/credentials/fetcher_default.go +++ b/credentials/fetcher_default.go @@ -78,8 +78,10 @@ func NewFetcherDefault(l *logrusx.Logger, cancelAfter time.Duration, ttl time.Du ttl: ttl, keys: make(map[string]jose.JSONWebKeySet), fetchedAt: make(map[string]time.Time), - client: httpx.NewResilientClientLatencyToleranceHigh(nil), - mux: cloudstorage.NewURLMux(), + client: httpx.NewResilientClient( + httpx.ResilientClientWithConnectionTimeout(15 * time.Second), + ).StandardClient(), + mux: cloudstorage.NewURLMux(), } } @@ -265,9 +267,7 @@ func (s *FetcherDefault) resolve(wg *sync.WaitGroup, errs chan error, location u defer f.Close() reader = f - case "https": - fallthrough - case "http": + case "http", "https": res, err := s.client.Get(location.String()) if err != nil { errs <- errors.WithStack(herodot. diff --git a/credentials/fetcher_default_test.go b/credentials/fetcher_default_test.go index abfc940d9a..238c38ea0a 100644 --- a/credentials/fetcher_default_test.go +++ b/credentials/fetcher_default_test.go @@ -39,7 +39,7 @@ func TestFetcherDefault(t *testing.T) { }) l := logrusx.New("", "", logrusx.ForceLevel(logrus.DebugLevel)) - w := herodot.NewJSONWriter(l.Logger) + w := herodot.NewJSONWriter(l) s := NewFetcherDefault(l, maxWait, JWKsTTL) timeOutServer := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { @@ -59,7 +59,7 @@ func TestFetcherDefault(t *testing.T) { })) defer fastServer.Close() - invalidServer := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { + invalidServer := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, _ *http.Request) { rw.Header().Set("Content-Type", "application/json") rw.Write(sets[3]) })) diff --git a/doc.go b/doc.go index 008584a7e1..84f08c14e0 100644 --- a/doc.go +++ b/doc.go @@ -22,23 +22,23 @@ // // ORY Oathkeeper is a reverse proxy that checks the HTTP Authorization for validity against a set of rules. This service uses Hydra to validate access tokens and policies. // -// Schemes: http, https -// Host: -// BasePath: / -// Version: Latest -// Contact: ORY https://www.ory.am +// Schemes: http, https +// Host: +// BasePath: / +// Version: Latest +// Contact: ORY https://www.ory.am // -// Consumes: -// - application/json +// Consumes: +// - application/json // -// Produces: -// - application/json +// Produces: +// - application/json // -// Extensions: -// --- -// x-request-id: string -// x-forwarded-proto: string -// --- +// Extensions: +// --- +// x-request-id: string +// x-forwarded-proto: string +// --- // // swagger:meta package main diff --git a/driver/configuration/config_keys.go b/driver/configuration/config_keys.go new file mode 100644 index 0000000000..bc80d4c313 --- /dev/null +++ b/driver/configuration/config_keys.go @@ -0,0 +1,78 @@ +package configuration + +type Key = string + +const ( + ProxyReadTimeout Key = "serve.proxy.timeout.read" + ProxyWriteTimeout Key = "serve.proxy.timeout.write" + ProxyIdleTimeout Key = "serve.proxy.timeout.idle" + ProxyServeAddressHost Key = "serve.proxy.host" + ProxyServeAddressPort Key = "serve.proxy.port" + APIServeAddressHost Key = "serve.api.host" + APIServeAddressPort Key = "serve.api.port" + APIReadTimeout Key = "serve.api.timeout.read" + APIWriteTimeout Key = "serve.api.timeout.write" + APIIdleTimeout Key = "serve.api.timeout.idle" + PrometheusServeAddressHost Key = "serve.prometheus.host" + PrometheusServeAddressPort Key = "serve.prometheus.port" + PrometheusServeMetricsPath Key = "serve.prometheus.metrics_path" + PrometheusServeMetricsNamePrefix Key = "serve.prometheus.metric_name_prefix" + PrometheusServeHideRequestPaths Key = "serve.prometheus.hide_request_paths" + PrometheusServeCollapseRequestPaths Key = "serve.prometheus.collapse_request_paths" + AccessRuleRepositories Key = "access_rules.repositories" + AccessRuleMatchingStrategy Key = "access_rules.matching_strategy" +) + +// Authorizers +const ( + AuthorizerAllowIsEnabled Key = "authorizers.allow.enabled" + AuthorizerDenyIsEnabled Key = "authorizers.deny.enabled" + AuthorizerKetoEngineACPORYIsEnabled Key = "authorizers.keto_engine_acp_ory.enabled" + AuthorizerRemoteIsEnabled Key = "authorizers.remote.enabled" + AuthorizerRemoteJSONIsEnabled Key = "authorizers.remote_json.enabled" +) + +// Mutators +const ( + MutatorCookieIsEnabled Key = "mutators.cookie.enabled" + MutatorHeaderIsEnabled Key = "mutators.header.enabled" + MutatorNoopIsEnabled Key = "mutators.noop.enabled" + MutatorHydratorIsEnabled Key = "mutators.hydrator.enabled" + MutatorIDTokenIsEnabled Key = "mutators.id_token.enabled" + MutatorIDTokenJWKSURL Key = "mutators.id_token.config.jwks_url" +) + +// Authenticators +const ( + // anonymous + AuthenticatorAnonymousIsEnabled Key = "authenticators.anonymous.enabled" + + // noop + AuthenticatorNoopIsEnabled Key = "authenticators.noop.enabled" + + // cookie session + AuthenticatorCookieSessionIsEnabled Key = "authenticators.cookie_session.enabled" + + // jwt + AuthenticatorJwtIsEnabled Key = "authenticators.jwt.enabled" + AuthenticatorJwtJwkMaxWait Key = "authenticators.jwt.config.jwks_max_wait" + AuthenticatorJwtJwkTtl Key = "authenticators.jwt.config.jwks_ttl" + + // oauth2_client_credentials + AuthenticatorOAuth2ClientCredentialsIsEnabled Key = "authenticators.oauth2_client_credentials.enabled" + + // oauth2_token_introspection + AuthenticatorOAuth2TokenIntrospectionIsEnabled Key = "authenticators.oauth2_introspection.enabled" + + // unauthorized + AuthenticatorUnauthorizedIsEnabled Key = "authenticators.unauthorized.enabled" +) + +// Errors +const ( + ErrorsHandlers Key = "errors.handlers" + ErrorsFallback Key = "errors.fallback" + ErrorsJSONIsEnabled Key = ErrorsHandlers + ".json.enabled" + ErrorsRedirectIsEnabled Key = ErrorsHandlers + ".redirect.enabled" + ErrorsWWWAuthenticateIsEnabled Key = ErrorsHandlers + ".www_authenticate.enabled" +) diff --git a/driver/configuration/provider.go b/driver/configuration/provider.go index 5910c0251d..66fd2ec56a 100644 --- a/driver/configuration/provider.go +++ b/driver/configuration/provider.go @@ -3,11 +3,13 @@ package configuration import ( "encoding/json" "net/url" + "testing" "time" "github.com/gobuffalo/packr/v2" "github.com/ory/fosite" + "github.com/ory/x/configx" "github.com/ory/x/tracing" "github.com/rs/cors" @@ -25,13 +27,23 @@ type MatchingStrategy string // Possible matching strategies. const ( - Regexp MatchingStrategy = "regexp" - Glob MatchingStrategy = "glob" + Regexp MatchingStrategy = "regexp" + Glob MatchingStrategy = "glob" + DefaultMatchingStrategy = Regexp ) type Provider interface { + Get(k Key) interface{} + String(k Key) string + AllSettings() map[string]interface{} + Source() *configx.Provider + + AddWatcher(cb callback) SubscriptionID + RemoveWatcher(id SubscriptionID) + CORSEnabled(iface string) bool CORSOptions(iface string) cors.Options + CORS(iface string) (cors.Options, bool) ProviderAuthenticators ProviderErrorHandlers @@ -66,6 +78,10 @@ type Provider interface { TracingProvider() string TracingJaegerConfig() *tracing.JaegerConfig TracingZipkinConfig() *tracing.ZipkinConfig + + TLSConfig(daemon string) *TLSConfig + + SetForTest(t testing.TB, key string, value interface{}) } type ProviderErrorHandlers interface { diff --git a/driver/configuration/provider_koanf.go b/driver/configuration/provider_koanf.go new file mode 100644 index 0000000000..9937c06fd9 --- /dev/null +++ b/driver/configuration/provider_koanf.go @@ -0,0 +1,444 @@ +package configuration + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "net/url" + "strings" + "sync" + "testing" + "time" + + "github.com/google/uuid" + "github.com/knadh/koanf" + "github.com/pkg/errors" + "github.com/rs/cors" + "github.com/spf13/pflag" + "github.com/stretchr/testify/require" + + "github.com/ory/fosite" + "github.com/ory/gojsonschema" + "github.com/ory/x/configx" + "github.com/ory/x/logrusx" + "github.com/ory/x/stringsx" + "github.com/ory/x/tracing" + "github.com/ory/x/urlx" + "github.com/ory/x/watcherx" + + schema "github.com/ory/oathkeeper/.schema" + "github.com/ory/oathkeeper/x" +) + +type ( + KoanfProvider struct { + source *configx.Provider + l *logrusx.Logger + ctx context.Context + + enabledMutex sync.RWMutex + enabledCache map[uint64]bool + + configMutex sync.RWMutex + configCache map[uint64]json.RawMessage + + subscriptions subscriptions + } + + callback = func(event watcherx.Event, err error) + SubscriptionID uuid.UUID + subscriptions struct { + data map[SubscriptionID]callback + sync.RWMutex + } +) + +var _ Provider = new(KoanfProvider) + +func NewKoanfProvider(ctx context.Context, flags *pflag.FlagSet, l *logrusx.Logger, opts ...configx.OptionModifier) (kp *KoanfProvider, err error) { + kp = &KoanfProvider{ + ctx: ctx, + l: l, + + enabledCache: make(map[uint64]bool), + configCache: make(map[uint64]json.RawMessage), + subscriptions: subscriptions{data: make(map[SubscriptionID]callback)}, + } + kp.source, err = configx.New( + ctx, + schema.Config, + append(opts, + configx.WithFlags(flags), + configx.WithStderrValidationReporter(), + configx.WithLogrusWatcher(l), + configx.WithContext(ctx), + configx.AttachWatcher(kp.configChangeHandler), + )..., + ) + if err != nil { + return nil, err + } + + for k, v := range kp.source.All() { + l.Infof("Loaded config: %v = %v", k, v) + } + + return kp, nil +} + +// Internal watcher to distribute configuration changes. +func (v *KoanfProvider) configChangeHandler(event watcherx.Event, err error) { + v.subscriptions.RLock() + defer v.subscriptions.RUnlock() + for _, cb := range v.subscriptions.data { + cb := cb + go cb(event, err) + } +} + +// AddWatcher ensures that the callback is called when the configuration +// changes. The returned subscription can be used to remove the watcher. +func (v *KoanfProvider) AddWatcher(cb callback) SubscriptionID { + sID := SubscriptionID(uuid.New()) + + v.subscriptions.Lock() + v.subscriptions.data[sID] = cb + v.subscriptions.Unlock() + + return sID +} + +// RemoveWatcher removes the watcher with the given subscription ID. +func (v *KoanfProvider) RemoveWatcher(id SubscriptionID) { + v.subscriptions.Lock() + delete(v.subscriptions.data, id) + v.subscriptions.Unlock() +} + +func (v *KoanfProvider) Get(k Key) interface{} { + return v.source.Get(string(k)) +} +func (v *KoanfProvider) String(k Key) string { + return v.source.String(string(k)) +} +func (v *KoanfProvider) AllSettings() map[string]interface{} { + return v.source.All() +} +func (v *KoanfProvider) Source() *configx.Provider { + return v.source +} + +func (v *KoanfProvider) SetForTest(t testing.TB, key string, value interface{}) { + if original := v.source.Get(key); original != nil { + t.Cleanup(func() { require.NoError(t, v.source.Set(key, original)) }) + } else { + t.Cleanup(func() { v.source.Delete(key) }) + } + require.NoError(t, v.source.Set(key, value)) +} + +func (v *KoanfProvider) AccessRuleRepositories() []url.URL { + var sources []string + + // The config supports both a single string and a list of strings. + switch val := v.source.Get(AccessRuleRepositories).(type) { + case string: + sources = []string{val} + case []string: + sources = val + default: + sources = v.source.Strings(AccessRuleRepositories) + } + + repositories := make([]url.URL, len(sources)) + for k, source := range sources { + repositories[k] = *x.ParseURLOrFatal(v.l, source) + } + + return repositories +} + +// AccessRuleMatchingStrategy returns current MatchingStrategy. +func (v *KoanfProvider) AccessRuleMatchingStrategy() MatchingStrategy { + return MatchingStrategy(v.source.String(AccessRuleMatchingStrategy)) +} + +func (v *KoanfProvider) CORSEnabled(iface string) bool { + _, enabled := v.CORS(iface) + return enabled +} + +func (v *KoanfProvider) CORSOptions(iface string) cors.Options { + opts, _ := v.CORS(iface) + return opts +} + +func (v *KoanfProvider) CORS(iface string) (cors.Options, bool) { + return v.source.CORS("serve."+iface, cors.Options{}) +} + +func (v *KoanfProvider) ProxyReadTimeout() time.Duration { + return v.source.DurationF(ProxyReadTimeout, 5*time.Second) +} + +func (v *KoanfProvider) ProxyWriteTimeout() time.Duration { + return v.source.DurationF(ProxyWriteTimeout, 10*time.Second) +} + +func (v *KoanfProvider) ProxyIdleTimeout() time.Duration { + return v.source.DurationF(ProxyIdleTimeout, 120*time.Second) +} + +func (v *KoanfProvider) ProxyServeAddress() string { + return fmt.Sprintf("%s:%d", + v.source.String(ProxyServeAddressHost), + v.source.IntF(ProxyServeAddressPort, 4455), + ) +} + +func (v *KoanfProvider) APIReadTimeout() time.Duration { + return v.source.DurationF(APIReadTimeout, 5*time.Second) +} + +func (v *KoanfProvider) APIWriteTimeout() time.Duration { + return v.source.DurationF(APIWriteTimeout, 10*time.Second) +} + +func (v *KoanfProvider) APIIdleTimeout() time.Duration { + return v.source.DurationF(APIIdleTimeout, 120*time.Second) +} + +func (v *KoanfProvider) APIServeAddress() string { + return fmt.Sprintf( + "%s:%d", + v.source.String(APIServeAddressHost), + v.source.IntF(APIServeAddressPort, 4456), + ) +} + +func (v *KoanfProvider) PrometheusServeAddress() string { + return fmt.Sprintf( + "%s:%d", + v.source.String(PrometheusServeAddressHost), + v.source.IntF(PrometheusServeAddressPort, 9000), + ) +} + +func (v *KoanfProvider) PrometheusMetricsPath() string { + return v.source.StringF(PrometheusServeMetricsPath, "/metrics") +} + +func (v *KoanfProvider) PrometheusMetricsNamePrefix() string { + return v.source.StringF(PrometheusServeMetricsNamePrefix, "ory_oathkeeper_") +} + +func (v *KoanfProvider) PrometheusCollapseRequestPaths() bool { + return v.source.BoolF(PrometheusServeCollapseRequestPaths, true) +} + +func (v *KoanfProvider) ParseURLs(sources []string) ([]url.URL, error) { + r := make([]url.URL, len(sources)) + for k, u := range sources { + p, err := urlx.Parse(u) + if err != nil { + return nil, err + } + r[k] = *p + } + + return r, nil +} + +func (v *KoanfProvider) getURL(value string, key string) *url.URL { + u, err := url.ParseRequestURI(value) + if err != nil { + v.l.WithError(err).Errorf(`Configuration key "%s" is missing or malformed.`, key) + return nil + } + + return u +} + +func (v *KoanfProvider) ToScopeStrategy(value string, key string) fosite.ScopeStrategy { + switch s := stringsx.SwitchExact(strings.ToLower(value)); { + case s.AddCase("hierarchic"): + return fosite.HierarchicScopeStrategy + case s.AddCase("exact"): + return fosite.ExactScopeStrategy + case s.AddCase("wildcard"): + return fosite.WildcardScopeStrategy + case s.AddCase("none"): + return nil + default: + v.l.Errorf(`Configuration key "%s" declares unknown scope strategy: "%s". Falling back to strategy "none".`, key, s.ToUnknownCaseErr()) + return nil + } +} + +func (v *KoanfProvider) pipelineIsEnabled(prefix, id string) bool { + return v.source.Bool(fmt.Sprintf("%s.%s.enabled", prefix, id)) +} + +func (v *KoanfProvider) PipelineConfig(prefix, id string, override json.RawMessage, dest interface{}) error { + if dest == nil { + return nil + } + pipelineCfg := v.source.Cut(fmt.Sprintf("%s.%s.config", prefix, id)) + + if len(override) != 0 { + overrideCfg := koanf.New(".") + if err := overrideCfg.Load(configx.NewKoanfMemory(v.ctx, override), nil); err != nil { + return errors.WithStack(err) + } + pipelineCfg.Merge(overrideCfg) + } + + marshalled, err := json.Marshal(pipelineCfg.Raw()) + if err != nil { + return errors.WithStack(err) + } + + if err = v.validatePipelineConfig(prefix, id, marshalled); err != nil { + return errors.WithStack(err) + } + + if err := json.NewDecoder(bytes.NewBuffer(marshalled)).Decode(dest); err != nil { + return errors.WithStack(err) + } + + return nil +} + +func (v *KoanfProvider) validatePipelineConfig(prefix, id string, marshalled []byte) error { + rawComponentSchema, err := schema.FS.ReadFile(fmt.Sprintf( + "pipeline/%s.%s.schema.json", strings.Split(prefix, ".")[0], id)) + if err != nil { + return errors.WithStack(err) + } + + rawRootSchema, err := schema.FS.ReadFile("config.schema.json") + if err != nil { + return errors.WithStack(err) + } + + sbl := gojsonschema.NewSchemaLoader() + if err := sbl.AddSchemas(gojsonschema.NewBytesLoader(rawRootSchema)); err != nil { + return errors.WithStack(err) + } + + scheme, err := sbl.Compile(gojsonschema.NewBytesLoader(rawComponentSchema)) + if err != nil { + return errors.WithStack(err) + } + + if result, err := scheme.Validate(gojsonschema.NewBytesLoader(marshalled)); err != nil { + return errors.WithStack(err) + } else if !result.Valid() { + return errors.WithStack(result.Errors()) + } + + return nil +} + +func (v *KoanfProvider) ErrorHandlerConfig(id string, override json.RawMessage, dest interface{}) error { + return v.PipelineConfig(ErrorsHandlers, id, override, dest) +} + +func (v *KoanfProvider) ErrorHandlerFallbackSpecificity() []string { + return v.source.StringsF(ErrorsFallback, []string{"json"}) +} + +func (v *KoanfProvider) ErrorHandlerIsEnabled(id string) bool { + return v.pipelineIsEnabled(ErrorsHandlers, id) +} + +func (v *KoanfProvider) AuthenticatorIsEnabled(id string) bool { + return v.pipelineIsEnabled("authenticators", id) +} + +func (v *KoanfProvider) AuthenticatorConfig(id string, override json.RawMessage, dest interface{}) error { + return v.PipelineConfig("authenticators", id, override, dest) +} + +func (v *KoanfProvider) AuthenticatorJwtJwkMaxWait() time.Duration { + return v.source.DurationF(AuthenticatorJwtJwkMaxWait, 1*time.Second) +} + +func (v *KoanfProvider) AuthenticatorJwtJwkTtl() time.Duration { + return v.source.DurationF(AuthenticatorJwtJwkTtl, 30*time.Second) +} + +func (v *KoanfProvider) AuthorizerIsEnabled(id string) bool { + return v.pipelineIsEnabled("authorizers", id) +} + +func (v *KoanfProvider) AuthorizerConfig(id string, override json.RawMessage, dest interface{}) error { + return v.PipelineConfig("authorizers", id, override, dest) +} + +func (v *KoanfProvider) MutatorIsEnabled(id string) bool { + return v.pipelineIsEnabled("mutators", id) +} + +func (v *KoanfProvider) MutatorConfig(id string, override json.RawMessage, dest interface{}) error { + return v.PipelineConfig("mutators", id, override, dest) +} + +func (v *KoanfProvider) JSONWebKeyURLs() []string { + switch val := v.source.Get(MutatorIDTokenJWKSURL).(type) { + case string: + return []string{val} + default: + return v.source.Strings(MutatorIDTokenJWKSURL) + } +} + +func (v *KoanfProvider) TracingServiceName() string { + return v.source.StringF("tracing.service_name", "ORY Oathkeeper") +} + +func (v *KoanfProvider) TracingProvider() string { + return v.source.String("tracing.provider") +} + +func (v *KoanfProvider) PrometheusHideRequestPaths() bool { + return v.source.BoolF(PrometheusServeHideRequestPaths, false) +} + +func (v *KoanfProvider) TracingJaegerConfig() *tracing.JaegerConfig { + return &tracing.JaegerConfig{ + LocalAgentAddress: v.source.String( + "tracing.providers.jaeger.local_agent_address", + ), + + Sampling: &tracing.JaegerSampling{ + Type: v.source.StringF("tracing.providers.jaeger.sampling.type", "const"), + Value: v.source.Float64F("tracing.providers.jaeger.sampling.value", 1), + ServerURL: v.source.String("tracing.providers.jaeger.sampling.server_url"), + }, + Propagation: v.source.String("tracing.providers.jaeger.propagation"), + } +} +func (v *KoanfProvider) TracingZipkinConfig() *tracing.ZipkinConfig { + return &tracing.ZipkinConfig{ + ServerURL: v.source.String("tracing.providers.zipkin.server_url"), + } +} + +type TLSConfig struct { + Key TLSData `mapstructure:"key"` + Cert TLSData `mapstructure:"cert"` +} +type TLSData struct { + Path string `mapstructure:"path"` + Base64 string `mapstructure:"base64"` +} + +func (v *KoanfProvider) TLSConfig(daemon string) *TLSConfig { + c := new(TLSConfig) + if err := v.source.Unmarshal("serve."+daemon+".tls", c); err != nil { + v.l.Logger.Warnf("Failed to unmarshal TLS config for %s: %v", daemon, err) + } + return c +} diff --git a/driver/configuration/provider_viper_private_test.go b/driver/configuration/provider_koanf_private_test.go similarity index 80% rename from driver/configuration/provider_viper_private_test.go rename to driver/configuration/provider_koanf_private_test.go index dbbdcf5ee3..57d8be073e 100644 --- a/driver/configuration/provider_viper_private_test.go +++ b/driver/configuration/provider_koanf_private_test.go @@ -21,15 +21,18 @@ package configuration import ( + "context" "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/ory/x/logrusx" ) func TestGetURL(t *testing.T) { - v := NewViperProvider(logrusx.New("", "")) - assert.Nil(t, v.getURL("", "key")) - assert.Nil(t, v.getURL("a", "key")) + kp, err := NewKoanfProvider(context.Background(), nil, logrusx.New("", "")) + require.NoError(t, err) + assert.Nil(t, kp.getURL("", "key")) + assert.Nil(t, kp.getURL("a", "key")) } diff --git a/driver/configuration/provider_viper_public_test.go b/driver/configuration/provider_koanf_public_test.go similarity index 78% rename from driver/configuration/provider_viper_public_test.go rename to driver/configuration/provider_koanf_public_test.go index 4315b9f3dd..906e737e12 100644 --- a/driver/configuration/provider_viper_public_test.go +++ b/driver/configuration/provider_koanf_public_test.go @@ -1,25 +1,23 @@ package configuration_test import ( + "context" "encoding/json" "fmt" "net/url" - "os" "testing" "github.com/rs/cors" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/ory/x/configx" "github.com/ory/x/logrusx" - "github.com/ory/x/viperx" - - "github.com/ory/viper" - _ "github.com/ory/jsonschema/v3/fileloader" _ "github.com/ory/jsonschema/v3/httploader" + "github.com/ory/oathkeeper/driver/configuration" . "github.com/ory/oathkeeper/driver/configuration" "github.com/ory/oathkeeper/pipeline/authn" "github.com/ory/oathkeeper/pipeline/authz" @@ -27,49 +25,44 @@ import ( "github.com/ory/oathkeeper/x" ) -func setup(t *testing.T) *ViperProvider { - l := logrusx.New("", "") - viper.Reset() - viperx.InitializeConfig( - "oathkeeper", - "./../../internal/config/", - l, +func setup(t *testing.T) *KoanfProvider { + p, err := configuration.NewKoanfProvider( + context.Background(), + nil, + logrusx.New(t.Name(), ""), + configx.WithConfigFiles("./../../internal/config/.oathkeeper.yaml"), ) - - err := viperx.ValidateFromURL("file://../../.schema/config.schema.json") - if err != nil { - l.WithError(err).Error("unable to validate") - } require.NoError(t, err) - - return NewViperProvider(l) + return p } func TestPipelineConfig(t *testing.T) { t.Run("case=should use config from environment variables", func(t *testing.T) { var res json.RawMessage - require.NoError(t, os.Setenv("AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_INTROSPECTION_URL", "https://override/path")) + + t.Setenv("AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_INTROSPECTION_URL", "https://override/path") p := setup(t) require.NoError(t, p.PipelineConfig("authenticators", "oauth2_introspection", nil, &res)) assert.JSONEq(t, `{"cache":{"enabled":false, "max_cost":1000},"introspection_url":"https://override/path","pre_authorization":{"client_id":"some_id","client_secret":"some_secret","enabled":true,"audience":"some_audience","scope":["foo","bar"],"token_url":"https://my-website.com/oauth2/token"},"retry":{"max_delay":"100ms", "give_up_after":"1s"},"scope_strategy":"exact"}`, string(res), "%s", res) + }) - // Cleanup - require.NoError(t, os.Setenv("AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_INTROSPECTION_URL", "")) - + t.Run("case=should setup", func(t *testing.T) { + setup(t) }) t.Run("case=should fail when invalid value is used in override", func(t *testing.T) { p := setup(t) + res := json.RawMessage{} require.Error(t, p.PipelineConfig("mutators", "hydrator", json.RawMessage(`{"not-api":"invalid"}`), &res)) - assert.JSONEq(t, `{"cache":{"enabled":false,"ttl":"1m"},"api":{"url":"https://some-url/","retry":{"give_up_after":"1s","max_delay":"100ms"}},"not-api":"invalid"}`, string(res)) + assert.Equal(t, json.RawMessage{}, res) require.Error(t, p.PipelineConfig("mutators", "hydrator", json.RawMessage(`{"api":{"this-key-does-not-exist":true}}`), &res)) - assert.JSONEq(t, `{"cache":{"enabled":false,"ttl":"1m"},"api":{"url":"https://some-url/","this-key-does-not-exist":true,"retry":{"give_up_after":"1s","max_delay":"100ms"}}}`, string(res)) + assert.Equal(t, json.RawMessage{}, res) require.Error(t, p.PipelineConfig("mutators", "hydrator", json.RawMessage(`{"api":{"url":"not-a-url"}}`), &res)) - assert.JSONEq(t, `{"cache":{"enabled":false,"ttl":"1m"},"api":{"url":"not-a-url","retry":{"give_up_after":"1s","max_delay":"100ms"}}}`, string(res)) + assert.Equal(t, json.RawMessage{}, res) }) t.Run("case=should pass and override values", func(t *testing.T) { @@ -111,22 +104,15 @@ v0.35.2 */ func BenchmarkPipelineConfig(b *testing.B) { - viper.Reset() - l := logrusx.New("", "") - viperx.InitializeConfig( - "oathkeeper", - "./../../internal/config/", - l, + p, err := configuration.NewKoanfProvider( + context.Background(), + nil, + logrusx.New(b.Name(), ""), + configx.WithConfigFiles("./../../internal/config/.oathkeeper.yaml"), ) - - err := viperx.ValidateFromURL("file://../../.schema/config.schema.json") - if err != nil { - l.WithError(err).Error("unable to validate") - } require.NoError(b, err) - p := NewViperProvider(logrusx.New("", "")) - + b.ResetTimer() for n := 0; n < b.N; n++ { res := json.RawMessage{} p.PipelineConfig("authenticators", "oauth2_introspection", nil, &res) @@ -144,22 +130,15 @@ v0.35.5 */ func BenchmarkPipelineEnabled(b *testing.B) { - viper.Reset() - logger := logrusx.New("", "") - viperx.InitializeConfig( - "oathkeeper", - "./../../internal/config/", - logger, + p, err := configuration.NewKoanfProvider( + context.Background(), + nil, + logrusx.New(b.Name(), ""), + configx.WithConfigFiles("./../../internal/config/.oathkeeper.yaml"), ) - - err := viperx.ValidateFromURL("file://../../.schema/config.schema.json") - if err != nil { - logger.WithError(err).Error("unable to validate") - } require.NoError(b, err) - p := NewViperProvider(logrusx.New("", "")) - + b.ResetTimer() for n := 0; n < b.N; n++ { p.AuthorizerIsEnabled("allow") p.AuthenticatorIsEnabled("noop") @@ -167,20 +146,15 @@ func BenchmarkPipelineEnabled(b *testing.B) { } } -func TestViperProvider(t *testing.T) { - viper.Reset() +func TestKoanfProvider(t *testing.T) { logger := logrusx.New("", "") - viperx.InitializeConfig( - "oathkeeper", - "./../../internal/config/", + p, err := configuration.NewKoanfProvider( + context.Background(), + nil, logger, + configx.WithConfigFiles("./../../internal/config/.oathkeeper.yaml"), ) - - err := viperx.ValidateFromURL("file://../../.schema/config.schema.json") - if err != nil { - logger.WithError(err).Error("unable to validate") - } - p := NewViperProvider(logrusx.New("", "")) + require.NoError(t, err) t.Run("group=serve", func(t *testing.T) { assert.Equal(t, "127.0.0.1:1234", p.ProxyServeAddress()) @@ -222,10 +196,22 @@ func TestViperProvider(t *testing.T) { t.Run("group=tls", func(t *testing.T) { for _, daemon := range []string{"proxy", "api"} { t.Run(fmt.Sprintf("daemon="+daemon), func(t *testing.T) { - assert.Equal(t, "LS0tLS1CRUdJTiBFTkNSWVBURUQgUFJJVkFURSBLRVktLS0tLVxuTUlJRkRqQkFCZ2txaGtpRzl3MEJCUTB3...", viper.GetString("serve."+daemon+".tls.key.base64")) - assert.Equal(t, "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG5NSUlEWlRDQ0FrMmdBd0lCQWdJRVY1eE90REFOQmdr...", viper.GetString("serve."+daemon+".tls.cert.base64")) - assert.Equal(t, "/path/to/key.pem", viper.GetString("serve."+daemon+".tls.key.path")) - assert.Equal(t, "/path/to/cert.pem", viper.GetString("serve."+daemon+".tls.cert.path")) + assert.Equal(t, + "LS0tLS1CRUdJTiBFTkNSWVBURUQgUFJJVkFURSBLRVktLS0tLVxuTUlJRkRqQkFCZ2txaGtpRzl3MEJCUTB3...", + p.TLSConfig(daemon).Key.Base64, + ) + assert.Equal(t, + "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG5NSUlEWlRDQ0FrMmdBd0lCQWdJRVY1eE90REFOQmdr...", + p.TLSConfig(daemon).Cert.Base64, + ) + assert.Equal(t, + "/path/to/key.pem", + p.TLSConfig(daemon).Key.Path, + ) + assert.Equal(t, + "/path/to/cert.pem", + p.TLSConfig(daemon).Cert.Path, + ) }) } }) @@ -398,20 +384,31 @@ func TestViperProvider(t *testing.T) { } func TestToScopeStrategy(t *testing.T) { - v := NewViperProvider(logrusx.New("", "")) + p, err := configuration.NewKoanfProvider( + context.Background(), + nil, + logrusx.New("", ""), + configx.WithConfigFiles("./../../internal/config/.oathkeeper.yaml"), + ) + require.NoError(t, err) - assert.True(t, v.ToScopeStrategy("exact", "foo")([]string{"foo"}, "foo")) - assert.True(t, v.ToScopeStrategy("hierarchic", "foo")([]string{"foo"}, "foo.bar")) - assert.True(t, v.ToScopeStrategy("wildcard", "foo")([]string{"foo.*"}, "foo.bar")) - assert.Nil(t, v.ToScopeStrategy("none", "foo")) - assert.Nil(t, v.ToScopeStrategy("whatever", "foo")) + assert.True(t, p.ToScopeStrategy("exact", "foo")([]string{"foo"}, "foo")) + assert.True(t, p.ToScopeStrategy("hierarchic", "foo")([]string{"foo"}, "foo.bar")) + assert.True(t, p.ToScopeStrategy("wildcard", "foo")([]string{"foo.*"}, "foo.bar")) + assert.Nil(t, p.ToScopeStrategy("none", "foo")) + assert.Nil(t, p.ToScopeStrategy("whatever", "foo")) } func TestAuthenticatorOAuth2TokenIntrospectionPreAuthorization(t *testing.T) { - viper.Reset() - v := NewViperProvider(logrusx.New("", "")) - viper.Set("authenticators.oauth2_introspection.enabled", true) - viper.Set("authenticators.oauth2_introspection.config.introspection_url", "http://some-url/") + p, err := configuration.NewKoanfProvider( + context.Background(), + nil, + logrusx.New("", ""), + configx.WithConfigFiles("./../../internal/config/.oathkeeper.yaml"), + configx.WithValue("authenticators.oauth2_introspection.enabled", true), + configx.WithValue("authenticators.oauth2_introspection.config.introspection_url", "http://some-url/"), + ) + require.NoError(t, err) for k, tc := range []struct { enabled bool @@ -431,7 +428,7 @@ func TestAuthenticatorOAuth2TokenIntrospectionPreAuthorization(t *testing.T) { {enabled: true, id: "a", secret: "b", turl: "https://some-url", err: false}, } { t.Run(fmt.Sprintf("case=%d", k), func(t *testing.T) { - a := authn.NewAuthenticatorOAuth2Introspection(v, logrusx.New("", "")) + a := authn.NewAuthenticatorOAuth2Introspection(p, logrusx.New("", "")) config, _, err := a.Config(json.RawMessage(fmt.Sprintf(`{ "pre_authorization": { diff --git a/driver/configuration/provider_viper.go b/driver/configuration/provider_viper.go deleted file mode 100644 index 1a329ded7b..0000000000 --- a/driver/configuration/provider_viper.go +++ /dev/null @@ -1,461 +0,0 @@ -package configuration - -import ( - "bytes" - "encoding/binary" - "encoding/json" - "fmt" - "hash/crc64" - "net/url" - "strings" - "sync" - "time" - - "github.com/imdario/mergo" - "github.com/pkg/errors" - "github.com/rs/cors" - - "github.com/ory/viper" - "github.com/ory/x/logrusx" - "github.com/ory/x/urlx" - - "github.com/ory/go-convenience/stringsx" - - "github.com/ory/fosite" - "github.com/ory/gojsonschema" - "github.com/ory/x/corsx" - "github.com/ory/x/tracing" - "github.com/ory/x/viperx" - - "github.com/ory/oathkeeper/x" -) - -var _ Provider = new(ViperProvider) - -func init() { - // The JSON error handler is the default error handler and must be enabled by default. - viper.SetDefault(ViperKeyErrorsJSONIsEnabled, true) -} - -const ( - ViperKeyProxyReadTimeout = "serve.proxy.timeout.read" - ViperKeyProxyWriteTimeout = "serve.proxy.timeout.write" - ViperKeyProxyIdleTimeout = "serve.proxy.timeout.idle" - ViperKeyProxyServeAddressHost = "serve.proxy.host" - ViperKeyProxyServeAddressPort = "serve.proxy.port" - ViperKeyAPIServeAddressHost = "serve.api.host" - ViperKeyAPIServeAddressPort = "serve.api.port" - ViperKeyAPIReadTimeout = "serve.api.timeout.read" - ViperKeyAPIWriteTimeout = "serve.api.timeout.write" - ViperKeyAPIIdleTimeout = "serve.api.timeout.idle" - ViperKeyPrometheusServeAddressHost = "serve.prometheus.host" - ViperKeyPrometheusServeAddressPort = "serve.prometheus.port" - ViperKeyPrometheusServeMetricsPath = "serve.prometheus.metrics_path" - ViperKeyPrometheusServeMetricsNamePrefix = "serve.prometheus.metric_name_prefix" - ViperKeyPrometheusServeHideRequestPaths = "serve.prometheus.hide_request_paths" - ViperKeyPrometheusServeCollapseRequestPaths = "serve.prometheus.collapse_request_paths" - ViperKeyAccessRuleRepositories = "access_rules.repositories" - ViperKeyAccessRuleMatchingStrategy = "access_rules.matching_strategy" -) - -// Authorizers -const ( - ViperKeyAuthorizerAllowIsEnabled = "authorizers.allow.enabled" - - ViperKeyAuthorizerDenyIsEnabled = "authorizers.deny.enabled" - - ViperKeyAuthorizerKetoEngineACPORYIsEnabled = "authorizers.keto_engine_acp_ory.enabled" - - ViperKeyAuthorizerRemoteIsEnabled = "authorizers.remote.enabled" - - ViperKeyAuthorizerRemoteJSONIsEnabled = "authorizers.remote_json.enabled" -) - -// Mutators -const ( - ViperKeyMutatorCookieIsEnabled = "mutators.cookie.enabled" - - ViperKeyMutatorHeaderIsEnabled = "mutators.header.enabled" - - ViperKeyMutatorNoopIsEnabled = "mutators.noop.enabled" - - ViperKeyMutatorHydratorIsEnabled = "mutators.hydrator.enabled" - - ViperKeyMutatorIDTokenIsEnabled = "mutators.id_token.enabled" - ViperKeyMutatorIDTokenJWKSURL = "mutators.id_token.config.jwks_url" -) - -// Authenticators -const ( - // anonymous - ViperKeyAuthenticatorAnonymousIsEnabled = "authenticators.anonymous.enabled" - - // noop - ViperKeyAuthenticatorNoopIsEnabled = "authenticators.noop.enabled" - - // cookie session - ViperKeyAuthenticatorCookieSessionIsEnabled = "authenticators.cookie_session.enabled" - - // jwt - ViperKeyAuthenticatorJwtIsEnabled = "authenticators.jwt.enabled" - ViperKeyAuthenticatorJwtJwkMaxWait = "authenticators.jwt.config.jwks_max_wait" - ViperKeyAuthenticatorJwtJwkTtl = "authenticators.jwt.config.jwks_ttl" - - // oauth2_client_credentials - ViperKeyAuthenticatorOAuth2ClientCredentialsIsEnabled = "authenticators.oauth2_client_credentials.enabled" - - // oauth2_token_introspection - ViperKeyAuthenticatorOAuth2TokenIntrospectionIsEnabled = "authenticators.oauth2_introspection.enabled" - - // unauthorized - ViperKeyAuthenticatorUnauthorizedIsEnabled = "authenticators.unauthorized.enabled" -) - -// Errors -const ( - ViperKeyErrors = "errors.handlers" - ViperKeyErrorsFallback = "errors.fallback" - ViperKeyErrorsJSONIsEnabled = ViperKeyErrors + ".json.enabled" - ViperKeyErrorsRedirectIsEnabled = ViperKeyErrors + ".redirect.enabled" - ViperKeyErrorsWWWAuthenticateIsEnabled = ViperKeyErrors + ".www_authenticate.enabled" -) - -type ViperProvider struct { - l *logrusx.Logger - - enabledMutex sync.RWMutex - enabledCache map[uint64]bool - - configMutex sync.RWMutex - configCache map[uint64]json.RawMessage -} - -func NewViperProvider(l *logrusx.Logger) *ViperProvider { - return &ViperProvider{ - l: l, - enabledCache: make(map[uint64]bool), - configCache: make(map[uint64]json.RawMessage), - } -} - -func (v *ViperProvider) AccessRuleRepositories() []url.URL { - sources := viperx.GetStringSlice(v.l, ViperKeyAccessRuleRepositories, []string{}) - repositories := make([]url.URL, len(sources)) - for k, source := range sources { - repositories[k] = *x.ParseURLOrFatal(v.l, source) - } - - return repositories -} - -// AccessRuleMatchingStrategy returns current MatchingStrategy. -func (v *ViperProvider) AccessRuleMatchingStrategy() MatchingStrategy { - return MatchingStrategy(viperx.GetString(v.l, ViperKeyAccessRuleMatchingStrategy, "")) -} - -func (v *ViperProvider) CORSEnabled(iface string) bool { - return corsx.IsEnabled(v.l, "serve."+iface) -} - -func (v *ViperProvider) CORSOptions(iface string) cors.Options { - return corsx.ParseOptions(v.l, "serve."+iface) -} - -func (v *ViperProvider) ProxyReadTimeout() time.Duration { - return viperx.GetDuration(v.l, ViperKeyProxyReadTimeout, time.Second*5, "PROXY_SERVER_READ_TIMEOUT") -} - -func (v *ViperProvider) ProxyWriteTimeout() time.Duration { - return viperx.GetDuration(v.l, ViperKeyProxyWriteTimeout, time.Second*10, "PROXY_SERVER_WRITE_TIMEOUT") -} - -func (v *ViperProvider) ProxyIdleTimeout() time.Duration { - return viperx.GetDuration(v.l, ViperKeyProxyIdleTimeout, time.Second*120, "PROXY_SERVER_IDLE_TIMEOUT") -} - -func (v *ViperProvider) ProxyServeAddress() string { - return fmt.Sprintf( - "%s:%d", - viperx.GetString(v.l, ViperKeyProxyServeAddressHost, ""), - viperx.GetInt(v.l, ViperKeyProxyServeAddressPort, 4455), - ) -} - -func (v *ViperProvider) APIReadTimeout() time.Duration { - return viperx.GetDuration(v.l, ViperKeyAPIReadTimeout, time.Second*5) -} - -func (v *ViperProvider) APIWriteTimeout() time.Duration { - return viperx.GetDuration(v.l, ViperKeyAPIWriteTimeout, time.Second*10) -} - -func (v *ViperProvider) APIIdleTimeout() time.Duration { - return viperx.GetDuration(v.l, ViperKeyAPIIdleTimeout, time.Second*120) -} - -func (v *ViperProvider) APIServeAddress() string { - return fmt.Sprintf( - "%s:%d", - viperx.GetString(v.l, ViperKeyAPIServeAddressHost, ""), - viperx.GetInt(v.l, ViperKeyAPIServeAddressPort, 4456), - ) -} - -func (v *ViperProvider) PrometheusServeAddress() string { - return fmt.Sprintf( - "%s:%d", - viperx.GetString(v.l, ViperKeyPrometheusServeAddressHost, ""), - viperx.GetInt(v.l, ViperKeyPrometheusServeAddressPort, 9000), - ) -} - -func (v *ViperProvider) PrometheusMetricsPath() string { - return viperx.GetString(v.l, ViperKeyPrometheusServeMetricsPath, "/metrics") -} - -func (v *ViperProvider) PrometheusMetricsNamePrefix() string { - return viperx.GetString(v.l, ViperKeyPrometheusServeMetricsNamePrefix, "ory_oathkeeper_") -} - -func (v *ViperProvider) PrometheusHideRequestPaths() bool { - return viperx.GetBool(v.l, ViperKeyPrometheusServeHideRequestPaths, false) -} - -func (v *ViperProvider) PrometheusCollapseRequestPaths() bool { - return viperx.GetBool(v.l, ViperKeyPrometheusServeCollapseRequestPaths, true) -} - -func (v *ViperProvider) ParseURLs(sources []string) ([]url.URL, error) { - r := make([]url.URL, len(sources)) - for k, u := range sources { - p, err := urlx.Parse(u) - if err != nil { - return nil, err - } - r[k] = *p - } - - return r, nil -} - -func (v *ViperProvider) getURL(value string, key string) *url.URL { - u, err := url.ParseRequestURI(value) - if err != nil { - v.l.WithError(err).Errorf(`Configuration key "%s" is missing or malformed.`, key) - return nil - } - - return u -} - -func (v *ViperProvider) ToScopeStrategy(value string, key string) fosite.ScopeStrategy { - switch strings.ToLower(value) { - case "hierarchic": - return fosite.HierarchicScopeStrategy - case "exact": - return fosite.ExactScopeStrategy - case "wildcard": - return fosite.WildcardScopeStrategy - case "none": - return nil - default: - v.l.Errorf(`Configuration key "%s" declares unknown scope strategy "%s", only "hierarchic", "exact", "wildcard", "none" are supported. Falling back to strategy "none".`, key, value) - return nil - } -} - -func (v *ViperProvider) pipelineIsEnabled(prefix, id string) bool { - hash, err := v.hashPipelineConfig(prefix, id, nil) - if err != nil { - return false - } - - v.enabledMutex.RLock() - e, ok := v.enabledCache[hash] - v.enabledMutex.RUnlock() - - if ok { - return e - } - - v.enabledMutex.Lock() - v.enabledCache[hash] = viperx.GetBool(v.l, fmt.Sprintf("%s.%s.enabled", prefix, id), false) - v.enabledMutex.Unlock() - - return v.enabledCache[hash] -} - -func (v *ViperProvider) hashPipelineConfig(prefix, id string, override json.RawMessage) (uint64, error) { - ts := viper.ConfigChangeAt().UnixNano() - b := make([]byte, 8) - binary.LittleEndian.PutUint64(b, uint64(ts)) - - slices := [][]byte{ - []byte(prefix), - []byte(id), - []byte(override), - []byte(b), - } - - var hashSlices []byte - for _, s := range slices { - hashSlices = append(hashSlices, s...) - } - - return crc64.Checksum(hashSlices, crc64.MakeTable(crc64.ECMA)), nil -} - -func (v *ViperProvider) PipelineConfig(prefix, id string, override json.RawMessage, dest interface{}) error { - hash, err := v.hashPipelineConfig(prefix, id, override) - if err != nil { - return errors.WithStack(err) - } - - v.configMutex.RLock() - c, ok := v.configCache[hash] - v.configMutex.RUnlock() - - if ok { - if dest != nil { - if err := json.NewDecoder(bytes.NewBuffer(c)).Decode(dest); err != nil { - return errors.WithStack(err) - } - } - - return nil - } - - // we need to create a copy for config otherwise we will accidentally override values - config, err := x.Deepcopy(viperx.GetStringMapConfig(stringsx.Splitx(fmt.Sprintf("%s.%s.config", prefix, id), ".")...)) - if err != nil { - return errors.WithStack(err) - } - - if len(override) != 0 { - var overrideMap map[string]interface{} - if err := json.Unmarshal(override, &overrideMap); err != nil { - return errors.WithStack(err) - } - - if err := mergo.Merge(&config, &overrideMap, mergo.WithOverride); err != nil { - return errors.WithStack(err) - } - } - - marshalled, err := json.Marshal(config) - if err != nil { - return errors.WithStack(err) - } - - if dest != nil { - if err := json.NewDecoder(bytes.NewBuffer(marshalled)).Decode(dest); err != nil { - return errors.WithStack(err) - } - } - - rawComponentSchema, err := schemas.Find(fmt.Sprintf("pipeline/%s.%s.schema.json", strings.Split(prefix, ".")[0], id)) - if err != nil { - return errors.WithStack(err) - } - - rawRootSchema, err := schemas.Find("config.schema.json") - if err != nil { - return errors.WithStack(err) - } - - sbl := gojsonschema.NewSchemaLoader() - if err := sbl.AddSchemas(gojsonschema.NewBytesLoader(rawRootSchema)); err != nil { - return errors.WithStack(err) - } - - schema, err := sbl.Compile(gojsonschema.NewBytesLoader(rawComponentSchema)) - if err != nil { - return errors.WithStack(err) - } - - if result, err := schema.Validate(gojsonschema.NewBytesLoader(marshalled)); err != nil { - return errors.WithStack(err) - } else if !result.Valid() { - return errors.WithStack(result.Errors()) - } - - v.configMutex.Lock() - v.configCache[hash] = marshalled - v.configMutex.Unlock() - - return nil -} - -func (v *ViperProvider) ErrorHandlerConfig(id string, override json.RawMessage, dest interface{}) error { - return v.PipelineConfig(ViperKeyErrors, id, override, dest) -} - -func (v *ViperProvider) ErrorHandlerFallbackSpecificity() []string { - return viperx.GetStringSlice(v.l, ViperKeyErrorsFallback, []string{"json"}) -} - -func (v *ViperProvider) ErrorHandlerIsEnabled(id string) bool { - return v.pipelineIsEnabled(ViperKeyErrors, id) -} - -func (v *ViperProvider) AuthenticatorIsEnabled(id string) bool { - return v.pipelineIsEnabled("authenticators", id) -} - -func (v *ViperProvider) AuthenticatorConfig(id string, override json.RawMessage, dest interface{}) error { - return v.PipelineConfig("authenticators", id, override, dest) -} - -func (v *ViperProvider) AuthenticatorJwtJwkMaxWait() time.Duration { - return viperx.GetDuration(v.l, ViperKeyAuthenticatorJwtJwkMaxWait, time.Second) -} - -func (v *ViperProvider) AuthenticatorJwtJwkTtl() time.Duration { - return viperx.GetDuration(v.l, ViperKeyAuthenticatorJwtJwkTtl, time.Second*30) -} - -func (v *ViperProvider) AuthorizerIsEnabled(id string) bool { - return v.pipelineIsEnabled("authorizers", id) -} - -func (v *ViperProvider) AuthorizerConfig(id string, override json.RawMessage, dest interface{}) error { - return v.PipelineConfig("authorizers", id, override, dest) -} - -func (v *ViperProvider) MutatorIsEnabled(id string) bool { - return v.pipelineIsEnabled("mutators", id) -} - -func (v *ViperProvider) MutatorConfig(id string, override json.RawMessage, dest interface{}) error { - return v.PipelineConfig("mutators", id, override, dest) -} - -func (v *ViperProvider) JSONWebKeyURLs() []string { - return viperx.GetStringSlice(v.l, ViperKeyMutatorIDTokenJWKSURL, []string{}) -} - -func (v *ViperProvider) TracingServiceName() string { - return viperx.GetString(v.l, "tracing.service_name", "ORY Oathkeeper") -} - -func (v *ViperProvider) TracingProvider() string { - return viperx.GetString(v.l, "tracing.provider", "", "TRACING_PROVIDER") -} - -func (v *ViperProvider) TracingJaegerConfig() *tracing.JaegerConfig { - return &tracing.JaegerConfig{ - LocalAgentHostPort: viperx.GetString(v.l, "tracing.providers.jaeger.local_agent_address", "", "TRACING_PROVIDER_JAEGER_LOCAL_AGENT_ADDRESS"), - SamplerType: viperx.GetString(v.l, "tracing.providers.jaeger.sampling.type", "const", "TRACING_PROVIDER_JAEGER_SAMPLING_TYPE"), - SamplerValue: viperx.GetFloat64(v.l, "tracing.providers.jaeger.sampling.value", float64(1), "TRACING_PROVIDER_JAEGER_SAMPLING_VALUE"), - SamplerServerURL: viperx.GetString(v.l, "tracing.providers.jaeger.sampling.server_url", "", "TRACING_PROVIDER_JAEGER_SAMPLING_SERVER_URL"), - Propagation: stringsx.Coalesce( - viper.GetString("JAEGER_PROPAGATION"), // Standard Jaeger client config - viperx.GetString(v.l, "tracing.providers.jaeger.propagation", "", "TRACING_PROVIDER_JAEGER_PROPAGATION"), - ), - } -} -func (v *ViperProvider) TracingZipkinConfig() *tracing.ZipkinConfig { - return &tracing.ZipkinConfig{ - ServerURL: viperx.GetString(v.l, "tracing.providers.zipkin.server_url", "", "TRACING_PROVIDER_ZIPKIN_SERVER_URL"), - } -} diff --git a/driver/driver_default.go b/driver/driver_default.go index 3533edef1e..82311de67e 100644 --- a/driver/driver_default.go +++ b/driver/driver_default.go @@ -1,6 +1,11 @@ package driver import ( + "context" + + "github.com/spf13/pflag" + + "github.com/ory/x/configx" "github.com/ory/x/logrusx" "github.com/ory/oathkeeper/driver/configuration" @@ -11,8 +16,12 @@ type DefaultDriver struct { r Registry } -func NewDefaultDriver(l *logrusx.Logger, version, build, date string) Driver { - c := configuration.NewViperProvider(l) +func NewDefaultDriver(l *logrusx.Logger, version, build, date string, flags *pflag.FlagSet, configOpts ...configx.OptionModifier) Driver { + c, err := configuration.NewKoanfProvider( + context.Background(), flags, l, configOpts...) + if err != nil { + l.WithError(err).Fatal("Failed to initialize configuration") + } r := NewRegistry(c).WithLogger(l).WithBuildInfo(version, build, date) return &DefaultDriver{r: r, c: c} diff --git a/driver/health/event_manager_default.go b/driver/health/event_manager_default.go index 4ee7fa9e38..ca17d6a5a7 100644 --- a/driver/health/event_manager_default.go +++ b/driver/health/event_manager_default.go @@ -2,6 +2,7 @@ package health import ( "context" + "net/http" "github.com/pkg/errors" @@ -61,7 +62,7 @@ func (h *DefaultHealthEventManager) Watch(ctx context.Context) { func (h *DefaultHealthEventManager) HealthxReadyCheckers() healthx.ReadyCheckers { var checkers = make(healthx.ReadyCheckers) for _, listener := range h.listeners { - checkers[listener.ID()] = listener.Validate + checkers[listener.ID()] = func(_ *http.Request) error { return listener.Validate() } } return checkers } diff --git a/driver/registry_memory.go b/driver/registry_memory.go index 783beee6f0..ae793b2b7a 100644 --- a/driver/registry_memory.go +++ b/driver/registry_memory.go @@ -179,7 +179,7 @@ func (r *RegistryMemory) RuleRepository() rule.Repository { func (r *RegistryMemory) Writer() herodot.Writer { if r.writer == nil { - r.writer = herodot.NewJSONWriter(r.Logger().Logger) + r.writer = herodot.NewJSONWriter(r.Logger()) } return r.writer } @@ -421,15 +421,17 @@ func (r *RegistryMemory) prepareMutators() { func (r *RegistryMemory) Tracer() *tracing.Tracer { if r.trc == nil { - r.trc = &tracing.Tracer{ - ServiceName: r.c.TracingServiceName(), - JaegerConfig: r.c.TracingJaegerConfig(), - ZipkinConfig: r.c.TracingZipkinConfig(), - Provider: r.c.TracingProvider(), - Logger: r.Logger(), - } - - if err := r.trc.Setup(); err != nil { + var err error + r.trc, err = tracing.New(r.Logger(), + &tracing.Config{ + ServiceName: r.c.TracingServiceName(), + Provider: r.c.TracingProvider(), + Providers: &tracing.ProvidersConfig{ + Jaeger: r.c.TracingJaegerConfig(), + Zipkin: r.c.TracingZipkinConfig(), + }, + }) + if err != nil { r.Logger().WithError(err).Fatalf("Unable to initialize Tracer.") } } diff --git a/go.mod b/go.mod index f8e756f83e..abb87051c3 100644 --- a/go.mod +++ b/go.mod @@ -1,81 +1,82 @@ module github.com/ory/oathkeeper -replace gopkg.in/DataDog/dd-trace-go.v1 => gopkg.in/DataDog/dd-trace-go.v1 v1.27.1 - -replace github.com/dgrijalva/jwt-go => github.com/form3tech-oss/jwt-go v1.0.3-0.20210625141045-a211650c6ae1 - -replace github.com/oleiade/reflections => github.com/oleiade/reflections v1.0.1 +replace ( + github.com/dgrijalva/jwt-go => github.com/form3tech-oss/jwt-go v1.0.3-0.20210625141045-a211650c6ae1 + github.com/mattn/go-sqlite3 => github.com/mattn/go-sqlite3 v1.14.10 + github.com/oleiade/reflections => github.com/oleiade/reflections v1.0.1 + gopkg.in/DataDog/dd-trace-go.v1 => gopkg.in/DataDog/dd-trace-go.v1 v1.27.1 +) require ( github.com/Azure/azure-pipeline-go v0.2.2 github.com/Azure/azure-storage-blob-go v0.9.0 github.com/Masterminds/sprig/v3 v3.2.2 github.com/auth0/go-jwt-middleware v1.0.1 - github.com/aws/aws-sdk-go v1.31.13 + github.com/aws/aws-sdk-go v1.34.28 github.com/blang/semver v3.5.1+incompatible github.com/bxcodec/faker v2.0.1+incompatible - github.com/dgraph-io/ristretto v0.0.2 + github.com/dgraph-io/ristretto v0.1.0 github.com/dlclark/regexp2 v1.2.0 github.com/form3tech-oss/jwt-go v3.2.2+incompatible - github.com/fsnotify/fsnotify v1.4.9 + github.com/fsnotify/fsnotify v1.5.4 github.com/ghodss/yaml v1.0.0 - github.com/go-openapi/errors v0.20.1 - github.com/go-openapi/runtime v0.19.20 - github.com/go-openapi/strfmt v0.19.5 - github.com/go-openapi/swag v0.19.9 - github.com/go-openapi/validate v0.19.10 - github.com/go-sql-driver/mysql v1.5.0 - github.com/go-swagger/go-swagger v0.25.0 + github.com/go-openapi/errors v0.20.3 + github.com/go-openapi/runtime v0.24.1 + github.com/go-openapi/strfmt v0.21.3 + github.com/go-openapi/swag v0.22.3 + github.com/go-openapi/validate v0.22.0 + github.com/go-sql-driver/mysql v1.6.0 + github.com/go-swagger/go-swagger v0.30.0 github.com/gobuffalo/httptest v1.0.2 github.com/gobuffalo/packr/v2 v2.8.0 github.com/gobwas/glob v0.2.3 github.com/golang-jwt/jwt/v4 v4.0.0 github.com/golang/gddo v0.0.0-20190904175337-72a348e765d2 - github.com/golang/mock v1.4.4 - github.com/google/go-replayers/httpreplay v0.1.0 - github.com/google/uuid v1.1.1 + github.com/google/go-replayers/httpreplay v1.1.1 + github.com/google/martian/v3 v3.3.3-0.20220816151257-0f7e6797a04d // indirect + github.com/google/uuid v1.3.0 github.com/gorilla/websocket v1.4.2 - github.com/imdario/mergo v0.3.11 - github.com/julienschmidt/httprouter v1.2.0 - github.com/lib/pq v1.3.0 + github.com/hashicorp/go-retryablehttp v0.7.0 + github.com/julienschmidt/httprouter v1.3.0 + github.com/knadh/koanf v1.4.0 + github.com/lib/pq v1.10.6 github.com/mattn/goveralls v0.0.6 - github.com/mitchellh/copystructure v1.0.0 + github.com/mitchellh/copystructure v1.2.0 github.com/opentracing/opentracing-go v1.2.0 - github.com/ory/analytics-go/v4 v4.0.1 + github.com/ory/analytics-go/v4 v4.0.3 github.com/ory/cli v0.0.10 github.com/ory/fosite v0.36.1 github.com/ory/go-acc v0.2.6 github.com/ory/go-convenience v0.1.0 github.com/ory/gojsonschema v1.2.0 github.com/ory/graceful v0.1.1 - github.com/ory/herodot v0.8.4 - github.com/ory/jsonschema/v3 v3.0.1 + github.com/ory/herodot v0.9.13 + github.com/ory/jsonschema/v3 v3.0.7 github.com/ory/ladon v1.1.0 github.com/ory/viper v1.7.5 - github.com/ory/x v0.0.165 - github.com/pborman/uuid v1.2.0 + github.com/ory/x v0.0.458 + github.com/pborman/uuid v1.2.1 github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.5.0 - github.com/rogpeppe/go-internal v1.6.2 // indirect - github.com/rs/cors v1.6.0 - github.com/sirupsen/logrus v1.8.0 - github.com/spf13/cobra v1.1.1 + github.com/prometheus/client_golang v1.11.1 + github.com/rs/cors v1.8.2 + github.com/sirupsen/logrus v1.9.0 + github.com/spf13/cobra v1.5.0 + github.com/spf13/pflag v1.0.5 github.com/sqs/goreturns v0.0.0-20181028201513-538ac6014518 github.com/square/go-jose v2.3.1+incompatible - github.com/stretchr/testify v1.7.0 - github.com/tidwall/gjson v1.9.3 - github.com/tidwall/sjson v1.1.1 + github.com/stretchr/testify v1.8.0 + github.com/tidwall/gjson v1.14.3 + github.com/tidwall/sjson v1.2.4 github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce github.com/urfave/negroni v1.0.0 github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect gocloud.dev v0.20.0 - golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 - golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f - golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 // indirect - golang.org/x/tools v0.1.7 - google.golang.org/api v0.30.0 - gopkg.in/square/go-jose.v2 v2.5.1 + golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8 + golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094 + golang.org/x/tools v0.1.12 + google.golang.org/api v0.84.0 + gopkg.in/square/go-jose.v2 v2.6.0 ) go 1.16 diff --git a/go.sum b/go.sum index 6699226f91..eb95473868 100644 --- a/go.sum +++ b/go.sum @@ -19,18 +19,45 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.58.0/go.mod h1:W+9FnSUw6nhVwXlFcp1eL+krq5+HQUJeUogSeJZZiWg= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0 h1:Dg9iHVQfrhq82rUNu9ZxUDrJLaxFUe/HlCVaLyRruq8= 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.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= +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.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0 h1:DAq3r8y4mDgyB/ZPJ9v/5VJNqjgJAxTn6ZYLlUywOu8= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= 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/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 h1:v/k9Eueb8aAJ0vZuxKMrgm6kPhCLZU9HxFU+AFDs9Uk= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/firestore v1.2.0/go.mod h1:iISCjWnTpnoJT1R287xRdjvQHJrxQOpeah4phb5D3h0= +cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/iam v0.3.0 h1:exkAomrVUuzx9kWFI1wm3KI0uoDeUFPB4kKGzx6x+Gc= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= 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= @@ -40,17 +67,21 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo 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.9.0/go.mod h1:m+/etGaqZbylxaNT876QGXqEHp4PR2Rq5GMqICWb9bU= -cloud.google.com/go/storage v1.10.0 h1:STgFzyU5/8miMl0//zKh2aQeTyeaUH3WN9bSUiJ09bA= 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 h1:F6IlQJZrZM++apn9V5/VfS3gbTUYg98PS3EMQAzqtfg= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= contrib.go.opencensus.io/exporter/aws v0.0.0-20181029163544-2befc13012d0/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw= contrib.go.opencensus.io/integrations/ocsql v0.1.4/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= github.com/Azure/azure-amqp-common-go/v3 v3.0.0/go.mod h1:SY08giD/XbhTz07tJdpw1SoxQXHPN30+DI3Z04SYqyg= github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= github.com/Azure/azure-pipeline-go v0.2.2 h1:6oiIS9yaG6XCCzhgAgKFfIWyo4LLCiDhZot6ltoThhY= github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= +github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v37.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-service-bus-go v0.10.1/go.mod h1:E/FOceuKAFUfpbIJDKWz/May6guE+eGibfGT6q+n1to= github.com/Azure/azure-storage-blob-go v0.9.0 h1:kORqvzXP8ORhKbW13FflGUaSE5CMyDWun9UwMxY8gPs= @@ -59,38 +90,55 @@ github.com/Azure/go-amqp v0.12.6/go.mod h1:qApuH6OFTSKZFmCOxccvAv5rLizBQf4v8pRmG github.com/Azure/go-amqp v0.12.7/go.mod h1:qApuH6OFTSKZFmCOxccvAv5rLizBQf4v8pRmG138DPo= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.9.3 h1:OZEIaBbMdUE/Js+BQKlpO81XlISgipr6yDJ+PSwsgi4= github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= +github.com/Azure/go-autorest/autorest v0.11.1 h1:eVvIXUKiTgv++6YnWb42DUA1YL7qDugnKP0HljexdnQ= +github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/adal v0.8.3 h1:O1AGG9Xig71FxdX9HO5pGNyZ7TbSyHaVg+5eJO/jSGw= github.com/Azure/go-autorest/autorest/adal v0.8.3/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest/adal v0.9.5 h1:Y3bBUV4rTuxenJJs41HU3qmqsb+auo+a3Lz+PlJPpL0= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= github.com/Azure/go-autorest/autorest/azure/auth v0.4.2 h1:iM6UAvjR97ZIeR93qTcwpKNMpV+/FTWjwEbuPD495Tk= github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= github.com/Azure/go-autorest/autorest/azure/cli v0.3.1 h1:LXl088ZQlP0SBppGFsRZonW6hSvwgL5gRByMbvUbx8U= github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0 h1:yW+Zlqf26583pE43KhfnhFcdmSWlm5Ew6bxipnr/tbM= github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= -github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= +github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= 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/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/DataDog/datadog-go v4.0.0+incompatible h1:Dq8Dr+4sV1gBO1sHDWdW+4G+PdsA+YSJOK925MxrrCY= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.0.0-20211129110424-6491aa3bf583/go.mod h1:EP9f4GqaDJyP1F5jTNMtzdIpw3JpNs3rMSJOnYywCiw= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/datadog-go v4.0.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/datadog-go v4.8.2+incompatible h1:qbcKSx29aBLD+5QLvlQZlGmRMF/FfGqFLFev/1TDzRo= +github.com/DataDog/datadog-go v4.8.2+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/datadog-go/v5 v5.0.2/go.mod h1:ZI9JFB4ewXbw1sBnF4sxsR2k1H3xjV+PUAOUsHvKpcU= github.com/DataDog/sketches-go v0.0.0-20190923095040-43f19ad77ff7/go.mod h1:Q5DbzQ+3AkgGwymQO7aZFNP7ns2lZKGtvRBzRXfdi60= +github.com/DataDog/sketches-go v1.2.1/go.mod h1:1xYmPLY1So10AwxV6MJV0J53XVH+WL9Ad1KetxVivVI= github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20191009163259-e802c2cb94ae/go.mod h1:mjwGPas4yKduTyubHvD1Atl9r1rUq8DfVy+gkVvZ+oo= +github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.4.2 h1:WBLTQ37jOCzSLtXNdoo8bNM8876KhNqOKvrlGITgsTc= @@ -101,113 +149,300 @@ github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0 github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8= github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/go-winio v0.4.14 h1:+hMXMk01us9KgxGb7ftKQt2Xpf5hH/yky+TDA+qxleU= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= +github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= +github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= +github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= +github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= +github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= +github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= +github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= -github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/sarama v1.30.0/go.mod h1:zujlQQx1kzHsh4jfV1USnptCQrHAEZ2Hk8fTKCulPVs= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/Shopify/toxiproxy/v2 v2.1.6-0.20210914104332-15ea381dcdae/go.mod h1:/cvHQkZ1fst0EmZnA5dFtiQdWCNCFYzb+uE2vqVgvx0= github.com/ajg/form v0.0.0-20160822230020-523a5da1a92f h1:zvClvFQwU++UpIUBGC8YmDlfhUrweEy1R1Fj1gu5iIM= github.com/ajg/form v0.0.0-20160822230020-523a5da1a92f/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20210923152817-c3b6e2f0c527/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= -github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= +github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= +github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/auth0/go-jwt-middleware v1.0.1 h1:/fsQ4vRr4zod1wKReUH+0A3ySRjGiT9G34kypO/EKwI= github.com/auth0/go-jwt-middleware v1.0.1/go.mod h1:YSeUX3z6+TF2H+7padiEqNJ73Zy9vXW72U//IgN0BIM= +github.com/avast/retry-go/v4 v4.0.5 h1:C0Fm9MjPCmgLW6Jb1zBTVRx0ycr+VUaaUZO5wpqYjqg= +github.com/avast/retry-go/v4 v4.0.5/go.mod h1:HqmLvS2VLdStPCGDFjSuZ9pzlTqVRldCI4w2dO4m1Ms= +github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.19.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.23.19/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.31.13 h1:UeWMTRTL0XAKLR7vxDL4/u7KOtz/LtfJr+lXtxN4YEQ= github.com/aws/aws-sdk-go v1.31.13/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.34.28 h1:sscPpn/Ns3i0F4HPEWAVcwdIRaZZCuL7llJ2/60yPIk= +github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= +github.com/aws/aws-sdk-go-v2 v1.9.2/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2/config v1.8.3/go.mod h1:4AEiLtAb8kLs7vgw2ZV3p2VZ1+hBavOc84hqxVNpCyw= +github.com/aws/aws-sdk-go-v2/credentials v1.4.3/go.mod h1:FNNC6nQZQUuyhq5aE5c7ata8o9e4ECGmS4lAXC7o1mQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.6.0/go.mod h1:gqlclDEZp4aqJOancXK6TN24aKhT0W0Ae9MHk3wzTMM= +github.com/aws/aws-sdk-go-v2/internal/ini v1.2.4/go.mod h1:ZcBrrI3zBKlhGFNYWvju0I3TR93I7YIgAfy82Fh4lcQ= +github.com/aws/aws-sdk-go-v2/service/appconfig v1.4.2/go.mod h1:FZ3HkCe+b10uFZZkFdvf98LHW21k49W8o8J366lqVKY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.2/go.mod h1:72HRZDLMtmVQiLG2tLfQcaWLCssELvGl+Zf2WVxMmR8= +github.com/aws/aws-sdk-go-v2/service/sso v1.4.2/go.mod h1:NBvT9R1MEF+Ud6ApJKM0G+IkPchKS7p7c2YPKwHmBOk= +github.com/aws/aws-sdk-go-v2/service/sts v1.7.2/go.mod h1:8EzeIqfWt2wWT4rJVu3f21TfrhJ8AEMzVybRNSb/b4g= github.com/aws/aws-xray-sdk-go v0.9.4/go.mod h1:XtMKdBQfpVut+tJEwI7+dJFRxxRdxHDyVNp2tHXRq04= +github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= +github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/benbjohnson/clock v1.0.0/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/bmatcuk/doublestar/v2 v2.0.3/go.mod h1:QMmcs3H2AUQICWhfzLXz+IYln8lRQmTZRptLie8RgRw= +github.com/bmatcuk/doublestar/v2 v2.0.4/go.mod h1:QMmcs3H2AUQICWhfzLXz+IYln8lRQmTZRptLie8RgRw= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/bradleyjkemp/cupaloy/v2 v2.6.0 h1:knToPYa2xtfg42U3I6punFEjaGFKWQRXJwj0JTv4mTs= +github.com/bradleyjkemp/cupaloy/v2 v2.6.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0= +github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/bxcodec/faker v2.0.1+incompatible h1:P0KUpUw5w6WJXwrPfv35oc91i4d8nf40Nwln+M/+faA= github.com/bxcodec/faker v2.0.1+incompatible/go.mod h1:BNzfpVdTwnFJ6GtfYTcQu6l6rHShT+veBxNCnjCx5XM= github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v3 v3.0.0 h1:ske+9nBpD9qZsTBoF41nW5L+AIuFBKMeze18XQ3eG1c= github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= +github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= +github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= +github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= 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/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= +github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= +github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk= github.com/cockroachdb/cockroach-go v0.0.0-20190925194419-606b3d062051/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk= +github.com/cockroachdb/cockroach-go v0.0.0-20200312223839-f565e4789405 h1:i1XXyBMAGL7NqogtoS6NHQ/IJwCbG0R725hAhEhldOI= github.com/cockroachdb/cockroach-go v0.0.0-20200312223839-f565e4789405/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= +github.com/cockroachdb/cockroach-go/v2 v2.2.10 h1:O7Hl8m0rs/oJNBmRr14ED3Q3+AmugMK9DtJwRDHZ2DA= +github.com/cockroachdb/cockroach-go/v2 v2.2.10/go.mod h1:xZ2VHjUEb/cySv0scXBx7YsBnHtLHkR1+w/w73b5i3M= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codegangsta/negroni v1.0.0/go.mod h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2iZY63YTKWo0= +github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= +github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= +github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= +github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= +github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= +github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= +github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= +github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= +github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= +github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= +github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= +github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= +github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= +github.com/containerd/containerd v1.5.7 h1:rQyoYtj4KddB3bxG6SAqd4+08gePNyJjRqvOIfV3rkM= +github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= github.com/containerd/continuity v0.0.0-20181203112020-004b46473808/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20200107194136-26c1120b8d41 h1:kIFnQBO7rQ0XkMe6xEwbybYHBEaWmh/f++laI6Emt7M= +github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20200107194136-26c1120b8d41/go.mod h1:Dq467ZllaHgAtVp4p1xUQWBrFXR9s/wyoTpG8zOJGkY= +github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= +github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= +github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= +github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= +github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= +github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= +github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= +github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= +github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= +github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= +github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= +github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= +github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= +github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= +github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= +github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= +github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= +github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= +github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= +github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= +github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= +github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= +github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= +github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= +github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cucumber/godog v0.8.1 h1:lVb+X41I4YDreE+ibZ50bdXmySxgRviYFgKY6Aw4XE8= +github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cucumber/godog v0.8.1/go.mod h1:vSh3r/lM+psC1BPXvdkSEuNjmXfpVqrMGYAElF6hxnA= +github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= +github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= +github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= +github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= 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/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= github.com/dgraph-io/ristretto v0.0.1/go.mod h1:T40EBc7CJke8TkpiYfGGKAeFjSaxuFXhuXRyumBd6RE= -github.com/dgraph-io/ristretto v0.0.2 h1:a5WaUrDa0qm0YrAAS1tUykT5El3kt62KNZZeMxQn3po= github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.0.3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= +github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= @@ -215,33 +450,73 @@ github.com/dimchansky/utfbom v1.1.0 h1:FcM3g+nofKgUteL8dm/UpdRXNC9KmADgTpLKsu0TR github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk= github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/cli v20.10.14+incompatible h1:dSBKJOVesDgHo7rbxlYjYsXe7gPzrTT+/cKQgpDAazg= +github.com/docker/cli v20.10.14+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= +github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= +github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.9+incompatible h1:JlsVnETOjM2RLQa0Cc1XCIspUdXW3Zenq9P54uXBm6k= +github.com/docker/docker v20.10.9+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v0.0.0-20180713052910-9f541cc9db5d/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/elastic/go-licenser v0.3.1 h1:RmRukU/JUmts+rpexAw0Fvt2ly7VVu6mw8z4HrEzObU= +github.com/elastic/go-licenser v0.3.1/go.mod h1:D8eNQk70FOCVBl3smCGQt/lv7meBeQno2eI1S5apiHQ= github.com/elastic/go-sysinfo v1.1.1 h1:ZVlaLDyhVkDfjwPGU55CQRCRolNpc7P0BbyhhQZQmMI= github.com/elastic/go-sysinfo v1.1.1/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= github.com/elastic/go-windows v1.0.0 h1:qLURgZFkkrYyTTkvYpsZIgf83AUsdIHfvlJaqaZ7aSY= github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/elazarl/goproxy v0.0.0-20181003060214-f58a169a71a5/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= 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/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.11.0+incompatible h1:glyUF9yIYtMHzn8xaKw5rMhdWcwsYV8dZHIq5567/xs= +github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/structs v1.0.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= +github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v1.0.3-0.20210625141045-a211650c6ae1 h1:47QZG6unnoYor+ib1NfUNyOPdxG9iTMmTJgwH49yR0g= @@ -249,102 +524,163 @@ github.com/form3tech-oss/jwt-go v1.0.3-0.20210625141045-a211650c6ae1/go.mod h1:0 github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= +github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-bindata/go-bindata v3.1.1+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo= +github.com/go-bindata/go-bindata v3.1.2+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= 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-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= +github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +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/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= -github.com/go-openapi/analysis v0.19.10 h1:5BHISBAXOc/aJK25irLZnx2D3s6WyYaY9D4gmuz9fdE= github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= +github.com/go-openapi/analysis v0.21.2/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY= +github.com/go-openapi/analysis v0.21.4 h1:ZDFLvSNxpDaomuCueM0BlSXxpANBlFYiBvr+GXrvIHc= +github.com/go-openapi/analysis v0.21.4/go.mod h1:4zQ35W4neeZTqh3ol0rv/O8JBbka9QyAgQRPp9y3pfo= github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= github.com/go-openapi/errors v0.19.6/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= -github.com/go-openapi/errors v0.20.1 h1:j23mMDtRxMwIobkpId7sWh7Ddcx4ivaoqUbfXx5P+a8= -github.com/go-openapi/errors v0.20.1/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.20.0/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.20.2/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.20.3 h1:rz6kiC84sqNQoqrtulzaL/VERgkoCyB6WdEkc2ujzUc= +github.com/go-openapi/errors v0.20.3/go.mod h1:Z3FlZ4I8jEGxjUK+bugx3on2mIAk4txuAOhlsB1FSgk= github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.4 h1:3Vw+rh13uq2JFNxgnMTGE1rnoieU9FmyE1gvnyylsYg= -github.com/go-openapi/jsonreference v0.19.4/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= +github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= +github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI= -github.com/go-openapi/loads v0.19.5 h1:jZVYWawIQiA1NBnHla28ktg6hrcfTHsCE+3QLVRBIls= github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= +github.com/go-openapi/loads v0.21.1/go.mod h1:/DtAMXXneXFjbQMGEtbamCZb+4x7eGwkvZCvBmwUG+g= +github.com/go-openapi/loads v0.21.2 h1:r2a/xFIYeZ4Qd2TnGpWDIQNcP80dIaZgf704za8enro= +github.com/go-openapi/loads v0.21.2/go.mod h1:Jq58Os6SSGz0rzh62ptiu8Z31I+OTHqmULx5e/gJbNw= github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= -github.com/go-openapi/runtime v0.19.20 h1:J/t+QIjbcoq8WJvjGxRKiFBhqUE8slS9SbmD0Oi/raQ= -github.com/go-openapi/runtime v0.19.20/go.mod h1:Lm9YGCeecBnUUkFTxPC4s1+lwrkJ0pthx8YvyjCfkgk= +github.com/go-openapi/runtime v0.20.0/go.mod h1:2WnLRxMiOUWNN0UZskSkxW0+WXdfB1KmqRKCFH+ZWYk= +github.com/go-openapi/runtime v0.24.1 h1:Sml5cgQKGYQHF+M7yYSHaH1eOjvTykrddTE/KtQVjqo= +github.com/go-openapi/runtime v0.24.1/go.mod h1:AKurw9fNre+h3ELZfk6ILsfvPN+bvvlaU/M9q/r9hpk= github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/spec v0.19.8 h1:qAdZLh1r6QF/hI/gTq+TJTvsQUodZsM7KLqkAJdiJNg= github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= +github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= +github.com/go-openapi/spec v0.20.6/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= +github.com/go-openapi/spec v0.20.7 h1:1Rlu/ZrOCCob0n+JKKJAWhNWMPW8bOZRg8FJaY+0SKI= +github.com/go-openapi/spec v0.20.7/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= -github.com/go-openapi/strfmt v0.19.5 h1:0utjKrw+BAh8s57XE9Xz8DUBsVvPmRUB6styvl9wWIM= github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= +github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+WaRADcS5iNg= +github.com/go-openapi/strfmt v0.21.1/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= +github.com/go-openapi/strfmt v0.21.2/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= +github.com/go-openapi/strfmt v0.21.3 h1:xwhj5X6CjXEZZHMWy1zKJxvW9AfHC9pkyUjLvHtKG7o= +github.com/go-openapi/strfmt v0.21.3/go.mod h1:k+RzNO0Da+k3FrrynSNN8F7n/peCmQQqbbXjtDfvmGg= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= -github.com/go-openapi/swag v0.19.9 h1:1IxuqvBUU3S2Bi4YC7tlP9SJF1gVpCvqN0T2Qof4azE= github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= +github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= -github.com/go-openapi/validate v0.19.10 h1:tG3SZ5DC5KF4cyt7nqLVcQXGj5A7mpaYkAcNPlDK+Yk= github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbNMAuKvKB+IaGx8= +github.com/go-openapi/validate v0.21.0/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= +github.com/go-openapi/validate v0.22.0 h1:b0QecH6VslW/TxtpKgzpO1SNG7GU2FsaqKdP1E2T50Y= +github.com/go-openapi/validate v0.22.0/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-swagger/go-swagger v0.25.0 h1:FxhyrWWV8V/A9P6GtI5szWordAdbb6Y0nqdY/y9So2w= -github.com/go-swagger/go-swagger v0.25.0/go.mod h1:9639ioXrPX9E6BbnbaDklGXjNz7upAXoNBwL4Ok11Vk= +github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= +github.com/go-swagger/go-swagger v0.30.0 h1:HakSyutD7Ek9ndkR8Fxy6WAoQtgu7UcAmZCTa6SzawA= +github.com/go-swagger/go-swagger v0.30.0/go.mod h1:GhZVX/KIBM4VpGp4P7AJOIrlTuBeRVPS+j9kk6rFmfY= github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013 h1:l9rI6sNaZgNC0LnF3MiE+qTmyBA/tZAg1rtyrGbUMK0= github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013/go.mod h1:b65mBPzqzZWxOZGxSWrqs4GInLIn+u99Q9q7p+GKni0= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= github.com/gobuffalo/attrs v0.1.0/go.mod h1:fmNpaWyHM0tRm8gCZWKx8yY9fvaNLo2PyzBNSrBZ5Hw= +github.com/gobuffalo/attrs v1.0.2/go.mod h1:tJ7wJj6XbMNhYwJ8fl2PFDpDcUfsG1spWdUJISvPAZQ= github.com/gobuffalo/buffalo v0.12.8-0.20181004233540-fac9bb505aa8/go.mod h1:sLyT7/dceRXJUxSsE813JTQtA3Eb1vjxWfo/N//vXIY= github.com/gobuffalo/buffalo v0.13.0/go.mod h1:Mjn1Ba9wpIbpbrD+lIDMy99pQ0H0LiddMIIDGse7qT4= github.com/gobuffalo/buffalo-plugins v1.0.2/go.mod h1:pOp/uF7X3IShFHyobahTkTLZaeUXwb0GrUTb9ngJWTs= @@ -378,8 +714,9 @@ github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaS github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= github.com/gobuffalo/envy v1.7.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= github.com/gobuffalo/envy v1.8.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= -github.com/gobuffalo/envy v1.9.0 h1:eZR0DuEgVLfeIb1zIKt3bT4YovIMf9O9LXQeCZLXpqE= github.com/gobuffalo/envy v1.9.0/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= +github.com/gobuffalo/envy v1.10.1 h1:ppDLoXv2feQ5nus4IcgtyMdHQkKng2lhJCIm33cblM0= +github.com/gobuffalo/envy v1.10.1/go.mod h1:AWx4++KnNOW3JOeEvhSaq+mvgAvnMYOY1XSIin4Mago= github.com/gobuffalo/events v1.0.3/go.mod h1:Txo8WmqScapa7zimEQIwgiJBvMECMe9gJjsKNPN3uZw= github.com/gobuffalo/events v1.0.7/go.mod h1:z8txf6H9jWhQ5Scr7YPLWg/cgXBRj8Q4uYI+rsVCCSQ= github.com/gobuffalo/events v1.0.8/go.mod h1:A5KyqT1sA+3GJiBE4QKZibse9mtOcI9nw8gGrDdqYGs= @@ -393,8 +730,8 @@ github.com/gobuffalo/events v1.3.1/go.mod h1:9JOkQVoyRtailYVE/JJ2ZQ/6i4gTjM5t2Hs github.com/gobuffalo/events v1.4.1/go.mod h1:SjXgWKpeSuvQDvGhgMz5IXx3Czu+IbL+XPLR41NvVQY= github.com/gobuffalo/fizz v1.0.12/go.mod h1:C0sltPxpYK8Ftvf64kbsQa2yiCZY4RZviurNxXdAKwc= github.com/gobuffalo/fizz v1.9.8/go.mod h1:w1FEn1yKNVCc49KnADGyYGRPH7jFON3ak4Bj1yUudHo= -github.com/gobuffalo/fizz v1.10.0 h1:I8vad0PnmR+CLjSnZ5L5jlhBm4S88UIGOoZZL3/3e24= -github.com/gobuffalo/fizz v1.10.0/go.mod h1:J2XGPO0AfJ1zKw7+2BA+6FEGAkyEsdCOLvN93WCT2WI= +github.com/gobuffalo/fizz v1.14.2 h1:t02ZX47tLq5P9NzxbsNkpvXqqBXsYDk02O2xhw5C2Po= +github.com/gobuffalo/fizz v1.14.2/go.mod h1:pZp2NZYEiPRoylV3lKIz0XZOOupizz+SnKq9wb1idxE= github.com/gobuffalo/flect v0.0.0-20180907193754-dc14d8acaf9f/go.mod h1:rCiQgmAE4axgBNl3jZWzS5rETRYTGOsrixTRaCPzNdA= github.com/gobuffalo/flect v0.0.0-20181002182613-4571df4b1daf/go.mod h1:rCiQgmAE4axgBNl3jZWzS5rETRYTGOsrixTRaCPzNdA= github.com/gobuffalo/flect v0.0.0-20181007231023-ae7ed6bfe683/go.mod h1:rCiQgmAE4axgBNl3jZWzS5rETRYTGOsrixTRaCPzNdA= @@ -411,8 +748,9 @@ github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= github.com/gobuffalo/flect v0.1.5/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= -github.com/gobuffalo/flect v0.2.1 h1:GPoRjEN0QObosV4XwuoWvSd5uSiL0N3e91/xqyY4crQ= github.com/gobuffalo/flect v0.2.1/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc= +github.com/gobuffalo/flect v0.2.5 h1:H6vvsv2an0lalEaCDRThvtBfmg44W/QHXBCYUXf/6S4= +github.com/gobuffalo/flect v0.2.5/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= github.com/gobuffalo/genny v0.0.0-20180924032338-7af3a40f2252/go.mod h1:tUTQOogrr7tAQnhajMSH6rv1BVev34H2sa1xNHMy94g= github.com/gobuffalo/genny v0.0.0-20181003150629-3786a0744c5d/go.mod h1:WAd8HmjMVrnkAZbmfgH5dLBUchsZfqzp/WS5sQz+uTM= github.com/gobuffalo/genny v0.0.0-20181005145118-318a41a134cc/go.mod h1:WAd8HmjMVrnkAZbmfgH5dLBUchsZfqzp/WS5sQz+uTM= @@ -444,12 +782,14 @@ github.com/gobuffalo/genny v0.2.0/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGG github.com/gobuffalo/genny v0.3.0/go.mod h1:ywJ2CoXrTZj7rbS8HTbzv7uybnLKlsNSBhEQ+yFI3E8= github.com/gobuffalo/genny v0.6.0/go.mod h1:Vigx9VDiNscYpa/LwrURqGXLSIbzTfapt9+K6gF1kTA= github.com/gobuffalo/genny/v2 v2.0.5/go.mod h1:kRkJuAw9mdI37AiEYjV4Dl+TgkBDYf8HZVjLkqe5eBg= +github.com/gobuffalo/genny/v2 v2.0.12/go.mod h1:KtMtTcR/U2kHbQxhjCVA16ph6rjBnhw39f6aaxl4hMk= github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= github.com/gobuffalo/github_flavored_markdown v1.0.4/go.mod h1:uRowCdK+q8d/RF0Kt3/DSalaIXbb0De/dmTqMQdkQ4I= github.com/gobuffalo/github_flavored_markdown v1.0.5/go.mod h1:U0643QShPF+OF2tJvYNiYDLDGDuQmJZXsf/bHOJPsMY= github.com/gobuffalo/github_flavored_markdown v1.0.7/go.mod h1:w93Pd9Lz6LvyQXEG6DktTPHkOtCbr+arAD5mkwMzXLI= -github.com/gobuffalo/github_flavored_markdown v1.1.0 h1:8Zzj4fTRl/OP2R7sGerzSf6g2nEJnaBEJe7UAOiEvbQ= github.com/gobuffalo/github_flavored_markdown v1.1.0/go.mod h1:TSpTKWcRTI0+v7W3x8dkSKMLJSUpuVitlptCkpeY8ic= +github.com/gobuffalo/github_flavored_markdown v1.1.1 h1:kUf8ginyBOTRXcKSTPsPAqlA25vQ80+xAspLIYaxmTU= +github.com/gobuffalo/github_flavored_markdown v1.1.1/go.mod h1:yU32Pen+eorS58oxh/bNZx76zUOCJwmvyV5FBrvzOKQ= github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= @@ -458,8 +798,9 @@ github.com/gobuffalo/helpers v0.2.2/go.mod h1:xYbzUdCUpVzLwLnqV8HIjT6hmG0Cs7YIBC github.com/gobuffalo/helpers v0.2.4/go.mod h1:NX7v27yxPDOPTgUFYmJ5ow37EbxdoLraucOGvMNawyk= github.com/gobuffalo/helpers v0.5.0/go.mod h1:stpgxJ2C7T99NLyAxGUnYMM2zAtBk5NKQR0SIbd05j4= github.com/gobuffalo/helpers v0.6.0/go.mod h1:pncVrer7x/KRvnL5aJABLAuT/RhKRR9klL6dkUOhyv8= -github.com/gobuffalo/helpers v0.6.1 h1:LLcL4BsiyDQYtMRUUpyFdBFvFXQ6hNYOpwrcYeilVWM= github.com/gobuffalo/helpers v0.6.1/go.mod h1:wInbDi0vTJKZBviURTLRMFLE4+nF2uRuuL2fnlYo7w4= +github.com/gobuffalo/helpers v0.6.5 h1:Quf1KAUae97sdDmm/QP5V9P/0XYpK+HrhnYXU+nf65M= +github.com/gobuffalo/helpers v0.6.5/go.mod h1:LA4zcc89tkZsfKpJIWsXLibiqTgZQ4EvDszfxdqr9ZA= github.com/gobuffalo/here v0.6.0 h1:hYrd0a6gDmWxBM4TnrGw8mQg24iSVoIkHEk7FodQcBI= github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= github.com/gobuffalo/httptest v1.0.2 h1:LWp2khlgA697h4BIYWW2aRxvB93jMnBrbakQ/r2KLzs= @@ -481,8 +822,9 @@ github.com/gobuffalo/logger v0.0.0-20181127160119-5b956e21995c/go.mod h1:+HxKANr github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= github.com/gobuffalo/logger v1.0.0/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= github.com/gobuffalo/logger v1.0.1/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= -github.com/gobuffalo/logger v1.0.3 h1:YaXOTHNPCvkqqA7w05A4v0k2tCdpr+sgFlgINbQ6gqc= github.com/gobuffalo/logger v1.0.3/go.mod h1:SoeejUwldiS7ZsyCBphOGURmWdwUFXs0J7TCjEhjKxM= +github.com/gobuffalo/logger v1.0.6 h1:nnZNpxYo0zx+Aj9RfMPBm+x9zAU2OayFh/xrAWi34HU= +github.com/gobuffalo/logger v1.0.6/go.mod h1:J31TBEHR1QLV2683OXTAItYIg8pv2JMHnF/quuAbMjs= github.com/gobuffalo/makr v1.1.5/go.mod h1:Y+o0btAH1kYAMDJW/TX3+oAXEu0bmSLLoC9mIFxtzOw= github.com/gobuffalo/mapi v1.0.0/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= @@ -505,8 +847,9 @@ github.com/gobuffalo/mw-i18n v0.0.0-20180802152014-e3060b7e13d6/go.mod h1:91AQfu github.com/gobuffalo/mw-paramlogger v0.0.0-20181005191442-d6ee392ec72e/go.mod h1:6OJr6VwSzgJMqWMj7TYmRUqzNe2LXu/W1rRW4MAz/ME= github.com/gobuffalo/mw-tokenauth v0.0.0-20181001105134-8545f626c189/go.mod h1:UqBF00IfKvd39ni5+yI5MLMjAf4gX7cDKN/26zDOD6c= github.com/gobuffalo/nulls v0.2.0/go.mod h1:w4q8RoSCEt87Q0K0sRIZWYeIxkxog5mh3eN3C/n+dUc= -github.com/gobuffalo/nulls v0.3.0 h1:yfOsQarm6pD7Crg/VnpI9Odh5nBlO+eDeKRiHYZOsTA= github.com/gobuffalo/nulls v0.3.0/go.mod h1:UP49vd/k+bcaz6m0cHMyuk8oQ7XgLnkfxeiVoPAvBSs= +github.com/gobuffalo/nulls v0.4.1 h1:k7QVCJfMplv9VRQQLb4N1d8tXUdGvcdMNfp4BfMnG2M= +github.com/gobuffalo/nulls v0.4.1/go.mod h1:pp8e1hWTRJZFpMl4fj/CVbSMlaxjeGKkFq4RuBZi3w8= github.com/gobuffalo/packd v0.0.0-20181027182251-01ad393492c8/go.mod h1:SmdBdhj6uhOsg1Ui4SFAyrhuc7U4VCildosO5IDJ3lc= github.com/gobuffalo/packd v0.0.0-20181027190505-aafc0d02c411/go.mod h1:SmdBdhj6uhOsg1Ui4SFAyrhuc7U4VCildosO5IDJ3lc= github.com/gobuffalo/packd v0.0.0-20181027194105-7ae579e6d213/go.mod h1:SmdBdhj6uhOsg1Ui4SFAyrhuc7U4VCildosO5IDJ3lc= @@ -521,8 +864,9 @@ github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hh github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= github.com/gobuffalo/packd v0.2.0/go.mod h1:k2CkHP3bjbqL2GwxwhxUy1DgnlbW644hkLC9iIUvZwY= github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= -github.com/gobuffalo/packd v1.0.0 h1:6ERZvJHfe24rfFmA9OaoKBdC7+c9sydrytMg8SdFGBM= github.com/gobuffalo/packd v1.0.0/go.mod h1:6VTc4htmJRFB7u1m/4LeMTWjFoYrUiBkU9Fdec9hrhI= +github.com/gobuffalo/packd v1.0.1 h1:U2wXfRr4E9DH8IdsDLlRFwTZTK7hLfq9qT/QHXGVe/0= +github.com/gobuffalo/packd v1.0.1/go.mod h1:PP2POP3p3RXGz7Jh6eYEf93S7vA2za6xM7QT85L4+VY= github.com/gobuffalo/packr v1.13.7/go.mod h1:KkinLIn/n6+3tVXMwg6KkNvWwVsrRAz4ph+jgpk3Z24= github.com/gobuffalo/packr v1.15.0/go.mod h1:t5gXzEhIviQwVlNx/+3SfS07GS+cZ2hn76WLzPp6MGI= github.com/gobuffalo/packr v1.15.1/go.mod h1:IeqicJ7jm8182yrVmNbM6PR4g79SjN9tZLH8KduZZwE= @@ -557,8 +901,9 @@ github.com/gobuffalo/plush v3.7.32+incompatible/go.mod h1:rQ4zdtUUyZNqULlc6bqd5s github.com/gobuffalo/plush v3.8.2+incompatible/go.mod h1:rQ4zdtUUyZNqULlc6bqd5scsPfLKfT0+TGMChgduDvI= github.com/gobuffalo/plush v3.8.3+incompatible h1:kzvUTnFPhwyfPEsx7U7LI05/IIslZVGnAlMA1heWub8= github.com/gobuffalo/plush v3.8.3+incompatible/go.mod h1:rQ4zdtUUyZNqULlc6bqd5scsPfLKfT0+TGMChgduDvI= -github.com/gobuffalo/plush/v4 v4.0.0 h1:ZHdmfr2R7DQ77XzWZK2PGKJOXm9NRy21EZ6Rw7FhuNw= github.com/gobuffalo/plush/v4 v4.0.0/go.mod h1:ErFS3UxKqEb8fpFJT7lYErfN/Nw6vHGiDMTjxpk5bQ0= +github.com/gobuffalo/plush/v4 v4.1.13 h1:tru7S39kYaefzM+dk+W1bib65ZVkS1nV+6ARB7yPWn0= +github.com/gobuffalo/plush/v4 v4.1.13/go.mod h1:s3hUyj/JlwEiJ039OBJevojq9xT40D1pgekw0o88CVU= github.com/gobuffalo/plushgen v0.0.0-20181128164830-d29dcb966cb2/go.mod h1:r9QwptTFnuvSaSRjpSp4S2/4e2D3tJhARYbvEBcKSb4= github.com/gobuffalo/plushgen v0.0.0-20181203163832-9fc4964505c2/go.mod h1:opEdT33AA2HdrIwK1aibqnTJDVVKXC02Bar/GT1YRVs= github.com/gobuffalo/plushgen v0.0.0-20181207152837-eedb135bd51b/go.mod h1:Lcw7HQbEVm09sAQrCLzIxuhFbB3nAgp4c55E+UlynR0= @@ -570,8 +915,8 @@ github.com/gobuffalo/pop v4.8.4+incompatible/go.mod h1:DwBz3SD5SsHpTZiTubcsFWcVD github.com/gobuffalo/pop v4.13.1+incompatible h1:AhbqPxNOBN/DBb2DBaiBqzOXIBQXxEYzngHHJ+ytP4g= github.com/gobuffalo/pop v4.13.1+incompatible/go.mod h1:DwBz3SD5SsHpTZiTubcsFWcVDpJWGsxjVjMPnkiThWg= github.com/gobuffalo/pop/v5 v5.0.11/go.mod h1:mZJHJbA3cy2V18abXYuVop2ldEJ8UZ2DK6qOekC5u5g= -github.com/gobuffalo/pop/v5 v5.3.1 h1:dJbBPy6e0G0VRjn28md3fk16wpYIBv5iYVQWd0eqmkQ= -github.com/gobuffalo/pop/v5 v5.3.1/go.mod h1:vcEDhh6cJ3WVENqJDFt/6z7zNb7lLnlN8vj3n5G9rYA= +github.com/gobuffalo/pop/v6 v6.0.6 h1:M/CJ9RLibCTN0OtsgASmVtKqyEXJAreF8oamZrHscc4= +github.com/gobuffalo/pop/v6 v6.0.6/go.mod h1:toTxNJnsSuSlyK6w0yGb4YXSNIHsi2chQYC2CjBF9Ac= github.com/gobuffalo/release v1.0.35/go.mod h1:VtHFAKs61vO3wboCec5xr9JPTjYyWYcvaM3lclkc4x4= github.com/gobuffalo/release v1.0.38/go.mod h1:VtHFAKs61vO3wboCec5xr9JPTjYyWYcvaM3lclkc4x4= github.com/gobuffalo/release v1.0.42/go.mod h1:RPs7EtafH4oylgetOJpGP0yCZZUiO4vqHfTHJjSdpug= @@ -597,8 +942,9 @@ github.com/gobuffalo/tags v2.1.0+incompatible/go.mod h1:9XmhOkyaB7UzvuY4UoZO4s67 github.com/gobuffalo/tags v2.1.7+incompatible h1:GUxxh34f9SI4U0Pj3ZqvopO9SlzuqSf+g4ZGSPSszt4= github.com/gobuffalo/tags v2.1.7+incompatible/go.mod h1:9XmhOkyaB7UzvuY4UoZO4s67q8/xRMVJEaakauVQYeY= github.com/gobuffalo/tags/v3 v3.0.2/go.mod h1:ZQeN6TCTiwAFnS0dNcbDtSgZDwNKSpqajvVtt6mlYpA= -github.com/gobuffalo/tags/v3 v3.1.0 h1:mzdCYooN2VsLRr8KIAdEZ1lh1Py7JSMsiEGCGata2AQ= github.com/gobuffalo/tags/v3 v3.1.0/go.mod h1:ZQeN6TCTiwAFnS0dNcbDtSgZDwNKSpqajvVtt6mlYpA= +github.com/gobuffalo/tags/v3 v3.1.3 h1:yhq9gudiEngYtPzH1KtMUknxffQBqwNfkHKP6i4l4NE= +github.com/gobuffalo/tags/v3 v3.1.3/go.mod h1:WAAjKdskZUmdi6EkNjP2SXBwBwRovHsjJsPJbBiPlKc= github.com/gobuffalo/uuid v2.0.3+incompatible/go.mod h1:ErhIzkRhm0FtRuiE/PeORqcw4cVi1RtSpnwYrxuvkfE= github.com/gobuffalo/uuid v2.0.4+incompatible/go.mod h1:ErhIzkRhm0FtRuiE/PeORqcw4cVi1RtSpnwYrxuvkfE= github.com/gobuffalo/uuid v2.0.5+incompatible/go.mod h1:ErhIzkRhm0FtRuiE/PeORqcw4cVi1RtSpnwYrxuvkfE= @@ -607,21 +953,43 @@ github.com/gobuffalo/validate v2.0.4+incompatible h1:ZTxozrIw8qQ5nfhShmc4izjYPTs github.com/gobuffalo/validate v2.0.4+incompatible/go.mod h1:N+EtDe0J8252BgfzQUChBgfd6L93m9weay53EWFVsMM= github.com/gobuffalo/validate/v3 v3.0.0/go.mod h1:HFpjq+AIiA2RHoQnQVTFKF/ZpUPXwyw82LgyDPxQ9r0= github.com/gobuffalo/validate/v3 v3.1.0/go.mod h1:HFpjq+AIiA2RHoQnQVTFKF/ZpUPXwyw82LgyDPxQ9r0= -github.com/gobuffalo/validate/v3 v3.2.0 h1:Zrpkz2kuZ4rGXLaO3IHVlwX512/cUWRvNjw46Cjhz2Q= github.com/gobuffalo/validate/v3 v3.2.0/go.mod h1:PrhDOdDHxtN8KUgMvF3TDL0r1YZXV4sQnyFX/EmeETY= +github.com/gobuffalo/validate/v3 v3.3.2 h1:GZdJlDy6zDRXF5BnEiY+pGvGDFx95atMIWd3N3MMseE= +github.com/gobuffalo/validate/v3 v3.3.2/go.mod h1:jiEEw+N7KbAP2aInFxGnfitI0g7HjXqcp5hDD6TaQDU= github.com/gobuffalo/x v0.0.0-20181003152136-452098b06085/go.mod h1:WevpGD+5YOreDJznWevcn8NTmQEW5STSBgIkpkjzqXc= github.com/gobuffalo/x v0.0.0-20181007152206-913e47c59ca7/go.mod h1:9rDPXaB3kXdKWzMc4odGQQdG2e2DIEmANy5aSJ9yesY= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/goccy/go-yaml v1.9.5 h1:Eh/+3uk9kLxG4koCX6lRMAPS1OaMSAi+FJcya0INdB0= +github.com/goccy/go-yaml v1.9.5/go.mod h1:U/jl18uSupI5rdI2jmuCswEA2htH9eXfferR3KfscvA= +github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/uuid v3.1.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gofrs/uuid/v3 v3.1.2 h1:V3IBv1oU82x6YIr5txe3azVHgmOKYdyKQTowm9moBlY= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.1.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/gofrs/uuid/v3 v3.1.2/go.mod h1:xPwMqoocQ1L5G6pXX5BcE7N5jlzn2o19oqAKxwZW/kI= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= +github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.0.0 h1:RAqyYixv1p7uEnocuy8P1nru5wprCh/MH2BIlW5z5/o= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= @@ -629,19 +997,25 @@ github.com/golang/gddo v0.0.0-20180828051604-96d2a289f41e/go.mod h1:xEhNfoBDX1hz github.com/golang/gddo v0.0.0-20190904175337-72a348e765d2 h1:xisWqjiKEff2B0KfFYGpCqc3M3zdTz+OHQHRc09FeYk= github.com/golang/gddo v0.0.0-20190904175337-72a348e765d2/go.mod h1:xEhNfoBDX1hzLm2Nf80qUvZ2sVwoMZ8d6IE2SrsQfh4= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= 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.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 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= @@ -655,10 +1029,17 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU 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 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= 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.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomarkdown/markdown v0.0.0-20200609195525-3f9352745725 h1:X6sZdr+t2E2jwajTy/FfXbmAKPFTYxEq9hiFgzMiuPQ= github.com/gomarkdown/markdown v0.0.0-20200609195525-3f9352745725/go.mod h1:aii0r/K0ZnHv7G0KF7xy1v0A7s2Ljrb5byB7MO5p6TU= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -670,19 +1051,33 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ 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 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= 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 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-jsonnet v0.16.0/go.mod h1:sOcuej3UW1vpPTZOr8L7RQimqai1a57bt5j22LzGZCw= +github.com/google/go-jsonnet v0.17.0/go.mod h1:sOcuej3UW1vpPTZOr8L7RQimqai1a57bt5j22LzGZCw= github.com/google/go-replayers/grpcreplay v0.1.0 h1:eNb1y9rZFmY4ax45uEEECSa8fsxGRU+8Bil52ASAwic= github.com/google/go-replayers/grpcreplay v0.1.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE= -github.com/google/go-replayers/httpreplay v0.1.0 h1:AX7FUb4BjrrzNvblr/OlgwrmFiep6soj5K2QSDW7BGk= github.com/google/go-replayers/httpreplay v0.1.0/go.mod h1:YKZViNhiGgqdBlUbI2MwGpq4pXxNmhJLPHQ7cv2b5no= +github.com/google/go-replayers/httpreplay v1.1.1 h1:H91sIMlt1NZzN7R+/ASswyouLJfW0WLW7fhyUFvDEkY= +github.com/google/go-replayers/httpreplay v1.1.1/go.mod h1:gN9GeLIs7l6NUoVaSSnv2RiqK1NiwAmD0MrKeC9IIks= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible h1:xmapqc1AyLoB+ddYT6r04bD9lIjlOqGaREovi0SzFaE= github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0 h1:pMen7vLs8nvgEYhywH3KDWJIJTeEr2ULsVWHWYHQyBs= 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/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.3-0.20220816151257-0f7e6797a04d h1:h4YaJSE986q8iYHs6xbfHJ2tIq+TRwcM/DAl/yML2ic= +github.com/google/martian/v3 v3.3.3-0.20220816151257-0f7e6797a04d/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= 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= @@ -691,76 +1086,161 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/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-20210506205249-923b5ab0fc1a/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/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/wire v0.4.0 h1:kXcsA/rIGzJImVqPdhfnr6q0xsS9gU0515q1EPpJ9fE= github.com/google/wire v0.4.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa h1:7MYGT2XEMam7Mtzv1yDUYXANedWvwk3HKkR3MyGowy8= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/gax-go v2.0.2+incompatible h1:silFMLAnr330+NRuag/VjIGF7TLp/LBrV2CJKFLWEww= github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= 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 h1:dS9eYAjhrE2RjmzYw2XAPvcXfmcQLtFEQWn0CR82awk= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= +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-20181004151105-1babbf986f6f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 h1:l5lAOZEym3oK3SQ2HBHWsJUfbNBiTXJDeW2QDxw9AQ0= github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/handlers v1.4.2 h1:0QniY0USkHQ1RGCLfKxeNHK9bkDHGRYGNDFBCS+YARg= -github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= +github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= +github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= +github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/pat v0.0.0-20180118222023-199c85a7f6d1/go.mod h1:YeAe0gNeiNT5hoiZRI4yiOky6jVdNvfO2N6Kav/HmxY= github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.1.2/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= -github.com/gorilla/sessions v1.1.3 h1:uXoZdcdA5XdXF3QzuSlheVRUvjl+1rKY7zBXL68L9RU= github.com/gorilla/sessions v1.1.3/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= +github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gotestyourself/gotestyourself v1.3.0/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= -github.com/gotestyourself/gotestyourself v2.2.0+incompatible h1:AQwinXlbQR2HvPjQZOmDhRqsv5mZf+Jb1RnSLxcqZcI= github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= +github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= +github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.2.0 h1:La19f8d7WIlm4ogzNHB0JGqs5AUDAZ2UfCY4sJXcJdM= +github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-retryablehttp v0.6.8/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-retryablehttp v0.7.0 h1:eu1EI/mbirUgP5C8hVsTNaGZreBDlYiwC1FZWkvQPQ4= +github.com/hashicorp/go-retryablehttp v0.7.0/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= 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/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/vault/api v1.0.4/go.mod h1:gDcqh3WGcR1cpF5AJz/B1UFheUEneMoIospckxBxk6Q= +github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvhkWnjtSYCaS2M= +github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.3.1 h1:4jgBlKK6tLKFvO8u5pmYjG91cqytmDCDvGh7ECVFfFs= github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= +github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inhies/go-bytesize v0.0.0-20210819104631-275770b98743 h1:X3Xxno5Ji8idrNiUoFc7QyXpqhSYlDRYQmc7mlpMBzU= +github.com/inhies/go-bytesize v0.0.0-20210819104631-275770b98743/go.mod h1:KrtyD5PFj++GKkFS/7/RRrfnRhAMGQwy75GLCHWrCNs= +github.com/instana/go-sensor v1.41.1 h1:duCCYLzwVRjgptqwc0doWfJb1oT6w1CzTRQDRNrQ6zw= +github.com/instana/go-sensor v1.41.1/go.mod h1:E42MelHWFz11qqaLwvgt0j98v2s2O/bq22UDkGaG0Gg= +github.com/instana/testify v1.6.2-0.20200721153833-94b1851f4d65 h1:T25FL3WEzgmKB0m6XCJNZ65nw09/QIp3T1yXr487D+A= +github.com/instana/testify v1.6.2-0.20200721153833-94b1851f4d65/go.mod h1:nYhEREG/B7HUY7P+LKOrqy53TpIqmJ9JyUShcaEKtGw= +github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= @@ -772,12 +1252,18 @@ github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= github.com/jackc/pgconn v1.3.2/go.mod h1:LvCquS3HbBKwgl7KbX9KyqEIumJAbm1UMcTvGaIf3bM= github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= -github.com/jackc/pgconn v1.6.0 h1:8FiBxMxS/Z0eQ9BeE1HhL6pzPL1R5x+ZuQ+T86WgZ4I= -github.com/jackc/pgconn v1.6.0/go.mod h1:yeseQo4xhQbgyJs2c87RAXOH2i624N0Fh1KSPJya7qo= +github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= +github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= +github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.12.0/go.mod h1:ZkhRC59Llhrq3oSfrikvwQ5NaxYExr6twkdkMLaKono= +github.com/jackc/pgconn v1.12.1 h1:rsDFzIpRk7xT4B8FufgpCCeyjdNpKyghZeSefViE5W8= +github.com/jackc/pgconn v1.12.1/go.mod h1:ZkhRC59Llhrq3oSfrikvwQ5NaxYExr6twkdkMLaKono= github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= -github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2 h1:JVX6jT/XfzNqIjye4717ITLaNwV9mWbJx0dLCpcRzdA= github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= +github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= @@ -787,16 +1273,20 @@ github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.0.2 h1:q1Hsy66zh4vuNsajBUF2PNqfAMMfxU5mk594lPE9vjY= -github.com/jackc/pgproto3/v2 v2.0.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8 h1:Q3tB+ExeflWUW7AFcAhXqk40s9mnNYLk1nOkKNZ5GnU= +github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.3.0 h1:brH0pCGBDkBW07HWlN/oSBXrmo3WB0UvZd1pIuDcL8Y= +github.com/jackc/pgproto3/v2 v2.3.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= github.com/jackc/pgtype v1.2.0/go.mod h1:5m2OfMh1wTK7x+Fk952IDmI4nw3nPrvtQdM0ZT4WpC0= -github.com/jackc/pgtype v1.3.0 h1:l8JvKrby3RI7Kg3bYEeU9TA4vqC38QDpFCfcrC7KuN0= -github.com/jackc/pgtype v1.3.0/go.mod h1:b0JqxHvPmljG+HQ5IsvQ0yqeSi4nGcDTVjFoiLDb0Ik= +github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= +github.com/jackc/pgtype v1.11.0 h1:u4uiGPz/1hryuXzyaBhSk6dnIyyG2683olG2OV+UUgs= +github.com/jackc/pgtype v1.11.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= github.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= github.com/jackc/pgx v3.6.2+incompatible h1:2zP5OD7kiyR3xzRYMhOcXVvkDZsImVXfj+yIyTQf3/o= github.com/jackc/pgx v3.6.2+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= @@ -804,36 +1294,69 @@ github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08 github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= github.com/jackc/pgx/v4 v4.4.1/go.mod h1:6iSW+JznC0YT+SgBn7rNxoEBsBgSmnC5FwyCekOGUiE= -github.com/jackc/pgx/v4 v4.6.0 h1:Fh0O9GdlG4gYpjpwOqjdEodJUQM9jzN3Hdv7PN0xmm0= -github.com/jackc/pgx/v4 v4.6.0/go.mod h1:vPh43ZzxijXUVJ+t/EmXBtFmbFVO72cuneCT9oAlxAg= +github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= +github.com/jackc/pgx/v4 v4.16.0/go.mod h1:N0A9sFdWzkw/Jy1lwoiB64F2+ugFZi987zRxcPez/wI= +github.com/jackc/pgx/v4 v4.16.1 h1:JzTglcal01DrghUqt+PmzWsZx/Yh7SC/CTQmSBMTd0Y= +github.com/jackc/pgx/v4 v4.16.1/go.mod h1:SIhx0D5hoADaiXZVyv+3gSm3LCIIINTVO0PficsvWGQ= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= +github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jandelgado/gcov2lcov v1.0.4/go.mod h1:NnSxK6TMlg1oGDBfGelGbjgorT5/L3cchlbtgFYZSss= +github.com/jandelgado/gcov2lcov v1.0.5 h1:rkBt40h0CVK4oCb8Dps950gvfd1rYvQ8+cWa346lVU0= +github.com/jandelgado/gcov2lcov v1.0.5/go.mod h1:NnSxK6TMlg1oGDBfGelGbjgorT5/L3cchlbtgFYZSss= +github.com/jcchavezs/porto v0.1.0 h1:Xmxxn25zQMmgE7/yHYmh19KcItG81hIwfbEEFnd6w/Q= +github.com/jcchavezs/porto v0.1.0/go.mod h1:fESH0gzDHiutHRdX2hv27ojnOVFco37hg1W6E9EZF4A= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.3.0 h1:OS12ieG61fsCg5+qLJ+SsW9NicxNkg3b25OyT2yCeUc= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmoiron/sqlx v0.0.0-20180614180643-0dae4fefe7c0/go.mod h1:IiEW3SEiiErVyFdH8NTuWjSifiEQKUoyK3LNqr2kCHU= -github.com/jmoiron/sqlx v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/jmoiron/sqlx v1.3.4/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= +github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= +github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/joho/godotenv v1.2.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= +github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/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 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= 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/julienschmidt/httprouter v1.2.0 h1:TDTW5Yz1mjftljbcKqRcrYhd4XeOoI98t+9HbQbYf7g= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/karrick/godirwalk v1.7.5/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34= github.com/karrick/godirwalk v1.7.7/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34= @@ -843,15 +1366,20 @@ github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0Lh github.com/karrick/godirwalk v1.10.9/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/karrick/godirwalk v1.15.3/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= +github.com/karrick/godirwalk v1.15.5 h1:ErdAEFW/cKxQ5+9Gm/hopxB8ki21/di+vyNb9mHnHrA= github.com/karrick/godirwalk v1.15.5/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= -github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw= -github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/knadh/koanf v1.4.0 h1:/k0Bh49SqLyLNfte9r6cvuZWrApOQhglOmhIU3L/zDw= +github.com/knadh/koanf v1.4.0/go.mod h1:1cfH5223ZeZUOs8FU2UdTmaNfHpqgtjV0+NHjRO43gs= github.com/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -859,8 +1387,10 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxv github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= @@ -868,30 +1398,39 @@ github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.3.0 h1:/qkRGz8zljWiDcFvgpwUpwIAPu3r07TDvs3Rws+o/pU= github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs= +github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/looplab/fsm v0.1.0 h1:Qte7Zdn/5hBNbXzP7yxVU4OIFHWXBovyTT2LaBTyC20= +github.com/looplab/fsm v0.1.0/go.mod h1:m2VaOfDHxqXBBMgc26m6yUOwkFn8H2AlJDE+jd/uafI= github.com/luna-duclos/instrumentedsql v0.0.0-20181127104832-b7d587d28109/go.mod h1:PWUIzhtavmOR965zfawVsHXbEuU1G29BPZ/CB3C7jXk= github.com/luna-duclos/instrumentedsql v1.1.2/go.mod h1:4LGbEqDnopzNAiyxPPDXhLspyunZxgPTMJBKtC6U0BQ= github.com/luna-duclos/instrumentedsql v1.1.3 h1:t7mvC0z1jUt5A0UQ6I/0H31ryymuQRnJcWCiqV3lSAA= github.com/luna-duclos/instrumentedsql v1.1.3/go.mod h1:9J1njvFds+zN7y85EDhN9XNQLANWwZt2ULeIC8yMNYs= -github.com/luna-duclos/instrumentedsql/opentracing v0.0.0-20201103091713-40d03108b6f4/go.mod h1:YnZVBK+MxEr2sn1rbf4UMqsBd0uKaCOq52UtmbfDKNM= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magefile/mage v1.10.0 h1:3HiXzCUY12kh9bIuyXShaVe529fJfyqoVM42o/uom2g= -github.com/magefile/mage v1.10.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/markbates/deplist v1.0.4/go.mod h1:gRRbPbbuA8TmMiRvaOzUlRfzfjeCCBqX2A6arxN01MM= github.com/markbates/deplist v1.0.5/go.mod h1:gRRbPbbuA8TmMiRvaOzUlRfzfjeCCBqX2A6arxN01MM= github.com/markbates/deplist v1.1.3/go.mod h1:BF7ioVzAJYEtzQN/os4rt8H8Ti3h0T7EoN+7eyALktE= @@ -920,12 +1459,17 @@ github.com/markbates/safe v1.0.1 h1:yjZkbvRM6IzKj9tlu/zMJLS0n/V351OZWRnF3QfaUxI= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/markbates/sigtx v1.0.0/go.mod h1:QF1Hv6Ic6Ca6W+T+DL0Y/ypborFKyvUY9HmuCD4VeTc= github.com/markbates/willie v1.0.9/go.mod h1:fsrFVWl91+gXpx/6dv715j7i11fYPfZ9ZGfH0DQzY7w= +github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.1 h1:qiyop7gCflfhwCzGyeT0gro3sF9AIg9HU98JORTkqfI= @@ -936,62 +1480,112 @@ github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= -github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-sqlite3 v1.14.10 h1:MLn+5bFRlWMGoSRmJour3CL1w/qL96mvipqpwQW/Sfk= +github.com/mattn/go-sqlite3 v1.14.10/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/mattn/goveralls v0.0.6 h1:cr8Y0VMo/MnEZBjxNN/vh6G90SZ7IMb6lms1dzMoO+Y= github.com/mattn/goveralls v0.0.6/go.mod h1:h8b4ow6FxSPMQHF6o2ve3qsclnffZjYTNEKmLesRwqw= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= -github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/microcosm-cc/bluemonday v1.0.16 h1:kHmAq2t7WPWLjiGvzKa5o3HzSfahUKiOq7fAPUiMNIc= +github.com/microcosm-cc/bluemonday v1.0.16/go.mod h1:Z0r70sCuXHig8YpBzCc5eGHAap2K7e/u082ZUpDRRqM= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= 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/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.0.0/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.2.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.3.2 h1:mRS76wmkOn3KkKAyXDu42V+6ebnXWIztFSYGN7GeoRg= github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY= +github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +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/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= 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/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= +github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 h1:rzf0wL0CHVc8CEsgyygG0Mn9CNCCPZqOPaz8RiiHYQk= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/monoculum/formam v0.0.0-20180901015400-4e68be1d79ba/go.mod h1:RKgILGEJq24YyJ2ban8EO0RUVSJlF1pGsEvoLEACr/Q= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/moul/http2curl v0.0.0-20170919181001-9ac6cf4d929b/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= +github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/nicksnyder/go-i18n v1.10.0/go.mod h1:HrK7VCrbOvQoUAQ7Vpy7i87N7JZZZ7R2xBGjv0j365Q= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/npillmayer/nestext v0.1.3/go.mod h1:h2lrijH8jpicr25dFY+oAJLyzlya6jhnuG+zWp9L0Uk= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/nyaruka/phonenumbers v1.0.73 h1:bP2WN8/NUP8tQebR+WCIejFaibwYMHOaB7MQVayclUo= +github.com/nyaruka/phonenumbers v1.0.73/go.mod h1:3aiS+PS3DuYwkbK3xdcmRwMiPNECZ0oENH8qUT1lY7Q= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/oleiade/reflections v1.0.1 h1:D1XO3LVEYroYskEsoSiGItp9RUxG6jWnCVvrqH0HHQM= github.com/oleiade/reflections v1.0.1/go.mod h1:rdFxbxq4QXVZWj0F+e9jqjDkc7dbp97vkRixKo2JR60= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.9.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= @@ -999,13 +1593,38 @@ github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/onsi/gomega v1.6.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= +github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc9 h1:/k06BMULKF5hidyoZymkoDCzdJzltZpz/UU4LguQVtc= +github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= +github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= +github.com/opencontainers/runc v1.1.1 h1:PJ9DSs2sVwE0iVr++pAHE6QkS9tzcVWozlPifdwMgrU= +github.com/opencontainers/runc v1.1.1/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= +github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= +github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= +github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= +github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= +github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492 h1:lM6RxxfUMrYL/f8bWEUqdXrANWtrL7Nndbm9iFN0DlU= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -1016,17 +1635,19 @@ github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYr github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5 h1:ZCnq+JUrvXcDVhX/xRolRBZifmabN1HcS1wrPSvxhrU= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2 h1:nY8Hti+WKaP0cRsSeQ026wU03QsM762XBeCXBb9NAWI= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.4.0 h1:CtfRrOVZtbDj8rt1WXjklw0kqqJQwICrCKmlfUuBUUw= +github.com/openzipkin/zipkin-go v0.4.0/go.mod h1:4c3sLeE8xjNqehmF5RpAFLPLJxXscc0R4l6Zg0P1tTQ= github.com/ory/analytics-go/v4 v4.0.0/go.mod h1:FMx9cLRD9xN+XevPvZ5FDMfignpmcqPP6FUKnJ9/MmE= -github.com/ory/analytics-go/v4 v4.0.1 h1:kKB2Mk8W0N23ZQCBHZ4wB6NQB6RxlxqzZB9LmSQ3Mho= -github.com/ory/analytics-go/v4 v4.0.1/go.mod h1:FMx9cLRD9xN+XevPvZ5FDMfignpmcqPP6FUKnJ9/MmE= +github.com/ory/analytics-go/v4 v4.0.3 h1:2zNBQLlm3UiD8U7DdUGLLUBm62ZA5GtbEJ3S5U+xEOI= +github.com/ory/analytics-go/v4 v4.0.3/go.mod h1:A3Chm/3TmM8jw4nqRss+gFhAYHRI5j/HFYH3C1FRahU= github.com/ory/cli v0.0.10 h1:HmZWrGry3ICdnkJWy+Ok0PGlPUZXsw7gGS+CP3dkj1s= github.com/ory/cli v0.0.10/go.mod h1:WQ+RPlizyFBLH7zrePdnwd3Ea+PHaJmPSR9TEVSw7zI= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= -github.com/ory/dockertest/v3 v3.5.4 h1:rYijlJuraj8D4OgC1DpYpCV8SGXrkviT3RVrjFy7OFc= github.com/ory/dockertest/v3 v3.5.4/go.mod h1:J8ZUbNB2FOhm1cFZW9xBpDsODqsSWcyYgtJYVPcnF70= +github.com/ory/dockertest/v3 v3.9.0 h1:U7M9FfYEwF4uqEE6WUSFs7K+Hvb31CsCX5uZUZD3olI= +github.com/ory/dockertest/v3 v3.9.0/go.mod h1:jgm0rnguArPXsVduy+oUjzFtD0Na+DDNbUl8W5v+ez8= github.com/ory/fosite v0.29.0/go.mod h1:0atSZmXO7CAcs6NPMI/Qtot8tmZYj04Nddoold4S2h0= github.com/ory/fosite v0.36.1 h1:xqu4UYemsiKX1LesoYx+3XCs74ZOGDK6bMBSfb4o3iA= github.com/ory/fosite v0.36.1/go.mod h1:42KzCDGR5zzuEIP48QwxL0QkA98ckUphlSgrSvxKB+A= @@ -1048,10 +1669,11 @@ github.com/ory/graceful v0.1.1/go.mod h1:zqu70l95WrKHF4AZ6tXHvAqAvpY6M7g6ttaAVcM github.com/ory/herodot v0.6.2/go.mod h1:3BOneqcyBsVybCPAJoi92KN2BpJHcmDqAMcAAaJiJow= github.com/ory/herodot v0.7.0/go.mod h1:YXKOfAXYdQojDP5sD8m0ajowq3+QXNdtxA+QiUXBwn0= github.com/ory/herodot v0.8.3/go.mod h1:rvLjxOAlU5omtmgjCfazQX2N82EpMfl3BytBWc1jjsk= -github.com/ory/herodot v0.8.4 h1:BAlRtKO3AAD5HsiLn8X1LnDMre/BeFbcg62M4/S0A0U= -github.com/ory/herodot v0.8.4/go.mod h1:rvLjxOAlU5omtmgjCfazQX2N82EpMfl3BytBWc1jjsk= -github.com/ory/jsonschema/v3 v3.0.1 h1:xzV7w2rt/Qn+jvh71joIXNKKOCqqNyTlaIxdxU0IQJc= +github.com/ory/herodot v0.9.13 h1:cN/Z4eOkErl/9W7hDIDLb79IO/bfsH+8yscBjRpB4IU= +github.com/ory/herodot v0.9.13/go.mod h1:IWDs9kSvFQqw/cQ8zi5ksyYvITiUU4dI7glUrhZcJYo= github.com/ory/jsonschema/v3 v3.0.1/go.mod h1:jgLHekkFk0uiGdEWGleC+tOm6JSSP8cbf17PnBuGXlw= +github.com/ory/jsonschema/v3 v3.0.7 h1:GQ9qfZDiJqs4l2d3p56dozCChvejQFZyLKGHYzDzOSo= +github.com/ory/jsonschema/v3 v3.0.7/go.mod h1:g8c8YOtN4TrR2wYeMdT02GDmzJDI0fEW2nI26BECafY= github.com/ory/ladon v1.1.0 h1:6tgazU2J3Z3odPs1f0qn729kRXCAtlJROliuWUHedV0= github.com/ory/ladon v1.1.0/go.mod h1:25bNc/Glx/8xCH7MbItDxjvviAmFQ+aYxb1V1SE5wlg= github.com/ory/pagination v0.0.1/go.mod h1:d1ToRROAUleriPhmb2dYbhANhhLwZ8s395m2yJCDFh8= @@ -1064,60 +1686,103 @@ github.com/ory/x v0.0.93/go.mod h1:lfcTaGXpTZs7IEQAW00r9EtTCOxD//SiP5uWtNiz31g= github.com/ory/x v0.0.110/go.mod h1:DJfkE3GdakhshNhw4zlKoRaL/ozg/lcTahA9OCih2BE= github.com/ory/x v0.0.128/go.mod h1:ykx1XOsl9taQtoW2yNvuxl/feEfTfrZTcbY1U7841tI= github.com/ory/x v0.0.162/go.mod h1:sj3z/MeCrAyNFFTfN6yK1nTmHXGSFnw+QwIIQ/Rowec= -github.com/ory/x v0.0.165 h1:PdLzbWj95+1hIkclBVeOchzIv3n/wSYJqRHQeEWueWA= -github.com/ory/x v0.0.165/go.mod h1:OmHWAMal8+FhNJgDh1KkN8ik24ubjPSJQNdnTj6tzCQ= +github.com/ory/x v0.0.458 h1:7GUEDCNzgmsAVKBQVVogVQxzZuQMpFW20RvMTwT/5v8= +github.com/ory/x v0.0.458/go.mod h1:HRI5iWZuF2wGRaSTftFRqMCUqUNhbZ4UjcGGy3tkfVc= github.com/parnurzeal/gorequest v0.2.15/go.mod h1:3Kh2QUMJoqw3icWAecsyzkpY7UzRfDhbRdTjtNwNiUE= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= +github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= -github.com/pelletier/go-toml v1.8.0 h1:Keo9qb7iRJs2voHvunFtuuYFsbWeOBh8/P9v/kVMFtw= +github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= +github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU= +github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= -github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= +github.com/philhofer/fwd v1.1.1 h1:GdGcTjf5RNAxwS4QLsiMzJYj5KEvPJD3Abr261yRQXQ= +github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrre/gotestcover v0.0.0-20160517101806-924dca7d15f0/go.mod h1:4xpMLz7RBWyB+ElzHu8Llua96TRCB3YwX+l5EP1wmHk= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1 h1:F++O52m40owAmADcojzM+9gyjmMOY/T4oYJkgFDH8RE= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/profile v1.6.0 h1:hUDfIISABYI59DyeB3OTay/HxSRwTQ8rB/H83k6r5dM= +github.com/pkg/profile v1.6.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= 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/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= +github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.5.0 h1:Ctq0iGpCmr3jeP77kbF2UxgvRwzWWz+4Bh9/vJTyg1A= -github.com/prometheus/client_golang v1.5.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.11.1 h1:+4eQaD7vAZ6DsfsxB15hbE0odUjGI5ARs9yskGu1v4s= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rabbitmq/amqp091-go v1.1.0/go.mod h1:ogQDLSOACsLPsIq0NpbtiifNZi2YOz0VTJ0kHRghqbM= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20190728182440-6a916e37a237/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rhnvrm/simples3 v0.6.1/go.mod h1:Y+3vYm2V7Y4VijFoJHHTrja6OgPrJ2cBti8dPGkC3sA= +github.com/robertkrimen/godocdown v0.0.0-20130622164427-0bfa04905481/go.mod h1:C9WhFzY47SzYBIvzFqSvHIR6ROgDo4TtdTuRaOMjF/s= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.0.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -1125,24 +1790,38 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.4.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.6.2 h1:aIihoIOHCiLZHxyoNQ+ABL4NKhFTgKLBdMLyEAh98m0= -github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rs/cors v1.6.0 h1:G9tHG9lebljV9mfp9SNPDL36nCDxmo3zTlAf1YgvzmI= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= +github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/rubenv/sql-migrate v0.0.0-20190212093014-1007f53448d7/go.mod h1:WS0rl9eEliYI8DPnr3TOwz4439pay+qNgzJoVya/DmY= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +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/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= github.com/santhosh-tekuri/jsonschema v1.2.4 h1:hNhW8e7t+H1vgY+1QeEQpveR6D4+OwKPXCfD2aieJis= github.com/santhosh-tekuri/jsonschema v1.2.4/go.mod h1:TEAUOeZSmIxTTuHatJzrvARHiuO9LYd+cIxzgEHCQI4= github.com/santhosh-tekuri/jsonschema/v2 v2.1.0/go.mod h1:yzJzKUGV4RbWqWIBBP4wSOBqavX5saE02yirLS0OTyg= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/seatgeek/logrus-gelf-formatter v0.0.0-20210414080842-5b05eb8ff761 h1:0b8DF5kR0PhRoRXDiEEdzrgBc8UqVY4JWLkQJCRsLME= +github.com/seatgeek/logrus-gelf-formatter v0.0.0-20210414080842-5b05eb8ff761/go.mod h1:/THDZYi7F/BsVEcYzYPqdcWFQ+1C2InkawTKfLOAnzg= +github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/segmentio/analytics-go v3.0.1+incompatible/go.mod h1:C7CYBtQWk4vRk2RyLu0qOcbHJ18E3F1HV2C/8JvKN48= github.com/segmentio/analytics-go v3.1.0+incompatible/go.mod h1:C7CYBtQWk4vRk2RyLu0qOcbHJ18E3F1HV2C/8JvKN48= github.com/segmentio/backo-go v0.0.0-20160424052352-204274ad699c/go.mod h1:kJ9mm9YmoWSkk+oQ+5Cj8DEoRCX2JT6As4kEtIIOp1M= @@ -1153,18 +1832,19 @@ github.com/segmentio/go-snakecase v1.1.0/go.mod h1:jk1miR5MS7Na32PZUykG89Arm+1BU github.com/segmentio/objconv v1.0.1/go.mod h1:auayaH5k3137Cl4SoXTgrzQcuQDmvuVtZgS0fb1Ahys= github.com/serenize/snaker v0.0.0-20171204205717-a683aaf2d516/go.mod h1:Yow6lPLSAXx2ifx470yD/nUe22Dv5vBvxK/UK9UUTVs= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= github.com/shurcooL/highlight_go v0.0.0-20170515013102-78fb10f4a5f8/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= github.com/shurcooL/octicon v0.0.0-20180602230221-c42b0e3b24d9/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= @@ -1177,12 +1857,15 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.8.0 h1:nfhvjKcUMhBMVqbKHJlk5RPrrfYr/NMo3692g0dwfWU= -github.com/sirupsen/logrus v1.8.0/go.mod h1:4GuYW9TZmE769R5STWrRakJc4UqQ3+QQ95fyz7ENv1A= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.1.0 h1:MkTeG1DMwsrdH7QtLXy5W+fUxWq+vmb6cLmyJ7aRtF0= github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= 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/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -1190,29 +1873,36 @@ github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d h1:yKm7XZV6j9 github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e h1:qpG93cPwA5f7s/ZPBJnGOYQNK/vKsaDaseuKT5Asee8= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.0/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.3.2 h1:GDarE4TJQI52kYSbSAmLiId1Elfj+xgSDqrUZxFhxlU= -github.com/spf13/afero v1.3.2/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.5.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= +github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.2-0.20200723214538-8d17101741c8/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +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 v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v0.0.7/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= -github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= +github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= 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 v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -1221,111 +1911,229 @@ github.com/spf13/viper v1.2.1/go.mod h1:P4AexN0a+C9tGAnUFNwDMYYZv3pjFuvmeiMyKRaN github.com/spf13/viper v1.3.1/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= +github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= github.com/sqs/goreturns v0.0.0-20181028201513-538ac6014518 h1:iD+PFTQwKEmbwSdwfvP5ld2WEI/g7qbdhmHJ2ASfYGs= github.com/sqs/goreturns v0.0.0-20181028201513-538ac6014518/go.mod h1:CKI4AZ4XmGV240rTHfO0hfE83S6/a3/Q1siZJ/vXf7A= github.com/square/go-jose v2.3.1+incompatible h1:RhqCh4GjK8cxzULjztpqLCmEOYQYB05Id8I40FkHZ6Q= github.com/square/go-jose v2.3.1+incompatible/go.mod h1:7MxpAF/1WTVUu8Am+T5kNy+t0902CaLWM4Z745MkOa8= +github.com/square/go-jose/v3 v3.0.0-20200630053402-0a67ce9b0693 h1:wD1IWQwAhdWclCwaf6DdzgCAe9Bfz1M+4AHRd7N786Y= +github.com/square/go-jose/v3 v3.0.0-20200630053402-0a67ce9b0693/go.mod h1:6hSY48PjDm4UObWmGLyJE9DxYVKTgR9kbCspXXJEhcU= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/subosito/gotenv v1.1.1/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI= +github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= +github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= github.com/tidwall/gjson v1.3.2/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= -github.com/tidwall/gjson v1.6.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= -github.com/tidwall/gjson v1.9.3 h1:hqzS9wAHMO+KVBBkLxYdkEeeFHuqr95GfClRLKlgK0E= -github.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.14.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.14.3 h1:9jvXn7olKEHU1S9vwoMGliaT8jq1vJ7IH/n9zD9Dnlw= +github.com/tidwall/gjson v1.14.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tidwall/pretty v1.0.1/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.0.4/go.mod h1:bURseu1nuBkFpIES5cz6zBtjmYeOQmEESshn7VpF15Y= -github.com/tidwall/sjson v1.1.1 h1:7h1vk049Jnd5EH9NyzNiEuwYW4b5qgreBbqRC19AS3U= -github.com/tidwall/sjson v1.1.1/go.mod h1:yvVuSnpEQv5cYIrO+AT6kw4QVfd5SDZoGIS7/5+fZFs= +github.com/tidwall/sjson v1.2.4 h1:cuiLzLnaMeBhRmEv00Lpk3tkYrcxpmbU81tAY4Dw0tc= +github.com/tidwall/sjson v1.2.4/go.mod h1:098SZ494YoMWPmMO6ct4dcFnqxwj9r/gF0Etp19pSNM= github.com/tinylib/msgp v1.1.2 h1:gWmO7n0Ys2RBEb7GPYB9Ujq8Mk5p2U08lRnmMcGy6BQ= github.com/tinylib/msgp v1.1.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce h1:fb190+cK2Xz/dvi9Hv8eCYJYvIGUTN2/KLq1pT6CjEc= github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= github.com/toqueteos/webbrowser v1.2.0 h1:tVP/gpK69Fx+qMJKsLE7TD8LuGWPnEV71wBN9rrstGQ= github.com/toqueteos/webbrowser v1.2.0/go.mod h1:XWoZq4cyp9WeUeak7w7LXRUQf1F1ATJMir8RTqb4ayM= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/uber/jaeger-client-go v2.22.1+incompatible h1:NHcubEkVbahf9t3p75TOCR83gdUHXjRJvjoBh1yACsM= github.com/uber/jaeger-client-go v2.22.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= +github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v1.5.0/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -github.com/uber/jaeger-lib v2.2.0+incompatible h1:MxZXOiR2JuoANZ3J6DE/U0kSFv/eJ/GfSYVCjK7dyaw= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= +github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/unrolled/secure v0.0.0-20180918153822-f340ee86eb8b/go.mod h1:mnPT77IAdsi/kV7+Es7y+pXALeV3h7G6dQF6mNYjcLA= github.com/unrolled/secure v0.0.0-20181005190816-ff9db2ff917f/go.mod h1:mnPT77IAdsi/kV7+Es7y+pXALeV3h7G6dQF6mNYjcLA= +github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= +github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= +github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= +github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= 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 v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +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/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c h1:3lbZUMbMiGUW/LMkfsEABsc5zNT9+b1CvsJx47JzJ8g= github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c/go.mod h1:UrdRz5enIKZ63MEE3IF9l2/ebyx59GyGgPi+tICQdmM= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= 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.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= -go.elastic.co/apm v1.8.0 h1:AWEKpHwRal0yCMd4K8Oxy1HAa7xid+xq1yy+XjgoVU0= go.elastic.co/apm v1.8.0/go.mod h1:tCw6CkOJgkWnzEthFN9HUP1uL3Gjc/Ur6m7gRPLaoH0= -go.elastic.co/apm/module/apmhttp v1.8.0 h1:5AJPefWJzWDLX/47XIDfaloGiYWkkOQEULvlrI6Ieaw= +go.elastic.co/apm v1.15.0 h1:uPk2g/whK7c7XiZyz/YCUnAUBNPiyNeE3ARX3G6Gx7Q= +go.elastic.co/apm v1.15.0/go.mod h1:dylGv2HKR0tiCV+wliJz1KHtDyuD8SPe69oV7VyK6WY= go.elastic.co/apm/module/apmhttp v1.8.0/go.mod h1:9LPFlEON51/lRbnWDfqAWErihIiAFDUMfMV27YjoWQ8= -go.elastic.co/apm/module/apmot v1.8.0 h1:7r8b5RGDN5gAUG7FoegzJ24+jFSZF7FvY2ODODaKFYk= +go.elastic.co/apm/module/apmhttp v1.15.0 h1:Le/DhI0Cqpr9wG/NIGOkbz7+rOMqJrfE4MRG6q/+leU= +go.elastic.co/apm/module/apmhttp v1.15.0/go.mod h1:NruY6Jq8ALLzWUVUQ7t4wIzn+onKoiP5woJJdTV7GMg= go.elastic.co/apm/module/apmot v1.8.0/go.mod h1:Q5Xzabte8G/fkvDjr1jlDuOSUt9hkVWNZEHh6ZNaTjI= -go.elastic.co/fastjson v1.0.0 h1:ooXV/ABvf+tBul26jcVViPT3sBir0PvXgibYB1IQQzg= +go.elastic.co/apm/module/apmot v1.15.0 h1:yqarZ4HCIb6dLAzEVSWdppAuRhfrCfm2Z6UL+ubai2A= +go.elastic.co/apm/module/apmot v1.15.0/go.mod h1:BjFz2KOlnjXdnSo0p6nhDDaIEYYX8c6uVHwvkZiLqtQ= go.elastic.co/fastjson v1.0.0/go.mod h1:PmeUOMMtLHQr9ZS9J9owrAVg0FkaZDRZJEFTTGHtchs= +go.elastic.co/fastjson v1.1.0 h1:3MrGBWWVIxe/xvsbpghtkFoPciPhOCmjsR/HfwEeQR4= +go.elastic.co/fastjson v1.1.0/go.mod h1:boNGISWMjQsUPy/t6yqt2/1Wx4YNPSe+mZjlyw9vKKI= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= +go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= +go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= -go.mongodb.org/mongo-driver v1.3.5 h1:S0ZOruh4YGHjD7JoN7mIsTrNjnQbOjrmgrx6l6pZN7I= -go.mongodb.org/mongo-driver v1.3.5/go.mod h1:Ual6Gkco7ZGQw8wE1t4tLnvBsf6yVSM60qW6TgOeJ5c= +go.mongodb.org/mongo-driver v1.5.1/go.mod h1:gRXCHX4Jo7J0IJ1oDQyUxF7jfy19UfxniMS4xxMmUqw= +go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= +go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= +go.mongodb.org/mongo-driver v1.8.3/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY= +go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8= +go.mongodb.org/mongo-driver v1.10.1 h1:NujsPveKwHaWuKUer/ceo9DzEe7HIj1SlJ6uvXZG0S4= +go.mongodb.org/mongo-driver v1.10.1/go.mod h1:z4XpeoU6w+9Vht+jAFyLgVrD+jGSQQe0+CBWFHNiHt8= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= 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.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= 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 h1:LYy1Hy3MJdrCdMwwzxA/dRok4ejH+RwNGbuoD9fCjto= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.13.0 h1:T6W6DcsRSLxMCv2J96fAkHaKu+V3tW/8vXdPNe/1B1A= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.13.0/go.mod h1:TwTkyRaTam1pOIb2wxcAiC2hkMVbokXkt6DEt5nDkD8= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.25.0 h1:H6bZI2q89Q1RR/mQgrWIVtOTh711dJd0oA7Kxk4ujy8= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.25.0/go.mod h1:0MPbX5HgESa5d3UZXbz8pmKoWVrCZwt1N6JmmY206IQ= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.29.0 h1:SLme4Porm+UwX0DdHMxlwRt7FzPSE0sys81bet2o0pU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.29.0/go.mod h1:tLYsuf2v8fZreBVwp9gVMhefZlLFZaUiNVSq8QxXRII= +go.opentelemetry.io/contrib/propagators/b3 v1.4.0 h1:wDb2ct7xMzossYpx44w81skxkEyeT2IRnBgYKqyEork= +go.opentelemetry.io/contrib/propagators/b3 v1.4.0/go.mod h1:K399DN23drp0RQGXCbSPOt9075HopQigMgUL99oR8hc= +go.opentelemetry.io/contrib/propagators/jaeger v1.4.0 h1:nZZrtAz9Z0bXXJPB/p0uHIuk4am7LvkUUiuhulrhnjI= +go.opentelemetry.io/contrib/propagators/jaeger v1.4.0/go.mod h1:C6Tffii02q1NrEzJxpawJH1pyU3ZQ1520gCrxpNg7X4= +go.opentelemetry.io/contrib/samplers/jaegerremote v0.0.0-20220314184135-32895002a444 h1:bpPIQ4lcXFubX82lvMN/3hvu/mI/qCrQMEhQiW1glu4= +go.opentelemetry.io/contrib/samplers/jaegerremote v0.0.0-20220314184135-32895002a444/go.mod h1:e0xV/IXUqN67FXhxQ/IEaZ1nRIxU4pML/ptX4DTqfkM= go.opentelemetry.io/otel v0.6.0/go.mod h1:jzBIgIzK43Iu1BpDAXwqOd6UPsSAk+ewVZ5ofSXw4Ek= -go.opentelemetry.io/otel v0.13.0 h1:2isEnyzjjJZq6r2EKMsFj4TxiQiexsM04AVhwbR/oBA= go.opentelemetry.io/otel v0.13.0/go.mod h1:dlSNewoRYikTkotEnxdmuBHgzT+k/idJSfDv/FxEnOY= +go.opentelemetry.io/otel v1.0.1/go.mod h1:OPEOD4jIT2SlZPMmwT6FqZz2C0ZNdQqiWcoK6M0SNFU= +go.opentelemetry.io/otel v1.4.0/go.mod h1:jeAqMFKy2uLIxCtKxoFj0FAL5zAPKQagc3+GtBWakzk= +go.opentelemetry.io/otel v1.4.1/go.mod h1:StM6F/0fSwpd8dKWDCdRr7uRvEPYdW0hBSlbdTiUde4= +go.opentelemetry.io/otel v1.9.0 h1:8WZNQFIB2a71LnANS9JeyidJKKGOOremcUtb/OtHISw= +go.opentelemetry.io/otel v1.9.0/go.mod h1:np4EoPGzoPs3O67xUVNoPPcmSvsfOxNlNA4F4AC+0Eo= +go.opentelemetry.io/otel/bridge/opentracing v1.9.0 h1:jlrWaQ/BRcf7C1+LldCcTcqwANsfc1E5HmOv4kE7EZc= +go.opentelemetry.io/otel/bridge/opentracing v1.9.0/go.mod h1:QYKRAmt+MWDoudzsVKYSutcVs9scYhc2K6YspGV/LLw= +go.opentelemetry.io/otel/exporters/jaeger v1.9.0 h1:gAEgEVGDWwFjcis9jJTOJqZNxDzoZfR12WNIxr7g9Ww= +go.opentelemetry.io/otel/exporters/jaeger v1.9.0/go.mod h1:hquezOLVAybNW6vanIxkdLXTXvzlj2Vn3wevSP15RYs= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.9.0 h1:ggqApEjDKczicksfvZUCxuvoyDmR6Sbm56LwiK8DVR0= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.9.0/go.mod h1:78XhIg8Ht9vR4tbLNUhXsiOnE2HOuSeKAiAcoVQEpOY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.9.0 h1:NN90Cuna0CnBg8YNu1Q0V35i2E8LDByFOwHRCq/ZP9I= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.9.0/go.mod h1:0EsCXjZAiiZGnLdEUXM9YjCKuuLZMYyglh2QDXcYKVA= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.9.0 h1:FAF9l8Wjxi9Ad2k/vLTfHZyzXYX72C62wBGpV3G6AIo= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.9.0/go.mod h1:smUdtylgc0YQiUr2PuifS4hBXhAS5xtR6WQhxP1wiNA= +go.opentelemetry.io/otel/exporters/zipkin v1.9.0 h1:06b/nt6xao6th00aue9WU3ZDTTe+InaMXA/vym6pLuA= +go.opentelemetry.io/otel/exporters/zipkin v1.9.0/go.mod h1:HyIvYIu37wV4Wx5azd7e05x9k/dOz9KB4x0plw2QNvs= +go.opentelemetry.io/otel/internal/metric v0.27.0 h1:9dAVGAfFiiEq5NVB9FUJ5et+btbDQAUIJehJ+ikyryk= +go.opentelemetry.io/otel/internal/metric v0.27.0/go.mod h1:n1CVxRqKqYZtqyTh9U/onvKapPGv7y/rpyOTI+LFNzw= +go.opentelemetry.io/otel/metric v0.27.0 h1:HhJPsGhJoKRSegPQILFbODU56NS/L1UE4fS1sC5kIwQ= +go.opentelemetry.io/otel/metric v0.27.0/go.mod h1:raXDJ7uP2/Jc0nVZWQjJtzoyssOYWu/+pjZqRzfvZ7g= +go.opentelemetry.io/otel/sdk v1.4.1/go.mod h1:NBwHDgDIBYjwK2WNu1OPgsIc2IJzmBXNnvIJxJc8BpE= +go.opentelemetry.io/otel/sdk v1.9.0 h1:LNXp1vrr83fNXTHgU8eO89mhzxb/bbWAsHG6fNf3qWo= +go.opentelemetry.io/otel/sdk v1.9.0/go.mod h1:AEZc8nt5bd2F7BC24J5R0mrjYnpEgYHyTcM/vrSple4= +go.opentelemetry.io/otel/trace v1.0.1/go.mod h1:5g4i4fKLaX2BQpSBsxw8YYcgKpMMSW3x7ZTuYBr3sUk= +go.opentelemetry.io/otel/trace v1.4.0/go.mod h1:uc3eRsqDfWs9R7b92xbQbU42/eTNz4N+gLP8qJCi4aE= +go.opentelemetry.io/otel/trace v1.4.1/go.mod h1:iYEVbroFCNut9QkwEczV9vMRPHNKSSwYZjulEtsmhFc= +go.opentelemetry.io/otel/trace v1.9.0 h1:oZaCNJUjWcg60VXWee8lJKlqhPbXAPB51URuR47pQYc= +go.opentelemetry.io/otel/trace v1.9.0/go.mod h1:2737Q0MuG8q1uILYm2YYVkAyLtOofiTNGg6VODnOiPo= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.18.0 h1:W5hyXNComRa23tGpKwG+FRAc4rfF6ZUg1JReK+QHS80= +go.opentelemetry.io/proto/otlp v0.18.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.1 h1:rsqfU5vBkVknbhUGbAUwQKR2H4ItV8tjJ+6kJX4cxHM= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= gocloud.dev v0.20.0 h1:mbEKMfnyPV7W1Rj35R1xXfjszs9dXkwSOq2KoFr25g8= gocloud.dev v0.20.0/go.mod h1:+Y/RpSXrJthIOM8uFNzWp6MRu9pFPNFEEZrQMxpkfIc= golang.org/dl v0.0.0-20190829154251-82a15e2f2ead/go.mod h1:IUMfjQLJQd4UTqG1Z90tenwKoCX93Gn3MAQJMOSBsDQ= @@ -1359,19 +2167,34 @@ golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191122220453-ac88ee75c92c/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200320181102-891825fb96df/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= +golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 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/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220517005047-85d78b3ac167/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8 h1:GIAS/yBem/gq2MUqgNIzUHW7cJMmx3TGZOrnyYaNQ6c= +golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1380,6 +2203,7 @@ golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= 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-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= 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= @@ -1389,6 +2213,14 @@ golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMk golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= 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= @@ -1398,8 +2230,10 @@ golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHl 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 h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= 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 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= +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= @@ -1408,8 +2242,11 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB 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.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= +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.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180816102801-aaf60122140d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1442,7 +2279,9 @@ golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191003171128-d98b1b443823/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191112182307-2180aed22343/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= @@ -1455,14 +2294,43 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ 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-20200520004742-59133d7f0dd7/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-20200602114024-627f9648deb9/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-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-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-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/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-20220520000938-2e3eb7b945c2/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-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-20220826154423-83b083e8dc8b h1:ZmngSVLe/wycRns9MKikG9OWIEjGcGAkacif7oYQaUY= +golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181003184128-c57b0facaced/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1470,8 +2338,25 @@ golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4Iltr 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-20210819190943-2bc19b11175f h1:Qmd2pbz05z7z6lm0DrgQVVPuBm92jqujBKMHMOlOQEw= +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-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.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-20220822191816-0ebed06d0094 h1:2o1E+E8TpNLklK9nHiPiK1uzIYrIHt+cQx3ynCwq9V8= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= 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= @@ -1481,8 +2366,13 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ 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-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +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-20220513210516-0976fa681c29/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 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180816055513-1c9583448a9c/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1506,6 +2396,7 @@ golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181206074257-70b957f3b65e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190102155601-82a175fd1598/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190116161447-11f53e031339/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/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= @@ -1516,29 +2407,47 @@ golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191105231009-c1f44814a5cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200121082415-34d275377bf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/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-20200317113312-5766fd39f98d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1549,28 +2458,102 @@ golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7w 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-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/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-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/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-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/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-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/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-20210603081109-ebe580a85c40/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-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 h1:foEbQz/B0Oz6YIqu/69kfXPYeFQAuuMYFkjaqXzl5Wo= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211107104306-e0b2ad06fe42/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/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-20220405210540-1e041c57c461/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-20220513210249-45d2b4557a2a/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-20220715151400-c0bba94af5f8/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-20220817070843-5a390386f1f2 h1:fqTvyMIIj+HRzMmnzr9NtpHP6uVpvB5fkHcgPDC4nu8= +golang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 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.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 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.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= +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 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 h1:GZokNIeuVkl3aZHJchRrr13WCsols02MLUcz1U9is6M= +golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1619,14 +2602,18 @@ golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190617190820-da514acc4774/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-20190624190245-7f2218787638/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/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-20190711191110-9a621aea19f8/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191004055002-72853e10c5a3/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/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= @@ -1636,6 +2623,7 @@ golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191224055732-dd894d0a8a40/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-20200103221440-774c71fcf114/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-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1653,6 +2641,7 @@ golang.org/x/tools v0.0.0-20200317043434-63da46f3035e/go.mod h1:Sl4aGygMT6LrqrWc golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= 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-20200509030707-2212a7e161a5/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-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -1660,25 +2649,49 @@ golang.org/x/tools v0.0.0-20200601175630-2caf76543d99/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200606014950-c42cb6316fb6/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200608174601-1b747fd94509/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-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.1.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ= +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-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= +golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= 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 h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.6.2/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/netlib v0.0.0-20191229114700-bbb4dff026f8/go.mod h1:2IgXn/sJaRbePPBA1wRj8OE+QLvVaH0q8SK6TSTKlnk= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= gonum.org/v1/plot v0.0.0-20200111075622-4abb28f724d5/go.mod h1:+HbaZVpsa73UwN7kXGCECULRHovLRJjH+t5cFPgxErs= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.0/go.mod h1:JWIHJ7U20drSQb/aDpTetJzfC1KlAPldJLpkSy88dvQ= +google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -1696,22 +2709,52 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.26.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 h1:yfrXXP61wVuLb0vBcG6qaOoIoqYEzOQS8jum51jkv2w= 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.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/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.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= +google.golang.org/api v0.84.0 h1:NMB9J4cCxs9xEm+1Z9QiO3eFvn7EnQj3Eo3hN6ugVlg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 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 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= 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-20190404172233-64821d5d2107/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-20190508193815-b515fa19cec8/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190626174449-989357319d63/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190708153700-3bdd9d9f5532/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= @@ -1724,6 +2767,7 @@ google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvx 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-20200117163144-32f20d992d24/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= @@ -1736,6 +2780,7 @@ google.golang.org/genproto v0.0.0-20200325114520-5b2d0af7952b/go.mod h1:55QSHmfG 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-20200603110839-e855014d5736/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= @@ -1743,8 +2788,68 @@ google.golang.org/genproto v0.0.0-20200608115520-7c474a2e3482/go.mod h1:jDfRM7Fc 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 h1:PDIOdWxZ8eRizhKa1AAvY53xsvLB1cWorMjslvY3VA8= +google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/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-20201110150050-8816d57aaa9a/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-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211020151524-b7c3a969101a/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/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-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-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-20220519153652-3a47de7e79bd/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 h1:4SPz2GL2CXJt28MTF8V6Ap/9ZiVbQlJeGSd9qtA7DLs= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -1753,6 +2858,8 @@ google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= 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= @@ -1760,8 +2867,32 @@ google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 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 h1:T7P4R73V3SSDPhH7WW7ATbfViLtmamH0DKrP3f9AuDI= 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.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= +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 h1:9n77onPX5F3qfFCqjy9dhn8PbNQsIKeVU04J9G7umt8= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/grpc/examples v0.0.0-20210304020650-930c79186c99 h1:qA8rMbz1wQ4DOFfM2ouD29DG9aHWBm6ZOy9BGxiUMmY= +google.golang.org/grpc/examples v0.0.0-20210304020650-930c79186c99/go.mod h1:Ly7ZA/ARzg8fnPU9TyZIxoz33sEUuWX7txiqs8lPTgE= 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= @@ -1771,18 +2902,27 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 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 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= 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 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/DataDog/dd-trace-go.v1 v1.27.1 h1:9BJfwtuCUrUiNB3WCTXHuaP5E/J/zfMPUUaRJoEQfdc= gopkg.in/DataDog/dd-trace-go.v1 v1.27.1/go.mod h1:Sp1lku8WJMvNV0kjDI4Ni/T7J/U3BO5ct5kEaoVU8+I= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= +gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/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/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= @@ -1791,33 +2931,51 @@ gopkg.in/go-playground/mold.v2 v2.2.0/go.mod h1:XMyyRsGtakkDPbxXbrA5VODo6bUXyvoD gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw= gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.55.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.57.0 h1:9unxIsFcTt4I55uWluz+UmL95q4kdJ0buvQ1ZIqVQww= gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= +gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mail.v2 v2.0.0-20180731213649-a0242b2233b4/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.1.9/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w= +gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= +gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/validator.v2 v2.0.0-20180514200540-135c24b11c19/go.mod h1:o4V0GXN9/CAmCsvJ0oXYZvrZOe7syiDZSN1GWGZTGzc= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/postgres v1.3.5/go.mod h1:EGCWefLFQSVFrHGy4J8EtiHCWX5Q8t0yz2Jt9aKkGzU= +gorm.io/gorm v1.23.4/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= +gorm.io/gorm v1.23.5/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +gotest.tools/v3 v3.2.0 h1:I0DwBVMGAx26dttAj1BtJLAkVGncrkkUXfJLC4Flt/I= +gotest.tools/v3 v3.2.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= 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= @@ -1827,6 +2985,31 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= +k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= +k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= +k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= +k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= +k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= +k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= +k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= +k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= +k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= +k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= +k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= +k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= +k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= +k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= +k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= @@ -1836,3 +3019,9 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8 rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/internal/driver.go b/internal/driver.go index 3813f974da..c6c4793d80 100644 --- a/internal/driver.go +++ b/internal/driver.go @@ -1,27 +1,24 @@ package internal import ( - "github.com/ory/viper" + "context" "github.com/ory/oathkeeper/driver" "github.com/ory/oathkeeper/driver/configuration" + "github.com/ory/x/configx" "github.com/ory/x/logrusx" ) -func ResetViper() { - viper.Reset() - viper.Set("log.level", "debug") - - // We need to reset the default value as defined in configuration.init() - viper.SetDefault(configuration.ViperKeyErrorsJSONIsEnabled, true) -} - -func NewConfigurationWithDefaults() *configuration.ViperProvider { - ResetViper() - return configuration.NewViperProvider(logrusx.New("", "")) +func NewConfigurationWithDefaults(opts ...configx.OptionModifier) configuration.Provider { + l := logrusx.New("", "") + c, err := configuration.NewKoanfProvider( + context.Background(), nil, l, opts...) + if err != nil { + l.WithError(err).Fatal("Failed to initialize configuration") + } + return c } -func NewRegistry(c *configuration.ViperProvider) *driver.RegistryMemory { - viper.Set("LOG_LEVEL", "debug") +func NewRegistry(c configuration.Provider) *driver.RegistryMemory { return driver.NewRegistryMemory().WithConfig(c).(*driver.RegistryMemory) } diff --git a/internal/httpclient/client/api/api_client.go b/internal/httpclient/client/api/api_client.go index ccf9be3ce8..0c85c1c592 100644 --- a/internal/httpclient/client/api/api_client.go +++ b/internal/httpclient/client/api/api_client.go @@ -25,41 +25,43 @@ type Client struct { formats strfmt.Registry } +// ClientOption is the option for Client methods +type ClientOption func(*runtime.ClientOperation) + // ClientService is the interface for Client methods type ClientService interface { - Decisions(params *DecisionsParams) (*DecisionsOK, error) + Decisions(params *DecisionsParams, opts ...ClientOption) (*DecisionsOK, error) - GetRule(params *GetRuleParams) (*GetRuleOK, error) + GetRule(params *GetRuleParams, opts ...ClientOption) (*GetRuleOK, error) - GetVersion(params *GetVersionParams) (*GetVersionOK, error) + GetVersion(params *GetVersionParams, opts ...ClientOption) (*GetVersionOK, error) - GetWellKnownJSONWebKeys(params *GetWellKnownJSONWebKeysParams) (*GetWellKnownJSONWebKeysOK, error) + GetWellKnownJSONWebKeys(params *GetWellKnownJSONWebKeysParams, opts ...ClientOption) (*GetWellKnownJSONWebKeysOK, error) - IsInstanceAlive(params *IsInstanceAliveParams) (*IsInstanceAliveOK, error) + IsInstanceAlive(params *IsInstanceAliveParams, opts ...ClientOption) (*IsInstanceAliveOK, error) - IsInstanceReady(params *IsInstanceReadyParams) (*IsInstanceReadyOK, error) + IsInstanceReady(params *IsInstanceReadyParams, opts ...ClientOption) (*IsInstanceReadyOK, error) - ListRules(params *ListRulesParams) (*ListRulesOK, error) + ListRules(params *ListRulesParams, opts ...ClientOption) (*ListRulesOK, error) SetTransport(transport runtime.ClientTransport) } /* - Decisions accesses control decision API + Decisions accesses control decision API - > This endpoint works with all HTTP Methods (GET, POST, PUT, ...) and matches every path prefixed with /decision. + > This endpoint works with all HTTP Methods (GET, POST, PUT, ...) and matches every path prefixed with /decision. This endpoint mirrors the proxy capability of ORY Oathkeeper's proxy functionality but instead of forwarding the request to the upstream server, returns 200 (request should be allowed), 401 (unauthorized), or 403 (forbidden) status codes. This endpoint can be used to integrate with other API Proxies like Ambassador, Kong, Envoy, and many more. */ -func (a *Client) Decisions(params *DecisionsParams) (*DecisionsOK, error) { +func (a *Client) Decisions(params *DecisionsParams, opts ...ClientOption) (*DecisionsOK, error) { // TODO: Validate the params before sending if params == nil { params = NewDecisionsParams() } - - result, err := a.transport.Submit(&runtime.ClientOperation{ + op := &runtime.ClientOperation{ ID: "decisions", Method: "GET", PathPattern: "/decisions", @@ -70,7 +72,12 @@ func (a *Client) Decisions(params *DecisionsParams) (*DecisionsOK, error) { Reader: &DecisionsReader{formats: a.formats}, Context: params.Context, Client: params.HTTPClient, - }) + } + for _, opt := range opts { + opt(op) + } + + result, err := a.transport.Submit(op) if err != nil { return nil, err } @@ -85,17 +92,16 @@ func (a *Client) Decisions(params *DecisionsParams) (*DecisionsOK, error) { } /* - GetRule retrieves a rule +GetRule retrieves a rule - Use this method to retrieve a rule from the storage. If it does not exist you will receive a 404 error. +Use this method to retrieve a rule from the storage. If it does not exist you will receive a 404 error. */ -func (a *Client) GetRule(params *GetRuleParams) (*GetRuleOK, error) { +func (a *Client) GetRule(params *GetRuleParams, opts ...ClientOption) (*GetRuleOK, error) { // TODO: Validate the params before sending if params == nil { params = NewGetRuleParams() } - - result, err := a.transport.Submit(&runtime.ClientOperation{ + op := &runtime.ClientOperation{ ID: "getRule", Method: "GET", PathPattern: "/rules/{id}", @@ -106,7 +112,12 @@ func (a *Client) GetRule(params *GetRuleParams) (*GetRuleOK, error) { Reader: &GetRuleReader{formats: a.formats}, Context: params.Context, Client: params.HTTPClient, - }) + } + for _, opt := range opts { + opt(op) + } + + result, err := a.transport.Submit(op) if err != nil { return nil, err } @@ -121,9 +132,9 @@ func (a *Client) GetRule(params *GetRuleParams) (*GetRuleOK, error) { } /* - GetVersion gets service version + GetVersion gets service version - This endpoint returns the service version typically notated using semantic versioning. + This endpoint returns the service version typically notated using semantic versioning. If the service supports TLS Edge Termination, this endpoint does not require the `X-Forwarded-Proto` header to be set. @@ -131,13 +142,12 @@ If the service supports TLS Edge Termination, this endpoint does not require the Be aware that if you are running multiple nodes of this service, the health status will never refer to the cluster state, only to a single instance. */ -func (a *Client) GetVersion(params *GetVersionParams) (*GetVersionOK, error) { +func (a *Client) GetVersion(params *GetVersionParams, opts ...ClientOption) (*GetVersionOK, error) { // TODO: Validate the params before sending if params == nil { params = NewGetVersionParams() } - - result, err := a.transport.Submit(&runtime.ClientOperation{ + op := &runtime.ClientOperation{ ID: "getVersion", Method: "GET", PathPattern: "/version", @@ -148,7 +158,12 @@ func (a *Client) GetVersion(params *GetVersionParams) (*GetVersionOK, error) { Reader: &GetVersionReader{formats: a.formats}, Context: params.Context, Client: params.HTTPClient, - }) + } + for _, opt := range opts { + opt(op) + } + + result, err := a.transport.Submit(op) if err != nil { return nil, err } @@ -163,17 +178,16 @@ func (a *Client) GetVersion(params *GetVersionParams) (*GetVersionOK, error) { } /* - GetWellKnownJSONWebKeys lists cryptographic keys +GetWellKnownJSONWebKeys lists cryptographic keys - This endpoint returns cryptographic keys that are required to, for example, verify signatures of ID Tokens. +This endpoint returns cryptographic keys that are required to, for example, verify signatures of ID Tokens. */ -func (a *Client) GetWellKnownJSONWebKeys(params *GetWellKnownJSONWebKeysParams) (*GetWellKnownJSONWebKeysOK, error) { +func (a *Client) GetWellKnownJSONWebKeys(params *GetWellKnownJSONWebKeysParams, opts ...ClientOption) (*GetWellKnownJSONWebKeysOK, error) { // TODO: Validate the params before sending if params == nil { params = NewGetWellKnownJSONWebKeysParams() } - - result, err := a.transport.Submit(&runtime.ClientOperation{ + op := &runtime.ClientOperation{ ID: "getWellKnownJSONWebKeys", Method: "GET", PathPattern: "/.well-known/jwks.json", @@ -184,7 +198,12 @@ func (a *Client) GetWellKnownJSONWebKeys(params *GetWellKnownJSONWebKeysParams) Reader: &GetWellKnownJSONWebKeysReader{formats: a.formats}, Context: params.Context, Client: params.HTTPClient, - }) + } + for _, opt := range opts { + opt(op) + } + + result, err := a.transport.Submit(op) if err != nil { return nil, err } @@ -199,9 +218,10 @@ func (a *Client) GetWellKnownJSONWebKeys(params *GetWellKnownJSONWebKeysParams) } /* - IsInstanceAlive checks alive status + IsInstanceAlive checks alive status + + This endpoint returns a 200 status code when the HTTP server is up running. - This endpoint returns a 200 status code when the HTTP server is up running. This status does currently not include checks whether the database connection is working. If the service supports TLS Edge Termination, this endpoint does not require the @@ -210,13 +230,12 @@ If the service supports TLS Edge Termination, this endpoint does not require the Be aware that if you are running multiple nodes of this service, the health status will never refer to the cluster state, only to a single instance. */ -func (a *Client) IsInstanceAlive(params *IsInstanceAliveParams) (*IsInstanceAliveOK, error) { +func (a *Client) IsInstanceAlive(params *IsInstanceAliveParams, opts ...ClientOption) (*IsInstanceAliveOK, error) { // TODO: Validate the params before sending if params == nil { params = NewIsInstanceAliveParams() } - - result, err := a.transport.Submit(&runtime.ClientOperation{ + op := &runtime.ClientOperation{ ID: "isInstanceAlive", Method: "GET", PathPattern: "/health/alive", @@ -227,7 +246,12 @@ func (a *Client) IsInstanceAlive(params *IsInstanceAliveParams) (*IsInstanceAliv Reader: &IsInstanceAliveReader{formats: a.formats}, Context: params.Context, Client: params.HTTPClient, - }) + } + for _, opt := range opts { + opt(op) + } + + result, err := a.transport.Submit(op) if err != nil { return nil, err } @@ -242,9 +266,10 @@ func (a *Client) IsInstanceAlive(params *IsInstanceAliveParams) (*IsInstanceAliv } /* - IsInstanceReady checks readiness status + IsInstanceReady checks readiness status + + This endpoint returns a 200 status code when the HTTP server is up running and the environment dependencies (e.g. - This endpoint returns a 200 status code when the HTTP server is up running and the environment dependencies (e.g. the database) are responsive as well. If the service supports TLS Edge Termination, this endpoint does not require the @@ -253,13 +278,12 @@ If the service supports TLS Edge Termination, this endpoint does not require the Be aware that if you are running multiple nodes of this service, the health status will never refer to the cluster state, only to a single instance. */ -func (a *Client) IsInstanceReady(params *IsInstanceReadyParams) (*IsInstanceReadyOK, error) { +func (a *Client) IsInstanceReady(params *IsInstanceReadyParams, opts ...ClientOption) (*IsInstanceReadyOK, error) { // TODO: Validate the params before sending if params == nil { params = NewIsInstanceReadyParams() } - - result, err := a.transport.Submit(&runtime.ClientOperation{ + op := &runtime.ClientOperation{ ID: "isInstanceReady", Method: "GET", PathPattern: "/health/ready", @@ -270,7 +294,12 @@ func (a *Client) IsInstanceReady(params *IsInstanceReadyParams) (*IsInstanceRead Reader: &IsInstanceReadyReader{formats: a.formats}, Context: params.Context, Client: params.HTTPClient, - }) + } + for _, opt := range opts { + opt(op) + } + + result, err := a.transport.Submit(op) if err != nil { return nil, err } @@ -285,18 +314,18 @@ func (a *Client) IsInstanceReady(params *IsInstanceReadyParams) (*IsInstanceRead } /* - ListRules lists all rules + ListRules lists all rules + + This method returns an array of all rules that are stored in the backend. This is useful if you want to get a full - This method returns an array of all rules that are stored in the backend. This is useful if you want to get a full view of what rules you have currently in place. */ -func (a *Client) ListRules(params *ListRulesParams) (*ListRulesOK, error) { +func (a *Client) ListRules(params *ListRulesParams, opts ...ClientOption) (*ListRulesOK, error) { // TODO: Validate the params before sending if params == nil { params = NewListRulesParams() } - - result, err := a.transport.Submit(&runtime.ClientOperation{ + op := &runtime.ClientOperation{ ID: "listRules", Method: "GET", PathPattern: "/rules", @@ -307,7 +336,12 @@ func (a *Client) ListRules(params *ListRulesParams) (*ListRulesOK, error) { Reader: &ListRulesReader{formats: a.formats}, Context: params.Context, Client: params.HTTPClient, - }) + } + for _, opt := range opts { + opt(op) + } + + result, err := a.transport.Submit(op) if err != nil { return nil, err } diff --git a/internal/httpclient/client/api/decisions_parameters.go b/internal/httpclient/client/api/decisions_parameters.go index 370e75873b..6950d28a66 100644 --- a/internal/httpclient/client/api/decisions_parameters.go +++ b/internal/httpclient/client/api/decisions_parameters.go @@ -16,47 +16,48 @@ import ( "github.com/go-openapi/strfmt" ) -// NewDecisionsParams creates a new DecisionsParams object -// with the default values initialized. +// NewDecisionsParams creates a new DecisionsParams object, +// with the default timeout for this client. +// +// Default values are not hydrated, since defaults are normally applied by the API server side. +// +// To enforce default values in parameter, use SetDefaults or WithDefaults. func NewDecisionsParams() *DecisionsParams { - return &DecisionsParams{ - timeout: cr.DefaultTimeout, } } // NewDecisionsParamsWithTimeout creates a new DecisionsParams object -// with the default values initialized, and the ability to set a timeout on a request +// with the ability to set a timeout on a request. func NewDecisionsParamsWithTimeout(timeout time.Duration) *DecisionsParams { - return &DecisionsParams{ - timeout: timeout, } } // NewDecisionsParamsWithContext creates a new DecisionsParams object -// with the default values initialized, and the ability to set a context for a request +// with the ability to set a context for a request. func NewDecisionsParamsWithContext(ctx context.Context) *DecisionsParams { - return &DecisionsParams{ - Context: ctx, } } // NewDecisionsParamsWithHTTPClient creates a new DecisionsParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request +// with the ability to set a custom HTTPClient for a request. func NewDecisionsParamsWithHTTPClient(client *http.Client) *DecisionsParams { - return &DecisionsParams{ HTTPClient: client, } } -/*DecisionsParams contains all the parameters to send to the API endpoint -for the decisions operation typically these are written to a http.Request +/* +DecisionsParams contains all the parameters to send to the API endpoint + + for the decisions operation. + + Typically these are written to a http.Request. */ type DecisionsParams struct { timeout time.Duration @@ -64,6 +65,21 @@ type DecisionsParams struct { HTTPClient *http.Client } +// WithDefaults hydrates default values in the decisions params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *DecisionsParams) WithDefaults() *DecisionsParams { + o.SetDefaults() + return o +} + +// SetDefaults hydrates default values in the decisions params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *DecisionsParams) SetDefaults() { + // no default values defined for this parameter +} + // WithTimeout adds the timeout to the decisions params func (o *DecisionsParams) WithTimeout(timeout time.Duration) *DecisionsParams { o.SetTimeout(timeout) diff --git a/internal/httpclient/client/api/decisions_responses.go b/internal/httpclient/client/api/decisions_responses.go index f0be70ca98..a02c7dc029 100644 --- a/internal/httpclient/client/api/decisions_responses.go +++ b/internal/httpclient/client/api/decisions_responses.go @@ -53,7 +53,6 @@ func (o *DecisionsReader) ReadResponse(response runtime.ClientResponse, consumer return nil, err } return nil, result - default: return nil, runtime.NewAPIError("response status code does not match any response statuses defined for this endpoint in the swagger spec", response, response.Code()) } @@ -64,17 +63,47 @@ func NewDecisionsOK() *DecisionsOK { return &DecisionsOK{} } -/*DecisionsOK handles this case with default header values. +/* +DecisionsOK describes a response with status code 200, with default header values. An empty response */ type DecisionsOK struct { } +// IsSuccess returns true when this decisions o k response has a 2xx status code +func (o *DecisionsOK) IsSuccess() bool { + return true +} + +// IsRedirect returns true when this decisions o k response has a 3xx status code +func (o *DecisionsOK) IsRedirect() bool { + return false +} + +// IsClientError returns true when this decisions o k response has a 4xx status code +func (o *DecisionsOK) IsClientError() bool { + return false +} + +// IsServerError returns true when this decisions o k response has a 5xx status code +func (o *DecisionsOK) IsServerError() bool { + return false +} + +// IsCode returns true when this decisions o k response a status code equal to that given +func (o *DecisionsOK) IsCode(code int) bool { + return code == 200 +} + func (o *DecisionsOK) Error() string { return fmt.Sprintf("[GET /decisions][%d] decisionsOK ", 200) } +func (o *DecisionsOK) String() string { + return fmt.Sprintf("[GET /decisions][%d] decisionsOK ", 200) +} + func (o *DecisionsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { return nil @@ -85,7 +114,8 @@ func NewDecisionsUnauthorized() *DecisionsUnauthorized { return &DecisionsUnauthorized{} } -/*DecisionsUnauthorized handles this case with default header values. +/* +DecisionsUnauthorized describes a response with status code 401, with default header values. genericError */ @@ -93,10 +123,39 @@ type DecisionsUnauthorized struct { Payload *models.GenericError } +// IsSuccess returns true when this decisions unauthorized response has a 2xx status code +func (o *DecisionsUnauthorized) IsSuccess() bool { + return false +} + +// IsRedirect returns true when this decisions unauthorized response has a 3xx status code +func (o *DecisionsUnauthorized) IsRedirect() bool { + return false +} + +// IsClientError returns true when this decisions unauthorized response has a 4xx status code +func (o *DecisionsUnauthorized) IsClientError() bool { + return true +} + +// IsServerError returns true when this decisions unauthorized response has a 5xx status code +func (o *DecisionsUnauthorized) IsServerError() bool { + return false +} + +// IsCode returns true when this decisions unauthorized response a status code equal to that given +func (o *DecisionsUnauthorized) IsCode(code int) bool { + return code == 401 +} + func (o *DecisionsUnauthorized) Error() string { return fmt.Sprintf("[GET /decisions][%d] decisionsUnauthorized %+v", 401, o.Payload) } +func (o *DecisionsUnauthorized) String() string { + return fmt.Sprintf("[GET /decisions][%d] decisionsUnauthorized %+v", 401, o.Payload) +} + func (o *DecisionsUnauthorized) GetPayload() *models.GenericError { return o.Payload } @@ -118,7 +177,8 @@ func NewDecisionsForbidden() *DecisionsForbidden { return &DecisionsForbidden{} } -/*DecisionsForbidden handles this case with default header values. +/* +DecisionsForbidden describes a response with status code 403, with default header values. genericError */ @@ -126,10 +186,39 @@ type DecisionsForbidden struct { Payload *models.GenericError } +// IsSuccess returns true when this decisions forbidden response has a 2xx status code +func (o *DecisionsForbidden) IsSuccess() bool { + return false +} + +// IsRedirect returns true when this decisions forbidden response has a 3xx status code +func (o *DecisionsForbidden) IsRedirect() bool { + return false +} + +// IsClientError returns true when this decisions forbidden response has a 4xx status code +func (o *DecisionsForbidden) IsClientError() bool { + return true +} + +// IsServerError returns true when this decisions forbidden response has a 5xx status code +func (o *DecisionsForbidden) IsServerError() bool { + return false +} + +// IsCode returns true when this decisions forbidden response a status code equal to that given +func (o *DecisionsForbidden) IsCode(code int) bool { + return code == 403 +} + func (o *DecisionsForbidden) Error() string { return fmt.Sprintf("[GET /decisions][%d] decisionsForbidden %+v", 403, o.Payload) } +func (o *DecisionsForbidden) String() string { + return fmt.Sprintf("[GET /decisions][%d] decisionsForbidden %+v", 403, o.Payload) +} + func (o *DecisionsForbidden) GetPayload() *models.GenericError { return o.Payload } @@ -151,7 +240,8 @@ func NewDecisionsNotFound() *DecisionsNotFound { return &DecisionsNotFound{} } -/*DecisionsNotFound handles this case with default header values. +/* +DecisionsNotFound describes a response with status code 404, with default header values. genericError */ @@ -159,10 +249,39 @@ type DecisionsNotFound struct { Payload *models.GenericError } +// IsSuccess returns true when this decisions not found response has a 2xx status code +func (o *DecisionsNotFound) IsSuccess() bool { + return false +} + +// IsRedirect returns true when this decisions not found response has a 3xx status code +func (o *DecisionsNotFound) IsRedirect() bool { + return false +} + +// IsClientError returns true when this decisions not found response has a 4xx status code +func (o *DecisionsNotFound) IsClientError() bool { + return true +} + +// IsServerError returns true when this decisions not found response has a 5xx status code +func (o *DecisionsNotFound) IsServerError() bool { + return false +} + +// IsCode returns true when this decisions not found response a status code equal to that given +func (o *DecisionsNotFound) IsCode(code int) bool { + return code == 404 +} + func (o *DecisionsNotFound) Error() string { return fmt.Sprintf("[GET /decisions][%d] decisionsNotFound %+v", 404, o.Payload) } +func (o *DecisionsNotFound) String() string { + return fmt.Sprintf("[GET /decisions][%d] decisionsNotFound %+v", 404, o.Payload) +} + func (o *DecisionsNotFound) GetPayload() *models.GenericError { return o.Payload } @@ -184,7 +303,8 @@ func NewDecisionsInternalServerError() *DecisionsInternalServerError { return &DecisionsInternalServerError{} } -/*DecisionsInternalServerError handles this case with default header values. +/* +DecisionsInternalServerError describes a response with status code 500, with default header values. genericError */ @@ -192,10 +312,39 @@ type DecisionsInternalServerError struct { Payload *models.GenericError } +// IsSuccess returns true when this decisions internal server error response has a 2xx status code +func (o *DecisionsInternalServerError) IsSuccess() bool { + return false +} + +// IsRedirect returns true when this decisions internal server error response has a 3xx status code +func (o *DecisionsInternalServerError) IsRedirect() bool { + return false +} + +// IsClientError returns true when this decisions internal server error response has a 4xx status code +func (o *DecisionsInternalServerError) IsClientError() bool { + return false +} + +// IsServerError returns true when this decisions internal server error response has a 5xx status code +func (o *DecisionsInternalServerError) IsServerError() bool { + return true +} + +// IsCode returns true when this decisions internal server error response a status code equal to that given +func (o *DecisionsInternalServerError) IsCode(code int) bool { + return code == 500 +} + func (o *DecisionsInternalServerError) Error() string { return fmt.Sprintf("[GET /decisions][%d] decisionsInternalServerError %+v", 500, o.Payload) } +func (o *DecisionsInternalServerError) String() string { + return fmt.Sprintf("[GET /decisions][%d] decisionsInternalServerError %+v", 500, o.Payload) +} + func (o *DecisionsInternalServerError) GetPayload() *models.GenericError { return o.Payload } diff --git a/internal/httpclient/client/api/get_rule_parameters.go b/internal/httpclient/client/api/get_rule_parameters.go index 570a2578f1..cb20665919 100644 --- a/internal/httpclient/client/api/get_rule_parameters.go +++ b/internal/httpclient/client/api/get_rule_parameters.go @@ -16,51 +16,52 @@ import ( "github.com/go-openapi/strfmt" ) -// NewGetRuleParams creates a new GetRuleParams object -// with the default values initialized. +// NewGetRuleParams creates a new GetRuleParams object, +// with the default timeout for this client. +// +// Default values are not hydrated, since defaults are normally applied by the API server side. +// +// To enforce default values in parameter, use SetDefaults or WithDefaults. func NewGetRuleParams() *GetRuleParams { - var () return &GetRuleParams{ - timeout: cr.DefaultTimeout, } } // NewGetRuleParamsWithTimeout creates a new GetRuleParams object -// with the default values initialized, and the ability to set a timeout on a request +// with the ability to set a timeout on a request. func NewGetRuleParamsWithTimeout(timeout time.Duration) *GetRuleParams { - var () return &GetRuleParams{ - timeout: timeout, } } // NewGetRuleParamsWithContext creates a new GetRuleParams object -// with the default values initialized, and the ability to set a context for a request +// with the ability to set a context for a request. func NewGetRuleParamsWithContext(ctx context.Context) *GetRuleParams { - var () return &GetRuleParams{ - Context: ctx, } } // NewGetRuleParamsWithHTTPClient creates a new GetRuleParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request +// with the ability to set a custom HTTPClient for a request. func NewGetRuleParamsWithHTTPClient(client *http.Client) *GetRuleParams { - var () return &GetRuleParams{ HTTPClient: client, } } -/*GetRuleParams contains all the parameters to send to the API endpoint -for the get rule operation typically these are written to a http.Request +/* +GetRuleParams contains all the parameters to send to the API endpoint + + for the get rule operation. + + Typically these are written to a http.Request. */ type GetRuleParams struct { - /*ID*/ + // ID. ID string timeout time.Duration @@ -68,6 +69,21 @@ type GetRuleParams struct { HTTPClient *http.Client } +// WithDefaults hydrates default values in the get rule params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *GetRuleParams) WithDefaults() *GetRuleParams { + o.SetDefaults() + return o +} + +// SetDefaults hydrates default values in the get rule params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *GetRuleParams) SetDefaults() { + // no default values defined for this parameter +} + // WithTimeout adds the timeout to the get rule params func (o *GetRuleParams) WithTimeout(timeout time.Duration) *GetRuleParams { o.SetTimeout(timeout) diff --git a/internal/httpclient/client/api/get_rule_responses.go b/internal/httpclient/client/api/get_rule_responses.go index d9a500d4e7..4c820635dd 100644 --- a/internal/httpclient/client/api/get_rule_responses.go +++ b/internal/httpclient/client/api/get_rule_responses.go @@ -41,7 +41,6 @@ func (o *GetRuleReader) ReadResponse(response runtime.ClientResponse, consumer r return nil, err } return nil, result - default: return nil, runtime.NewAPIError("response status code does not match any response statuses defined for this endpoint in the swagger spec", response, response.Code()) } @@ -52,7 +51,8 @@ func NewGetRuleOK() *GetRuleOK { return &GetRuleOK{} } -/*GetRuleOK handles this case with default header values. +/* +GetRuleOK describes a response with status code 200, with default header values. A rule */ @@ -60,10 +60,39 @@ type GetRuleOK struct { Payload *models.Rule } +// IsSuccess returns true when this get rule o k response has a 2xx status code +func (o *GetRuleOK) IsSuccess() bool { + return true +} + +// IsRedirect returns true when this get rule o k response has a 3xx status code +func (o *GetRuleOK) IsRedirect() bool { + return false +} + +// IsClientError returns true when this get rule o k response has a 4xx status code +func (o *GetRuleOK) IsClientError() bool { + return false +} + +// IsServerError returns true when this get rule o k response has a 5xx status code +func (o *GetRuleOK) IsServerError() bool { + return false +} + +// IsCode returns true when this get rule o k response a status code equal to that given +func (o *GetRuleOK) IsCode(code int) bool { + return code == 200 +} + func (o *GetRuleOK) Error() string { return fmt.Sprintf("[GET /rules/{id}][%d] getRuleOK %+v", 200, o.Payload) } +func (o *GetRuleOK) String() string { + return fmt.Sprintf("[GET /rules/{id}][%d] getRuleOK %+v", 200, o.Payload) +} + func (o *GetRuleOK) GetPayload() *models.Rule { return o.Payload } @@ -85,7 +114,8 @@ func NewGetRuleNotFound() *GetRuleNotFound { return &GetRuleNotFound{} } -/*GetRuleNotFound handles this case with default header values. +/* +GetRuleNotFound describes a response with status code 404, with default header values. genericError */ @@ -93,10 +123,39 @@ type GetRuleNotFound struct { Payload *models.GenericError } +// IsSuccess returns true when this get rule not found response has a 2xx status code +func (o *GetRuleNotFound) IsSuccess() bool { + return false +} + +// IsRedirect returns true when this get rule not found response has a 3xx status code +func (o *GetRuleNotFound) IsRedirect() bool { + return false +} + +// IsClientError returns true when this get rule not found response has a 4xx status code +func (o *GetRuleNotFound) IsClientError() bool { + return true +} + +// IsServerError returns true when this get rule not found response has a 5xx status code +func (o *GetRuleNotFound) IsServerError() bool { + return false +} + +// IsCode returns true when this get rule not found response a status code equal to that given +func (o *GetRuleNotFound) IsCode(code int) bool { + return code == 404 +} + func (o *GetRuleNotFound) Error() string { return fmt.Sprintf("[GET /rules/{id}][%d] getRuleNotFound %+v", 404, o.Payload) } +func (o *GetRuleNotFound) String() string { + return fmt.Sprintf("[GET /rules/{id}][%d] getRuleNotFound %+v", 404, o.Payload) +} + func (o *GetRuleNotFound) GetPayload() *models.GenericError { return o.Payload } @@ -118,7 +177,8 @@ func NewGetRuleInternalServerError() *GetRuleInternalServerError { return &GetRuleInternalServerError{} } -/*GetRuleInternalServerError handles this case with default header values. +/* +GetRuleInternalServerError describes a response with status code 500, with default header values. genericError */ @@ -126,10 +186,39 @@ type GetRuleInternalServerError struct { Payload *models.GenericError } +// IsSuccess returns true when this get rule internal server error response has a 2xx status code +func (o *GetRuleInternalServerError) IsSuccess() bool { + return false +} + +// IsRedirect returns true when this get rule internal server error response has a 3xx status code +func (o *GetRuleInternalServerError) IsRedirect() bool { + return false +} + +// IsClientError returns true when this get rule internal server error response has a 4xx status code +func (o *GetRuleInternalServerError) IsClientError() bool { + return false +} + +// IsServerError returns true when this get rule internal server error response has a 5xx status code +func (o *GetRuleInternalServerError) IsServerError() bool { + return true +} + +// IsCode returns true when this get rule internal server error response a status code equal to that given +func (o *GetRuleInternalServerError) IsCode(code int) bool { + return code == 500 +} + func (o *GetRuleInternalServerError) Error() string { return fmt.Sprintf("[GET /rules/{id}][%d] getRuleInternalServerError %+v", 500, o.Payload) } +func (o *GetRuleInternalServerError) String() string { + return fmt.Sprintf("[GET /rules/{id}][%d] getRuleInternalServerError %+v", 500, o.Payload) +} + func (o *GetRuleInternalServerError) GetPayload() *models.GenericError { return o.Payload } diff --git a/internal/httpclient/client/api/get_version_parameters.go b/internal/httpclient/client/api/get_version_parameters.go index de8a4c4cc7..cc91b5a58b 100644 --- a/internal/httpclient/client/api/get_version_parameters.go +++ b/internal/httpclient/client/api/get_version_parameters.go @@ -16,47 +16,48 @@ import ( "github.com/go-openapi/strfmt" ) -// NewGetVersionParams creates a new GetVersionParams object -// with the default values initialized. +// NewGetVersionParams creates a new GetVersionParams object, +// with the default timeout for this client. +// +// Default values are not hydrated, since defaults are normally applied by the API server side. +// +// To enforce default values in parameter, use SetDefaults or WithDefaults. func NewGetVersionParams() *GetVersionParams { - return &GetVersionParams{ - timeout: cr.DefaultTimeout, } } // NewGetVersionParamsWithTimeout creates a new GetVersionParams object -// with the default values initialized, and the ability to set a timeout on a request +// with the ability to set a timeout on a request. func NewGetVersionParamsWithTimeout(timeout time.Duration) *GetVersionParams { - return &GetVersionParams{ - timeout: timeout, } } // NewGetVersionParamsWithContext creates a new GetVersionParams object -// with the default values initialized, and the ability to set a context for a request +// with the ability to set a context for a request. func NewGetVersionParamsWithContext(ctx context.Context) *GetVersionParams { - return &GetVersionParams{ - Context: ctx, } } // NewGetVersionParamsWithHTTPClient creates a new GetVersionParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request +// with the ability to set a custom HTTPClient for a request. func NewGetVersionParamsWithHTTPClient(client *http.Client) *GetVersionParams { - return &GetVersionParams{ HTTPClient: client, } } -/*GetVersionParams contains all the parameters to send to the API endpoint -for the get version operation typically these are written to a http.Request +/* +GetVersionParams contains all the parameters to send to the API endpoint + + for the get version operation. + + Typically these are written to a http.Request. */ type GetVersionParams struct { timeout time.Duration @@ -64,6 +65,21 @@ type GetVersionParams struct { HTTPClient *http.Client } +// WithDefaults hydrates default values in the get version params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *GetVersionParams) WithDefaults() *GetVersionParams { + o.SetDefaults() + return o +} + +// SetDefaults hydrates default values in the get version params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *GetVersionParams) SetDefaults() { + // no default values defined for this parameter +} + // WithTimeout adds the timeout to the get version params func (o *GetVersionParams) WithTimeout(timeout time.Duration) *GetVersionParams { o.SetTimeout(timeout) diff --git a/internal/httpclient/client/api/get_version_responses.go b/internal/httpclient/client/api/get_version_responses.go index c801efe552..65b842bbb7 100644 --- a/internal/httpclient/client/api/get_version_responses.go +++ b/internal/httpclient/client/api/get_version_responses.go @@ -29,7 +29,6 @@ func (o *GetVersionReader) ReadResponse(response runtime.ClientResponse, consume return nil, err } return result, nil - default: return nil, runtime.NewAPIError("response status code does not match any response statuses defined for this endpoint in the swagger spec", response, response.Code()) } @@ -40,7 +39,8 @@ func NewGetVersionOK() *GetVersionOK { return &GetVersionOK{} } -/*GetVersionOK handles this case with default header values. +/* +GetVersionOK describes a response with status code 200, with default header values. version */ @@ -48,10 +48,39 @@ type GetVersionOK struct { Payload *models.Version } +// IsSuccess returns true when this get version o k response has a 2xx status code +func (o *GetVersionOK) IsSuccess() bool { + return true +} + +// IsRedirect returns true when this get version o k response has a 3xx status code +func (o *GetVersionOK) IsRedirect() bool { + return false +} + +// IsClientError returns true when this get version o k response has a 4xx status code +func (o *GetVersionOK) IsClientError() bool { + return false +} + +// IsServerError returns true when this get version o k response has a 5xx status code +func (o *GetVersionOK) IsServerError() bool { + return false +} + +// IsCode returns true when this get version o k response a status code equal to that given +func (o *GetVersionOK) IsCode(code int) bool { + return code == 200 +} + func (o *GetVersionOK) Error() string { return fmt.Sprintf("[GET /version][%d] getVersionOK %+v", 200, o.Payload) } +func (o *GetVersionOK) String() string { + return fmt.Sprintf("[GET /version][%d] getVersionOK %+v", 200, o.Payload) +} + func (o *GetVersionOK) GetPayload() *models.Version { return o.Payload } diff --git a/internal/httpclient/client/api/get_well_known_json_web_keys_parameters.go b/internal/httpclient/client/api/get_well_known_json_web_keys_parameters.go index 3068e145e4..eb69470d96 100644 --- a/internal/httpclient/client/api/get_well_known_json_web_keys_parameters.go +++ b/internal/httpclient/client/api/get_well_known_json_web_keys_parameters.go @@ -16,47 +16,48 @@ import ( "github.com/go-openapi/strfmt" ) -// NewGetWellKnownJSONWebKeysParams creates a new GetWellKnownJSONWebKeysParams object -// with the default values initialized. +// NewGetWellKnownJSONWebKeysParams creates a new GetWellKnownJSONWebKeysParams object, +// with the default timeout for this client. +// +// Default values are not hydrated, since defaults are normally applied by the API server side. +// +// To enforce default values in parameter, use SetDefaults or WithDefaults. func NewGetWellKnownJSONWebKeysParams() *GetWellKnownJSONWebKeysParams { - return &GetWellKnownJSONWebKeysParams{ - timeout: cr.DefaultTimeout, } } // NewGetWellKnownJSONWebKeysParamsWithTimeout creates a new GetWellKnownJSONWebKeysParams object -// with the default values initialized, and the ability to set a timeout on a request +// with the ability to set a timeout on a request. func NewGetWellKnownJSONWebKeysParamsWithTimeout(timeout time.Duration) *GetWellKnownJSONWebKeysParams { - return &GetWellKnownJSONWebKeysParams{ - timeout: timeout, } } // NewGetWellKnownJSONWebKeysParamsWithContext creates a new GetWellKnownJSONWebKeysParams object -// with the default values initialized, and the ability to set a context for a request +// with the ability to set a context for a request. func NewGetWellKnownJSONWebKeysParamsWithContext(ctx context.Context) *GetWellKnownJSONWebKeysParams { - return &GetWellKnownJSONWebKeysParams{ - Context: ctx, } } // NewGetWellKnownJSONWebKeysParamsWithHTTPClient creates a new GetWellKnownJSONWebKeysParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request +// with the ability to set a custom HTTPClient for a request. func NewGetWellKnownJSONWebKeysParamsWithHTTPClient(client *http.Client) *GetWellKnownJSONWebKeysParams { - return &GetWellKnownJSONWebKeysParams{ HTTPClient: client, } } -/*GetWellKnownJSONWebKeysParams contains all the parameters to send to the API endpoint -for the get well known JSON web keys operation typically these are written to a http.Request +/* +GetWellKnownJSONWebKeysParams contains all the parameters to send to the API endpoint + + for the get well known JSON web keys operation. + + Typically these are written to a http.Request. */ type GetWellKnownJSONWebKeysParams struct { timeout time.Duration @@ -64,6 +65,21 @@ type GetWellKnownJSONWebKeysParams struct { HTTPClient *http.Client } +// WithDefaults hydrates default values in the get well known JSON web keys params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *GetWellKnownJSONWebKeysParams) WithDefaults() *GetWellKnownJSONWebKeysParams { + o.SetDefaults() + return o +} + +// SetDefaults hydrates default values in the get well known JSON web keys params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *GetWellKnownJSONWebKeysParams) SetDefaults() { + // no default values defined for this parameter +} + // WithTimeout adds the timeout to the get well known JSON web keys params func (o *GetWellKnownJSONWebKeysParams) WithTimeout(timeout time.Duration) *GetWellKnownJSONWebKeysParams { o.SetTimeout(timeout) diff --git a/internal/httpclient/client/api/get_well_known_json_web_keys_responses.go b/internal/httpclient/client/api/get_well_known_json_web_keys_responses.go index f134ff3c46..d893381d0e 100644 --- a/internal/httpclient/client/api/get_well_known_json_web_keys_responses.go +++ b/internal/httpclient/client/api/get_well_known_json_web_keys_responses.go @@ -35,7 +35,6 @@ func (o *GetWellKnownJSONWebKeysReader) ReadResponse(response runtime.ClientResp return nil, err } return nil, result - default: return nil, runtime.NewAPIError("response status code does not match any response statuses defined for this endpoint in the swagger spec", response, response.Code()) } @@ -46,7 +45,8 @@ func NewGetWellKnownJSONWebKeysOK() *GetWellKnownJSONWebKeysOK { return &GetWellKnownJSONWebKeysOK{} } -/*GetWellKnownJSONWebKeysOK handles this case with default header values. +/* +GetWellKnownJSONWebKeysOK describes a response with status code 200, with default header values. jsonWebKeySet */ @@ -54,10 +54,39 @@ type GetWellKnownJSONWebKeysOK struct { Payload *models.JSONWebKeySet } +// IsSuccess returns true when this get well known Json web keys o k response has a 2xx status code +func (o *GetWellKnownJSONWebKeysOK) IsSuccess() bool { + return true +} + +// IsRedirect returns true when this get well known Json web keys o k response has a 3xx status code +func (o *GetWellKnownJSONWebKeysOK) IsRedirect() bool { + return false +} + +// IsClientError returns true when this get well known Json web keys o k response has a 4xx status code +func (o *GetWellKnownJSONWebKeysOK) IsClientError() bool { + return false +} + +// IsServerError returns true when this get well known Json web keys o k response has a 5xx status code +func (o *GetWellKnownJSONWebKeysOK) IsServerError() bool { + return false +} + +// IsCode returns true when this get well known Json web keys o k response a status code equal to that given +func (o *GetWellKnownJSONWebKeysOK) IsCode(code int) bool { + return code == 200 +} + func (o *GetWellKnownJSONWebKeysOK) Error() string { return fmt.Sprintf("[GET /.well-known/jwks.json][%d] getWellKnownJsonWebKeysOK %+v", 200, o.Payload) } +func (o *GetWellKnownJSONWebKeysOK) String() string { + return fmt.Sprintf("[GET /.well-known/jwks.json][%d] getWellKnownJsonWebKeysOK %+v", 200, o.Payload) +} + func (o *GetWellKnownJSONWebKeysOK) GetPayload() *models.JSONWebKeySet { return o.Payload } @@ -79,7 +108,8 @@ func NewGetWellKnownJSONWebKeysInternalServerError() *GetWellKnownJSONWebKeysInt return &GetWellKnownJSONWebKeysInternalServerError{} } -/*GetWellKnownJSONWebKeysInternalServerError handles this case with default header values. +/* +GetWellKnownJSONWebKeysInternalServerError describes a response with status code 500, with default header values. genericError */ @@ -87,10 +117,39 @@ type GetWellKnownJSONWebKeysInternalServerError struct { Payload *models.GenericError } +// IsSuccess returns true when this get well known Json web keys internal server error response has a 2xx status code +func (o *GetWellKnownJSONWebKeysInternalServerError) IsSuccess() bool { + return false +} + +// IsRedirect returns true when this get well known Json web keys internal server error response has a 3xx status code +func (o *GetWellKnownJSONWebKeysInternalServerError) IsRedirect() bool { + return false +} + +// IsClientError returns true when this get well known Json web keys internal server error response has a 4xx status code +func (o *GetWellKnownJSONWebKeysInternalServerError) IsClientError() bool { + return false +} + +// IsServerError returns true when this get well known Json web keys internal server error response has a 5xx status code +func (o *GetWellKnownJSONWebKeysInternalServerError) IsServerError() bool { + return true +} + +// IsCode returns true when this get well known Json web keys internal server error response a status code equal to that given +func (o *GetWellKnownJSONWebKeysInternalServerError) IsCode(code int) bool { + return code == 500 +} + func (o *GetWellKnownJSONWebKeysInternalServerError) Error() string { return fmt.Sprintf("[GET /.well-known/jwks.json][%d] getWellKnownJsonWebKeysInternalServerError %+v", 500, o.Payload) } +func (o *GetWellKnownJSONWebKeysInternalServerError) String() string { + return fmt.Sprintf("[GET /.well-known/jwks.json][%d] getWellKnownJsonWebKeysInternalServerError %+v", 500, o.Payload) +} + func (o *GetWellKnownJSONWebKeysInternalServerError) GetPayload() *models.GenericError { return o.Payload } diff --git a/internal/httpclient/client/api/is_instance_alive_parameters.go b/internal/httpclient/client/api/is_instance_alive_parameters.go index ac0dac22c9..0718f0f274 100644 --- a/internal/httpclient/client/api/is_instance_alive_parameters.go +++ b/internal/httpclient/client/api/is_instance_alive_parameters.go @@ -16,47 +16,48 @@ import ( "github.com/go-openapi/strfmt" ) -// NewIsInstanceAliveParams creates a new IsInstanceAliveParams object -// with the default values initialized. +// NewIsInstanceAliveParams creates a new IsInstanceAliveParams object, +// with the default timeout for this client. +// +// Default values are not hydrated, since defaults are normally applied by the API server side. +// +// To enforce default values in parameter, use SetDefaults or WithDefaults. func NewIsInstanceAliveParams() *IsInstanceAliveParams { - return &IsInstanceAliveParams{ - timeout: cr.DefaultTimeout, } } // NewIsInstanceAliveParamsWithTimeout creates a new IsInstanceAliveParams object -// with the default values initialized, and the ability to set a timeout on a request +// with the ability to set a timeout on a request. func NewIsInstanceAliveParamsWithTimeout(timeout time.Duration) *IsInstanceAliveParams { - return &IsInstanceAliveParams{ - timeout: timeout, } } // NewIsInstanceAliveParamsWithContext creates a new IsInstanceAliveParams object -// with the default values initialized, and the ability to set a context for a request +// with the ability to set a context for a request. func NewIsInstanceAliveParamsWithContext(ctx context.Context) *IsInstanceAliveParams { - return &IsInstanceAliveParams{ - Context: ctx, } } // NewIsInstanceAliveParamsWithHTTPClient creates a new IsInstanceAliveParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request +// with the ability to set a custom HTTPClient for a request. func NewIsInstanceAliveParamsWithHTTPClient(client *http.Client) *IsInstanceAliveParams { - return &IsInstanceAliveParams{ HTTPClient: client, } } -/*IsInstanceAliveParams contains all the parameters to send to the API endpoint -for the is instance alive operation typically these are written to a http.Request +/* +IsInstanceAliveParams contains all the parameters to send to the API endpoint + + for the is instance alive operation. + + Typically these are written to a http.Request. */ type IsInstanceAliveParams struct { timeout time.Duration @@ -64,6 +65,21 @@ type IsInstanceAliveParams struct { HTTPClient *http.Client } +// WithDefaults hydrates default values in the is instance alive params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *IsInstanceAliveParams) WithDefaults() *IsInstanceAliveParams { + o.SetDefaults() + return o +} + +// SetDefaults hydrates default values in the is instance alive params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *IsInstanceAliveParams) SetDefaults() { + // no default values defined for this parameter +} + // WithTimeout adds the timeout to the is instance alive params func (o *IsInstanceAliveParams) WithTimeout(timeout time.Duration) *IsInstanceAliveParams { o.SetTimeout(timeout) diff --git a/internal/httpclient/client/api/is_instance_alive_responses.go b/internal/httpclient/client/api/is_instance_alive_responses.go index d11c182b5e..0ae846c6a8 100644 --- a/internal/httpclient/client/api/is_instance_alive_responses.go +++ b/internal/httpclient/client/api/is_instance_alive_responses.go @@ -35,7 +35,6 @@ func (o *IsInstanceAliveReader) ReadResponse(response runtime.ClientResponse, co return nil, err } return nil, result - default: return nil, runtime.NewAPIError("response status code does not match any response statuses defined for this endpoint in the swagger spec", response, response.Code()) } @@ -46,7 +45,8 @@ func NewIsInstanceAliveOK() *IsInstanceAliveOK { return &IsInstanceAliveOK{} } -/*IsInstanceAliveOK handles this case with default header values. +/* +IsInstanceAliveOK describes a response with status code 200, with default header values. healthStatus */ @@ -54,10 +54,39 @@ type IsInstanceAliveOK struct { Payload *models.HealthStatus } +// IsSuccess returns true when this is instance alive o k response has a 2xx status code +func (o *IsInstanceAliveOK) IsSuccess() bool { + return true +} + +// IsRedirect returns true when this is instance alive o k response has a 3xx status code +func (o *IsInstanceAliveOK) IsRedirect() bool { + return false +} + +// IsClientError returns true when this is instance alive o k response has a 4xx status code +func (o *IsInstanceAliveOK) IsClientError() bool { + return false +} + +// IsServerError returns true when this is instance alive o k response has a 5xx status code +func (o *IsInstanceAliveOK) IsServerError() bool { + return false +} + +// IsCode returns true when this is instance alive o k response a status code equal to that given +func (o *IsInstanceAliveOK) IsCode(code int) bool { + return code == 200 +} + func (o *IsInstanceAliveOK) Error() string { return fmt.Sprintf("[GET /health/alive][%d] isInstanceAliveOK %+v", 200, o.Payload) } +func (o *IsInstanceAliveOK) String() string { + return fmt.Sprintf("[GET /health/alive][%d] isInstanceAliveOK %+v", 200, o.Payload) +} + func (o *IsInstanceAliveOK) GetPayload() *models.HealthStatus { return o.Payload } @@ -79,7 +108,8 @@ func NewIsInstanceAliveInternalServerError() *IsInstanceAliveInternalServerError return &IsInstanceAliveInternalServerError{} } -/*IsInstanceAliveInternalServerError handles this case with default header values. +/* +IsInstanceAliveInternalServerError describes a response with status code 500, with default header values. genericError */ @@ -87,10 +117,39 @@ type IsInstanceAliveInternalServerError struct { Payload *models.GenericError } +// IsSuccess returns true when this is instance alive internal server error response has a 2xx status code +func (o *IsInstanceAliveInternalServerError) IsSuccess() bool { + return false +} + +// IsRedirect returns true when this is instance alive internal server error response has a 3xx status code +func (o *IsInstanceAliveInternalServerError) IsRedirect() bool { + return false +} + +// IsClientError returns true when this is instance alive internal server error response has a 4xx status code +func (o *IsInstanceAliveInternalServerError) IsClientError() bool { + return false +} + +// IsServerError returns true when this is instance alive internal server error response has a 5xx status code +func (o *IsInstanceAliveInternalServerError) IsServerError() bool { + return true +} + +// IsCode returns true when this is instance alive internal server error response a status code equal to that given +func (o *IsInstanceAliveInternalServerError) IsCode(code int) bool { + return code == 500 +} + func (o *IsInstanceAliveInternalServerError) Error() string { return fmt.Sprintf("[GET /health/alive][%d] isInstanceAliveInternalServerError %+v", 500, o.Payload) } +func (o *IsInstanceAliveInternalServerError) String() string { + return fmt.Sprintf("[GET /health/alive][%d] isInstanceAliveInternalServerError %+v", 500, o.Payload) +} + func (o *IsInstanceAliveInternalServerError) GetPayload() *models.GenericError { return o.Payload } diff --git a/internal/httpclient/client/api/is_instance_ready_parameters.go b/internal/httpclient/client/api/is_instance_ready_parameters.go index dd92da186e..459fac0ff0 100644 --- a/internal/httpclient/client/api/is_instance_ready_parameters.go +++ b/internal/httpclient/client/api/is_instance_ready_parameters.go @@ -16,47 +16,48 @@ import ( "github.com/go-openapi/strfmt" ) -// NewIsInstanceReadyParams creates a new IsInstanceReadyParams object -// with the default values initialized. +// NewIsInstanceReadyParams creates a new IsInstanceReadyParams object, +// with the default timeout for this client. +// +// Default values are not hydrated, since defaults are normally applied by the API server side. +// +// To enforce default values in parameter, use SetDefaults or WithDefaults. func NewIsInstanceReadyParams() *IsInstanceReadyParams { - return &IsInstanceReadyParams{ - timeout: cr.DefaultTimeout, } } // NewIsInstanceReadyParamsWithTimeout creates a new IsInstanceReadyParams object -// with the default values initialized, and the ability to set a timeout on a request +// with the ability to set a timeout on a request. func NewIsInstanceReadyParamsWithTimeout(timeout time.Duration) *IsInstanceReadyParams { - return &IsInstanceReadyParams{ - timeout: timeout, } } // NewIsInstanceReadyParamsWithContext creates a new IsInstanceReadyParams object -// with the default values initialized, and the ability to set a context for a request +// with the ability to set a context for a request. func NewIsInstanceReadyParamsWithContext(ctx context.Context) *IsInstanceReadyParams { - return &IsInstanceReadyParams{ - Context: ctx, } } // NewIsInstanceReadyParamsWithHTTPClient creates a new IsInstanceReadyParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request +// with the ability to set a custom HTTPClient for a request. func NewIsInstanceReadyParamsWithHTTPClient(client *http.Client) *IsInstanceReadyParams { - return &IsInstanceReadyParams{ HTTPClient: client, } } -/*IsInstanceReadyParams contains all the parameters to send to the API endpoint -for the is instance ready operation typically these are written to a http.Request +/* +IsInstanceReadyParams contains all the parameters to send to the API endpoint + + for the is instance ready operation. + + Typically these are written to a http.Request. */ type IsInstanceReadyParams struct { timeout time.Duration @@ -64,6 +65,21 @@ type IsInstanceReadyParams struct { HTTPClient *http.Client } +// WithDefaults hydrates default values in the is instance ready params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *IsInstanceReadyParams) WithDefaults() *IsInstanceReadyParams { + o.SetDefaults() + return o +} + +// SetDefaults hydrates default values in the is instance ready params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *IsInstanceReadyParams) SetDefaults() { + // no default values defined for this parameter +} + // WithTimeout adds the timeout to the is instance ready params func (o *IsInstanceReadyParams) WithTimeout(timeout time.Duration) *IsInstanceReadyParams { o.SetTimeout(timeout) diff --git a/internal/httpclient/client/api/is_instance_ready_responses.go b/internal/httpclient/client/api/is_instance_ready_responses.go index 35de29f97b..094c0879ab 100644 --- a/internal/httpclient/client/api/is_instance_ready_responses.go +++ b/internal/httpclient/client/api/is_instance_ready_responses.go @@ -35,7 +35,6 @@ func (o *IsInstanceReadyReader) ReadResponse(response runtime.ClientResponse, co return nil, err } return nil, result - default: return nil, runtime.NewAPIError("response status code does not match any response statuses defined for this endpoint in the swagger spec", response, response.Code()) } @@ -46,7 +45,8 @@ func NewIsInstanceReadyOK() *IsInstanceReadyOK { return &IsInstanceReadyOK{} } -/*IsInstanceReadyOK handles this case with default header values. +/* +IsInstanceReadyOK describes a response with status code 200, with default header values. healthStatus */ @@ -54,10 +54,39 @@ type IsInstanceReadyOK struct { Payload *models.HealthStatus } +// IsSuccess returns true when this is instance ready o k response has a 2xx status code +func (o *IsInstanceReadyOK) IsSuccess() bool { + return true +} + +// IsRedirect returns true when this is instance ready o k response has a 3xx status code +func (o *IsInstanceReadyOK) IsRedirect() bool { + return false +} + +// IsClientError returns true when this is instance ready o k response has a 4xx status code +func (o *IsInstanceReadyOK) IsClientError() bool { + return false +} + +// IsServerError returns true when this is instance ready o k response has a 5xx status code +func (o *IsInstanceReadyOK) IsServerError() bool { + return false +} + +// IsCode returns true when this is instance ready o k response a status code equal to that given +func (o *IsInstanceReadyOK) IsCode(code int) bool { + return code == 200 +} + func (o *IsInstanceReadyOK) Error() string { return fmt.Sprintf("[GET /health/ready][%d] isInstanceReadyOK %+v", 200, o.Payload) } +func (o *IsInstanceReadyOK) String() string { + return fmt.Sprintf("[GET /health/ready][%d] isInstanceReadyOK %+v", 200, o.Payload) +} + func (o *IsInstanceReadyOK) GetPayload() *models.HealthStatus { return o.Payload } @@ -79,7 +108,8 @@ func NewIsInstanceReadyServiceUnavailable() *IsInstanceReadyServiceUnavailable { return &IsInstanceReadyServiceUnavailable{} } -/*IsInstanceReadyServiceUnavailable handles this case with default header values. +/* +IsInstanceReadyServiceUnavailable describes a response with status code 503, with default header values. healthNotReadyStatus */ @@ -87,10 +117,39 @@ type IsInstanceReadyServiceUnavailable struct { Payload *models.HealthNotReadyStatus } +// IsSuccess returns true when this is instance ready service unavailable response has a 2xx status code +func (o *IsInstanceReadyServiceUnavailable) IsSuccess() bool { + return false +} + +// IsRedirect returns true when this is instance ready service unavailable response has a 3xx status code +func (o *IsInstanceReadyServiceUnavailable) IsRedirect() bool { + return false +} + +// IsClientError returns true when this is instance ready service unavailable response has a 4xx status code +func (o *IsInstanceReadyServiceUnavailable) IsClientError() bool { + return false +} + +// IsServerError returns true when this is instance ready service unavailable response has a 5xx status code +func (o *IsInstanceReadyServiceUnavailable) IsServerError() bool { + return true +} + +// IsCode returns true when this is instance ready service unavailable response a status code equal to that given +func (o *IsInstanceReadyServiceUnavailable) IsCode(code int) bool { + return code == 503 +} + func (o *IsInstanceReadyServiceUnavailable) Error() string { return fmt.Sprintf("[GET /health/ready][%d] isInstanceReadyServiceUnavailable %+v", 503, o.Payload) } +func (o *IsInstanceReadyServiceUnavailable) String() string { + return fmt.Sprintf("[GET /health/ready][%d] isInstanceReadyServiceUnavailable %+v", 503, o.Payload) +} + func (o *IsInstanceReadyServiceUnavailable) GetPayload() *models.HealthNotReadyStatus { return o.Payload } diff --git a/internal/httpclient/client/api/list_rules_parameters.go b/internal/httpclient/client/api/list_rules_parameters.go index cd4f2744b4..3bf4624d07 100644 --- a/internal/httpclient/client/api/list_rules_parameters.go +++ b/internal/httpclient/client/api/list_rules_parameters.go @@ -17,58 +17,64 @@ import ( "github.com/go-openapi/swag" ) -// NewListRulesParams creates a new ListRulesParams object -// with the default values initialized. +// NewListRulesParams creates a new ListRulesParams object, +// with the default timeout for this client. +// +// Default values are not hydrated, since defaults are normally applied by the API server side. +// +// To enforce default values in parameter, use SetDefaults or WithDefaults. func NewListRulesParams() *ListRulesParams { - var () return &ListRulesParams{ - timeout: cr.DefaultTimeout, } } // NewListRulesParamsWithTimeout creates a new ListRulesParams object -// with the default values initialized, and the ability to set a timeout on a request +// with the ability to set a timeout on a request. func NewListRulesParamsWithTimeout(timeout time.Duration) *ListRulesParams { - var () return &ListRulesParams{ - timeout: timeout, } } // NewListRulesParamsWithContext creates a new ListRulesParams object -// with the default values initialized, and the ability to set a context for a request +// with the ability to set a context for a request. func NewListRulesParamsWithContext(ctx context.Context) *ListRulesParams { - var () return &ListRulesParams{ - Context: ctx, } } // NewListRulesParamsWithHTTPClient creates a new ListRulesParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request +// with the ability to set a custom HTTPClient for a request. func NewListRulesParamsWithHTTPClient(client *http.Client) *ListRulesParams { - var () return &ListRulesParams{ HTTPClient: client, } } -/*ListRulesParams contains all the parameters to send to the API endpoint -for the list rules operation typically these are written to a http.Request +/* +ListRulesParams contains all the parameters to send to the API endpoint + + for the list rules operation. + + Typically these are written to a http.Request. */ type ListRulesParams struct { - /*Limit - The maximum amount of rules returned. + /* Limit. + The maximum amount of rules returned. + + Format: int64 */ Limit *int64 - /*Offset - The offset from where to start looking. + /* Offset. + + The offset from where to start looking. + + Format: int64 */ Offset *int64 @@ -77,6 +83,21 @@ type ListRulesParams struct { HTTPClient *http.Client } +// WithDefaults hydrates default values in the list rules params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *ListRulesParams) WithDefaults() *ListRulesParams { + o.SetDefaults() + return o +} + +// SetDefaults hydrates default values in the list rules params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *ListRulesParams) SetDefaults() { + // no default values defined for this parameter +} + // WithTimeout adds the timeout to the list rules params func (o *ListRulesParams) WithTimeout(timeout time.Duration) *ListRulesParams { o.SetTimeout(timeout) @@ -144,32 +165,34 @@ func (o *ListRulesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Reg // query param limit var qrLimit int64 + if o.Limit != nil { qrLimit = *o.Limit } qLimit := swag.FormatInt64(qrLimit) if qLimit != "" { + if err := r.SetQueryParam("limit", qLimit); err != nil { return err } } - } if o.Offset != nil { // query param offset var qrOffset int64 + if o.Offset != nil { qrOffset = *o.Offset } qOffset := swag.FormatInt64(qrOffset) if qOffset != "" { + if err := r.SetQueryParam("offset", qOffset); err != nil { return err } } - } if len(res) > 0 { diff --git a/internal/httpclient/client/api/list_rules_responses.go b/internal/httpclient/client/api/list_rules_responses.go index 1e42c5c87c..5b2280063c 100644 --- a/internal/httpclient/client/api/list_rules_responses.go +++ b/internal/httpclient/client/api/list_rules_responses.go @@ -35,7 +35,6 @@ func (o *ListRulesReader) ReadResponse(response runtime.ClientResponse, consumer return nil, err } return nil, result - default: return nil, runtime.NewAPIError("response status code does not match any response statuses defined for this endpoint in the swagger spec", response, response.Code()) } @@ -46,7 +45,8 @@ func NewListRulesOK() *ListRulesOK { return &ListRulesOK{} } -/*ListRulesOK handles this case with default header values. +/* +ListRulesOK describes a response with status code 200, with default header values. A list of rules */ @@ -54,10 +54,39 @@ type ListRulesOK struct { Payload []*models.Rule } +// IsSuccess returns true when this list rules o k response has a 2xx status code +func (o *ListRulesOK) IsSuccess() bool { + return true +} + +// IsRedirect returns true when this list rules o k response has a 3xx status code +func (o *ListRulesOK) IsRedirect() bool { + return false +} + +// IsClientError returns true when this list rules o k response has a 4xx status code +func (o *ListRulesOK) IsClientError() bool { + return false +} + +// IsServerError returns true when this list rules o k response has a 5xx status code +func (o *ListRulesOK) IsServerError() bool { + return false +} + +// IsCode returns true when this list rules o k response a status code equal to that given +func (o *ListRulesOK) IsCode(code int) bool { + return code == 200 +} + func (o *ListRulesOK) Error() string { return fmt.Sprintf("[GET /rules][%d] listRulesOK %+v", 200, o.Payload) } +func (o *ListRulesOK) String() string { + return fmt.Sprintf("[GET /rules][%d] listRulesOK %+v", 200, o.Payload) +} + func (o *ListRulesOK) GetPayload() []*models.Rule { return o.Payload } @@ -77,7 +106,8 @@ func NewListRulesInternalServerError() *ListRulesInternalServerError { return &ListRulesInternalServerError{} } -/*ListRulesInternalServerError handles this case with default header values. +/* +ListRulesInternalServerError describes a response with status code 500, with default header values. genericError */ @@ -85,10 +115,39 @@ type ListRulesInternalServerError struct { Payload *models.GenericError } +// IsSuccess returns true when this list rules internal server error response has a 2xx status code +func (o *ListRulesInternalServerError) IsSuccess() bool { + return false +} + +// IsRedirect returns true when this list rules internal server error response has a 3xx status code +func (o *ListRulesInternalServerError) IsRedirect() bool { + return false +} + +// IsClientError returns true when this list rules internal server error response has a 4xx status code +func (o *ListRulesInternalServerError) IsClientError() bool { + return false +} + +// IsServerError returns true when this list rules internal server error response has a 5xx status code +func (o *ListRulesInternalServerError) IsServerError() bool { + return true +} + +// IsCode returns true when this list rules internal server error response a status code equal to that given +func (o *ListRulesInternalServerError) IsCode(code int) bool { + return code == 500 +} + func (o *ListRulesInternalServerError) Error() string { return fmt.Sprintf("[GET /rules][%d] listRulesInternalServerError %+v", 500, o.Payload) } +func (o *ListRulesInternalServerError) String() string { + return fmt.Sprintf("[GET /rules][%d] listRulesInternalServerError %+v", 500, o.Payload) +} + func (o *ListRulesInternalServerError) GetPayload() *models.GenericError { return o.Payload } diff --git a/internal/httpclient/models/generic_error.go b/internal/httpclient/models/generic_error.go index 8246e1b4e5..84b5461acc 100644 --- a/internal/httpclient/models/generic_error.go +++ b/internal/httpclient/models/generic_error.go @@ -6,11 +6,13 @@ package models // Editing this file might prove futile when you re-run the swagger generate command import ( + "context" + "github.com/go-openapi/strfmt" "github.com/go-openapi/swag" ) -// GenericError GenericError GenericError The standard error format +// GenericError The standard error format // // swagger:model genericError type GenericError struct { @@ -39,6 +41,11 @@ func (m *GenericError) Validate(formats strfmt.Registry) error { return nil } +// ContextValidate validates this generic error based on context it is used +func (m *GenericError) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + // MarshalBinary interface implementation func (m *GenericError) MarshalBinary() ([]byte, error) { if m == nil { diff --git a/internal/httpclient/models/health_not_ready_status.go b/internal/httpclient/models/health_not_ready_status.go index 64626783ed..bab6d3873e 100644 --- a/internal/httpclient/models/health_not_ready_status.go +++ b/internal/httpclient/models/health_not_ready_status.go @@ -6,6 +6,8 @@ package models // Editing this file might prove futile when you re-run the swagger generate command import ( + "context" + "github.com/go-openapi/strfmt" "github.com/go-openapi/swag" ) @@ -24,6 +26,11 @@ func (m *HealthNotReadyStatus) Validate(formats strfmt.Registry) error { return nil } +// ContextValidate validates this health not ready status based on context it is used +func (m *HealthNotReadyStatus) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + // MarshalBinary interface implementation func (m *HealthNotReadyStatus) MarshalBinary() ([]byte, error) { if m == nil { diff --git a/internal/httpclient/models/health_status.go b/internal/httpclient/models/health_status.go index 60ba32416b..5525dbc20e 100644 --- a/internal/httpclient/models/health_status.go +++ b/internal/httpclient/models/health_status.go @@ -6,6 +6,8 @@ package models // Editing this file might prove futile when you re-run the swagger generate command import ( + "context" + "github.com/go-openapi/strfmt" "github.com/go-openapi/swag" ) @@ -24,6 +26,11 @@ func (m *HealthStatus) Validate(formats strfmt.Registry) error { return nil } +// ContextValidate validates this health status based on context it is used +func (m *HealthStatus) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + // MarshalBinary interface implementation func (m *HealthStatus) MarshalBinary() ([]byte, error) { if m == nil { diff --git a/internal/httpclient/models/json_web_key.go b/internal/httpclient/models/json_web_key.go index d0d85e37eb..047927ebef 100644 --- a/internal/httpclient/models/json_web_key.go +++ b/internal/httpclient/models/json_web_key.go @@ -6,11 +6,13 @@ package models // Editing this file might prove futile when you re-run the swagger generate command import ( + "context" + "github.com/go-openapi/strfmt" "github.com/go-openapi/swag" ) -// JSONWebKey JSONWebKey JSONWebKey json web key +// JSONWebKey json web key // // swagger:model jsonWebKey type JSONWebKey struct { @@ -97,6 +99,11 @@ func (m *JSONWebKey) Validate(formats strfmt.Registry) error { return nil } +// ContextValidate validates this json web key based on context it is used +func (m *JSONWebKey) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + // MarshalBinary interface implementation func (m *JSONWebKey) MarshalBinary() ([]byte, error) { if m == nil { diff --git a/internal/httpclient/models/json_web_key_set.go b/internal/httpclient/models/json_web_key_set.go index 66fee7d68d..776e5a7128 100644 --- a/internal/httpclient/models/json_web_key_set.go +++ b/internal/httpclient/models/json_web_key_set.go @@ -6,6 +6,7 @@ package models // Editing this file might prove futile when you re-run the swagger generate command import ( + "context" "strconv" "github.com/go-openapi/errors" @@ -13,7 +14,7 @@ import ( "github.com/go-openapi/swag" ) -// JSONWebKeySet JSONWebKeySet json web key set +// JSONWebKeySet json web key set // // swagger:model jsonWebKeySet type JSONWebKeySet struct { @@ -41,7 +42,6 @@ func (m *JSONWebKeySet) Validate(formats strfmt.Registry) error { } func (m *JSONWebKeySet) validateKeys(formats strfmt.Registry) error { - if swag.IsZero(m.Keys) { // not required return nil } @@ -55,6 +55,42 @@ func (m *JSONWebKeySet) validateKeys(formats strfmt.Registry) error { if err := m.Keys[i].Validate(formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("keys" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("keys" + "." + strconv.Itoa(i)) + } + return err + } + } + + } + + return nil +} + +// ContextValidate validate this json web key set based on the context it is used +func (m *JSONWebKeySet) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := m.contextValidateKeys(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *JSONWebKeySet) contextValidateKeys(ctx context.Context, formats strfmt.Registry) error { + + for i := 0; i < len(m.Keys); i++ { + + if m.Keys[i] != nil { + if err := m.Keys[i].ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("keys" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("keys" + "." + strconv.Itoa(i)) } return err } diff --git a/internal/httpclient/models/rule.go b/internal/httpclient/models/rule.go index 275ded0f54..76d947ea1c 100644 --- a/internal/httpclient/models/rule.go +++ b/internal/httpclient/models/rule.go @@ -6,6 +6,7 @@ package models // Editing this file might prove futile when you re-run the swagger generate command import ( + "context" "strconv" "github.com/go-openapi/errors" @@ -80,7 +81,6 @@ func (m *Rule) Validate(formats strfmt.Registry) error { } func (m *Rule) validateAuthenticators(formats strfmt.Registry) error { - if swag.IsZero(m.Authenticators) { // not required return nil } @@ -94,6 +94,8 @@ func (m *Rule) validateAuthenticators(formats strfmt.Registry) error { if err := m.Authenticators[i].Validate(formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("authenticators" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("authenticators" + "." + strconv.Itoa(i)) } return err } @@ -105,7 +107,6 @@ func (m *Rule) validateAuthenticators(formats strfmt.Registry) error { } func (m *Rule) validateAuthorizer(formats strfmt.Registry) error { - if swag.IsZero(m.Authorizer) { // not required return nil } @@ -114,6 +115,8 @@ func (m *Rule) validateAuthorizer(formats strfmt.Registry) error { if err := m.Authorizer.Validate(formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("authorizer") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("authorizer") } return err } @@ -123,7 +126,6 @@ func (m *Rule) validateAuthorizer(formats strfmt.Registry) error { } func (m *Rule) validateMatch(formats strfmt.Registry) error { - if swag.IsZero(m.Match) { // not required return nil } @@ -132,6 +134,8 @@ func (m *Rule) validateMatch(formats strfmt.Registry) error { if err := m.Match.Validate(formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("match") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("match") } return err } @@ -141,7 +145,6 @@ func (m *Rule) validateMatch(formats strfmt.Registry) error { } func (m *Rule) validateMutators(formats strfmt.Registry) error { - if swag.IsZero(m.Mutators) { // not required return nil } @@ -155,6 +158,8 @@ func (m *Rule) validateMutators(formats strfmt.Registry) error { if err := m.Mutators[i].Validate(formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("mutators" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("mutators" + "." + strconv.Itoa(i)) } return err } @@ -166,7 +171,6 @@ func (m *Rule) validateMutators(formats strfmt.Registry) error { } func (m *Rule) validateUpstream(formats strfmt.Registry) error { - if swag.IsZero(m.Upstream) { // not required return nil } @@ -175,6 +179,126 @@ func (m *Rule) validateUpstream(formats strfmt.Registry) error { if err := m.Upstream.Validate(formats); err != nil { if ve, ok := err.(*errors.Validation); ok { return ve.ValidateName("upstream") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("upstream") + } + return err + } + } + + return nil +} + +// ContextValidate validate this rule based on the context it is used +func (m *Rule) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := m.contextValidateAuthenticators(ctx, formats); err != nil { + res = append(res, err) + } + + if err := m.contextValidateAuthorizer(ctx, formats); err != nil { + res = append(res, err) + } + + if err := m.contextValidateMatch(ctx, formats); err != nil { + res = append(res, err) + } + + if err := m.contextValidateMutators(ctx, formats); err != nil { + res = append(res, err) + } + + if err := m.contextValidateUpstream(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (m *Rule) contextValidateAuthenticators(ctx context.Context, formats strfmt.Registry) error { + + for i := 0; i < len(m.Authenticators); i++ { + + if m.Authenticators[i] != nil { + if err := m.Authenticators[i].ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("authenticators" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("authenticators" + "." + strconv.Itoa(i)) + } + return err + } + } + + } + + return nil +} + +func (m *Rule) contextValidateAuthorizer(ctx context.Context, formats strfmt.Registry) error { + + if m.Authorizer != nil { + if err := m.Authorizer.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("authorizer") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("authorizer") + } + return err + } + } + + return nil +} + +func (m *Rule) contextValidateMatch(ctx context.Context, formats strfmt.Registry) error { + + if m.Match != nil { + if err := m.Match.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("match") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("match") + } + return err + } + } + + return nil +} + +func (m *Rule) contextValidateMutators(ctx context.Context, formats strfmt.Registry) error { + + for i := 0; i < len(m.Mutators); i++ { + + if m.Mutators[i] != nil { + if err := m.Mutators[i].ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("mutators" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("mutators" + "." + strconv.Itoa(i)) + } + return err + } + } + + } + + return nil +} + +func (m *Rule) contextValidateUpstream(ctx context.Context, formats strfmt.Registry) error { + + if m.Upstream != nil { + if err := m.Upstream.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("upstream") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("upstream") } return err } diff --git a/internal/httpclient/models/rule_handler.go b/internal/httpclient/models/rule_handler.go index 3300ad7e1d..0e055f01d0 100644 --- a/internal/httpclient/models/rule_handler.go +++ b/internal/httpclient/models/rule_handler.go @@ -6,11 +6,13 @@ package models // Editing this file might prove futile when you re-run the swagger generate command import ( + "context" + "github.com/go-openapi/strfmt" "github.com/go-openapi/swag" ) -// RuleHandler RuleHandler rule handler +// RuleHandler rule handler // // swagger:model ruleHandler type RuleHandler struct { @@ -29,6 +31,11 @@ func (m *RuleHandler) Validate(formats strfmt.Registry) error { return nil } +// ContextValidate validates this rule handler based on context it is used +func (m *RuleHandler) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + // MarshalBinary interface implementation func (m *RuleHandler) MarshalBinary() ([]byte, error) { if m == nil { diff --git a/internal/httpclient/models/rule_match.go b/internal/httpclient/models/rule_match.go index f36a542e28..2ec45086ed 100644 --- a/internal/httpclient/models/rule_match.go +++ b/internal/httpclient/models/rule_match.go @@ -6,11 +6,13 @@ package models // Editing this file might prove futile when you re-run the swagger generate command import ( + "context" + "github.com/go-openapi/strfmt" "github.com/go-openapi/swag" ) -// RuleMatch RuleMatch RuleMatch RuleMatch RuleMatch rule match +// RuleMatch rule match // // swagger:model ruleMatch type RuleMatch struct { @@ -37,6 +39,11 @@ func (m *RuleMatch) Validate(formats strfmt.Registry) error { return nil } +// ContextValidate validates this rule match based on context it is used +func (m *RuleMatch) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + // MarshalBinary interface implementation func (m *RuleMatch) MarshalBinary() ([]byte, error) { if m == nil { diff --git a/internal/httpclient/models/upstream.go b/internal/httpclient/models/upstream.go index 91f361af14..6b167a97a6 100644 --- a/internal/httpclient/models/upstream.go +++ b/internal/httpclient/models/upstream.go @@ -6,11 +6,13 @@ package models // Editing this file might prove futile when you re-run the swagger generate command import ( + "context" + "github.com/go-openapi/strfmt" "github.com/go-openapi/swag" ) -// Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream upstream +// Upstream upstream // // swagger:model Upstream type Upstream struct { @@ -31,6 +33,11 @@ func (m *Upstream) Validate(formats strfmt.Registry) error { return nil } +// ContextValidate validates this upstream based on context it is used +func (m *Upstream) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + // MarshalBinary interface implementation func (m *Upstream) MarshalBinary() ([]byte, error) { if m == nil { diff --git a/internal/httpclient/models/uuid.go b/internal/httpclient/models/uuid.go index f28209a7a4..5ce11709b4 100644 --- a/internal/httpclient/models/uuid.go +++ b/internal/httpclient/models/uuid.go @@ -6,6 +6,8 @@ package models // Editing this file might prove futile when you re-run the swagger generate command import ( + "context" + "github.com/go-openapi/errors" "github.com/go-openapi/strfmt" "github.com/go-openapi/validate" @@ -29,3 +31,8 @@ func (m UUID) Validate(formats strfmt.Registry) error { } return nil } + +// ContextValidate validates this UUID based on context it is used +func (m UUID) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} diff --git a/internal/httpclient/models/version.go b/internal/httpclient/models/version.go index 8e687bcb20..2a92642e53 100644 --- a/internal/httpclient/models/version.go +++ b/internal/httpclient/models/version.go @@ -6,6 +6,8 @@ package models // Editing this file might prove futile when you re-run the swagger generate command import ( + "context" + "github.com/go-openapi/strfmt" "github.com/go-openapi/swag" ) @@ -24,6 +26,11 @@ func (m *Version) Validate(formats strfmt.Registry) error { return nil } +// ContextValidate validates this version based on context it is used +func (m *Version) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + // MarshalBinary interface implementation func (m *Version) MarshalBinary() ([]byte, error) { if m == nil { diff --git a/metrics/middleware_test.go b/metrics/middleware_test.go index 3c5462de7f..5c726eef01 100644 --- a/metrics/middleware_test.go +++ b/metrics/middleware_test.go @@ -1,7 +1,6 @@ package metrics import ( - "bytes" "fmt" "net/http" "net/http/httptest" @@ -9,10 +8,9 @@ import ( "testing" "time" - "github.com/stretchr/testify/require" - "github.com/ory/oathkeeper/driver" - "github.com/ory/viper" + "github.com/ory/oathkeeper/x" + "github.com/ory/x/configx" "github.com/ory/x/logrusx" "github.com/julienschmidt/httprouter" @@ -140,17 +138,14 @@ func TestConfigurablePrometheusRequestTotalMetrics(t *testing.T) { // re-initialize to prevent double counts RequestTotal.Reset() - viper.SetConfigType("yaml") - - // We set the fallback to first run www_authenticate. But because the error is not_found, as - // is defined in the when clause, we should see a json error instead! - require.NoError(t, viper.ReadConfig(bytes.NewBufferString(` + logger := logrusx.New("ORY Oathkeeper", "1") + d := driver.NewDefaultDriver(logger, "1", "test", time.Now().String(), nil, + configx.WithConfigFiles(x.WriteFile(t, ` serve: prometheus: metric_name_prefix: http_ -`))) - logger := logrusx.New("ORY Oathkeeper", "1") - d := driver.NewDefaultDriver(logger, "1", "test", time.Now().String()) +`)), + ) promRepo := NewConfigurablePrometheusRepository(d, logger) promMiddleware := NewMiddleware(promRepo, "test") promMiddleware.CollapsePaths(tt.collapsePaths) diff --git a/pipeline/authn/authenticator_anonymous_test.go b/pipeline/authn/authenticator_anonymous_test.go index ca55e275e5..b51d3d0994 100644 --- a/pipeline/authn/authenticator_anonymous_test.go +++ b/pipeline/authn/authenticator_anonymous_test.go @@ -25,8 +25,6 @@ import ( "net/http" "testing" - "github.com/ory/viper" - "github.com/ory/oathkeeper/driver/configuration" "github.com/ory/oathkeeper/internal" "github.com/ory/oathkeeper/pipeline/authn" @@ -37,7 +35,6 @@ import ( func TestAuthenticatorAnonymous(t *testing.T) { conf := internal.NewConfigurationWithDefaults() - // viper.Set(configuration.ViperKeyAuthenticatorAnonymousIdentifier, "anon") reg := internal.NewRegistry(conf) session := new(authn.AuthenticationSession) @@ -66,11 +63,10 @@ func TestAuthenticatorAnonymous(t *testing.T) { }) t.Run("method=validate", func(t *testing.T) { - viper.Set(configuration.ViperKeyAuthenticatorAnonymousIsEnabled, true) + conf.SetForTest(t, configuration.AuthenticatorAnonymousIsEnabled, true) require.NoError(t, a.Validate(json.RawMessage(`{"subject":"foo"}`))) - viper.Reset() - viper.Set(configuration.ViperKeyAuthenticatorAnonymousIsEnabled, false) + conf.SetForTest(t, configuration.AuthenticatorAnonymousIsEnabled, false) require.Error(t, a.Validate(json.RawMessage(`{"subject":"foo"}`))) }) } diff --git a/pipeline/authn/authenticator_cookie_session_test.go b/pipeline/authn/authenticator_cookie_session_test.go index 43a5c279f3..e1f15d32e3 100644 --- a/pipeline/authn/authenticator_cookie_session_test.go +++ b/pipeline/authn/authenticator_cookie_session_test.go @@ -31,7 +31,7 @@ func TestAuthenticatorCookieSession(t *testing.T) { t.Run("method=authenticate", func(t *testing.T) { t.Run("description=should fail because session store returned 400", func(t *testing.T) { - testServer, _ := makeServer(400, `{}`) + testServer, _ := makeServer(t, 400, `{}`) err := pipelineAuthenticator.Authenticate( makeRequest("GET", "/", "", map[string]string{"sessionid": "zyx"}, ""), session, @@ -42,7 +42,7 @@ func TestAuthenticatorCookieSession(t *testing.T) { }) t.Run("description=should pass because session store returned 200", func(t *testing.T) { - testServer, _ := makeServer(200, `{"subject": "123", "extra": {"foo": "bar"}}`) + testServer, _ := makeServer(t, 200, `{"subject": "123", "extra": {"foo": "bar"}}`) err := pipelineAuthenticator.Authenticate( makeRequest("GET", "/", "", map[string]string{"sessionid": "zyx"}, ""), session, @@ -57,25 +57,26 @@ func TestAuthenticatorCookieSession(t *testing.T) { }) t.Run("description=should pass through method, path, and headers to auth server", func(t *testing.T) { - testServer, requestRecorder := makeServer(200, `{"subject": "123"}`) + + testServer, requestRecorder := makeServer(t, 200, `{"subject": "123"}`) err := pipelineAuthenticator.Authenticate( makeRequest("PUT", "/users/123", "query=string", map[string]string{"sessionid": "zyx"}, ""), session, - json.RawMessage(fmt.Sprintf(`{"check_session_url": "%s"}`, testServer.URL)), + json.RawMessage(fmt.Sprintf(`{"check_session_url": "%s", "preserve_query": false}`, testServer.URL)), nil, ) require.NoError(t, err, "%#v", errors.Cause(err)) assert.Len(t, requestRecorder.requests, 1) r := requestRecorder.requests[0] - assert.Equal(t, r.Method, "PUT") - assert.Equal(t, r.URL.Path, "/users/123") - assert.Equal(t, r.URL.RawQuery, "query=string") - assert.Equal(t, r.Header.Get("Cookie"), "sessionid=zyx") + assert.Equal(t, "PUT", r.Method) + assert.Equal(t, "/users/123", r.URL.Path) + assert.Equal(t, "query=string", r.URL.RawQuery) + assert.Equal(t, "sessionid=zyx", r.Header.Get("Cookie")) assert.Equal(t, &AuthenticationSession{Subject: "123"}, session) }) t.Run("description=should pass through method and headers ONLY to auth server when PreservePath and PreserveQuery are true", func(t *testing.T) { - testServer, requestRecorder := makeServer(200, `{"subject": "123"}`) + testServer, requestRecorder := makeServer(t, 200, `{"subject": "123"}`) err := pipelineAuthenticator.Authenticate( makeRequest("PUT", "/users/123", "query=string", map[string]string{"sessionid": "zyx"}, ""), session, @@ -93,7 +94,7 @@ func TestAuthenticatorCookieSession(t *testing.T) { }) t.Run("should preserve path, query in check_session_url when preserve_path, preserve_query are true", func(t *testing.T) { - testServer, requestRecorder := makeServer(200, `{"subject": "123"}`) + testServer, requestRecorder := makeServer(t, 200, `{"subject": "123"}`) err := pipelineAuthenticator.Authenticate( makeRequest("PUT", "/client/request/path", "q=client-request-query", map[string]string{"sessionid": "zyx"}, ""), session, @@ -111,7 +112,7 @@ func TestAuthenticatorCookieSession(t *testing.T) { }) t.Run("should override method", func(t *testing.T) { - testServer, requestRecorder := makeServer(200, `{"subject": "123"}`) + testServer, requestRecorder := makeServer(t, 200, `{"subject": "123"}`) err := pipelineAuthenticator.Authenticate( makeRequest("PUT", "/client/request/path", "q=client-request-query", map[string]string{"sessionid": "zyx"}, ""), session, @@ -125,7 +126,7 @@ func TestAuthenticatorCookieSession(t *testing.T) { }) t.Run("description=should pass through x-forwarded-host if preserve_host is set to true", func(t *testing.T) { - testServer, requestRecorder := makeServer(200, `{"subject": "123"}`) + testServer, requestRecorder := makeServer(t, 200, `{"subject": "123"}`) req := makeRequest("PUT", "/users/123", "query=string", map[string]string{"sessionid": "zyx"}, "") expectedHost := "some-host" req.Host = expectedHost @@ -146,7 +147,7 @@ func TestAuthenticatorCookieSession(t *testing.T) { }) t.Run("description=should pass not override x-forwarded-host in set_headers", func(t *testing.T) { - testServer, requestRecorder := makeServer(200, `{"subject": "123"}`) + testServer, requestRecorder := makeServer(t, 200, `{"subject": "123"}`) req := makeRequest("PUT", "/users/123", "query=string", map[string]string{"sessionid": "zyx"}, "") expectedHost := "some-host" req.Host = expectedHost @@ -169,7 +170,7 @@ func TestAuthenticatorCookieSession(t *testing.T) { }) t.Run("description=does not pass request body through to auth server", func(t *testing.T) { - testServer, requestRecorder := makeServer(200, `{}`) + testServer, requestRecorder := makeServer(t, 200, `{}`) pipelineAuthenticator.Authenticate( makeRequest("POST", "/", "", map[string]string{"sessionid": "zyx"}, "Some body..."), session, @@ -184,7 +185,7 @@ func TestAuthenticatorCookieSession(t *testing.T) { }) t.Run("description=should fallthrough if only is specified and no cookie specified is set", func(t *testing.T) { - testServer, requestRecorder := makeServer(200, `{}`) + testServer, requestRecorder := makeServer(t, 200, `{}`) err := pipelineAuthenticator.Authenticate( makeRequest("GET", "/", "", map[string]string{"sessionid": "zyx"}, ""), session, @@ -196,7 +197,7 @@ func TestAuthenticatorCookieSession(t *testing.T) { }) t.Run("description=should fallthrough if is missing and it has no cookies", func(t *testing.T) { - testServer, requestRecorder := makeServer(200, `{}`) + testServer, requestRecorder := makeServer(t, 200, `{}`) err := pipelineAuthenticator.Authenticate( makeRequest("GET", "/", "", map[string]string{}, ""), session, @@ -208,7 +209,7 @@ func TestAuthenticatorCookieSession(t *testing.T) { }) t.Run("description=should not fallthrough if only is specified and cookie specified is set", func(t *testing.T) { - testServer, _ := makeServer(200, `{}`) + testServer, _ := makeServer(t, 200, `{}`) err := pipelineAuthenticator.Authenticate( makeRequest("GET", "/", "", map[string]string{"sid": "zyx"}, ""), session, @@ -219,7 +220,7 @@ func TestAuthenticatorCookieSession(t *testing.T) { }) t.Run("description=should work with nested extra keys", func(t *testing.T) { - testServer, _ := makeServer(200, `{"subject": "123", "session": {"foo": "bar"}}`) + testServer, _ := makeServer(t, 200, `{"subject": "123", "session": {"foo": "bar"}}`) err := pipelineAuthenticator.Authenticate( makeRequest("GET", "/", "", map[string]string{"sessionid": "zyx"}, ""), session, @@ -234,7 +235,7 @@ func TestAuthenticatorCookieSession(t *testing.T) { }) t.Run("description=should work with the root key for extra and a custom subject key", func(t *testing.T) { - testServer, _ := makeServer(200, `{"identity": {"id": "123"}, "session": {"foo": "bar"}}`) + testServer, _ := makeServer(t, 200, `{"identity": {"id": "123"}, "session": {"foo": "bar"}}`) err := pipelineAuthenticator.Authenticate( makeRequest("GET", "/", "", map[string]string{"sessionid": "zyx"}, ""), session, @@ -332,7 +333,7 @@ type RequestRecorder struct { bodies [][]byte } -func makeServer(statusCode int, responseBody string) (*httptest.Server, *RequestRecorder) { +func makeServer(t *testing.T, statusCode int, responseBody string) (*httptest.Server, *RequestRecorder) { requestRecorder := &RequestRecorder{} testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { requestRecorder.requests = append(requestRecorder.requests, r) @@ -341,6 +342,7 @@ func makeServer(statusCode int, responseBody string) (*httptest.Server, *Request w.WriteHeader(statusCode) w.Write([]byte(responseBody)) })) + t.Cleanup(testServer.Close) return testServer, requestRecorder } diff --git a/pipeline/authn/authenticator_jwt_test.go b/pipeline/authn/authenticator_jwt_test.go index ce1ee49985..bcb955091a 100644 --- a/pipeline/authn/authenticator_jwt_test.go +++ b/pipeline/authn/authenticator_jwt_test.go @@ -49,7 +49,6 @@ func TestAuthenticatorJWT(t *testing.T) { "file://../../test/stub/jwks-ecdsa.json", } conf := internal.NewConfigurationWithDefaults() - // viper.Set(configuration.ViperKeyAuthenticatorJWTJWKSURIs, keys) reg := internal.NewRegistry(conf) a, err := reg.PipelineAuthenticator("jwt") diff --git a/pipeline/authn/authenticator_noop_test.go b/pipeline/authn/authenticator_noop_test.go index 38c0a8d05f..baad11d25c 100644 --- a/pipeline/authn/authenticator_noop_test.go +++ b/pipeline/authn/authenticator_noop_test.go @@ -23,8 +23,6 @@ package authn_test import ( "testing" - "github.com/ory/viper" - "github.com/ory/oathkeeper/driver/configuration" "github.com/ory/oathkeeper/internal" @@ -46,11 +44,10 @@ func TestAuthenticatorNoop(t *testing.T) { }) t.Run("method=validate", func(t *testing.T) { - viper.Set(configuration.ViperKeyAuthenticatorNoopIsEnabled, true) + conf.SetForTest(t, configuration.AuthenticatorNoopIsEnabled, true) require.NoError(t, a.Validate(nil)) - viper.Reset() - viper.Set(configuration.ViperKeyAuthenticatorNoopIsEnabled, false) + conf.SetForTest(t, configuration.AuthenticatorNoopIsEnabled, false) require.Error(t, a.Validate(nil)) }) } diff --git a/pipeline/authn/authenticator_oauth2_client_credentials.go b/pipeline/authn/authenticator_oauth2_client_credentials.go index 1e20dace75..b3df7d1199 100644 --- a/pipeline/authn/authenticator_oauth2_client_credentials.go +++ b/pipeline/authn/authenticator_oauth2_client_credentials.go @@ -100,7 +100,10 @@ func (a *AuthenticatorOAuth2ClientCredentials) Config(config json.RawMessage) (* return nil, err } timeout := time.Millisecond * duration - a.client = httpx.NewResilientClientLatencyToleranceConfigurable(nil, timeout, maxWait) + a.client = httpx.NewResilientClient( + httpx.ResilientClientWithMaxRetryWait(maxWait), + httpx.ResilientClientWithConnectionTimeout(timeout), + ).StandardClient() if c.Cache.TTL != "" { cacheTTL, err := time.ParseDuration(c.Cache.TTL) diff --git a/pipeline/authn/authenticator_oauth2_client_credentials_cache_test.go b/pipeline/authn/authenticator_oauth2_client_credentials_cache_test.go index 5e6108e9c0..58b401db7d 100644 --- a/pipeline/authn/authenticator_oauth2_client_credentials_cache_test.go +++ b/pipeline/authn/authenticator_oauth2_client_credentials_cache_test.go @@ -1,6 +1,7 @@ package authn import ( + "context" "net/http/httptest" "testing" "time" @@ -12,20 +13,25 @@ import ( "golang.org/x/oauth2/clientcredentials" "github.com/ory/oathkeeper/driver/configuration" - "github.com/ory/viper" + "github.com/ory/x/configx" "github.com/ory/x/logrusx" ) func TestClientCredentialsCache(t *testing.T) { - viper.Reset() - ts := httptest.NewServer(httprouter.New()) - - viper.Set("authenticators.oauth2_client_credentials.config.token_url", ts.URL+"/oauth2/token") - viper.Set("authenticators.oauth2_client_credentials.config.cache.enabled", true) + t.Cleanup(ts.Close) logger := logrusx.New("", "") - c := configuration.NewViperProvider(logger) + c, err := configuration.NewKoanfProvider( + context.Background(), + nil, + logger, + configx.WithValues(map[string]interface{}{ + "authenticators.oauth2_client_credentials.config.token_url": ts.URL + "/oauth2/token", + "authenticators.oauth2_client_credentials.config.cache.enabled": true, + })) + require.NoError(t, err) + a := NewAuthenticatorOAuth2ClientCredentials(c, logger) assert.Equal(t, "oauth2_client_credentials", a.GetID()) diff --git a/pipeline/authn/authenticator_oauth2_client_credentials_test.go b/pipeline/authn/authenticator_oauth2_client_credentials_test.go index d032dd6c50..534e495cdd 100644 --- a/pipeline/authn/authenticator_oauth2_client_credentials_test.go +++ b/pipeline/authn/authenticator_oauth2_client_credentials_test.go @@ -28,15 +28,13 @@ import ( "testing" "time" - "github.com/ory/viper" - "github.com/ory/oathkeeper/driver/configuration" "github.com/ory/oathkeeper/internal" "github.com/ory/oathkeeper/pipeline/authn" + "github.com/ory/x/configx" "github.com/julienschmidt/httprouter" "github.com/pkg/errors" - "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/tidwall/sjson" @@ -53,7 +51,7 @@ func authOkDynamic(u string) *http.Request { } func TestAuthenticatorOAuth2ClientCredentials(t *testing.T) { - conf := internal.NewConfigurationWithDefaults() + conf := internal.NewConfigurationWithDefaults(configx.SkipValidation()) reg := internal.NewRegistry(conf) a, err := reg.PipelineAuthenticator("oauth2_client_credentials") @@ -70,6 +68,7 @@ func TestAuthenticatorOAuth2ClientCredentials(t *testing.T) { upstreamFailure.SetBasicAuth("client", "secret") calls := 0 + var logger herodot.ErrorReporter = nil for k, tc := range []struct { d string r *http.Request @@ -95,7 +94,7 @@ func TestAuthenticatorOAuth2ClientCredentials(t *testing.T) { token_url: "", setup: func(t *testing.T, h *httprouter.Router, _ json.RawMessage) { h.POST("/oauth2/token", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { - h := herodot.NewJSONWriter(logrus.New()) + h := herodot.NewJSONWriter(logger) h.WriteError(w, r, helper.ErrUnauthorized) }) }, @@ -109,7 +108,7 @@ func TestAuthenticatorOAuth2ClientCredentials(t *testing.T) { token_url: "", setup: func(t *testing.T, h *httprouter.Router, _ json.RawMessage) { h.POST("/oauth2/token", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { - h := herodot.NewJSONWriter(logrus.New()) + h := herodot.NewJSONWriter(logger) h.Write(w, r, map[string]interface{}{"access_token": "foo-token", "expires_in": 3600}) }) }, @@ -126,12 +125,12 @@ func TestAuthenticatorOAuth2ClientCredentials(t *testing.T) { h.POST("/oauth2/token", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { calls++ if calls == 2 { - h := herodot.NewJSONWriter(logrus.New()) + h := herodot.NewJSONWriter(logger) h.WriteError(w, r, helper.ErrUpstreamServiceNotAvailable) return } - h := herodot.NewJSONWriter(logrus.New()) + h := herodot.NewJSONWriter(logger) h.Write(w, r, map[string]interface{}{"access_token": "foo-token", "expires_in": 3600}) }) @@ -153,7 +152,7 @@ func TestAuthenticatorOAuth2ClientCredentials(t *testing.T) { token_url: "", setup: func(t *testing.T, h *httprouter.Router, c json.RawMessage) { h.POST("/oauth2/token", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { - h := herodot.NewJSONWriter(logrus.New()) + h := herodot.NewJSONWriter(logger) h.Write(w, r, map[string]interface{}{"access_token": "foo-token", "expires_in": 1}) }) @@ -178,12 +177,12 @@ func TestAuthenticatorOAuth2ClientCredentials(t *testing.T) { h.POST("/oauth2/token", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { calls++ if calls == 2 { - h := herodot.NewJSONWriter(logrus.New()) + h := herodot.NewJSONWriter(logger) h.WriteError(w, r, helper.ErrUpstreamServiceNotAvailable) return } - h := herodot.NewJSONWriter(logrus.New()) + h := herodot.NewJSONWriter(logger) h.Write(w, r, map[string]interface{}{"access_token": "foo-token", "expires_in": 3600}) }) @@ -208,13 +207,13 @@ func TestAuthenticatorOAuth2ClientCredentials(t *testing.T) { h.POST("/oauth2/token", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { calls++ if calls == 3 { - h := herodot.NewJSONWriter(logrus.New()) + h := herodot.NewJSONWriter(logger) t.Errorf("expected only 2 calls to token endpoint this is number %d", calls) h.WriteError(w, r, helper.ErrUpstreamServiceNotAvailable) return } - h := herodot.NewJSONWriter(logrus.New()) + h := herodot.NewJSONWriter(logger) h.Write(w, r, map[string]interface{}{"access_token": "foo-token", "expires_in": 3600}) }) @@ -251,13 +250,13 @@ func TestAuthenticatorOAuth2ClientCredentials(t *testing.T) { h.POST("/oauth2/token", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { calls++ if calls == 3 { - h := herodot.NewJSONWriter(logrus.New()) + h := herodot.NewJSONWriter(logger) t.Errorf("expected only 2 calls to token endpoint this is number %d", calls) h.WriteError(w, r, helper.ErrUpstreamServiceNotAvailable) return } - h := herodot.NewJSONWriter(logrus.New()) + h := herodot.NewJSONWriter(logger) h.Write(w, r, map[string]interface{}{"access_token": "foo-token", "expires_in": 3600}) }) @@ -295,7 +294,7 @@ func TestAuthenticatorOAuth2ClientCredentials(t *testing.T) { token_url: "", setup: func(t *testing.T, h *httprouter.Router, _ json.RawMessage) { h.POST("/oauth2/token", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { - h := herodot.NewJSONWriter(logrus.New()) + h := herodot.NewJSONWriter(logger) h.WriteError(w, r, helper.ErrUpstreamServiceNotAvailable) }) }, @@ -308,7 +307,7 @@ func TestAuthenticatorOAuth2ClientCredentials(t *testing.T) { token_url: "", setup: func(t *testing.T, h *httprouter.Router, _ json.RawMessage) { h.POST("/oauth2/token", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { - h := herodot.NewJSONWriter(logrus.New()) + h := herodot.NewJSONWriter(logger) h.WriteError(w, r, helper.ErrUpstreamServiceTimeout) }) }, @@ -321,7 +320,7 @@ func TestAuthenticatorOAuth2ClientCredentials(t *testing.T) { token_url: "", setup: func(t *testing.T, h *httprouter.Router, _ json.RawMessage) { h.POST("/oauth2/token", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { - h := herodot.NewJSONWriter(logrus.New()) + h := herodot.NewJSONWriter(logger) h.WriteError(w, r, helper.ErrUpstreamServiceInternalServerError) }) }, @@ -334,7 +333,7 @@ func TestAuthenticatorOAuth2ClientCredentials(t *testing.T) { token_url: "", setup: func(t *testing.T, h *httprouter.Router, _ json.RawMessage) { h.POST("/oauth2/v1/token", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { - h := herodot.NewJSONWriter(logrus.New()) + h := herodot.NewJSONWriter(logger) h.Write(w, r, map[string]interface{}{"access_token": "foo-token"}) }) }, @@ -347,7 +346,7 @@ func TestAuthenticatorOAuth2ClientCredentials(t *testing.T) { token_url: "", setup: func(t *testing.T, h *httprouter.Router, _ json.RawMessage) { h.POST("/oauth2/token", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { - h := herodot.NewJSONWriter(logrus.New()) + h := herodot.NewJSONWriter(logger) h.WriteError(w, r, helper.ErrForbidden) }) }, @@ -389,7 +388,7 @@ func TestAuthenticatorOAuth2ClientCredentials(t *testing.T) { h := httprouter.New() h.POST("/oauth2/token", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { - h := herodot.NewJSONWriter(logrus.New()) + h := herodot.NewJSONWriter(logger) u, p, ok := r.BasicAuth() if !ok || u != "client" || p != "secret" { h.WriteError(w, r, helper.ErrUnauthorized) @@ -401,23 +400,19 @@ func TestAuthenticatorOAuth2ClientCredentials(t *testing.T) { ts := httptest.NewServer(h) t.Run("method=validate", func(t *testing.T) { - viper.Set(configuration.ViperKeyAuthenticatorOAuth2ClientCredentialsIsEnabled, false) + conf.SetForTest(t, configuration.AuthenticatorOAuth2ClientCredentialsIsEnabled, false) require.Error(t, a.Validate(json.RawMessage(`{"token_url":""}`))) - viper.Reset() - viper.Set(configuration.ViperKeyAuthenticatorOAuth2ClientCredentialsIsEnabled, false) + conf.SetForTest(t, configuration.AuthenticatorOAuth2ClientCredentialsIsEnabled, false) require.Error(t, a.Validate(json.RawMessage(`{"token_url":"`+ts.URL+"/oauth2/token"+`"}`))) - viper.Reset() - viper.Set(configuration.ViperKeyAuthenticatorOAuth2ClientCredentialsIsEnabled, true) + conf.SetForTest(t, configuration.AuthenticatorOAuth2ClientCredentialsIsEnabled, true) require.Error(t, a.Validate(json.RawMessage(`{"token_url":""}`))) - viper.Reset() - viper.Set(configuration.ViperKeyAuthenticatorOAuth2ClientCredentialsIsEnabled, true) + conf.SetForTest(t, configuration.AuthenticatorOAuth2ClientCredentialsIsEnabled, true) require.NoError(t, a.Validate(json.RawMessage(`{"token_url":"`+ts.URL+"/oauth2/token"+`"}`))) - viper.Reset() - viper.Set(configuration.ViperKeyAuthenticatorOAuth2ClientCredentialsIsEnabled, true) + conf.SetForTest(t, configuration.AuthenticatorOAuth2ClientCredentialsIsEnabled, true) require.NoError(t, a.Validate(json.RawMessage(`{"token_url":"`+ts.URL+"/oauth2/token"+`","retry":{"give_up_after":"3s", "max_delay":"100ms"}}`))) }) } diff --git a/pipeline/authn/authenticator_oauth2_introspection.go b/pipeline/authn/authenticator_oauth2_introspection.go index 072b7b8389..5290ee086e 100644 --- a/pipeline/authn/authenticator_oauth2_introspection.go +++ b/pipeline/authn/authenticator_oauth2_introspection.go @@ -344,7 +344,11 @@ func (a *AuthenticatorOAuth2Introspection) Config(config json.RawMessage) (*Auth return nil, nil, errors.WithStack(err) } - client = httpx.NewResilientClientLatencyToleranceConfigurable(rt, timeout, maxWait) + client = httpx.NewResilientClient( + httpx.ResilientClientWithMaxRetryWait(maxWait), + httpx.ResilientClientWithConnectionTimeout(timeout), + ).StandardClient() + client.Transport = rt a.mu.Lock() a.clientMap[clientKey] = client a.mu.Unlock() diff --git a/pipeline/authn/authenticator_oauth2_introspection_cache_test.go b/pipeline/authn/authenticator_oauth2_introspection_cache_test.go index e9be52fcee..f54004f601 100644 --- a/pipeline/authn/authenticator_oauth2_introspection_cache_test.go +++ b/pipeline/authn/authenticator_oauth2_introspection_cache_test.go @@ -1,6 +1,7 @@ package authn import ( + "context" "testing" "time" @@ -9,18 +10,22 @@ import ( "github.com/ory/fosite" "github.com/ory/oathkeeper/driver/configuration" - "github.com/ory/viper" + "github.com/ory/x/configx" "github.com/ory/x/logrusx" ) func TestCache(t *testing.T) { - viper.Reset() - - viper.Set("authenticators.oauth2_introspection.config.cache.enabled", true) - viper.Set("authenticators.oauth2_introspection.config.introspection_url", "http://localhost:8080/") - logger := logrusx.New("", "") - c := configuration.NewViperProvider(logger) + c, err := configuration.NewKoanfProvider( + context.Background(), + nil, + logger, + configx.WithValues(map[string]interface{}{ + "authenticators.oauth2_introspection.config.cache.enabled": true, + "authenticators.oauth2_introspection.config.introspection_url": "http://localhost:8080/", + })) + require.NoError(t, err) + a := NewAuthenticatorOAuth2Introspection(c, logger) assert.Equal(t, "oauth2_introspection", a.GetID()) diff --git a/pipeline/authn/authenticator_oauth2_introspection_test.go b/pipeline/authn/authenticator_oauth2_introspection_test.go index d4366b05a3..8a9cd2425a 100644 --- a/pipeline/authn/authenticator_oauth2_introspection_test.go +++ b/pipeline/authn/authenticator_oauth2_introspection_test.go @@ -30,21 +30,22 @@ import ( "time" "github.com/ory/x/assertx" + "github.com/ory/x/configx" "github.com/julienschmidt/httprouter" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/tidwall/sjson" + "github.com/ory/x/logrusx" + "github.com/ory/oathkeeper/driver/configuration" "github.com/ory/oathkeeper/internal" . "github.com/ory/oathkeeper/pipeline/authn" - "github.com/ory/viper" - "github.com/ory/x/logrusx" ) func TestAuthenticatorOAuth2Introspection(t *testing.T) { - conf := internal.NewConfigurationWithDefaults() + conf := internal.NewConfigurationWithDefaults(configx.SkipValidation()) reg := internal.NewRegistry(conf) a, err := reg.PipelineAuthenticator("oauth2_introspection") @@ -578,10 +579,7 @@ func TestAuthenticatorOAuth2Introspection(t *testing.T) { }) t.Run("method=authenticate-with-cache", func(t *testing.T) { - viper.Set("authenticators.oauth2_introspection.config.cache.enabled", true) - t.Cleanup(func() { - viper.Set("authenticators.oauth2_introspection.config.cache.enabled", false) - }) + conf.SetForTest(t, "authenticators.oauth2_introspection.config.cache.enabled", true) var didNotUseCache sync.WaitGroup @@ -643,7 +641,7 @@ func TestAuthenticatorOAuth2Introspection(t *testing.T) { } t.Run("case=with none scope strategy", func(t *testing.T) { - viper.Set("authenticators.oauth2_introspection.config.scope_strategy", "none") + conf.SetForTest(t, "authenticators.oauth2_introspection.config.scope_strategy", "none") r := &http.Request{Header: http.Header{"Authorization": {"bearer active-scope-a"}}} expected := new(AuthenticationSession) t.Run("case=initial request succeeds and caches", func(t *testing.T) { @@ -692,7 +690,7 @@ func TestAuthenticatorOAuth2Introspection(t *testing.T) { t.Run("case=does not use cache for refresh tokens", func(t *testing.T) { for _, strategy := range []string{"wildcard", "none"} { t.Run("scope_strategy="+strategy, func(t *testing.T) { - viper.Set("authenticators.oauth2_introspection.config.scope_strategy", strategy) + conf.SetForTest(t, "authenticators.oauth2_introspection.config.scope_strategy", strategy) r := &http.Request{Header: http.Header{"Authorization": {"bearer refresh_token"}}} expected := new(AuthenticationSession) @@ -709,7 +707,7 @@ func TestAuthenticatorOAuth2Introspection(t *testing.T) { }) t.Run("case=with a scope scope strategy", func(t *testing.T) { - viper.Set("authenticators.oauth2_introspection.config.scope_strategy", "wildcard") + conf.SetForTest(t, "authenticators.oauth2_introspection.config.scope_strategy", "wildcard") r := &http.Request{Header: http.Header{"Authorization": {"bearer another-active-scope-a"}}} expected := new(AuthenticationSession) @@ -795,19 +793,16 @@ func TestAuthenticatorOAuth2Introspection(t *testing.T) { }) t.Run("method=validate", func(t *testing.T) { - viper.Set(configuration.ViperKeyAuthenticatorOAuth2TokenIntrospectionIsEnabled, false) + conf.SetForTest(t, configuration.AuthenticatorOAuth2TokenIntrospectionIsEnabled, false) require.Error(t, a.Validate(json.RawMessage(`{"introspection_url":""}`))) - viper.Reset() - viper.Set(configuration.ViperKeyAuthenticatorOAuth2TokenIntrospectionIsEnabled, true) + conf.SetForTest(t, configuration.AuthenticatorOAuth2TokenIntrospectionIsEnabled, true) require.Error(t, a.Validate(json.RawMessage(`{"introspection_url":""}`))) - viper.Reset() - viper.Set(configuration.ViperKeyAuthenticatorOAuth2TokenIntrospectionIsEnabled, false) + conf.SetForTest(t, configuration.AuthenticatorOAuth2TokenIntrospectionIsEnabled, false) require.Error(t, a.Validate(json.RawMessage(`{"introspection_url":"/oauth2/token"}`))) - viper.Reset() - viper.Set(configuration.ViperKeyAuthenticatorOAuth2TokenIntrospectionIsEnabled, true) + conf.SetForTest(t, configuration.AuthenticatorOAuth2TokenIntrospectionIsEnabled, true) require.Error(t, a.Validate(json.RawMessage(`{"introspection_url":"/oauth2/token"}`))) }) @@ -856,7 +851,7 @@ func TestAuthenticatorOAuth2Introspection(t *testing.T) { t.Run("Should not be equal because we changed a system default", func(t *testing.T) { // Unskip once https://github.com/ory/oathkeeper/issues/757 lands t.Skip("This fails due to viper caching and it makes no sense to fix it as we need to adopt koanf first") - viper.Set("authenticators.oauth2_introspection.config.pre_authorization", map[string]interface{}{"scope": []string{"foo"}}) + conf.SetForTest(t, "authenticators.oauth2_introspection.config.pre_authorization", map[string]interface{}{"scope": []string{"foo"}}) _, noPreauthClient3, err := authenticator.Config(noPreauthConfig) require.NoError(t, err) diff --git a/pipeline/authn/authenticator_unauthorized_test.go b/pipeline/authn/authenticator_unauthorized_test.go index 12c219aded..9be819a932 100644 --- a/pipeline/authn/authenticator_unauthorized_test.go +++ b/pipeline/authn/authenticator_unauthorized_test.go @@ -24,8 +24,6 @@ import ( "net/http" "testing" - "github.com/ory/viper" - "github.com/ory/oathkeeper/driver/configuration" "github.com/ory/oathkeeper/internal" @@ -47,11 +45,10 @@ func TestAuthenticatorBroken(t *testing.T) { }) t.Run("method=validate", func(t *testing.T) { - viper.Set(configuration.ViperKeyAuthenticatorUnauthorizedIsEnabled, true) + conf.SetForTest(t, configuration.AuthenticatorUnauthorizedIsEnabled, true) require.NoError(t, a.Validate(nil)) - viper.Reset() - viper.Set(configuration.ViperKeyAuthenticatorUnauthorizedIsEnabled, false) + conf.SetForTest(t, configuration.AuthenticatorUnauthorizedIsEnabled, false) require.Error(t, a.Validate(nil)) }) } diff --git a/pipeline/authz/authorizer_allow_test.go b/pipeline/authz/authorizer_allow_test.go index 530d34f245..34f77b5b6d 100644 --- a/pipeline/authz/authorizer_allow_test.go +++ b/pipeline/authz/authorizer_allow_test.go @@ -23,8 +23,6 @@ package authz_test import ( "testing" - "github.com/ory/viper" - "github.com/ory/oathkeeper/driver/configuration" "github.com/ory/oathkeeper/internal" @@ -33,6 +31,7 @@ import ( ) func TestAuthorizerAllow(t *testing.T) { + t.Parallel() conf := internal.NewConfigurationWithDefaults() reg := internal.NewRegistry(conf) @@ -45,11 +44,10 @@ func TestAuthorizerAllow(t *testing.T) { }) t.Run("method=validate", func(t *testing.T) { - viper.Set(configuration.ViperKeyAuthorizerAllowIsEnabled, true) + conf.SetForTest(t, configuration.AuthorizerAllowIsEnabled, true) require.NoError(t, a.Validate(nil)) - viper.Reset() - viper.Set(configuration.ViperKeyAuthorizerAllowIsEnabled, false) + conf.SetForTest(t, configuration.AuthorizerAllowIsEnabled, false) require.Error(t, a.Validate(nil)) }) } diff --git a/pipeline/authz/authorizer_deny_test.go b/pipeline/authz/authorizer_deny_test.go index ab758f0acd..8aa736399e 100644 --- a/pipeline/authz/authorizer_deny_test.go +++ b/pipeline/authz/authorizer_deny_test.go @@ -23,8 +23,6 @@ package authz_test import ( "testing" - "github.com/ory/viper" - "github.com/ory/oathkeeper/driver/configuration" "github.com/ory/oathkeeper/internal" @@ -33,6 +31,7 @@ import ( ) func TestAuthorizerDeny(t *testing.T) { + t.Parallel() conf := internal.NewConfigurationWithDefaults() reg := internal.NewRegistry(conf) @@ -45,11 +44,10 @@ func TestAuthorizerDeny(t *testing.T) { }) t.Run("method=validate", func(t *testing.T) { - viper.Set(configuration.ViperKeyAuthorizerDenyIsEnabled, true) + conf.SetForTest(t, configuration.AuthorizerDenyIsEnabled, true) require.NoError(t, a.Validate(nil)) - viper.Reset() - viper.Set(configuration.ViperKeyAuthorizerDenyIsEnabled, false) + conf.SetForTest(t, configuration.AuthorizerDenyIsEnabled, false) require.Error(t, a.Validate(nil)) }) } diff --git a/pipeline/authz/keto_engine_acp_ory.go b/pipeline/authz/keto_engine_acp_ory.go index 90d1364a19..79b440c5e0 100644 --- a/pipeline/authz/keto_engine_acp_ory.go +++ b/pipeline/authz/keto_engine_acp_ory.go @@ -30,13 +30,14 @@ import ( "text/template" "time" - "github.com/ory/x/httpx" + "github.com/hashicorp/go-retryablehttp" "github.com/ory/oathkeeper/driver/configuration" "github.com/ory/oathkeeper/pipeline" "github.com/ory/oathkeeper/pipeline/authn" "github.com/ory/oathkeeper/x" + "github.com/ory/x/httpx" "github.com/ory/x/urlx" "github.com/pkg/errors" @@ -68,15 +69,18 @@ func (c *AuthorizerKetoEngineACPORYConfiguration) ResourceTemplateID() string { type AuthorizerKetoEngineACPORY struct { c configuration.Provider - client *http.Client + client *retryablehttp.Client contextCreator authorizerKetoWardenContext t *template.Template } func NewAuthorizerKetoEngineACPORY(c configuration.Provider) *AuthorizerKetoEngineACPORY { return &AuthorizerKetoEngineACPORY{ - c: c, - client: httpx.NewResilientClientLatencyToleranceSmall(nil), + c: c, + client: httpx.NewResilientClient( + httpx.ResilientClientWithMaxRetryWait(100*time.Millisecond), + httpx.ResilientClientWithMaxRetry(5), + ), contextCreator: func(r *http.Request) map[string]interface{} { return map[string]interface{}{ "remoteIpAddress": realip.RealIP(r), @@ -104,7 +108,7 @@ func (a *AuthorizerKetoEngineACPORY) WithContextCreator(f authorizerKetoWardenCo a.contextCreator = f } -func (a *AuthorizerKetoEngineACPORY) Authorize(r *http.Request, session *authn.AuthenticationSession, config json.RawMessage, rule pipeline.Rule) error { +func (a *AuthorizerKetoEngineACPORY) Authorize(r *http.Request, session *authn.AuthenticationSession, config json.RawMessage, _ pipeline.Rule) error { cf, err := a.Config(config) if err != nil { return err @@ -160,7 +164,12 @@ func (a *AuthorizerKetoEngineACPORY) Authorize(r *http.Request, session *authn.A } req.Header.Add("Content-Type", "application/json") - res, err := a.client.Do(req.WithContext(r.Context())) + retryableReq, err := retryablehttp.FromRequest(req.WithContext(r.Context())) + if err != nil { + return errors.WithStack(err) + } + + res, err := a.client.Do(retryableReq) if err != nil { return errors.WithStack(err) } diff --git a/pipeline/authz/keto_engine_acp_ory_test.go b/pipeline/authz/keto_engine_acp_ory_test.go index 1677ed0df9..53e93ed6ad 100644 --- a/pipeline/authz/keto_engine_acp_ory_test.go +++ b/pipeline/authz/keto_engine_acp_ory_test.go @@ -30,7 +30,7 @@ import ( "github.com/tidwall/sjson" - "github.com/ory/viper" + "github.com/ory/x/configx" "github.com/ory/oathkeeper/driver/configuration" "github.com/ory/oathkeeper/internal" @@ -39,7 +39,6 @@ import ( "github.com/ory/oathkeeper/pipeline/authn" . "github.com/ory/oathkeeper/pipeline/authz" - "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -47,7 +46,8 @@ import ( ) func TestAuthorizerKetoWarden(t *testing.T) { - conf := internal.NewConfigurationWithDefaults() + t.Parallel() + conf := internal.NewConfigurationWithDefaults(configx.SkipValidation()) reg := internal.NewRegistry(conf) rule := &rule.Rule{ID: "TestAuthorizer"} @@ -76,7 +76,7 @@ func TestAuthorizerKetoWarden(t *testing.T) { config: []byte(`{ "required_action": "action", "required_resource": "resource", "flavor": "regex" }`), r: &http.Request{URL: &url.URL{}}, setup: func(t *testing.T) *httptest.Server { - return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusForbidden) })) }, @@ -172,9 +172,10 @@ func TestAuthorizerKetoWarden(t *testing.T) { expectErr: false, }, } { + k := k + tc := tc t.Run(fmt.Sprintf("case=%d", k), func(t *testing.T) { - c := gomock.NewController(t) - defer c.Finish() + t.Parallel() baseURL := "http://73fa403f-7e9c-48ef-870f-d21b2c34fc80c6cb6404-bb36-4e70-8b90-45155657fda6/" if tc.setup != nil { @@ -198,17 +199,16 @@ func TestAuthorizerKetoWarden(t *testing.T) { } t.Run("method=validate", func(t *testing.T) { - viper.Set(configuration.ViperKeyAuthorizerKetoEngineACPORYIsEnabled, false) + conf.SetForTest(t, configuration.AuthorizerKetoEngineACPORYIsEnabled, false) require.Error(t, a.Validate(json.RawMessage(`{"base_url":"","required_action":"foo","required_resource":"bar"}`))) - viper.Set(configuration.ViperKeyAuthorizerKetoEngineACPORYIsEnabled, false) + conf.SetForTest(t, configuration.AuthorizerKetoEngineACPORYIsEnabled, false) require.Error(t, a.Validate(json.RawMessage(`{"base_url":"http://foo/bar","required_action":"foo","required_resource":"bar"}`))) - viper.Reset() - viper.Set(configuration.ViperKeyAuthorizerKetoEngineACPORYIsEnabled, true) + conf.SetForTest(t, configuration.AuthorizerKetoEngineACPORYIsEnabled, true) require.Error(t, a.Validate(json.RawMessage(`{"base_url":"","required_action":"foo","required_resource":"bar"}`))) - viper.Set(configuration.ViperKeyAuthorizerKetoEngineACPORYIsEnabled, true) + conf.SetForTest(t, configuration.AuthorizerKetoEngineACPORYIsEnabled, true) require.NoError(t, a.Validate(json.RawMessage(`{"base_url":"http://foo/bar","required_action":"foo","required_resource":"bar"}`))) }) } diff --git a/pipeline/authz/remote.go b/pipeline/authz/remote.go index 832bcd8d41..800504284e 100644 --- a/pipeline/authz/remote.go +++ b/pipeline/authz/remote.go @@ -45,7 +45,7 @@ type AuthorizerRemote struct { func NewAuthorizerRemote(c configuration.Provider) *AuthorizerRemote { return &AuthorizerRemote{ c: c, - client: httpx.NewResilientClientLatencyToleranceSmall(nil), + client: httpx.NewResilientClient().StandardClient(), t: x.NewTemplate("remote"), } } @@ -165,7 +165,10 @@ func (a *AuthorizerRemote) Config(config json.RawMessage) (*AuthorizerRemoteConf return nil, err } timeout := time.Millisecond * duration - a.client = httpx.NewResilientClientLatencyToleranceConfigurable(nil, timeout, maxWait) + a.client = httpx.NewResilientClient( + httpx.ResilientClientWithMaxRetryWait(maxWait), + httpx.ResilientClientWithConnectionTimeout(timeout), + ).StandardClient() return &c, nil } diff --git a/pipeline/authz/remote_json.go b/pipeline/authz/remote_json.go index defd799653..cc8361133e 100644 --- a/pipeline/authz/remote_json.go +++ b/pipeline/authz/remote_json.go @@ -50,7 +50,7 @@ type AuthorizerRemoteJSON struct { func NewAuthorizerRemoteJSON(c configuration.Provider) *AuthorizerRemoteJSON { return &AuthorizerRemoteJSON{ c: c, - client: httpx.NewResilientClientLatencyToleranceSmall(nil), + client: httpx.NewResilientClient().StandardClient(), t: x.NewTemplate("remote_json"), } } @@ -129,10 +129,6 @@ func (a *AuthorizerRemoteJSON) Validate(config json.RawMessage) error { // Config merges config and the authorizer's configuration and validates the // resulting configuration. It reports an error if the configuration is invalid. func (a *AuthorizerRemoteJSON) Config(config json.RawMessage) (*AuthorizerRemoteJSONConfiguration, error) { - const ( - defaultTimeout = "500ms" - defaultMaxWait = "1s" - ) var c AuthorizerRemoteJSONConfiguration if err := a.c.AuthorizerConfig(a.GetID(), config, &c); err != nil { return nil, NewErrAuthorizerMisconfigured(a, err) @@ -142,16 +138,6 @@ func (a *AuthorizerRemoteJSON) Config(config json.RawMessage) (*AuthorizerRemote c.ForwardResponseHeadersToUpstream = []string{} } - if c.Retry == nil { - c.Retry = &AuthorizerRemoteJSONRetryConfiguration{Timeout: defaultTimeout, MaxWait: defaultMaxWait} - } else { - if c.Retry.Timeout == "" { - c.Retry.Timeout = defaultTimeout - } - if c.Retry.MaxWait == "" { - c.Retry.MaxWait = defaultMaxWait - } - } duration, err := time.ParseDuration(c.Retry.Timeout) if err != nil { return nil, err @@ -162,7 +148,10 @@ func (a *AuthorizerRemoteJSON) Config(config json.RawMessage) (*AuthorizerRemote return nil, err } timeout := time.Millisecond * duration - a.client = httpx.NewResilientClientLatencyToleranceConfigurable(nil, timeout, maxWait) + a.client = httpx.NewResilientClient( + httpx.ResilientClientWithMaxRetryWait(maxWait), + httpx.ResilientClientWithConnectionTimeout(timeout), + ).StandardClient() return &c, nil } diff --git a/pipeline/authz/remote_json_test.go b/pipeline/authz/remote_json_test.go index 4a0ab416f6..a4fd76fc00 100644 --- a/pipeline/authz/remote_json_test.go +++ b/pipeline/authz/remote_json_test.go @@ -1,6 +1,7 @@ package authz_test import ( + "context" "encoding/json" "io/ioutil" "net/http" @@ -11,10 +12,9 @@ import ( "github.com/stretchr/testify/require" "github.com/tidwall/sjson" + "github.com/ory/x/configx" "github.com/ory/x/logrusx" - "github.com/ory/viper" - "github.com/ory/oathkeeper/driver/configuration" "github.com/ory/oathkeeper/pipeline/authn" . "github.com/ory/oathkeeper/pipeline/authz" @@ -22,6 +22,7 @@ import ( ) func TestAuthorizerRemoteJSONAuthorize(t *testing.T) { + t.Parallel() tests := []struct { name string setup func(t *testing.T) *httptest.Server @@ -63,7 +64,7 @@ func TestAuthorizerRemoteJSONAuthorize(t *testing.T) { { name: "forbidden", setup: func(t *testing.T) *httptest.Server { - return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusForbidden) })) }, @@ -74,7 +75,7 @@ func TestAuthorizerRemoteJSONAuthorize(t *testing.T) { { name: "unexpected status code", setup: func(t *testing.T) *httptest.Server { - return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusBadRequest) })) }, @@ -102,7 +103,7 @@ func TestAuthorizerRemoteJSONAuthorize(t *testing.T) { { name: "ok with allowed headers", setup: func(t *testing.T) *httptest.Server { - return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.Header().Set("X-Foo", "bar") w.WriteHeader(http.StatusOK) })) @@ -114,7 +115,7 @@ func TestAuthorizerRemoteJSONAuthorize(t *testing.T) { { name: "ok with not allowed headers", setup: func(t *testing.T) *httptest.Server { - return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.Header().Set("X-Bar", "foo") w.WriteHeader(http.StatusOK) })) @@ -157,14 +158,21 @@ func TestAuthorizerRemoteJSONAuthorize(t *testing.T) { }, } for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { + t.Parallel() if tt.setup != nil { server := tt.setup(t) defer server.Close() tt.config, _ = sjson.SetBytes(tt.config, "remote", server.URL) } - p := configuration.NewViperProvider(logrusx.New("", "")) + l := logrusx.New("", "") + p, err := configuration.NewKoanfProvider( + context.Background(), nil, l) + if err != nil { + l.WithError(err).Fatal("Failed to initialize configuration") + } a := NewAuthorizerRemoteJSON(p) r := &http.Request{ Header: map[string][]string{ @@ -183,6 +191,7 @@ func TestAuthorizerRemoteJSONAuthorize(t *testing.T) { } func TestAuthorizerRemoteJSONValidate(t *testing.T) { + t.Parallel() tests := []struct { name string enabled bool @@ -241,9 +250,13 @@ func TestAuthorizerRemoteJSONValidate(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - p := configuration.NewViperProvider(logrusx.New("", "")) + p, err := configuration.NewKoanfProvider( + context.Background(), nil, logrusx.New("", ""), + configx.SkipValidation(), + ) + require.NoError(t, err) a := NewAuthorizerRemoteJSON(p) - viper.Set(configuration.ViperKeyAuthorizerRemoteJSONIsEnabled, tt.enabled) + p.SetForTest(t, configuration.AuthorizerRemoteJSONIsEnabled, tt.enabled) if err := a.Validate(tt.config); (err != nil) != tt.wantErr { t.Errorf("Validate() error = %v, wantErr %v", err, tt.wantErr) } @@ -252,6 +265,8 @@ func TestAuthorizerRemoteJSONValidate(t *testing.T) { } func TestAuthorizerRemoteJSONConfig(t *testing.T) { + t.Parallel() + tests := []struct { name string raw json.RawMessage @@ -265,7 +280,7 @@ func TestAuthorizerRemoteJSONConfig(t *testing.T) { Payload: "{}", ForwardResponseHeadersToUpstream: []string{"X-Foo"}, Retry: &AuthorizerRemoteJSONRetryConfiguration{ - Timeout: "500ms", + Timeout: "100ms", // default timeout from schema MaxWait: "1s", }, }, @@ -278,15 +293,20 @@ func TestAuthorizerRemoteJSONConfig(t *testing.T) { Payload: "{}", ForwardResponseHeadersToUpstream: []string{}, Retry: &AuthorizerRemoteJSONRetryConfiguration{ - Timeout: "500ms", + Timeout: "100ms", // default timeout from schema MaxWait: "1s", }, }, }, } for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - p := configuration.NewViperProvider(logrusx.New("", "")) + tt := tt + t.Run("case="+tt.name, func(t *testing.T) { + t.Parallel() + p, err := configuration.NewKoanfProvider( + context.Background(), nil, logrusx.New("", ""), + ) + require.NoError(t, err) a := NewAuthorizerRemoteJSON(p) actual, err := a.Config(tt.raw) assert.NoError(t, err) diff --git a/pipeline/authz/remote_test.go b/pipeline/authz/remote_test.go index f7bbfc1d51..1269f354a5 100644 --- a/pipeline/authz/remote_test.go +++ b/pipeline/authz/remote_test.go @@ -1,6 +1,7 @@ package authz_test import ( + "context" "encoding/json" "io/ioutil" "net/http" @@ -12,10 +13,9 @@ import ( "github.com/stretchr/testify/require" "github.com/tidwall/sjson" + "github.com/ory/x/configx" "github.com/ory/x/logrusx" - "github.com/ory/viper" - "github.com/ory/oathkeeper/driver/configuration" "github.com/ory/oathkeeper/pipeline/authn" . "github.com/ory/oathkeeper/pipeline/authz" @@ -53,7 +53,7 @@ func TestAuthorizerRemoteAuthorize(t *testing.T) { { name: "forbidden", setup: func(t *testing.T) *httptest.Server { - return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusForbidden) })) }, @@ -64,7 +64,7 @@ func TestAuthorizerRemoteAuthorize(t *testing.T) { { name: "unexpected status code", setup: func(t *testing.T) *httptest.Server { - return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusBadRequest) })) }, @@ -119,7 +119,7 @@ func TestAuthorizerRemoteAuthorize(t *testing.T) { { name: "ok with allowed headers", setup: func(t *testing.T) *httptest.Server { - return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.Header().Set("X-Foo", "bar") w.WriteHeader(http.StatusOK) })) @@ -131,7 +131,7 @@ func TestAuthorizerRemoteAuthorize(t *testing.T) { { name: "ok with not allowed headers", setup: func(t *testing.T) *httptest.Server { - return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.Header().Set("X-Bar", "foo") w.WriteHeader(http.StatusOK) })) @@ -167,7 +167,12 @@ func TestAuthorizerRemoteAuthorize(t *testing.T) { tt.config, _ = sjson.SetBytes(tt.config, "remote", server.URL) } - p := configuration.NewViperProvider(logrusx.New("", "")) + l := logrusx.New("", "") + p, err := configuration.NewKoanfProvider( + context.Background(), nil, l) + if err != nil { + l.WithError(err).Fatal("Failed to initialize configuration") + } a := NewAuthorizerRemote(p) r := &http.Request{ Header: map[string][]string{ @@ -242,9 +247,12 @@ func TestAuthorizerRemoteValidate(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - p := configuration.NewViperProvider(logrusx.New("", "")) + p, err := configuration.NewKoanfProvider( + context.Background(), nil, logrusx.New("", ""), + configx.SkipValidation()) + require.NoError(t, err) a := NewAuthorizerRemote(p) - viper.Set(configuration.ViperKeyAuthorizerRemoteIsEnabled, tt.enabled) + p.SetForTest(t, configuration.AuthorizerRemoteIsEnabled, tt.enabled) if err := a.Validate(tt.config); (err != nil) != tt.wantErr { t.Errorf("Validate() error = %v, wantErr %v", err, tt.wantErr) } diff --git a/pipeline/mutate/mutator_broken_test.go b/pipeline/mutate/mutator_broken_test.go index 10ca2fbf8b..048a8b6175 100644 --- a/pipeline/mutate/mutator_broken_test.go +++ b/pipeline/mutate/mutator_broken_test.go @@ -30,6 +30,7 @@ import ( ) func TestCredentialsIssuerBroken(t *testing.T) { + t.Parallel() a := mutate.NewMutatorBroken(false) assert.Equal(t, "broken", a.GetID()) diff --git a/pipeline/mutate/mutator_cookie_test.go b/pipeline/mutate/mutator_cookie_test.go index 776baae4ec..f95364a8e6 100644 --- a/pipeline/mutate/mutator_cookie_test.go +++ b/pipeline/mutate/mutator_cookie_test.go @@ -24,6 +24,7 @@ import ( ) func TestCredentialsIssuerCookies(t *testing.T) { + t.Parallel() conf := internal.NewConfigurationWithDefaults() reg := internal.NewRegistry(conf) @@ -206,11 +207,10 @@ func TestCredentialsIssuerCookies(t *testing.T) { }) t.Run("method=validate", func(t *testing.T) { - viper.Set(configuration.ViperKeyMutatorCookieIsEnabled, true) + viper.Set(configuration.MutatorCookieIsEnabled, true) require.Error(t, a.Validate(json.RawMessage(`{}`))) - viper.Reset() - viper.Set(configuration.ViperKeyMutatorCookieIsEnabled, false) + viper.Set(configuration.MutatorCookieIsEnabled, false) require.Error(t, a.Validate(json.RawMessage(`{"cookies":{}}`))) }) }) diff --git a/pipeline/mutate/mutator_header_test.go b/pipeline/mutate/mutator_header_test.go index c958724aa3..d75b40974b 100644 --- a/pipeline/mutate/mutator_header_test.go +++ b/pipeline/mutate/mutator_header_test.go @@ -8,7 +8,7 @@ import ( "testing" "text/template" - "github.com/ory/viper" + "github.com/ory/x/configx" "github.com/ory/oathkeeper/driver/configuration" "github.com/ory/oathkeeper/internal" @@ -24,7 +24,8 @@ import ( ) func TestCredentialsIssuerHeaders(t *testing.T) { - conf := internal.NewConfigurationWithDefaults() + t.Parallel() + conf := internal.NewConfigurationWithDefaults(configx.SkipValidation()) reg := internal.NewRegistry(conf) a, err := reg.PipelineMutator("header") @@ -218,11 +219,10 @@ func TestCredentialsIssuerHeaders(t *testing.T) { }) t.Run("method=validate", func(t *testing.T) { - viper.Set(configuration.ViperKeyMutatorHeaderIsEnabled, true) + conf.SetForTest(t, configuration.MutatorHeaderIsEnabled, true) require.NoError(t, a.Validate(json.RawMessage(`{"headers":{}}`))) - viper.Reset() - viper.Set(configuration.ViperKeyMutatorHeaderIsEnabled, false) + conf.SetForTest(t, configuration.MutatorHeaderIsEnabled, false) require.Error(t, a.Validate(json.RawMessage(`{"headers":{}}`))) }) } diff --git a/pipeline/mutate/mutator_hydrator.go b/pipeline/mutate/mutator_hydrator.go index 9430eefd2d..278a5646dc 100644 --- a/pipeline/mutate/mutator_hydrator.go +++ b/pipeline/mutate/mutator_hydrator.go @@ -107,7 +107,12 @@ func NewMutatorHydrator(c configuration.Provider, d mutatorHydratorDependencies) // This is a best-practice value. BufferItems: 64, }) - return &MutatorHydrator{c: c, d: d, client: httpx.NewResilientClientLatencyToleranceSmall(nil), hydrateCache: cache} + return &MutatorHydrator{ + c: c, + d: d, + client: httpx.NewResilientClient().StandardClient(), + hydrateCache: cache, + } } func (a *MutatorHydrator) GetID() string { @@ -184,7 +189,8 @@ func (a *MutatorHydrator) Mutate(r *http.Request, session *authn.AuthenticationS } req.Header.Set(contentTypeHeaderKey, contentTypeJSONHeaderValue) - var client http.Client + var client *http.Client + if cfg.Api.Retry != nil { maxRetryDelay := time.Second giveUpAfter := time.Millisecond * 50 @@ -203,7 +209,12 @@ func (a *MutatorHydrator) Mutate(r *http.Request, session *authn.AuthenticationS } } - client.Transport = httpx.NewResilientRoundTripper(a.client.Transport, maxRetryDelay, giveUpAfter) + client = httpx.NewResilientClient( + httpx.ResilientClientWithMaxRetryWait(maxRetryDelay), + httpx.ResilientClientWithConnectionTimeout(giveUpAfter), + ).StandardClient() + } else { + client = http.DefaultClient } res, err := client.Do(req.WithContext(r.Context())) diff --git a/pipeline/mutate/mutator_hydrator_test.go b/pipeline/mutate/mutator_hydrator_test.go index 40760caba7..8141cd85c5 100644 --- a/pipeline/mutate/mutator_hydrator_test.go +++ b/pipeline/mutate/mutator_hydrator_test.go @@ -15,8 +15,7 @@ import ( "github.com/ory/oathkeeper/pipeline/authn" "github.com/ory/oathkeeper/pipeline/mutate" "github.com/ory/oathkeeper/rule" - - "github.com/ory/viper" + "github.com/ory/x/configx" "github.com/ory/oathkeeper/driver/configuration" "github.com/ory/oathkeeper/internal" @@ -128,7 +127,8 @@ func configWithRetriesForMutator(giveUpAfter, retryDelay string) func(*httptest. } func TestMutatorHydrator(t *testing.T) { - conf := internal.NewConfigurationWithDefaults() + t.Parallel() + conf := internal.NewConfigurationWithDefaults(configx.SkipValidation()) reg := internal.NewRegistry(conf) a, err := reg.PipelineMutator("hydrator") @@ -205,7 +205,7 @@ func TestMutatorHydrator(t *testing.T) { "Empty Response": { Setup: func(t *testing.T) http.Handler { router := httprouter.New() - router.POST("/", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { + router.POST("/", func(w http.ResponseWriter, _ *http.Request, _ httprouter.Params) { w.WriteHeader(http.StatusOK) _, err = w.Write([]byte(`{}`)) require.NoError(t, err) @@ -242,9 +242,9 @@ func TestMutatorHydrator(t *testing.T) { Err: errors.New("mutator matching this route is misconfigured or disabled"), }, "Not Found": { - Setup: func(t *testing.T) http.Handler { + Setup: func(_ *testing.T) http.Handler { router := httprouter.New() - router.POST("/", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { + router.POST("/", func(w http.ResponseWriter, _ *http.Request, _ httprouter.Params) { w.WriteHeader(http.StatusNotFound) }) return router @@ -382,8 +382,7 @@ func TestMutatorHydrator(t *testing.T) { {enabled: true, shouldPass: true, apiUrl: "http://api/bar"}, } { t.Run(fmt.Sprintf("case=%d", k), func(t *testing.T) { - viper.Reset() - viper.Set(configuration.ViperKeyMutatorHydratorIsEnabled, testCase.enabled) + conf.SetForTest(t, configuration.MutatorHydratorIsEnabled, testCase.enabled) err := a.Validate(json.RawMessage(`{"api":{"url":"` + testCase.apiUrl + `"}}`)) if testCase.shouldPass { diff --git a/pipeline/mutate/mutator_id_token_test.go b/pipeline/mutate/mutator_id_token_test.go index 556e4b8d09..bce552fa06 100644 --- a/pipeline/mutate/mutator_id_token_test.go +++ b/pipeline/mutate/mutator_id_token_test.go @@ -37,11 +37,10 @@ import ( "github.com/ory/oathkeeper/rule" "github.com/ory/oathkeeper/x" + "github.com/ory/x/configx" "github.com/golang-jwt/jwt/v4" - "github.com/ory/viper" - "github.com/ory/oathkeeper/credentials" "github.com/ory/oathkeeper/driver/configuration" "github.com/ory/oathkeeper/internal" @@ -200,14 +199,15 @@ func parseToken(h http.Header) string { } func TestMutatorIDToken(t *testing.T) { - conf := internal.NewConfigurationWithDefaults() + t.Parallel() + conf := internal.NewConfigurationWithDefaults(configx.SkipValidation()) reg := internal.NewRegistry(conf) a, err := reg.PipelineMutator("id_token") require.NoError(t, err) assert.Equal(t, "id_token", a.GetID()) - viper.Set("mutators.id_token.config.issuer_url", "/foo/bar") + conf.SetForTest(t, "mutators.id_token.config.issuer_url", "/foo/bar") t.Run("method=mutate", func(t *testing.T) { r := &http.Request{} @@ -257,8 +257,8 @@ func TestMutatorIDToken(t *testing.T) { session := &authn.AuthenticationSession{Subject: "foo", Extra: map[string]interface{}{"bar": "baz"}} config := json.RawMessage([]byte(`{"ttl": "3s", "claims": "{\"foo\": \"{{ print .Extra.bar }}\", \"aud\": [\"foo\"]}", "jwks_url": "file://../../test/stub/jwks-ecdsa.json"}`)) - t.Parallel() t.Run("subcase=different tokens because expired", func(t *testing.T) { + t.Parallel() config, _ := sjson.SetBytes(config, "ttl", "100ms") prev := mutate(t, *session, config) time.Sleep(time.Millisecond * 90) @@ -266,18 +266,21 @@ func TestMutatorIDToken(t *testing.T) { }) t.Run("subcase=same tokens because expired is long enough", func(t *testing.T) { + t.Parallel() prev := mutate(t, *session, config) time.Sleep(time.Second) // give the cache buffers some time assert.Equal(t, prev, mutate(t, *session, config)) }) t.Run("subcase=different tokens because expired is long but was reached", func(t *testing.T) { + t.Parallel() prev := mutate(t, *session, config) time.Sleep(time.Second * 3) // give the cache buffers some time assert.NotEqual(t, prev, mutate(t, *session, config)) }) t.Run("subcase=different tokens because different subjects", func(t *testing.T) { + t.Parallel() prev := mutate(t, *session, config) time.Sleep(time.Second) s := *session @@ -286,6 +289,7 @@ func TestMutatorIDToken(t *testing.T) { }) t.Run("subcase=different tokens because session extra changed", func(t *testing.T) { + t.Parallel() prev := mutate(t, *session, config) time.Sleep(time.Second) s := *session @@ -294,6 +298,7 @@ func TestMutatorIDToken(t *testing.T) { }) t.Run("subcase=different tokens because claim options changed", func(t *testing.T) { + t.Parallel() prev := mutate(t, *session, config) time.Sleep(time.Second) config := json.RawMessage([]byte(`{"ttl": "3s", "claims": "{\"foo\": \"{{ print .Extra.bar }}\", \"aud\": [\"not-foo\"]}", "jwks_url": "file://../../test/stub/jwks-ecdsa.json"}`)) @@ -301,6 +306,7 @@ func TestMutatorIDToken(t *testing.T) { }) t.Run("subcase=same tokens because session extra changed but claims ignore the extra claims", func(t *testing.T) { + t.Parallel() t.Skip("Skipped because cache hit rate is too low, see: https://github.com/ory/oathkeeper/issues/371") prev := mutate(t, *session, config) @@ -311,6 +317,7 @@ func TestMutatorIDToken(t *testing.T) { }) t.Run("subcase=different tokens because issuer changed", func(t *testing.T) { + t.Parallel() prev := mutate(t, *session, config) time.Sleep(time.Second) config, _ := sjson.SetBytes(config, "issuer_url", "/not-baz/not-bar") @@ -318,6 +325,7 @@ func TestMutatorIDToken(t *testing.T) { }) t.Run("subcase=different tokens because JWKS source changed", func(t *testing.T) { + t.Parallel() prev := mutate(t, *session, config) time.Sleep(time.Second) config, _ := sjson.SetBytes(config, "jwks_url", "file://../../test/stub/jwks-hs.json") @@ -372,8 +380,7 @@ func TestMutatorIDToken(t *testing.T) { {e: true, i: "http://baz/foo", j: "http://baz/foo", pass: true}, } { t.Run(fmt.Sprintf("case=%d", k), func(t *testing.T) { - viper.Reset() - viper.Set(configuration.ViperKeyMutatorIDTokenIsEnabled, tc.e) + conf.SetForTest(t, configuration.MutatorIDTokenIsEnabled, tc.e) err := a.Validate(json.RawMessage(`{"issuer_url":"` + tc.i + `", "jwks_url": "` + tc.j + `"}`)) if tc.pass { require.NoError(t, err) @@ -419,7 +426,7 @@ func BenchmarkMutatorIDToken(b *testing.B) { for i := 0; i < b.N; i++ { tc = tcs[i%len(tcs)] config, _ = sjson.SetBytes(tc.Config, "jwks_url", key) - viper.Set("mutators.id_token.config.issuer_url", "/"+issuers[i%len(issuers)]) + conf.SetForTest(b, "mutators.id_token.config.issuer_url", "/"+issuers[i%len(issuers)]) b.StartTimer() err := a.Mutate(r, tc.Session, config, rl) diff --git a/pipeline/mutate/mutator_noop_test.go b/pipeline/mutate/mutator_noop_test.go index d3b4d8ac27..6c3b1f90d5 100644 --- a/pipeline/mutate/mutator_noop_test.go +++ b/pipeline/mutate/mutator_noop_test.go @@ -26,8 +26,6 @@ import ( "github.com/ory/oathkeeper/pipeline/authn" - "github.com/ory/viper" - "github.com/ory/oathkeeper/driver/configuration" "github.com/ory/oathkeeper/internal" @@ -36,6 +34,7 @@ import ( ) func TestMutatorNoop(t *testing.T) { + t.Parallel() conf := internal.NewConfigurationWithDefaults() reg := internal.NewRegistry(conf) @@ -52,11 +51,10 @@ func TestMutatorNoop(t *testing.T) { }) t.Run("method=validate", func(t *testing.T) { - viper.Set(configuration.ViperKeyMutatorNoopIsEnabled, true) + conf.SetForTest(t, configuration.MutatorNoopIsEnabled, true) require.NoError(t, a.Validate(nil)) - viper.Reset() - viper.Set(configuration.ViperKeyMutatorNoopIsEnabled, false) + conf.SetForTest(t, configuration.MutatorNoopIsEnabled, false) require.Error(t, a.Validate(nil)) }) } diff --git a/proxy/proxy_test.go b/proxy/proxy_test.go index 8ca23f1bbf..fe588c82a1 100644 --- a/proxy/proxy_test.go +++ b/proxy/proxy_test.go @@ -32,17 +32,14 @@ import ( "strings" "testing" - "github.com/ory/viper" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/ory/oathkeeper/driver/configuration" "github.com/ory/oathkeeper/internal" "github.com/ory/oathkeeper/proxy" - "github.com/ory/oathkeeper/x" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "github.com/ory/oathkeeper/rule" + "github.com/ory/oathkeeper/x" ) func TestProxy(t *testing.T) { @@ -61,13 +58,13 @@ func TestProxy(t *testing.T) { ts := httptest.NewServer(&httputil.ReverseProxy{Director: d.Director, Transport: d}) defer ts.Close() - viper.Set(configuration.ViperKeyAuthenticatorNoopIsEnabled, true) - viper.Set(configuration.ViperKeyAuthenticatorUnauthorizedIsEnabled, true) - viper.Set(configuration.ViperKeyAuthenticatorAnonymousIsEnabled, true) - viper.Set(configuration.ViperKeyAuthorizerAllowIsEnabled, true) - viper.Set(configuration.ViperKeyAuthorizerDenyIsEnabled, true) - viper.Set(configuration.ViperKeyMutatorNoopIsEnabled, true) - viper.Set(configuration.ViperKeyErrorsWWWAuthenticateIsEnabled, true) + conf.SetForTest(t, configuration.AuthenticatorNoopIsEnabled, true) + conf.SetForTest(t, configuration.AuthenticatorUnauthorizedIsEnabled, true) + conf.SetForTest(t, configuration.AuthenticatorAnonymousIsEnabled, true) + conf.SetForTest(t, configuration.AuthorizerAllowIsEnabled, true) + conf.SetForTest(t, configuration.AuthorizerDenyIsEnabled, true) + conf.SetForTest(t, configuration.MutatorNoopIsEnabled, true) + conf.SetForTest(t, configuration.ErrorsWWWAuthenticateIsEnabled, true) ruleNoOpAuthenticator := rule.Rule{ Match: &rule.Match{Methods: []string{"GET"}, URL: ts.URL + "/authn-noop/<[0-9]+>"}, @@ -355,10 +352,10 @@ backend_url=%s } - t.Run("regexp", func(t *testing.T) { + t.Run("regexp", func(*testing.T) { testFunc(configuration.Regexp, tc.rulesRegexp) }) - t.Run("glob", func(t *testing.T) { + t.Run("glob", func(*testing.T) { testFunc(configuration.Glob, tc.rulesGlob) }) diff --git a/proxy/request_handler_test.go b/proxy/request_handler_test.go index 7c72d10d09..080e25d259 100644 --- a/proxy/request_handler_test.go +++ b/proxy/request_handler_test.go @@ -21,17 +21,18 @@ package proxy_test import ( - "bytes" "encoding/json" "fmt" "net/http" "net/http/httptest" "testing" + "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/ory/herodot" - "github.com/ory/viper" + "github.com/ory/x/configx" + "github.com/ory/x/logrusx" "github.com/ory/oathkeeper/driver/configuration" "github.com/ory/oathkeeper/internal" @@ -51,12 +52,13 @@ func newTestRequest(u string) *http.Request { func TestHandleError(t *testing.T) { for k, tc := range []struct { - d string - inputErr error - rule *rule.Rule - header http.Header - assert func(t *testing.T, w *httptest.ResponseRecorder) - setup func(t *testing.T) + d string + inputErr error + rule *rule.Rule + header http.Header + assert func(t *testing.T, w *httptest.ResponseRecorder) + setup func(t *testing.T, config configuration.Provider) + configOpts []configx.OptionModifier }{ { d: "should return a JSON error per default and work with nil rules", @@ -69,8 +71,8 @@ func TestHandleError(t *testing.T) { { d: "should return a 500 error when no handler is enabled", inputErr: &herodot.ErrNotFound, - setup: func(t *testing.T) { - viper.Set(configuration.ViperKeyErrorsJSONIsEnabled, false) + setup: func(t *testing.T, config configuration.Provider) { + config.SetForTest(t, configuration.ErrorsJSONIsEnabled, false) }, assert: func(t *testing.T, w *httptest.ResponseRecorder) { assert.Equal(t, 500, w.Code) @@ -79,8 +81,8 @@ func TestHandleError(t *testing.T) { { d: "should return the found response", inputErr: &herodot.ErrUnauthorized, - setup: func(t *testing.T) { - viper.Set(configuration.ViperKeyErrorsRedirectIsEnabled, true) + setup: func(t *testing.T, config configuration.Provider) { + config.SetForTest(t, configuration.ErrorsRedirectIsEnabled, true) }, rule: &rule.Rule{ Errors: []rule.ErrorHandler{{ @@ -96,9 +98,9 @@ func TestHandleError(t *testing.T) { { d: "should return a JSON error because the error is not unauthorized and JSON is the default", inputErr: &herodot.ErrNotFound, - setup: func(t *testing.T) { - viper.Set(configuration.ViperKeyErrorsRedirectIsEnabled, true) - viper.Set(configuration.ViperKeyErrors+".redirect.config.to", "http://test/test") + setup: func(t *testing.T, config configuration.Provider) { + config.SetForTest(t, configuration.ErrorsRedirectIsEnabled, true) + config.SetForTest(t, configuration.ErrorsHandlers+".redirect.config.to", "http://test/test") }, rule: &rule.Rule{ Errors: []rule.ErrorHandler{{ @@ -114,8 +116,8 @@ func TestHandleError(t *testing.T) { { d: "should pick the appropriate (json) error handler for the request when multiple are configured", inputErr: &herodot.ErrNotFound, - setup: func(t *testing.T) { - viper.Set(configuration.ViperKeyErrorsRedirectIsEnabled, true) + setup: func(t *testing.T, config configuration.Provider) { + config.SetForTest(t, configuration.ErrorsRedirectIsEnabled, true) }, header: map[string][]string{"Accept": {"application/json"}}, rule: &rule.Rule{ @@ -135,8 +137,8 @@ func TestHandleError(t *testing.T) { { d: "should redirect to the specified endpoint by picking the appropriate error handler (redirect)", inputErr: &herodot.ErrUnauthorized, - setup: func(t *testing.T) { - viper.Set(configuration.ViperKeyErrorsRedirectIsEnabled, true) + setup: func(t *testing.T, config configuration.Provider) { + config.SetForTest(t, configuration.ErrorsRedirectIsEnabled, true) }, header: map[string][]string{"Accept": {"application/xml"}}, rule: &rule.Rule{ @@ -156,10 +158,10 @@ func TestHandleError(t *testing.T) { { d: "should respond with the appropriate fallback handler (here www_authenticate)", inputErr: &herodot.ErrUnauthorized, - setup: func(t *testing.T) { - viper.Set(configuration.ViperKeyErrorsRedirectIsEnabled, true) - viper.Set(configuration.ViperKeyErrorsWWWAuthenticateIsEnabled, true) - viper.Set(configuration.ViperKeyErrorsFallback, []string{"www_authenticate", "json"}) + setup: func(t *testing.T, config configuration.Provider) { + config.SetForTest(t, configuration.ErrorsRedirectIsEnabled, true) + config.SetForTest(t, configuration.ErrorsWWWAuthenticateIsEnabled, true) + config.SetForTest(t, configuration.ErrorsFallback, []string{"www_authenticate", "json"}) }, header: map[string][]string{"Accept": {"mime/undefined"}}, rule: &rule.Rule{ @@ -179,12 +181,9 @@ func TestHandleError(t *testing.T) { { d: "should respond with the appropriate fallback handler (here json)", inputErr: &herodot.ErrForbidden, - setup: func(t *testing.T) { - viper.SetConfigType("yaml") - - // We set the fallback to first run www_authenticate. But because the error is not_found, as - // is defined in the when clause, we should see a json error instead! - require.NoError(t, viper.ReadConfig(bytes.NewBufferString(` + // We set the fallback to first run www_authenticate. But because the error is not_found, as + // is defined in the when clause, we should see a json error instead! + configOpts: []configx.OptionModifier{configx.WithConfigFiles(x.WriteFile(t, ` errors: fallback: - www_authenticate @@ -200,8 +199,7 @@ errors: when: - error: - not_found -`))) - }, +`))}, header: map[string][]string{"Accept": {"mime/undefined"}}, rule: &rule.Rule{ Errors: []rule.ErrorHandler{{ @@ -220,12 +218,9 @@ errors: { d: "should return a 500 error because no fallback could handle the error", inputErr: &herodot.ErrForbidden, - setup: func(t *testing.T) { - viper.SetConfigType("yaml") - - // We set the fallback to first run www_authenticate. But because the error is not_found, as - // is defined in the when clause, we should see the 500 misconfigured error - require.NoError(t, viper.ReadConfig(bytes.NewBufferString(` + // We set the fallback to first run www_authenticate. But because the error is not_found, as + // is defined in the when clause, we should see the 500 misconfigured error + configOpts: []configx.OptionModifier{configx.WithConfigFiles(x.WriteFile(t, ` errors: fallback: - www_authenticate @@ -236,8 +231,7 @@ errors: when: - error: - not_found -`))) - }, +`))}, header: map[string][]string{"Accept": {"mime/undefined"}}, rule: &rule.Rule{ Errors: []rule.ErrorHandler{{ @@ -256,11 +250,13 @@ errors: }, } { t.Run(fmt.Sprintf("case=%d/description=%s", k, tc.d), func(t *testing.T) { - conf := internal.NewConfigurationWithDefaults() + conf := internal.NewConfigurationWithDefaults( + append(tc.configOpts, configx.SkipValidation())..., + ) reg := internal.NewRegistry(conf) if tc.setup != nil { - tc.setup(t) + tc.setup(t, conf) } r := httptest.NewRequest("GET", "/test", nil) @@ -273,10 +269,29 @@ errors: } } +type testWriter struct{ t *testing.T } + +func (tw *testWriter) Write(p []byte) (n int, err error) { + tw.t.Log(string(p)) + return len(p), nil +} + +type logHook struct{ t *testing.T } + +func (l *logHook) Levels() []logrus.Level { return logrus.AllLevels } +func (l *logHook) Fire(e *logrus.Entry) error { + s, err := e.String() + if err != nil { + return err + } + l.t.Log(s) + return nil +} + func TestRequestHandler(t *testing.T) { for k, tc := range []struct { d string - setup func() + setup func(t *testing.T, config configuration.Provider) rule rule.Rule r *http.Request expectErr bool @@ -293,10 +308,10 @@ func TestRequestHandler(t *testing.T) { }, { d: "should fail because the rule is missing authn, authz, and mutator even when some pipelines are enabled", - setup: func() { - viper.Set(configuration.ViperKeyAuthenticatorNoopIsEnabled, true) - viper.Set(configuration.ViperKeyAuthorizerAllowIsEnabled, true) - viper.Set(configuration.ViperKeyMutatorNoopIsEnabled, true) + setup: func(t *testing.T, config configuration.Provider) { + config.SetForTest(t, configuration.AuthenticatorNoopIsEnabled, true) + config.SetForTest(t, configuration.AuthorizerAllowIsEnabled, true) + config.SetForTest(t, configuration.MutatorNoopIsEnabled, true) }, expectErr: true, r: newTestRequest("http://localhost"), @@ -308,10 +323,10 @@ func TestRequestHandler(t *testing.T) { }, { d: "should pass", - setup: func() { - viper.Set(configuration.ViperKeyAuthenticatorNoopIsEnabled, true) - viper.Set(configuration.ViperKeyAuthorizerAllowIsEnabled, true) - viper.Set(configuration.ViperKeyMutatorNoopIsEnabled, true) + setup: func(t *testing.T, config configuration.Provider) { + config.SetForTest(t, configuration.AuthenticatorNoopIsEnabled, true) + config.SetForTest(t, configuration.AuthorizerAllowIsEnabled, true) + config.SetForTest(t, configuration.MutatorNoopIsEnabled, true) }, expectErr: false, r: newTestRequest("http://localhost"), @@ -323,10 +338,10 @@ func TestRequestHandler(t *testing.T) { }, { d: "should fail when authn is set but not authz nor mutator", - setup: func() { - viper.Set(configuration.ViperKeyAuthenticatorAnonymousIsEnabled, true) - viper.Set(configuration.ViperKeyAuthorizerAllowIsEnabled, true) - viper.Set(configuration.ViperKeyMutatorNoopIsEnabled, true) + setup: func(t *testing.T, config configuration.Provider) { + config.SetForTest(t, configuration.AuthenticatorAnonymousIsEnabled, true) + config.SetForTest(t, configuration.AuthorizerAllowIsEnabled, true) + config.SetForTest(t, configuration.MutatorNoopIsEnabled, true) }, expectErr: true, r: newTestRequest("http://localhost"), @@ -338,10 +353,10 @@ func TestRequestHandler(t *testing.T) { }, { d: "should fail when authn, authz is set but not mutator", - setup: func() { - viper.Set(configuration.ViperKeyAuthenticatorAnonymousIsEnabled, true) - viper.Set(configuration.ViperKeyAuthorizerAllowIsEnabled, true) - viper.Set(configuration.ViperKeyMutatorNoopIsEnabled, true) + setup: func(t *testing.T, config configuration.Provider) { + config.SetForTest(t, configuration.AuthenticatorAnonymousIsEnabled, true) + config.SetForTest(t, configuration.AuthorizerAllowIsEnabled, true) + config.SetForTest(t, configuration.MutatorNoopIsEnabled, true) }, expectErr: true, r: newTestRequest("http://localhost"), @@ -353,10 +368,10 @@ func TestRequestHandler(t *testing.T) { }, { d: "should fail when authn is invalid because not enabled", - setup: func() { - viper.Set(configuration.ViperKeyAuthenticatorAnonymousIsEnabled, false) - viper.Set(configuration.ViperKeyAuthorizerAllowIsEnabled, true) - viper.Set(configuration.ViperKeyMutatorNoopIsEnabled, true) + setup: func(t *testing.T, config configuration.Provider) { + config.SetForTest(t, configuration.AuthenticatorAnonymousIsEnabled, false) + config.SetForTest(t, configuration.AuthorizerAllowIsEnabled, true) + config.SetForTest(t, configuration.MutatorNoopIsEnabled, true) }, expectErr: true, r: newTestRequest("http://localhost"), @@ -368,10 +383,10 @@ func TestRequestHandler(t *testing.T) { }, { d: "should fail when authz is invalid because not enabled", - setup: func() { - viper.Set(configuration.ViperKeyAuthenticatorAnonymousIsEnabled, true) - viper.Set(configuration.ViperKeyAuthorizerAllowIsEnabled, false) - viper.Set(configuration.ViperKeyMutatorNoopIsEnabled, true) + setup: func(t *testing.T, config configuration.Provider) { + config.SetForTest(t, configuration.AuthenticatorAnonymousIsEnabled, true) + config.SetForTest(t, configuration.AuthorizerAllowIsEnabled, false) + config.SetForTest(t, configuration.MutatorNoopIsEnabled, true) }, expectErr: true, r: newTestRequest("http://localhost"), @@ -383,10 +398,10 @@ func TestRequestHandler(t *testing.T) { }, { d: "should fail when mutator is invalid because not enabled", - setup: func() { - viper.Set(configuration.ViperKeyAuthenticatorAnonymousIsEnabled, true) - viper.Set(configuration.ViperKeyAuthorizerAllowIsEnabled, true) - viper.Set(configuration.ViperKeyMutatorNoopIsEnabled, false) + setup: func(t *testing.T, config configuration.Provider) { + config.SetForTest(t, configuration.AuthenticatorAnonymousIsEnabled, true) + config.SetForTest(t, configuration.AuthorizerAllowIsEnabled, true) + config.SetForTest(t, configuration.MutatorNoopIsEnabled, false) }, expectErr: true, r: newTestRequest("http://localhost"), @@ -398,10 +413,10 @@ func TestRequestHandler(t *testing.T) { }, { d: "should fail when authn does not exist", - setup: func() { - viper.Set(configuration.ViperKeyAuthenticatorAnonymousIsEnabled, true) - viper.Set(configuration.ViperKeyAuthorizerAllowIsEnabled, true) - viper.Set(configuration.ViperKeyMutatorNoopIsEnabled, true) + setup: func(t *testing.T, config configuration.Provider) { + config.SetForTest(t, configuration.AuthenticatorAnonymousIsEnabled, true) + config.SetForTest(t, configuration.AuthorizerAllowIsEnabled, true) + config.SetForTest(t, configuration.MutatorNoopIsEnabled, true) }, expectErr: true, r: newTestRequest("http://localhost"), @@ -413,10 +428,10 @@ func TestRequestHandler(t *testing.T) { }, { d: "should fail when authz does not exist", - setup: func() { - viper.Set(configuration.ViperKeyAuthenticatorAnonymousIsEnabled, true) - viper.Set(configuration.ViperKeyAuthorizerAllowIsEnabled, true) - viper.Set(configuration.ViperKeyMutatorNoopIsEnabled, true) + setup: func(t *testing.T, config configuration.Provider) { + config.SetForTest(t, configuration.AuthenticatorAnonymousIsEnabled, true) + config.SetForTest(t, configuration.AuthorizerAllowIsEnabled, true) + config.SetForTest(t, configuration.MutatorNoopIsEnabled, true) }, expectErr: true, r: newTestRequest("http://localhost"), @@ -428,10 +443,10 @@ func TestRequestHandler(t *testing.T) { }, { d: "should fail when mutator does not exist", - setup: func() { - viper.Set(configuration.ViperKeyAuthenticatorAnonymousIsEnabled, true) - viper.Set(configuration.ViperKeyAuthorizerAllowIsEnabled, true) - viper.Set(configuration.ViperKeyMutatorNoopIsEnabled, true) + setup: func(t *testing.T, config configuration.Provider) { + config.SetForTest(t, configuration.AuthenticatorAnonymousIsEnabled, true) + config.SetForTest(t, configuration.AuthorizerAllowIsEnabled, true) + config.SetForTest(t, configuration.MutatorNoopIsEnabled, true) }, expectErr: true, r: newTestRequest("http://localhost"), @@ -443,12 +458,16 @@ func TestRequestHandler(t *testing.T) { }, } { t.Run(fmt.Sprintf("case=%d/description=%s", k, tc.d), func(t *testing.T) { - - conf := internal.NewConfigurationWithDefaults() + // log, hook := test.NewNullLogger() + l := logrusx.New("", "" /*, logrusx.UseLogger(log), logrusx.WithHook(hook)*/) + l.Info("testing!!!") + conf := internal.NewConfigurationWithDefaults( + configx.WithLogger(l), + ) reg := internal.NewRegistry(conf) if tc.setup != nil { - tc.setup() + tc.setup(t, conf) } _, err := reg.ProxyRequestHandler().HandleRequest(tc.r, &tc.rule) @@ -544,7 +563,7 @@ func TestInitializeSession(t *testing.T) { conf := internal.NewConfigurationWithDefaults() reg := internal.NewRegistry(conf) - viper.Set(configuration.ViperKeyAccessRuleMatchingStrategy, string(tc.matchingStrategy)) + conf.SetForTest(t, configuration.AccessRuleMatchingStrategy, string(tc.matchingStrategy)) rule := rule.Rule{ Match: &tc.ruleMatch, diff --git a/rule/fetcher_default.go b/rule/fetcher_default.go index e29b433432..e5d62ee4ab 100644 --- a/rule/fetcher_default.go +++ b/rule/fetcher_default.go @@ -6,37 +6,31 @@ import ( "encoding/base64" "encoding/json" "io" - "io/ioutil" "net/http" "net/url" "os" "path" "path/filepath" - "reflect" "strings" "sync" + "time" "github.com/fsnotify/fsnotify" - - "github.com/ory/x/stringslice" - "github.com/ory/x/urlx" - - "github.com/ory/oathkeeper/internal/cloudstorage" - - "github.com/ory/viper" - "github.com/ory/x/httpx" - "github.com/ory/x/viperx" - - "github.com/ory/oathkeeper/driver/configuration" - "github.com/ory/oathkeeper/x" - "github.com/ghodss/yaml" "github.com/pkg/errors" - "gocloud.dev/blob" _ "gocloud.dev/blob/azureblob" _ "gocloud.dev/blob/gcsblob" _ "gocloud.dev/blob/s3blob" + + "github.com/ory/x/httpx" + "github.com/ory/x/stringslice" + "github.com/ory/x/urlx" + "github.com/ory/x/watcherx" + + "github.com/ory/oathkeeper/driver/configuration" + "github.com/ory/oathkeeper/internal/cloudstorage" + "github.com/ory/oathkeeper/x" ) type event struct { @@ -61,10 +55,10 @@ type fetcherRegistry interface { } type FetcherDefault struct { - c configuration.Provider - r fetcherRegistry - hc *http.Client - mux *blob.URLMux + config configuration.Provider + registry fetcherRegistry + hc *http.Client + mux *blob.URLMux cache map[string][]Rule @@ -76,15 +70,15 @@ type FetcherDefault struct { } func NewFetcherDefault( - c configuration.Provider, - r fetcherRegistry, + config configuration.Provider, + registry fetcherRegistry, ) *FetcherDefault { return &FetcherDefault{ - r: r, - c: c, - mux: cloudstorage.NewURLMux(), - hc: httpx.NewResilientClientLatencyToleranceHigh(nil), - cache: map[string][]Rule{}, + registry: registry, + config: config, + mux: cloudstorage.NewURLMux(), + hc: httpx.NewResilientClient(httpx.ResilientClientWithConnectionTimeout(15 * time.Second)).StandardClient(), + cache: map[string][]Rule{}, } } @@ -95,7 +89,7 @@ func (f *FetcherDefault) configUpdate(ctx context.Context, watcher *fsnotify.Wat if fileToWatch.Scheme == "file" || fileToWatch.Scheme == "" { p := filepath.Clean(urlx.GetURLFilePath(&fileToWatch)) filesBeingWatched = append(filesBeingWatched, p) - directoryToWatch, _ := filepath.Split(p) + directoryToWatch := filepath.Dir(p) directoriesToWatch = append(directoriesToWatch, directoryToWatch) } } @@ -105,9 +99,9 @@ func (f *FetcherDefault) configUpdate(ctx context.Context, watcher *fsnotify.Wat for _, source := range sources { if err := cb(source); err != nil { if os.IsNotExist(err) { - f.r.Logger().WithError(err).WithField("file", source).Error("Not watching config file for changes because it does not exist. Check the configuration or restart the service if the issue persists.") + f.registry.Logger().WithError(err).WithField("file", source).Error("Not watching config file for changes because it does not exist. Check the configuration or restart the service if the issue persists.") } else if os.IsPermission(err) { - f.r.Logger().WithError(err).WithField("file", source).Error("Not watching config file for changes because permission is denied. Check the configuration or restart the service if the issue persists.") + f.registry.Logger().WithError(err).WithField("file", source).Error("Not watching config file for changes because permission is denied. Check the configuration or restart the service if the issue persists.") } else if strings.Contains(err.Error(), "non-existent kevent") { // ignore this error because it is fired when removing a source that does not have a watcher which can happen and is negligible } else { @@ -122,7 +116,7 @@ func (f *FetcherDefault) configUpdate(ctx context.Context, watcher *fsnotify.Wat // First we remove all the directories being watched if err := updateWatcher(f.directoriesBeingWatched, watcher.Remove); err != nil { - f.r.Logger().WithError(err).Error("Unable to modify (remove) file watcher. If the issue persists, restart the service.") + f.registry.Logger().WithError(err).Error("Unable to modify (remove) file watcher. If the issue persists, restart the service.") } f.directoriesBeingWatched = directoriesToWatch @@ -130,7 +124,7 @@ func (f *FetcherDefault) configUpdate(ctx context.Context, watcher *fsnotify.Wat // Next we (re-) add all the directories to watch if err := updateWatcher(directoriesToWatch, watcher.Add); err != nil { - f.r.Logger().WithError(err).Error("Unable to modify (add) file watcher. If the issue persists, restart the service.") + f.registry.Logger().WithError(err).Error("Unable to modify (add) file watcher. If the issue persists, restart the service.") } // And we need to reset the rule cache @@ -139,8 +133,10 @@ func (f *FetcherDefault) configUpdate(ctx context.Context, watcher *fsnotify.Wat // If there are no more sources to watch we reset the rule repository as a whole if len(replace) == 0 { - f.r.Logger().WithField("repos", viper.AllSettings()).Warn("No access rule repositories have been defined in the updated config.") - if err := f.r.RuleRepository().Set(ctx, []Rule{}); err != nil { + f.registry.Logger(). + WithField("repos", f.config.Get(configuration.AccessRuleRepositories)). + Warn("No access rule repositories have been defined in the updated config.") + if err := f.registry.RuleRepository().Set(ctx, []Rule{}); err != nil { return err } } @@ -190,33 +186,15 @@ func (f *FetcherDefault) Watch(ctx context.Context) error { } func (f *FetcherDefault) watch(ctx context.Context, watcher *fsnotify.Watcher, events chan event) error { - var pc map[string]interface{} - - viperx.AddWatcher(func(e fsnotify.Event) error { - if reflect.DeepEqual(pc, viper.Get(configuration.ViperKeyAccessRuleRepositories)) { - f.r.Logger(). - Debug("Not reloading access rule repositories because configuration value has not changed.") - return nil - } - - f.enqueueEvent(events, event{et: eventRepositoryConfigChanged, source: "viper_watcher"}) - - return nil - }) - f.enqueueEvent(events, event{et: eventRepositoryConfigChanged, source: "entrypoint"}) - - var strategy map[string]interface{} - viperx.AddWatcher(func(e fsnotify.Event) error { - if reflect.DeepEqual(strategy, viper.Get(configuration.ViperKeyAccessRuleMatchingStrategy)) { - f.r.Logger(). - Debug("Not reloading access rule matching strategy because configuration value has not changed.") - return nil + f.config.AddWatcher(func(e watcherx.Event, err error) { + if err != nil { + return } - f.enqueueEvent(events, event{et: eventMatchingStrategyChanged, source: "viper_watcher"}) - return nil + f.enqueueEvent(events, event{et: eventRepositoryConfigChanged, source: "viper_watcher"}) }) f.enqueueEvent(events, event{et: eventMatchingStrategyChanged, source: "entrypoint"}) + f.enqueueEvent(events, event{et: eventRepositoryConfigChanged, source: "entrypoint"}) for { select { @@ -246,7 +224,7 @@ func (f *FetcherDefault) watch(ctx context.Context, watcher *fsnotify.Watcher, e continue } - f.r.Logger(). + f.registry.Logger(). WithField("event", "fsnotify"). WithField("file", e.Name). WithField("op", e.Op.String()). @@ -256,29 +234,29 @@ func (f *FetcherDefault) watch(ctx context.Context, watcher *fsnotify.Watcher, e case e, ok := <-events: if !ok { // channel was closed - f.r.Logger().Debug("The events channel was closed") + f.registry.Logger().Debug("The events channel was closed") return nil } switch e.et { case eventRepositoryConfigChanged: - f.r.Logger(). + f.registry.Logger(). WithField("event", "config_change"). WithField("source", e.source). Debugf("Viper detected a configuration change, reloading config.") - if err := f.configUpdate(ctx, watcher, f.c.AccessRuleRepositories(), events); err != nil { + if err := f.configUpdate(ctx, watcher, f.config.AccessRuleRepositories(), events); err != nil { return err } case eventMatchingStrategyChanged: - f.r.Logger(). + f.registry.Logger(). WithField("event", "matching_strategy_config_change"). WithField("source", e.source). Debugf("Viper detected a configuration change, updating matching strategy") - if err := f.r.RuleRepository().SetMatchingStrategy(ctx, f.c.AccessRuleMatchingStrategy()); err != nil { + if err := f.registry.RuleRepository().SetMatchingStrategy(ctx, f.config.AccessRuleMatchingStrategy()); err != nil { return errors.Wrapf(err, "unable to update matching strategy") } case eventFileChanged: - f.r.Logger(). + f.registry.Logger(). WithField("event", "repository_change"). WithField("source", e.source). WithField("file", e.path.String()). @@ -286,13 +264,13 @@ func (f *FetcherDefault) watch(ctx context.Context, watcher *fsnotify.Watcher, e rules, err := f.sourceUpdate(e) if err != nil { - f.r.Logger().WithError(err). + f.registry.Logger().WithError(err). WithField("file", e.path.String()). Error("Unable to update access rules from given location, changes will be ignored. Check the configuration or restart the service if the issue persists.") continue } - if err := f.r.RuleRepository().Set(ctx, rules); err != nil { + if err := f.registry.RuleRepository().Set(ctx, rules); err != nil { return errors.Wrapf(err, "unable to reset access rule repository") } } @@ -301,6 +279,7 @@ func (f *FetcherDefault) watch(ctx context.Context, watcher *fsnotify.Watcher, e } func (f *FetcherDefault) enqueueEvent(events chan event, evt event) { + // TODO(hperl): Why is this so complicated (not just a simple send)? f.wg.Add(1) go func() { defer f.wg.Done() @@ -310,24 +289,16 @@ func (f *FetcherDefault) enqueueEvent(events chan event, evt event) { } func (f *FetcherDefault) fetch(source url.URL) ([]Rule, error) { - f.r.Logger(). + f.registry.Logger(). WithField("location", source.String()). Debugf("Fetching access rules from given location because something changed.") switch source.Scheme { - case "azblob": - fallthrough - case "gs": - fallthrough - case "s3": + case "azblob", "gs", "s3": return f.fetchFromStorage(source) - case "http": - fallthrough - case "https": + case "http", "https": return f.fetchRemote(source.String()) - case "": - fallthrough - case "file": + case "", "file": p := urlx.GetURLFilePath(&source) if path.Ext(p) == ".json" || path.Ext(p) == ".yaml" || path.Ext(p) == ".yml" { return f.fetchFile(p) @@ -391,7 +362,7 @@ func (f *FetcherDefault) fetchFile(source string) ([]Rule, error) { } func (f *FetcherDefault) decode(r io.Reader) ([]Rule, error) { - b, err := ioutil.ReadAll(r) + b, err := io.ReadAll(r) if err != nil { return nil, errors.WithStack(err) } diff --git a/rule/fetcher_default_test.go b/rule/fetcher_default_test.go index c9dba38e4e..eaf9fd2429 100644 --- a/rule/fetcher_default_test.go +++ b/rule/fetcher_default_test.go @@ -3,7 +3,7 @@ package rule_test import ( "context" "fmt" - "io/ioutil" + "io" "net/http" "net/http/httptest" "os" @@ -19,11 +19,12 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/ory/x/watcherx" + + "github.com/ory/x/configx" "github.com/ory/x/logrusx" - "github.com/ory/viper" "github.com/ory/x/stringslice" - "github.com/ory/x/viperx" "github.com/ory/oathkeeper/driver/configuration" "github.com/ory/oathkeeper/internal" @@ -32,62 +33,94 @@ import ( ) const testRule = `[{"id":"test-rule-5","upstream":{"preserve_host":true,"strip_path":"/api","url":"mybackend.com/api"},"match":{"url":"myproxy.com/api","methods":["GET","POST"]},"authenticators":[{"handler":"noop"},{"handler":"anonymous"}],"authorizer":{"handler":"allow"},"mutators":[{"handler":"noop"}]}]` +const testConfigPath = "../test/update" + +func copyToFile(t *testing.T, src string, dst *os.File) { + t.Helper() + + source, err := os.Open(filepath.Join(testConfigPath, src)) + if err != nil { + t.Fatal(err) + } + defer source.Close() + + _, err = dst.Seek(0, 0) + if err != nil { + t.Fatal(err) + } + + err = dst.Truncate(0) + if err != nil { + t.Fatal(err) + } + + _, err = io.Copy(dst, source) + if err != nil { + t.Fatal(err) + } + + err = dst.Sync() + if err != nil { + t.Fatal(err) + } + + // We need to sleep here because the changes need to be picked up by FetcherDefault.watch + time.Sleep(100 * time.Millisecond) +} func TestFetcherReload(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - viper.Reset() - conf := internal.NewConfigurationWithDefaults() // this resets viper and must be at the top + + configFile, err := os.CreateTemp(t.TempDir(), "config-*.yaml") + require.NoError(t, err) + t.Cleanup(func() { configFile.Close() }) + + configChanged := make(chan struct{}) + + conf := internal.NewConfigurationWithDefaults( + configx.WithContext(ctx), + configx.WithLogger(logrusx.New("", "", logrusx.ForceLevel(logrus.TraceLevel))), + configx.SkipValidation(), + configx.WithConfigFiles(configFile.Name()), + configx.AttachWatcher(func(event watcherx.Event, err error) { + go func() { configChanged <- struct{}{} }() + }), + ) r := internal.NewRegistry(conf) - testConfigPath := "../test/update" ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { _, _ = w.Write([]byte(testRule)) })) defer ts.Close() - tempdir := os.TempDir() - - id := uuid.New().String() - configFile := filepath.Join(tempdir, ".oathkeeper-"+id+".yml") - require.NoError(t, ioutil.WriteFile(configFile, []byte(""), 0666)) - - l := logrusx.New("", "", logrusx.ForceLevel(logrus.TraceLevel)) - viperx.InitializeConfig("oathkeeper-"+id, tempdir, nil) - viperx.WatchConfig(l, nil) - - go func() { - require.NoError(t, r.RuleFetcher().Watch(ctx)) - }() + go func() { require.NoError(t, r.RuleFetcher().Watch(ctx)) }() // initial config without a repo and without a matching strategy - config, err := ioutil.ReadFile(path.Join(testConfigPath, "config_no_repo.yaml")) - require.NoError(t, err) - require.NoError(t, ioutil.WriteFile(configFile, config, 0666)) + copyToFile(t, "config_no_repo.yaml", configFile) + <-configChanged rules := eventuallyListRules(ctx, t, r, 0) require.Empty(t, rules) strategy, err := r.RuleRepository().MatchingStrategy(ctx) require.NoError(t, err) - require.Equal(t, configuration.MatchingStrategy(""), strategy) + require.Equal(t, configuration.DefaultMatchingStrategy, strategy) // config with a repo and without a matching strategy - config, err = ioutil.ReadFile(path.Join(testConfigPath, "config_default.yaml")) - require.NoError(t, err) - require.NoError(t, ioutil.WriteFile(configFile, config, 0666)) + copyToFile(t, "config_default.yaml", configFile) + <-configChanged rules = eventuallyListRules(ctx, t, r, 1) require.Equal(t, "test-rule-1-glob", rules[0].ID) strategy, err = r.RuleRepository().MatchingStrategy(ctx) require.NoError(t, err) - require.Equal(t, configuration.MatchingStrategy(""), strategy) + require.Equal(t, configuration.Regexp, strategy) // config with a glob matching strategy - config, err = ioutil.ReadFile(path.Join(testConfigPath, "config_glob.yaml")) - require.NoError(t, err) - require.NoError(t, ioutil.WriteFile(configFile, config, 0666)) + copyToFile(t, "config_glob.yaml", configFile) + <-configChanged rules = eventuallyListRules(ctx, t, r, 1) require.Equal(t, "test-rule-1-glob", rules[0].ID) @@ -97,21 +130,19 @@ func TestFetcherReload(t *testing.T) { require.Equal(t, configuration.Glob, strategy) // config with unknown matching strategy - config, err = ioutil.ReadFile(path.Join(testConfigPath, "config_error.yaml")) - require.NoError(t, err) - require.NoError(t, ioutil.WriteFile(configFile, config, 0666)) + copyToFile(t, "config_error.yaml", configFile) + <-configChanged rules = eventuallyListRules(ctx, t, r, 1) require.Equal(t, "test-rule-1-glob", rules[0].ID) strategy, err = r.RuleRepository().MatchingStrategy(ctx) require.NoError(t, err) - require.Equal(t, configuration.MatchingStrategy("UNKNOWN"), strategy) + require.Equal(t, "UNKNOWN", string(strategy)) // config with regexp matching strategy - config, err = ioutil.ReadFile(path.Join(testConfigPath, "config_regexp.yaml")) - require.NoError(t, err) - require.NoError(t, ioutil.WriteFile(configFile, config, 0666)) + copyToFile(t, "config_regexp.yaml", configFile) + <-configChanged rules = eventuallyListRules(ctx, t, r, 1) require.Equal(t, "test-rule-1-glob", rules[0].ID) @@ -122,46 +153,50 @@ func TestFetcherReload(t *testing.T) { } func TestFetcherWatchConfig(t *testing.T) { - viper.Reset() - conf := internal.NewConfigurationWithDefaults() // this resets viper and must be at the top - r := internal.NewRegistry(conf) ctx, cancel := context.WithCancel(context.Background()) defer cancel() + configFile, err := os.CreateTemp(t.TempDir(), "config-*.yaml") + require.NoError(t, err) + configFile.Close() + configChanged := make(chan struct{}) + conf := internal.NewConfigurationWithDefaults( + configx.WithContext(ctx), + configx.SkipValidation(), + configx.WithLogger(logrusx.New("", "", logrusx.ForceLevel(logrus.TraceLevel))), + configx.WithConfigFiles(configFile.Name()), + configx.AttachWatcher(func(event watcherx.Event, err error) { + go func() { configChanged <- struct{}{} }() + }), + ) + r := internal.NewRegistry(conf) + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { _, _ = w.Write([]byte(testRule)) })) - defer ts.Close() + t.Cleanup(ts.Close) - tempdir := os.TempDir() + require.NoError(t, os.WriteFile(configFile.Name(), []byte(""), 0666)) - id := uuid.New().String() - configFile := filepath.Join(tempdir, ".oathkeeper-"+id+".yml") - require.NoError(t, ioutil.WriteFile(configFile, []byte(""), 0666)) - - l := logrusx.New("", "", logrusx.ForceLevel(logrus.TraceLevel)) - viperx.InitializeConfig("oathkeeper-"+id, tempdir, nil) - viperx.WatchConfig(l, nil) - - go func() { - require.NoError(t, r.RuleFetcher().Watch(ctx)) - }() + go func() { require.NoError(t, r.RuleFetcher().Watch(ctx)) }() for k, tc := range []struct { config string tmpContent string expectIDs []string - expectNone bool expectedStrategy configuration.MatchingStrategy }{ - {config: ""}, + { + config: "", + expectedStrategy: configuration.DefaultMatchingStrategy, + }, { config: ` access_rules: repositories: - ftp://not-valid `, - expectNone: true, + expectedStrategy: configuration.DefaultMatchingStrategy, }, { config: ` @@ -169,12 +204,11 @@ access_rules: repositories: - file://../test/stub/rules.json - file://../test/stub/rules.yaml - - invalid - file:///invalid/path - inline://W3siaWQiOiJ0ZXN0LXJ1bGUtNCIsInVwc3RyZWFtIjp7InByZXNlcnZlX2hvc3QiOnRydWUsInN0cmlwX3BhdGgiOiIvYXBpIiwidXJsIjoibXliYWNrZW5kLmNvbS9hcGkifSwibWF0Y2giOnsidXJsIjoibXlwcm94eS5jb20vYXBpIiwibWV0aG9kcyI6WyJHRVQiLCJQT1NUIl19LCJhdXRoZW50aWNhdG9ycyI6W3siaGFuZGxlciI6Im5vb3AifSx7ImhhbmRsZXIiOiJhbm9ueW1vdXMifV0sImF1dGhvcml6ZXIiOnsiaGFuZGxlciI6ImFsbG93In0sIm11dGF0b3JzIjpbeyJoYW5kbGVyIjoibm9vcCJ9XX1d - - ` + ts.URL + ` -`, - expectIDs: []string{"test-rule-1", "test-rule-2", "test-rule-3", "test-rule-4", "test-rule-5", "test-rule-1-yaml"}, + - ` + ts.URL + "\n", + expectedStrategy: configuration.DefaultMatchingStrategy, + expectIDs: []string{"test-rule-1", "test-rule-2", "test-rule-3", "test-rule-4", "test-rule-5", "test-rule-1-yaml"}, }, { config: ` @@ -189,14 +223,15 @@ access_rules: { config: ` access_rules: - repositories: + repositories: [] matching_strategy: regexp `, expectedStrategy: configuration.Regexp, }, } { t.Run(fmt.Sprintf("case=%d", k), func(t *testing.T) { - require.NoError(t, ioutil.WriteFile(configFile, []byte(tc.config), 0666)) + require.NoError(t, os.WriteFile(configFile.Name(), []byte(tc.config), 0666)) + <-configChanged rules := eventuallyListRules(ctx, t, r, len(tc.expectIDs)) strategy, err := r.RuleRepository().MatchingStrategy(ctx) @@ -216,30 +251,38 @@ access_rules: } func TestFetcherWatchRepositoryFromFS(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() if runtime.GOOS == "windows" { t.Skip("Skipping watcher tests on windows") } + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() - conf := internal.NewConfigurationWithDefaults() // this resets viper!! - r := internal.NewRegistry(conf) + tempDir := t.TempDir() + configFile, err := os.CreateTemp(tempDir, "config-*.yaml") + require.NoError(t, err) + t.Cleanup(func() { configFile.Close() }) - dir := path.Join(os.TempDir(), uuid.New().String()) - require.NoError(t, os.MkdirAll(dir, 0777)) + repoFile, err := os.CreateTemp(tempDir, "access-rules-*.json") + require.NoError(t, err) + t.Cleanup(func() { repoFile.Close() }) - id := uuid.New().String() - repository := path.Join(dir, "access-rules-"+id+".json") - require.NoError(t, ioutil.WriteFile(repository, []byte("[]"), 0777)) + repoFile.WriteString("[]") + require.NoError(t, repoFile.Sync()) - require.NoError(t, ioutil.WriteFile(filepath.Join(os.TempDir(), ".oathkeeper-"+id+".yml"), []byte(` + configFile.WriteString(fmt.Sprintf(` access_rules: repositories: - - file://`+repository+` -`), 0777)) - - viperx.InitializeConfig("oathkeeper-"+id, os.TempDir(), nil) - viperx.WatchConfig(nil, nil) + - file://%s +`, repoFile.Name())) + require.NoError(t, configFile.Sync()) + + conf := internal.NewConfigurationWithDefaults( + configx.WithContext(ctx), + configx.SkipValidation(), + configx.WithLogger(logrusx.New("", "", logrusx.ForceLevel(logrus.TraceLevel))), + configx.WithConfigFiles(configFile.Name()), + ) + r := internal.NewRegistry(conf) go func() { require.NoError(t, r.RuleFetcher().Watch(ctx)) @@ -252,11 +295,12 @@ access_rules: {content: "[]"}, {content: `[{"id":"1"}]`, expectIDs: []string{"1"}}, {content: `[{"id":"1"},{"id":"2"}]`, expectIDs: []string{"1", "2"}}, - {content: `[{"id":"2"},{"id":"3"}]`, expectIDs: []string{"2", "3"}}, + {content: `[{"id":"2"},{"id":"3"},{"id":"4"}]`, expectIDs: []string{"2", "3", "4"}}, } { t.Run(fmt.Sprintf("case=%d", k), func(t *testing.T) { - require.NoError(t, ioutil.WriteFile(repository, []byte(tc.content), 0777)) - time.Sleep(time.Millisecond * 500) + repoFile.Truncate(0) + repoFile.WriteAt([]byte(tc.content), 0) + repoFile.Sync() rules := eventuallyListRules(ctx, t, r, len(tc.expectIDs)) @@ -273,22 +317,25 @@ access_rules: } func TestFetcherWatchRepositoryFromKubernetesConfigMap(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() if runtime.GOOS == "windows" { - t.Skip() + t.Skip("Skipping watcher tests on windows") } - viper.Reset() - conf := internal.NewConfigurationWithDefaults() // this must be at the top because it resets viper - r := internal.NewRegistry(conf) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() // Set up temp dir and file to watch - watchDir, err := ioutil.TempDir("", uuid.New().String()) - require.NoError(t, err) + watchDir := t.TempDir() watchFile := path.Join(watchDir, "access-rules.json") + conf := internal.NewConfigurationWithDefaults( + configx.SkipValidation(), + configx.WithContext(ctx), + configx.WithLogger(logrusx.New("", "", logrusx.ForceLevel(logrus.TraceLevel))), + ) + r := internal.NewRegistry(conf) + // Configure watcher - viper.Set(configuration.ViperKeyAccessRuleRepositories, []string{"file://" + watchFile}) + conf.SetForTest(t, configuration.AccessRuleRepositories, []string{"file://" + watchFile}) // This emulates a config map update // drwxr-xr-x 2 root root 4096 Aug 1 07:42 ..2019_08_01_07_42_33.068812649 @@ -312,7 +359,7 @@ func TestFetcherWatchRepositoryFromKubernetesConfigMap(t *testing.T) { require.NoError(t, os.Mkdir(dir, 0777)) fp := path.Join(dir, "access-rules.json") - require.NoError(t, ioutil.WriteFile(fp, []byte(data), 0640)) + require.NoError(t, os.WriteFile(fp, []byte(data), 0640)) // this is the symlink: ..data -> ..2019_08_01_07_42_33.068812649 _ = os.Rename(path.Join(watchDir, "..data"), path.Join(watchDir, "..data_tmp")) @@ -361,14 +408,8 @@ func TestFetchRulesFromObjectStorage(t *testing.T) { cloudstorage.SetCurrentTest(t) - conf := internal.NewConfigurationWithDefaults() // this must be at the top because it resets viper - r := internal.NewRegistry(conf) - - dir := path.Join(os.TempDir(), uuid.New().String()) - require.NoError(t, os.MkdirAll(dir, 0777)) - - id := uuid.New().String() - require.NoError(t, ioutil.WriteFile(filepath.Join(os.TempDir(), ".oathkeeper-"+id+".yml"), []byte(` + configFile, _ := os.CreateTemp(t.TempDir(), ".oathkeeper-*.yml") + configFile.WriteString(` authenticators: noop: { enabled: true } @@ -377,10 +418,16 @@ access_rules: - s3://oathkeeper-test-bucket/path/prefix/rules.json - gs://oathkeeper-test-bucket/path/prefix/rules.json - azblob://path/prefix/rules.json -`), 0777)) - - viperx.InitializeConfig("oathkeeper-"+id, os.TempDir(), nil) - viperx.WatchConfig(nil, nil) +`) + require.NoError(t, configFile.Sync()) + + conf := internal.NewConfigurationWithDefaults( + configx.SkipValidation(), + configx.WithContext(ctx), + configx.WithLogger(logrusx.New("", "", logrusx.ForceLevel(logrus.TraceLevel))), + configx.WithConfigFiles(configFile.Name()), + ) + r := internal.NewRegistry(conf) go func() { require.NoError(t, r.RuleFetcher().Watch(ctx)) @@ -390,11 +437,12 @@ access_rules: } func eventuallyListRules(ctx context.Context, t *testing.T, r rule.Registry, expectedLen int) (rules []rule.Rule) { + t.Helper() var err error assert.Eventually(t, func() bool { rules, err = r.RuleRepository().List(ctx, 500, 0) require.NoError(t, err) return len(rules) == expectedLen - }, 5*time.Second, 10*time.Millisecond) + }, 2*time.Second, 10*time.Millisecond) return } diff --git a/rule/validator_test.go b/rule/validator_test.go index 20fe9740e0..85f30085d5 100644 --- a/rule/validator_test.go +++ b/rule/validator_test.go @@ -25,8 +25,6 @@ import ( "strings" "testing" - "github.com/ory/viper" - "github.com/ory/oathkeeper/driver/configuration" "github.com/ory/oathkeeper/internal" . "github.com/ory/oathkeeper/rule" @@ -39,16 +37,16 @@ import ( ) func TestValidateRule(t *testing.T) { - var prep = func(an, az, m bool) func() { - return func() { - viper.Set(configuration.ViperKeyAuthenticatorNoopIsEnabled, an) - viper.Set(configuration.ViperKeyAuthorizerAllowIsEnabled, az) - viper.Set(configuration.ViperKeyMutatorNoopIsEnabled, m) + var prep = func(an, az, m bool) func(*testing.T, configuration.Provider) { + return func(t *testing.T, config configuration.Provider) { + config.SetForTest(t, configuration.AuthenticatorNoopIsEnabled, an) + config.SetForTest(t, configuration.AuthorizerAllowIsEnabled, az) + config.SetForTest(t, configuration.MutatorNoopIsEnabled, m) } } for k, tc := range []struct { - setup func() + setup func(*testing.T, configuration.Provider) r *Rule expectErr string }{ @@ -170,7 +168,7 @@ func TestValidateRule(t *testing.T) { t.Run(fmt.Sprintf("case=%d", k), func(t *testing.T) { conf := internal.NewConfigurationWithDefaults() if tc.setup != nil { - tc.setup() + tc.setup(t, conf) } r := internal.NewRegistry(conf) diff --git a/spec/api.json b/spec/api.json index 9fda6097f4..1726abf970 100755 --- a/spec/api.json +++ b/spec/api.json @@ -34,7 +34,6 @@ "type": "string" }, "Upstream": { - "description": "Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream upstream", "properties": { "preserve_host": { "description": "PreserveHost, if false (the default), tells ORY Oathkeeper to set the upstream request's Host header to the\nhostname of the API's upstream's URL. Setting this flag to true instructs ORY Oathkeeper not to do so.", @@ -52,35 +51,29 @@ "type": "object" }, "genericError": { - "description": "GenericError GenericError The standard error format", + "description": "The standard error format", "properties": { "code": { - "description": "code", "format": "int64", "type": "integer" }, "details": { - "description": "details", "items": { - "additionalProperties": true, + "additionalProperties": {}, "type": "object" }, "type": "array" }, "message": { - "description": "message", "type": "string" }, "reason": { - "description": "reason", "type": "string" }, "request": { - "description": "request", "type": "string" }, "status": { - "description": "status", "type": "string" } }, @@ -108,34 +101,27 @@ "type": "object" }, "jsonWebKey": { - "description": "JSONWebKey JSONWebKey json web key", "properties": { "alg": { "description": "The \"alg\" (algorithm) parameter identifies the algorithm intended for\nuse with the key. The values used should either be registered in the\nIANA \"JSON Web Signature and Encryption Algorithms\" registry\nestablished by [JWA] or be a value that contains a Collision-\nResistant Name.", "type": "string" }, "crv": { - "description": "crv", "type": "string" }, "d": { - "description": "d", "type": "string" }, "dp": { - "description": "dp", "type": "string" }, "dq": { - "description": "dq", "type": "string" }, "e": { - "description": "e", "type": "string" }, "k": { - "description": "k", "type": "string" }, "kid": { @@ -147,19 +133,15 @@ "type": "string" }, "n": { - "description": "n", "type": "string" }, "p": { - "description": "p", "type": "string" }, "q": { - "description": "q", "type": "string" }, "qi": { - "description": "qi", "type": "string" }, "use": { @@ -167,7 +149,6 @@ "type": "string" }, "x": { - "description": "x", "type": "string" }, "x5c": { @@ -178,14 +159,12 @@ "type": "array" }, "y": { - "description": "y", "type": "string" } }, "type": "object" }, "jsonWebKeySet": { - "description": "JSONWebKeySet json web key set", "properties": { "keys": { "description": "The value of the \"keys\" parameter is an array of JWK values. By\ndefault, the order of the JWK values within the array does not imply\nan order of preference among them, although applications of JWK Sets\ncan choose to assign a meaning to the order for their purposes, if\ndesired.", @@ -235,11 +214,9 @@ "type": "object" }, "ruleHandler": { - "description": "RuleHandler rule handler", "properties": { "config": { - "description": "Config contains the configuration for the handler. Please read the user\nguide for a complete list of each handler's available settings.", - "type": "object" + "description": "Config contains the configuration for the handler. Please read the user\nguide for a complete list of each handler's available settings." }, "handler": { "description": "Handler identifies the implementation which will be used to handle this specific request. Please read the user\nguide for a complete list of available handlers.", @@ -249,7 +226,6 @@ "type": "object" }, "ruleMatch": { - "description": "RuleMatch RuleMatch RuleMatch RuleMatch rule match", "properties": { "methods": { "description": "An array of HTTP methods (e.g. GET, POST, PUT, DELETE, ...). When ORY Oathkeeper searches for rules\nto decide what to do with an incoming request to the proxy server, it compares the HTTP method of the incoming\nrequest with the HTTP methods of each rules. If a match is found, the rule is considered a partial match.\nIf the matchesUrl field is satisfied as well, the rule is considered a full match.", diff --git a/spec/swagger.json b/spec/swagger.json index f6af19c8aa..97820a2139 100755 --- a/spec/swagger.json +++ b/spec/swagger.json @@ -216,9 +216,7 @@ } }, "definitions": { - "UUID": { "type": "string", "format": "uuid4" }, "Upstream": { - "description": "Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream Upstream upstream", "type": "object", "properties": { "preserve_host": { @@ -236,36 +234,30 @@ } }, "genericError": { - "description": "GenericError GenericError The standard error format", + "description": "The standard error format", "type": "object", "properties": { "code": { - "description": "code", "type": "integer", "format": "int64" }, "details": { - "description": "details", "type": "array", "items": { "type": "object", - "additionalProperties": true + "additionalProperties": {} } }, "message": { - "description": "message", "type": "string" }, "reason": { - "description": "reason", "type": "string" }, "request": { - "description": "request", "type": "string" }, "status": { - "description": "status", "type": "string" } } @@ -292,7 +284,6 @@ } }, "jsonWebKey": { - "description": "JSONWebKey JSONWebKey json web key", "type": "object", "properties": { "alg": { @@ -300,27 +291,21 @@ "type": "string" }, "crv": { - "description": "crv", "type": "string" }, "d": { - "description": "d", "type": "string" }, "dp": { - "description": "dp", "type": "string" }, "dq": { - "description": "dq", "type": "string" }, "e": { - "description": "e", "type": "string" }, "k": { - "description": "k", "type": "string" }, "kid": { @@ -332,19 +317,15 @@ "type": "string" }, "n": { - "description": "n", "type": "string" }, "p": { - "description": "p", "type": "string" }, "q": { - "description": "q", "type": "string" }, "qi": { - "description": "qi", "type": "string" }, "use": { @@ -352,7 +333,6 @@ "type": "string" }, "x": { - "description": "x", "type": "string" }, "x5c": { @@ -363,13 +343,11 @@ } }, "y": { - "description": "y", "type": "string" } } }, "jsonWebKeySet": { - "description": "JSONWebKeySet json web key set", "type": "object", "properties": { "keys": { @@ -419,12 +397,10 @@ } }, "ruleHandler": { - "description": "RuleHandler rule handler", "type": "object", "properties": { "config": { - "description": "Config contains the configuration for the handler. Please read the user\nguide for a complete list of each handler's available settings.", - "type": "object" + "description": "Config contains the configuration for the handler. Please read the user\nguide for a complete list of each handler's available settings." }, "handler": { "description": "Handler identifies the implementation which will be used to handle this specific request. Please read the user\nguide for a complete list of available handlers.", @@ -433,7 +409,6 @@ } }, "ruleMatch": { - "description": "RuleMatch RuleMatch RuleMatch RuleMatch rule match", "type": "object", "properties": { "methods": { @@ -457,7 +432,8 @@ "type": "string" } } - } + }, + "UUID": { "type": "string", "format": "uuid4" } }, "responses": { "emptyResponse": { diff --git a/test/e2e/run.sh b/test/e2e/run.sh index d38a0f6296..dcdda7727e 100755 --- a/test/e2e/run.sh +++ b/test/e2e/run.sh @@ -22,6 +22,10 @@ killall oathkeeper || true killall okapi || true killall okclient || true +OATHKEEPER="go run ../.." +OKAPI="go run ./okapi" +OKCLIENT="go run ./okclient" + export OATHKEEPER_PROXY=http://127.0.0.1:6660 export OATHKEEPER_API=http://127.0.0.1:6661 export GO111MODULE=on @@ -29,11 +33,8 @@ export GO111MODULE=on [[ "$(command -v oathkeeper)" == "" ]] && (cd ../../; make install) -go install github.com/ory/oathkeeper/test/e2e/okapi -go install github.com/ory/oathkeeper/test/e2e/okclient - -oathkeeper --config ./config.yml serve >> ./oathkeeper.e2e.log 2>&1 & -PORT=6662 okapi >> ./api.e2e.log 2>&1 & +$OATHKEEPER --config ./config.yml serve > ./oathkeeper.e2e.log 2>&1 & +PORT=6662 $OKAPI > ./api.e2e.log 2>&1 & waitport 6660 waitport 6661 @@ -46,7 +47,7 @@ function finish { } trap finish EXIT -okclient +$OKCLIENT kill %1 || true kill %2 || true diff --git a/test/update/config_no_repo.yaml b/test/update/config_no_repo.yaml index d8846d1b76..2c1bcb9730 100644 --- a/test/update/config_no_repo.yaml +++ b/test/update/config_no_repo.yaml @@ -1,2 +1,2 @@ access_rules: - repositories: + repositories: [] diff --git a/x/testhelper.go b/x/testhelper.go new file mode 100644 index 0000000000..85f2cbe1b4 --- /dev/null +++ b/x/testhelper.go @@ -0,0 +1,21 @@ +package x + +import ( + "io" + "os" + "testing" +) + +// WriteFile writes the content to a new file in a temporary location and +// returns the path. No cleanup is necessary. +func WriteFile(t *testing.T, content string) string { + f, err := os.CreateTemp(t.TempDir(), "config-*.yaml") + if err != nil { + t.Error(err) + return "" + } + defer f.Close() + io.WriteString(f, content) + + return f.Name() +}