diff --git a/.github/workflows/go-combined-analysis.yml b/.github/workflows/go-combined-analysis.yml index 8243c58..76607a0 100644 --- a/.github/workflows/go-combined-analysis.yml +++ b/.github/workflows/go-combined-analysis.yml @@ -47,13 +47,13 @@ jobs: uses: reviewdog/action-golangci-lint@v2 with: github_token: ${{ steps.app-token.outputs.token }} - go_version: '1.23' + go_version: '1.26' tool_name: golint level: error fail_level: any reporter: github-pr-review filter_mode: diff_context - golangci_lint_version: v2.4.0 + golangci_lint_version: latest env: REVIEWDOG_GITHUB_API_TOKEN: ${{ steps.app-token.outputs.token }} GITHUB_TOKEN: ${{ steps.app-token.outputs.token }} @@ -70,10 +70,11 @@ jobs: - uses: actions/setup-go@v5 with: - go-version: '1.23' + go-version: '1.26' cache: false - - name: Gosec Scanner - uses: securego/gosec@master - with: - args: ./... \ No newline at end of file + - name: Install Gosec + run: go install github.com/securego/gosec/v2/cmd/gosec@latest + + - name: Run Gosec + run: gosec ./... \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c1f720..17a101b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +## [2.8.0-beta.4](https://github.com/LerianStudio/lib-auth/compare/v2.8.0-beta.3...v2.8.0-beta.4) (2026-05-18) + + +### Bug Fixes + +* **security:** redact clientSecret from tracing span payload ([fb15a94](https://github.com/LerianStudio/lib-auth/commit/fb15a9486a5d937ff45a7f9a2c7cc18fd6018569)) + +## [2.8.0-beta.3](https://github.com/LerianStudio/lib-auth/compare/v2.8.0-beta.2...v2.8.0-beta.3) (2026-05-18) + +## [2.8.0-beta.2](https://github.com/LerianStudio/lib-auth/compare/v2.8.0-beta.1...v2.8.0-beta.2) (2026-05-18) + +## [2.8.0-beta.1](https://github.com/LerianStudio/lib-auth/compare/v2.7.0...v2.8.0-beta.1) (2026-05-18) + ## [2.7.0](https://github.com/LerianStudio/lib-auth/compare/v2.6.0...v2.7.0) (2026-04-27) diff --git a/auth/middleware/middleware.go b/auth/middleware/middleware.go index 2a143ee..b3773e4 100644 --- a/auth/middleware/middleware.go +++ b/auth/middleware/middleware.go @@ -13,9 +13,10 @@ import ( "strings" "time" - "github.com/LerianStudio/lib-commons/v5/commons/log" - "github.com/LerianStudio/lib-commons/v5/commons/opentelemetry" - "github.com/LerianStudio/lib-commons/v5/commons/zap" + observability "github.com/LerianStudio/lib-observability" + "github.com/LerianStudio/lib-observability/log" + "github.com/LerianStudio/lib-observability/tracing" + "github.com/LerianStudio/lib-observability/zap" "go.opentelemetry.io/otel/attribute" "github.com/LerianStudio/lib-commons/v5/commons" @@ -214,9 +215,9 @@ func NewAuthClient(address string, enabled bool, logger *log.Logger) *AuthClient // If the user is authorized, the request is passed to the next handler; otherwise, a 403 Forbidden status is returned. func (auth *AuthClient) Authorize(sub, resource, action string) fiber.Handler { return func(c *fiber.Ctx) error { - ctx := opentelemetry.ExtractHTTPContext(c.UserContext(), c) + ctx := tracing.ExtractHTTPContext(c.UserContext(), c) - _, tracer, reqID, _ := commons.NewTrackingFromContext(ctx) + _, tracer, reqID, _ := observability.NewTrackingFromContext(ctx) if !auth.Enabled || auth.Address == "" { return c.Next() @@ -261,7 +262,7 @@ func (auth *AuthClient) Authorize(sub, resource, action string) fiber.Handler { // checkAuthorization sends an authorization request to the external service and returns whether the action is authorized. func (auth *AuthClient) checkAuthorization(ctx context.Context, sub, resource, action, accessToken string) (bool, int, error) { - _, tracer, reqID, _ := commons.NewTrackingFromContext(ctx) + _, tracer, reqID, _ := observability.NewTrackingFromContext(ctx) ctx, span := tracer.Start(ctx, "lib_auth.check_authorization") defer span.End() @@ -276,7 +277,7 @@ func (auth *AuthClient) checkAuthorization(ctx context.Context, sub, resource, a if err != nil { logErrorf(ctx, auth.Logger, "Failed to parse token: %v", err) - opentelemetry.HandleSpanError(span, "Failed to parse token", err) + tracing.HandleSpanError(span, "Failed to parse token", err) return false, http.StatusUnauthorized, err } @@ -287,7 +288,7 @@ func (auth *AuthClient) checkAuthorization(ctx context.Context, sub, resource, a err := errors.New("token claims are not in the expected format") - opentelemetry.HandleSpanError(span, "Failed to parse claims", err) + tracing.HandleSpanError(span, "Failed to parse claims", err) return false, http.StatusUnauthorized, err } @@ -303,7 +304,7 @@ func (auth *AuthClient) checkAuthorization(ctx context.Context, sub, resource, a err := errors.New("missing owner claim in token") - opentelemetry.HandleSpanError(span, "Missing owner claim in token", err) + tracing.HandleSpanError(span, "Missing owner claim in token", err) return false, http.StatusUnauthorized, err } @@ -318,9 +319,9 @@ func (auth *AuthClient) checkAuthorization(ctx context.Context, sub, resource, a "action": action, } - err = opentelemetry.SetSpanAttributesFromValue(span, "app.request.payload", requestBody, nil) + err = tracing.SetSpanAttributesFromValue(span, "app.request.payload", requestBody, nil) if err != nil { - opentelemetry.HandleSpanError(span, "Failed to convert request body to JSON string", err) + tracing.HandleSpanError(span, "Failed to convert request body to JSON string", err) return false, http.StatusInternalServerError, err } @@ -329,7 +330,7 @@ func (auth *AuthClient) checkAuthorization(ctx context.Context, sub, resource, a if err != nil { logErrorf(ctx, auth.Logger, "Failed to marshal request body: %v", err) - opentelemetry.HandleSpanError(span, "Failed to marshal request body", err) + tracing.HandleSpanError(span, "Failed to marshal request body", err) return false, http.StatusInternalServerError, err } @@ -338,12 +339,12 @@ func (auth *AuthClient) checkAuthorization(ctx context.Context, sub, resource, a if err != nil { logErrorf(ctx, auth.Logger, "Failed to create request: %v", err) - opentelemetry.HandleSpanError(span, "Failed to create request", err) + tracing.HandleSpanError(span, "Failed to create request", err) return false, http.StatusInternalServerError, fmt.Errorf("failed to create request: %w", err) } - opentelemetry.InjectHTTPContext(ctx, req.Header) + tracing.InjectHTTPContext(ctx, req.Header) req.Header.Set("Content-Type", "application/json") req.Header.Set("Authorization", accessToken) @@ -352,7 +353,7 @@ func (auth *AuthClient) checkAuthorization(ctx context.Context, sub, resource, a if err != nil { logErrorf(ctx, auth.Logger, "Failed to make request: %v", err) - opentelemetry.HandleSpanError(span, "Failed to make request", err) + tracing.HandleSpanError(span, "Failed to make request", err) return false, http.StatusInternalServerError, fmt.Errorf("failed to make request: %w", err) } @@ -362,7 +363,7 @@ func (auth *AuthClient) checkAuthorization(ctx context.Context, sub, resource, a if err != nil { logErrorf(ctx, auth.Logger, "Failed to read response body: %v", err) - opentelemetry.HandleSpanError(span, "Failed to read response body", err) + tracing.HandleSpanError(span, "Failed to read response body", err) return false, http.StatusInternalServerError, fmt.Errorf("failed to read response body: %w", err) } @@ -371,7 +372,7 @@ func (auth *AuthClient) checkAuthorization(ctx context.Context, sub, resource, a if err != nil { logErrorf(ctx, auth.Logger, "Failed to unmarshal auth error response: %v", err) - opentelemetry.HandleSpanError(span, "Failed to unmarshal auth error response", err) + tracing.HandleSpanError(span, "Failed to unmarshal auth error response", err) return false, http.StatusInternalServerError, fmt.Errorf("failed to unmarshal auth error response: %w", err) } @@ -379,7 +380,7 @@ func (auth *AuthClient) checkAuthorization(ctx context.Context, sub, resource, a if respError.Code != "" && resp.StatusCode != http.StatusInternalServerError { logErrorf(ctx, auth.Logger, "Authorization request failed: %s", respError.Message) - opentelemetry.HandleSpanError(span, "Authorization request failed", respError) + tracing.HandleSpanError(span, "Authorization request failed", respError) return false, resp.StatusCode, respError } @@ -388,7 +389,7 @@ func (auth *AuthClient) checkAuthorization(ctx context.Context, sub, resource, a if err := json.Unmarshal(body, &response); err != nil { logErrorf(ctx, auth.Logger, "Failed to unmarshal response: %v", err) - opentelemetry.HandleSpanError(span, "Failed to unmarshal response", err) + tracing.HandleSpanError(span, "Failed to unmarshal response", err) return false, http.StatusInternalServerError, fmt.Errorf("failed to unmarshal response: %w", err) } @@ -400,7 +401,7 @@ func (auth *AuthClient) checkAuthorization(ctx context.Context, sub, resource, a // It takes the client ID and client secret as parameters and returns the access token if the request is successful. // If the request fails at any step, an error is returned with a descriptive message. func (auth *AuthClient) GetApplicationToken(ctx context.Context, clientID, clientSecret string) (string, error) { - _, tracer, reqID, _ := commons.NewTrackingFromContext(ctx) + _, tracer, reqID, _ := observability.NewTrackingFromContext(ctx) ctx, span := tracer.Start(ctx, "lib_auth.get_application_token") defer span.End() @@ -421,9 +422,16 @@ func (auth *AuthClient) GetApplicationToken(ctx context.Context, clientID, clien "clientSecret": clientSecret, } - err := opentelemetry.SetSpanAttributesFromValue(span, "app.request.payload", requestBody, nil) + // tracePayload mirrors requestBody but omits clientSecret so the OAuth secret + // never flows into telemetry. Do not collapse these two maps. + tracePayload := map[string]string{ + "grantType": "client_credentials", + "clientId": clientID, + } + + err := tracing.SetSpanAttributesFromValue(span, "app.request.payload", tracePayload, nil) if err != nil { - opentelemetry.HandleSpanError(span, "Failed to convert request body to JSON string", err) + tracing.HandleSpanError(span, "Failed to convert request body to JSON string", err) return "", fmt.Errorf("failed to convert request body to JSON string: %w", err) } @@ -432,7 +440,7 @@ func (auth *AuthClient) GetApplicationToken(ctx context.Context, clientID, clien if err != nil { logErrorf(ctx, auth.Logger, "Failed to marshal request body: %v", err) - opentelemetry.HandleSpanError(span, "Failed to marshal request body", err) + tracing.HandleSpanError(span, "Failed to marshal request body", err) return "", fmt.Errorf("failed to marshal request body: %w", err) } @@ -441,12 +449,12 @@ func (auth *AuthClient) GetApplicationToken(ctx context.Context, clientID, clien if err != nil { logErrorf(ctx, auth.Logger, "Failed to create request: %v", err) - opentelemetry.HandleSpanError(span, "Failed to create request", err) + tracing.HandleSpanError(span, "Failed to create request", err) return "", fmt.Errorf("failed to create request: %w", err) } - opentelemetry.InjectHTTPContext(ctx, req.Header) + tracing.InjectHTTPContext(ctx, req.Header) req.Header.Set("Content-Type", "application/json") @@ -454,7 +462,7 @@ func (auth *AuthClient) GetApplicationToken(ctx context.Context, clientID, clien if err != nil { logErrorf(ctx, auth.Logger, "Failed to make request: %v", err) - opentelemetry.HandleSpanError(span, "Failed to make request", err) + tracing.HandleSpanError(span, "Failed to make request", err) return "", fmt.Errorf("failed to make request: %w", err) } @@ -464,7 +472,7 @@ func (auth *AuthClient) GetApplicationToken(ctx context.Context, clientID, clien if err != nil { logErrorf(ctx, auth.Logger, "Failed to read response body: %v", err) - opentelemetry.HandleSpanError(span, "Failed to read response body", err) + tracing.HandleSpanError(span, "Failed to read response body", err) return "", fmt.Errorf("failed to read response body: %w", err) } @@ -473,7 +481,7 @@ func (auth *AuthClient) GetApplicationToken(ctx context.Context, clientID, clien if err != nil { logErrorf(ctx, auth.Logger, "Failed to unmarshal auth error response: %v", err) - opentelemetry.HandleSpanError(span, "Failed to unmarshal auth error response", err) + tracing.HandleSpanError(span, "Failed to unmarshal auth error response", err) return "", fmt.Errorf("failed to unmarshal auth error response: %w", err) } @@ -481,7 +489,7 @@ func (auth *AuthClient) GetApplicationToken(ctx context.Context, clientID, clien if respError.Code != "" && resp.StatusCode != http.StatusInternalServerError { logErrorf(ctx, auth.Logger, "Failed to get application token: %s", respError.Message) - opentelemetry.HandleSpanError(span, "Failed to get application token", respError) + tracing.HandleSpanError(span, "Failed to get application token", respError) return "", respError } @@ -490,7 +498,7 @@ func (auth *AuthClient) GetApplicationToken(ctx context.Context, clientID, clien if err := json.Unmarshal(body, &response); err != nil { logErrorf(ctx, auth.Logger, "Failed to unmarshal response: %v", err) - opentelemetry.HandleSpanError(span, "Failed to unmarshal response", err) + tracing.HandleSpanError(span, "Failed to unmarshal response", err) return "", fmt.Errorf("failed to unmarshal response: %w", err) } diff --git a/auth/middleware/middlewareGRPC.go b/auth/middleware/middlewareGRPC.go index 7098b10..d02b0f9 100644 --- a/auth/middleware/middlewareGRPC.go +++ b/auth/middleware/middlewareGRPC.go @@ -9,7 +9,8 @@ import ( "strings" "github.com/LerianStudio/lib-commons/v5/commons" - "github.com/LerianStudio/lib-commons/v5/commons/opentelemetry" + observability "github.com/LerianStudio/lib-observability" + "github.com/LerianStudio/lib-observability/tracing" jwt "github.com/golang-jwt/jwt/v5" "go.opentelemetry.io/otel/attribute" "google.golang.org/grpc" @@ -50,7 +51,7 @@ func NewGRPCAuthUnaryPolicy(auth *AuthClient, cfg PolicyConfig) grpc.UnaryServer } token, ok := extractTokenFromMD(ctx) - _, tracer, reqID, _ := commons.NewTrackingFromContext(ctx) + _, tracer, reqID, _ := observability.NewTrackingFromContext(ctx) ctx, span := tracer.Start(ctx, "lib_auth.authorize_grpc_unary_policy") defer span.End() @@ -63,7 +64,7 @@ func NewGRPCAuthUnaryPolicy(auth *AuthClient, cfg PolicyConfig) grpc.UnaryServer pol, found := policyForMethod(cfg, info.FullMethod) if !found { - opentelemetry.HandleSpanError(span, "no policy configured for method", fmt.Errorf("%s", info.FullMethod)) + tracing.HandleSpanError(span, "no policy configured for method", fmt.Errorf("%s", info.FullMethod)) return nil, status.Error(codes.Internal, "internal configuration error") } @@ -75,7 +76,7 @@ func NewGRPCAuthUnaryPolicy(auth *AuthClient, cfg PolicyConfig) grpc.UnaryServer sub, err = cfg.SubResolver(ctx, info.FullMethod, req) if err != nil { - opentelemetry.HandleSpanError(span, "failed to resolve subject", err) + tracing.HandleSpanError(span, "failed to resolve subject", err) return nil, status.Error(codes.Internal, "internal configuration error") } @@ -86,8 +87,8 @@ func NewGRPCAuthUnaryPolicy(auth *AuthClient, cfg PolicyConfig) grpc.UnaryServer "resource": pol.Resource, "action": pol.Action, } - if err := opentelemetry.SetSpanAttributesFromValue(span, "app.request.payload", payload, nil); err != nil { - opentelemetry.HandleSpanError(span, "failed to set span payload", err) + if err := tracing.SetSpanAttributesFromValue(span, "app.request.payload", payload, nil); err != nil { + tracing.HandleSpanError(span, "failed to set span payload", err) } authorized, httpStatus, err := auth.checkAuthorization(ctx, sub, pol.Resource, pol.Action, token) diff --git a/auth/middleware/middleware_test.go b/auth/middleware/middleware_test.go index 6d66270..cdbee74 100644 --- a/auth/middleware/middleware_test.go +++ b/auth/middleware/middleware_test.go @@ -5,12 +5,16 @@ import ( "encoding/json" "net/http" "net/http/httptest" + "strings" "testing" - "github.com/LerianStudio/lib-commons/v5/commons/log" + observability "github.com/LerianStudio/lib-observability" + "github.com/LerianStudio/lib-observability/log" jwt "github.com/golang-jwt/jwt/v5" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + sdktrace "go.opentelemetry.io/otel/sdk/trace" + "go.opentelemetry.io/otel/sdk/trace/tracetest" ) // --------------------------------------------------------------------------- @@ -416,6 +420,75 @@ func TestCheckAuthorization_ServerReturnsInvalidJSON(t *testing.T) { assert.Contains(t, err.Error(), "failed to unmarshal") } +// --------------------------------------------------------------------------- +// GetApplicationToken +// --------------------------------------------------------------------------- + +func TestGetApplicationToken_DoesNotTraceClientSecret(t *testing.T) { + t.Parallel() + + const ( + clientID = "test-client-id" + clientSecret = "super-secret-client-secret" + accessToken = "application-access-token" + ) + + exporter := tracetest.NewInMemoryExporter() + tp := sdktrace.NewTracerProvider(sdktrace.WithSyncer(exporter)) + t.Cleanup(func() { require.NoError(t, tp.Shutdown(context.Background())) }) + + var capturedBody map[string]string + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, "/v1/login/oauth/access_token", r.URL.Path) + require.NoError(t, json.NewDecoder(r.Body).Decode(&capturedBody)) + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + + require.NoError(t, json.NewEncoder(w).Encode(oauth2Token{AccessToken: accessToken})) + })) + defer server.Close() + + auth := &AuthClient{ + Address: server.URL, + Enabled: true, + Logger: &testLogger{}, + } + + ctx := observability.ContextWithTracer(context.Background(), tp.Tracer("test")) + + token, err := auth.GetApplicationToken(ctx, clientID, clientSecret) + require.NoError(t, err) + assert.Equal(t, accessToken, token) + + assert.Equal(t, map[string]string{ + "grantType": "client_credentials", + "clientId": clientID, + "clientSecret": clientSecret, + }, capturedBody) + + spans := exporter.GetSpans() + require.Len(t, spans, 1) + assert.Equal(t, "lib_auth.get_application_token", spans[0].Name) + + payloadAttributes := map[string]string{} + for _, attr := range spans[0].Attributes { + key := string(attr.Key) + if !strings.HasPrefix(key, "app.request.payload") { + continue + } + + payloadAttributes[key] = attr.Value.AsString() + assert.NotContains(t, key, "clientSecret") + assert.NotContains(t, attr.Value.AsString(), clientSecret) + } + + assert.Equal(t, "client_credentials", payloadAttributes["app.request.payload.grantType"]) + assert.Equal(t, clientID, payloadAttributes["app.request.payload.clientId"]) + assert.NotContains(t, payloadAttributes, "app.request.payload.clientSecret") +} + // --------------------------------------------------------------------------- // AuthResponse JSON serialization // --------------------------------------------------------------------------- diff --git a/go.mod b/go.mod index c49dc4b..0b9e447 100644 --- a/go.mod +++ b/go.mod @@ -1,20 +1,22 @@ module github.com/LerianStudio/lib-auth/v2 -go 1.25.9 +go 1.26.3 require ( - github.com/LerianStudio/lib-commons/v5 v5.0.2 + github.com/LerianStudio/lib-commons/v5 v5.2.0-beta.12 + github.com/LerianStudio/lib-observability v1.0.0 github.com/gofiber/fiber/v2 v2.52.13 github.com/golang-jwt/jwt/v5 v5.3.1 github.com/stretchr/testify v1.11.1 go.opentelemetry.io/otel v1.43.0 - google.golang.org/grpc v1.80.0 + google.golang.org/grpc v1.81.0 ) require github.com/google/uuid v1.6.0 // indirect require ( github.com/andybalholm/brotli v1.2.0 // indirect + github.com/bxcodec/dbresolver/v2 v2.2.1 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/clipperhouse/uax29/v2 v2.7.0 // indirect @@ -26,6 +28,7 @@ require ( github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.30.1 // indirect + github.com/golang/snappy v1.0.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect github.com/joho/godotenv v1.5.1 // indirect github.com/klauspost/compress v1.18.5 // indirect @@ -33,6 +36,7 @@ require ( github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.21 // indirect + github.com/montanaflynn/stats v0.8.2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/shopspring/decimal v1.4.0 // indirect @@ -41,27 +45,33 @@ require ( github.com/tklauser/numcpus v0.11.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.69.0 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.2.0 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.mongodb.org/mongo-driver v1.17.9 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/contrib/bridges/otelzap v0.17.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.18.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.18.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.19.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.43.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 // indirect - go.opentelemetry.io/otel/log v0.18.0 // indirect + go.opentelemetry.io/otel/log v0.19.0 // indirect go.opentelemetry.io/otel/metric v1.43.0 // indirect go.opentelemetry.io/otel/sdk v1.43.0 // indirect - go.opentelemetry.io/otel/sdk/log v0.18.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.19.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect go.opentelemetry.io/otel/trace v1.43.0 // indirect go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.uber.org/mock v0.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.27.1 // indirect - golang.org/x/crypto v0.49.0 // indirect - golang.org/x/net v0.52.0 // indirect - golang.org/x/sys v0.42.0 // indirect - golang.org/x/text v0.35.0 // indirect + go.uber.org/zap v1.28.0 // indirect + golang.org/x/crypto v0.50.0 // indirect + golang.org/x/net v0.53.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.43.0 // indirect + golang.org/x/text v0.36.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 // indirect google.golang.org/protobuf v1.36.11 // indirect diff --git a/go.sum b/go.sum index 9dbf48a..697a7e2 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,13 @@ -github.com/LerianStudio/lib-commons/v5 v5.0.2 h1:7xjw67VzBcZz9/vo2BaghiLLKlqeoUrG4HcZ6spojK4= -github.com/LerianStudio/lib-commons/v5 v5.0.2/go.mod h1:VKACUO0KsfDQMiMb8wjtKjZqCSNUOcV8WSggaDU36UQ= +github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= +github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= +github.com/LerianStudio/lib-commons/v5 v5.2.0-beta.12 h1:+wQQ/V4BwI8WhGvtuyT+sp0RvGK294DBkOa/+RBQ73k= +github.com/LerianStudio/lib-commons/v5 v5.2.0-beta.12/go.mod h1:WyyOgyFshvAHMTZc1dnRGRQ9qA9J2dWZluzJbSWlTtk= +github.com/LerianStudio/lib-observability v1.0.0 h1:Ty9rlU8OJZoAmQ9lXYaXcDIBSiZOn6Aq1ofNzhwHq88= +github.com/LerianStudio/lib-observability v1.0.0/go.mod h1:kGZvqUqgFVTv5TkqqVqAtJ9GHEr0WMK2MfnjoQAyrp4= github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= +github.com/bxcodec/dbresolver/v2 v2.2.1 h1:bjIZm3YXK40dX36qHHj6Vhitj6C1XF88X4d3P3k8Jtw= +github.com/bxcodec/dbresolver/v2 v2.2.1/go.mod h1:xWb3HT8vrWUnoLVA7KQ+IcD9RvnzfRBqOkO9rKsg1rQ= github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= @@ -35,8 +41,12 @@ github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63Y github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= @@ -51,12 +61,16 @@ 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.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/lib/pq v1.12.0 h1:mC1zeiNamwKBecjHarAr26c/+d8V5w/u4J0I/yASbJo= +github.com/lib/pq v1.12.0/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.21 h1:jJKAZiQH+2mIinzCJIaIG9Be1+0NR+5sz/lYEEjdM8w= github.com/mattn/go-runewidth v0.0.21/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= +github.com/montanaflynn/stats v0.8.2 h1:52wnefTJnPI5FoHif1DQh2soKRw0yYs+4AVyvtcZCH0= +github.com/montanaflynn/stats v0.8.2/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -80,36 +94,47 @@ github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6Kllzaw github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.69.0 h1:fNLLESD2SooWeh2cidsuFtOcrEi4uB4m1mPrkJMZyVI= github.com/valyala/fasthttp v1.69.0/go.mod h1:4wA4PfAraPlAsJ5jMSqCE2ug5tqUPwKXxVj8oNECGcw= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.2.0 h1:bYKF2AEwG5rqd1BumT4gAnvwU/M9nBp2pTSxeZw7Wvs= +github.com/xdg-go/scram v1.2.0/go.mod h1:3dlrS0iBaWKYVt2ZfA4cj48umJZ+cAEbR6/SjLA88I8= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.mongodb.org/mongo-driver v1.17.9 h1:IexDdCuuNJ3BHrELgBlyaH9p60JXAvdzWR128q+U5tU= +go.mongodb.org/mongo-driver v1.17.9/go.mod h1:LlOhpH5NUEfhxcAwG0UEkMqwYcc4JU18gtCdGudk/tQ= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/bridges/otelzap v0.17.0 h1:oCltVHJcblcth2z9B9dRTeZIZTe2Sf9Ad9h8bcc+s8M= -go.opentelemetry.io/contrib/bridges/otelzap v0.17.0/go.mod h1:G/VE1A/hRn6mEWdfC8rMvSdQVGM64KUPi4XilLkwcQw= +go.opentelemetry.io/contrib/bridges/otelzap v0.18.0 h1:EkWTww6Nqs2P29r01NeuNsG7qNJtoWWaT1fx/CKode8= +go.opentelemetry.io/contrib/bridges/otelzap v0.18.0/go.mod h1:lj3bgA/c7nJy0NhxqyvWJFC30aTgB+G0RKDdLbvJ4QM= go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.18.0 h1:deI9UQMoGFgrg5iLPgzueqFPHevDl+28YKfSpPTI6rY= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.18.0/go.mod h1:PFx9NgpNUKXdf7J4Q3agRxMs3Y07QhTCVipKmLsMKnU= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.19.0 h1:Dn8rkudDzY6KV9dr/D/bTUuWgqDf9xe0rr4G2elrn0Y= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.19.0/go.mod h1:gMk9F0xDgyN9M/3Ed5Y1wKcx/9mlU91NXY2SNq7RQuU= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.43.0 h1:8UQVDcZxOJLtX6gxtDt3vY2WTgvZqMQRzjsqiIHQdkc= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.43.0/go.mod h1:2lmweYCiHYpEjQ/lSJBYhj9jP1zvCvQW4BqL9dnT7FQ= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 h1:88Y4s2C8oTui1LGM6bTWkw0ICGcOLCAI5l6zsD1j20k= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0/go.mod h1:Vl1/iaggsuRlrHf/hfPJPvVag77kKyvrLeD10kpMl+A= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0 h1:RAE+JPfvEmvy+0LzyUA25/SGawPwIUbZ6u0Wug54sLc= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.43.0/go.mod h1:AGmbycVGEsRx9mXMZ75CsOyhSP6MFIcj/6dnG+vhVjk= -go.opentelemetry.io/otel/log v0.18.0 h1:XgeQIIBjZZrliksMEbcwMZefoOSMI1hdjiLEiiB0bAg= -go.opentelemetry.io/otel/log v0.18.0/go.mod h1:KEV1kad0NofR3ycsiDH4Yjcoj0+8206I6Ox2QYFSNgI= -go.opentelemetry.io/otel/log/logtest v0.18.0 h1:2QeyoKJdIgK2LJhG1yn78o/zmpXx1EditeyRDREqVS8= -go.opentelemetry.io/otel/log/logtest v0.18.0/go.mod h1:v1vh3PYR9zIa5MK6HwkH2lMrLBg/Y9Of6Qc+krlesX0= +go.opentelemetry.io/otel/log v0.19.0 h1:KUZs/GOsw79TBBMfDWsXS+KZ4g2Ckzksd1ymzsIEbo4= +go.opentelemetry.io/otel/log v0.19.0/go.mod h1:5DQYeGmxVIr4n0/BcJvF4upsraHjg6vudJJpnkL6Ipk= +go.opentelemetry.io/otel/log/logtest v0.19.0 h1:HdSsl4ndTK15LtJGLWBfMsSlLrCgSeE3VMzwOrLYiYs= +go.opentelemetry.io/otel/log/logtest v0.19.0/go.mod h1:c1sH1nOHTwfMCWhhQTdWGqxgDjZhtkbkzAqGGyj0Ijs= go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= -go.opentelemetry.io/otel/sdk/log v0.18.0 h1:n8OyZr7t7otkeTnPTbDNom6rW16TBYGtvyy2Gk6buQw= -go.opentelemetry.io/otel/sdk/log v0.18.0/go.mod h1:C0+wxkTwKpOCZLrlJ3pewPiiQwpzycPI/u6W0Z9fuYk= -go.opentelemetry.io/otel/sdk/log/logtest v0.18.0 h1:l3mYuPsuBx6UKE47BVcPrZoZ0q/KER57vbj2qkgDLXA= -go.opentelemetry.io/otel/sdk/log/logtest v0.18.0/go.mod h1:7cHtiVJpZebB3wybTa4NG+FUo5NPe3PROz1FqB0+qdw= +go.opentelemetry.io/otel/sdk/log v0.19.0 h1:scYVLqT22D2gqXItnWiocLUKGH9yvkkeql5dBDiXyko= +go.opentelemetry.io/otel/sdk/log v0.19.0/go.mod h1:vFBowwXGLlW9AvpuF7bMgnNI95LiW10szrOdvzBHlAg= +go.opentelemetry.io/otel/sdk/log/logtest v0.19.0 h1:BEbF7ZBB6qQloV/Ub1+3NQoOUnVtcGkU3XX4Ws3GQfk= +go.opentelemetry.io/otel/sdk/log/logtest v0.19.0/go.mod h1:Lua81/3yM0wOmoHTokLj9y9ADeA02v1naRrVrkAZuKk= go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= @@ -122,27 +147,54 @@ go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= -go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= -golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= -golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= -golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= +go.uber.org/zap v1.28.0 h1:IZzaP1Fv73/T/pBMLk4VutPl36uNC+OSUh3JLG3FIjo= +go.uber.org/zap v1.28.0/go.mod h1:rDLpOi171uODNm/mxFcuYWxDsqWSAVkFdX4XojSKg/Q= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= +golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= +golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/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-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= -golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= -golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= +golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= +golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= +golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 h1:VPWxll4HlMw1Vs/qXtN7BvhZqsS9cdAittCNvVENElA= google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:7QBABkRtR8z+TEnmXTqIqwJLlzrZKVfAUm7tY3yGv0M= google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 h1:m8qni9SQFH0tJc1X0vmnpw/0t+AImlSvp30sEupozUg= google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= -google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= +google.golang.org/grpc v1.81.0 h1:W3G9N3KQf3BU+YuCtGKJk0CmxQNbAISICD/9AORxLIw= +google.golang.org/grpc v1.81.0/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=