A container registry that uses the AT Protocol for manifest storage and S3 for blob storage. atcr.io
docker container atproto go
80
fork

Configure Feed

Select the types of activity you want to include in your feed.

publish xrpc endpoint lexicons. fix backfill and jetstream to actually validate records match schema

+1549 -626
+92 -88
go.mod
··· 3 3 go 1.25.4 4 4 5 5 require ( 6 - github.com/aws/aws-sdk-go v1.55.5 7 - github.com/bluesky-social/indigo v0.0.0-20251218205144-034a2c019e64 6 + github.com/aws/aws-sdk-go v1.55.8 7 + github.com/bluesky-social/indigo v0.0.0-20260106221649-6fcd9317e725 8 8 github.com/distribution/distribution/v3 v3.0.0 9 9 github.com/distribution/reference v0.6.0 10 10 github.com/earthboundkid/versioninfo/v2 v2.24.1 11 11 github.com/go-chi/chi/v5 v5.2.3 12 12 github.com/go-chi/render v1.0.3 13 13 github.com/goki/freetype v1.0.5 14 - github.com/golang-jwt/jwt/v5 v5.2.2 14 + github.com/golang-jwt/jwt/v5 v5.3.0 15 15 github.com/google/uuid v1.6.0 16 16 github.com/gorilla/websocket v1.5.3 17 - github.com/ipfs/go-block-format v0.2.0 18 - github.com/ipfs/go-cid v0.4.1 19 - github.com/ipfs/go-datastore v0.6.0 17 + github.com/ipfs/go-block-format v0.2.3 18 + github.com/ipfs/go-cid v0.6.0 19 + github.com/ipfs/go-datastore v0.9.0 20 20 github.com/ipfs/go-ipfs-blockstore v1.3.1 21 - github.com/ipfs/go-ipld-format v0.6.0 22 - github.com/ipld/go-car v0.6.1-0.20230509095817-92d28eb23ba4 23 - github.com/klauspost/compress v1.18.0 24 - github.com/mattn/go-sqlite3 v1.14.32 21 + github.com/ipfs/go-ipld-format v0.6.3 22 + github.com/ipld/go-car v0.6.3 23 + github.com/klauspost/compress v1.18.2 24 + github.com/mattn/go-sqlite3 v1.14.33 25 25 github.com/microcosm-cc/bluemonday v1.0.27 26 26 github.com/multiformats/go-multihash v0.2.3 27 27 github.com/opencontainers/go-digest v1.0.0 28 - github.com/spf13/cobra v1.8.0 28 + github.com/spf13/cobra v1.10.2 29 29 github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c 30 30 github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef 31 - github.com/stretchr/testify v1.10.0 31 + github.com/stretchr/testify v1.11.1 32 32 github.com/whyrusleeping/cbor-gen v0.3.1 33 - github.com/yuin/goldmark v1.7.13 34 - go.opentelemetry.io/otel v1.32.0 35 - go.yaml.in/yaml/v4 v4.0.0-rc.2 36 - golang.org/x/crypto v0.44.0 37 - golang.org/x/image v0.34.0 38 - golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 39 - gorm.io/gorm v1.25.9 33 + github.com/yuin/goldmark v1.7.16 34 + go.opentelemetry.io/otel v1.39.0 35 + go.yaml.in/yaml/v4 v4.0.0-rc.3 36 + golang.org/x/crypto v0.47.0 37 + golang.org/x/image v0.35.0 38 + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da 39 + gorm.io/gorm v1.31.1 40 40 ) 41 41 42 42 require ( ··· 44 44 github.com/ajg/form v1.5.1 // indirect 45 45 github.com/aymerick/douceur v0.2.0 // indirect 46 46 github.com/beorn7/perks v1.0.1 // indirect 47 - github.com/bshuster-repo/logrus-logstash-hook v1.0.0 // indirect 48 - github.com/cenkalti/backoff/v4 v4.3.0 // indirect 47 + github.com/bshuster-repo/logrus-logstash-hook v1.1.0 // indirect 48 + github.com/cenkalti/backoff/v5 v5.0.3 // indirect 49 49 github.com/cespare/xxhash/v2 v2.3.0 // indirect 50 - github.com/coreos/go-systemd/v22 v22.5.0 // indirect 50 + github.com/coreos/go-systemd/v22 v22.6.0 // indirect 51 51 github.com/davecgh/go-spew v1.1.1 // indirect 52 52 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect 53 - github.com/docker/docker-credential-helpers v0.8.2 // indirect 54 - github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c // indirect 53 + github.com/docker/docker-credential-helpers v0.9.5 // indirect 54 + github.com/docker/go-events v0.0.0-20250808211157-605354379745 // indirect 55 55 github.com/docker/go-metrics v0.0.1 // indirect 56 56 github.com/felixge/httpsnoop v1.0.4 // indirect 57 - github.com/go-jose/go-jose/v4 v4.1.2 // indirect 58 - github.com/go-logr/logr v1.4.2 // indirect 57 + github.com/gammazero/chanqueue v1.1.1 // indirect 58 + github.com/gammazero/deque v1.2.0 // indirect 59 + github.com/go-jose/go-jose/v4 v4.1.3 // indirect 60 + github.com/go-logr/logr v1.4.3 // indirect 59 61 github.com/go-logr/stdr v1.2.2 // indirect 60 62 github.com/gocql/gocql v1.7.0 // indirect 61 63 github.com/gogo/protobuf v1.3.2 // indirect 62 - github.com/golang/snappy v0.0.4 // indirect 63 - github.com/google/go-cmp v0.7.0 // indirect 64 - github.com/google/go-querystring v1.1.0 // indirect 64 + github.com/golang/snappy v1.0.0 // indirect 65 + github.com/google/go-querystring v1.2.0 // indirect 65 66 github.com/gorilla/css v1.0.1 // indirect 66 67 github.com/gorilla/handlers v1.5.2 // indirect 67 68 github.com/gorilla/mux v1.8.1 // indirect 68 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect 69 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.4 // indirect 69 70 github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect 70 71 github.com/hashicorp/go-cleanhttp v0.5.2 // indirect 71 - github.com/hashicorp/go-retryablehttp v0.7.5 // indirect 72 + github.com/hashicorp/go-retryablehttp v0.7.8 // indirect 72 73 github.com/hashicorp/golang-lru v1.0.2 // indirect 73 - github.com/hashicorp/golang-lru/arc/v2 v2.0.6 // indirect 74 + github.com/hashicorp/golang-lru/arc/v2 v2.0.7 // indirect 74 75 github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect 75 76 github.com/inconshreveable/mousetrap v1.1.0 // indirect 76 77 github.com/ipfs/bbloom v0.0.4 // indirect 77 - github.com/ipfs/go-blockservice v0.5.2 // indirect 78 + github.com/ipfs/boxo v0.35.2 // indirect 79 + github.com/ipfs/go-cidutil v0.1.0 // indirect 80 + github.com/ipfs/go-dsqueue v0.1.1 // indirect 78 81 github.com/ipfs/go-ipfs-ds-help v1.1.1 // indirect 79 - github.com/ipfs/go-ipfs-exchange-interface v0.2.1 // indirect 80 82 github.com/ipfs/go-ipfs-util v0.0.3 // indirect 81 - github.com/ipfs/go-ipld-cbor v0.1.0 // indirect 82 - github.com/ipfs/go-ipld-legacy v0.2.1 // indirect 83 + github.com/ipfs/go-ipld-cbor v0.2.1 // indirect 84 + github.com/ipfs/go-ipld-legacy v0.2.2 // indirect 83 85 github.com/ipfs/go-libipfs v0.7.0 // indirect 84 86 github.com/ipfs/go-log v1.0.5 // indirect 85 - github.com/ipfs/go-log/v2 v2.5.1 // indirect 86 - github.com/ipfs/go-merkledag v0.11.0 // indirect 87 - github.com/ipfs/go-metrics-interface v0.0.1 // indirect 88 - github.com/ipfs/go-verifcid v0.0.3 // indirect 89 - github.com/ipld/go-codec-dagpb v1.6.0 // indirect 87 + github.com/ipfs/go-log/v2 v2.9.0 // indirect 88 + github.com/ipfs/go-metrics-interface v0.3.0 // indirect 89 + github.com/ipld/go-codec-dagpb v1.7.0 // indirect 90 90 github.com/ipld/go-ipld-prime v0.21.0 // indirect 91 91 github.com/jackc/pgpassfile v1.0.0 // indirect 92 - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect 93 - github.com/jackc/pgx/v5 v5.5.0 // indirect 94 - github.com/jackc/puddle/v2 v2.2.1 // indirect 95 - github.com/jbenet/goprocess v0.1.4 // indirect 92 + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect 93 + github.com/jackc/pgx/v5 v5.8.0 // indirect 94 + github.com/jackc/puddle/v2 v2.2.2 // indirect 96 95 github.com/jinzhu/inflection v1.0.0 // indirect 97 96 github.com/jinzhu/now v1.1.5 // indirect 98 97 github.com/jmespath/go-jmespath v0.4.0 // indirect 99 - github.com/klauspost/cpuid/v2 v2.2.7 // indirect 98 + github.com/klauspost/cpuid/v2 v2.3.0 // indirect 100 99 github.com/mattn/go-isatty v0.0.20 // indirect 101 100 github.com/minio/sha256-simd v1.0.1 // indirect 102 101 github.com/mr-tron/base58 v1.2.0 // indirect 103 102 github.com/multiformats/go-base32 v0.1.0 // indirect 104 103 github.com/multiformats/go-base36 v0.2.0 // indirect 105 104 github.com/multiformats/go-multibase v0.2.0 // indirect 106 - github.com/multiformats/go-varint v0.0.7 // indirect 105 + github.com/multiformats/go-multicodec v0.10.0 // indirect 106 + github.com/multiformats/go-varint v0.1.0 // indirect 107 107 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect 108 - github.com/opencontainers/image-spec v1.1.0 // indirect 108 + github.com/opencontainers/image-spec v1.1.1 // indirect 109 109 github.com/opentracing/opentracing-go v1.2.0 // indirect 110 110 github.com/pmezard/go-difflib v1.0.0 // indirect 111 111 github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f // indirect 112 - github.com/prometheus/client_golang v1.20.5 // indirect 113 - github.com/prometheus/client_model v0.6.1 // indirect 114 - github.com/prometheus/common v0.60.1 // indirect 115 - github.com/prometheus/procfs v0.15.1 // indirect 116 - github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 // indirect 117 - github.com/redis/go-redis/extra/redisotel/v9 v9.0.5 // indirect 118 - github.com/redis/go-redis/v9 v9.7.3 // indirect 112 + github.com/prometheus/client_golang v1.23.2 // indirect 113 + github.com/prometheus/client_model v0.6.2 // indirect 114 + github.com/prometheus/common v0.67.5 // indirect 115 + github.com/prometheus/otlptranslator v1.0.0 // indirect 116 + github.com/prometheus/procfs v0.19.2 // indirect 117 + github.com/redis/go-redis/extra/rediscmd/v9 v9.17.2 // indirect 118 + github.com/redis/go-redis/extra/redisotel/v9 v9.17.2 // indirect 119 + github.com/redis/go-redis/v9 v9.17.2 // indirect 120 + github.com/rivo/uniseg v0.4.7 // indirect 119 121 github.com/sirupsen/logrus v1.9.3 // indirect 120 122 github.com/spaolacci/murmur3 v1.1.0 // indirect 121 - github.com/spf13/pflag v1.0.5 // indirect 123 + github.com/spf13/pflag v1.0.10 // indirect 122 124 gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b // indirect 123 125 gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 // indirect 124 - go.opentelemetry.io/contrib/bridges/prometheus v0.57.0 // indirect 125 - go.opentelemetry.io/contrib/exporters/autoexport v0.57.0 // indirect 126 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 // indirect 127 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 // indirect 128 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 // indirect 129 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 // indirect 130 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 // indirect 131 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 // indirect 132 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 // indirect 133 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 // indirect 134 - go.opentelemetry.io/otel/exporters/prometheus v0.54.0 // indirect 135 - go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.8.0 // indirect 136 - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 // indirect 137 - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0 // indirect 138 - go.opentelemetry.io/otel/log v0.8.0 // indirect 139 - go.opentelemetry.io/otel/metric v1.32.0 // indirect 140 - go.opentelemetry.io/otel/sdk v1.32.0 // indirect 141 - go.opentelemetry.io/otel/sdk/log v0.8.0 // indirect 142 - go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect 143 - go.opentelemetry.io/otel/trace v1.32.0 // indirect 144 - go.opentelemetry.io/proto/otlp v1.3.1 // indirect 126 + go.opentelemetry.io/auto/sdk v1.2.1 // indirect 127 + go.opentelemetry.io/contrib/bridges/prometheus v0.64.0 // indirect 128 + go.opentelemetry.io/contrib/exporters/autoexport v0.64.0 // indirect 129 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0 // indirect 130 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.15.0 // indirect 131 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.15.0 // indirect 132 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.39.0 // indirect 133 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.39.0 // indirect 134 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 // indirect 135 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.39.0 // indirect 136 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0 // indirect 137 + go.opentelemetry.io/otel/exporters/prometheus v0.61.0 // indirect 138 + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.15.0 // indirect 139 + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.39.0 // indirect 140 + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.39.0 // indirect 141 + go.opentelemetry.io/otel/log v0.15.0 // indirect 142 + go.opentelemetry.io/otel/metric v1.39.0 // indirect 143 + go.opentelemetry.io/otel/sdk v1.39.0 // indirect 144 + go.opentelemetry.io/otel/sdk/log v0.15.0 // indirect 145 + go.opentelemetry.io/otel/sdk/metric v1.39.0 // indirect 146 + go.opentelemetry.io/otel/trace v1.39.0 // indirect 147 + go.opentelemetry.io/proto/otlp v1.9.0 // indirect 145 148 go.uber.org/atomic v1.11.0 // indirect 146 149 go.uber.org/multierr v1.11.0 // indirect 147 - go.uber.org/zap v1.26.0 // indirect 148 - golang.org/x/net v0.47.0 // indirect 150 + go.uber.org/zap v1.27.1 // indirect 151 + go.yaml.in/yaml/v2 v2.4.3 // indirect 152 + golang.org/x/net v0.49.0 // indirect 149 153 golang.org/x/sync v0.19.0 // indirect 150 - golang.org/x/sys v0.38.0 // indirect 151 - golang.org/x/text v0.32.0 // indirect 152 - golang.org/x/time v0.6.0 // indirect 153 - google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect 154 - google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect 155 - google.golang.org/grpc v1.68.0 // indirect 156 - google.golang.org/protobuf v1.35.1 // indirect 154 + golang.org/x/sys v0.40.0 // indirect 155 + golang.org/x/text v0.33.0 // indirect 156 + golang.org/x/time v0.14.0 // indirect 157 + google.golang.org/genproto/googleapis/api v0.0.0-20260112192933-99fd39fd28a9 // indirect 158 + google.golang.org/genproto/googleapis/rpc v0.0.0-20260112192933-99fd39fd28a9 // indirect 159 + google.golang.org/grpc v1.78.0 // indirect 160 + google.golang.org/protobuf v1.36.11 // indirect 157 161 gopkg.in/inf.v0 v0.9.1 // indirect 158 162 gopkg.in/yaml.v2 v2.4.0 // indirect 159 163 gopkg.in/yaml.v3 v3.0.1 // indirect 160 - gorm.io/driver/postgres v1.5.7 // indirect 161 - lukechampine.com/blake3 v1.2.1 // indirect 164 + gorm.io/driver/postgres v1.6.0 // indirect 165 + lukechampine.com/blake3 v1.4.1 // indirect 162 166 )
+254 -253
go.sum
··· 9 9 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 10 10 github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 h1:iW0a5ljuFxkLGPNem5Ui+KBjFJzKg4Fv2fnxe4dvzpM= 11 11 github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA= 12 - github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= 13 - github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= 12 + github.com/aws/aws-sdk-go v1.55.8 h1:JRmEUbU52aJQZ2AjX4q4Wu7t4uZjOu71uyNmaWlUkJQ= 13 + github.com/aws/aws-sdk-go v1.55.8/go.mod h1:ZkViS9AqA6otK+JBBNH2++sx1sgxrPKcSzPPvQkUtXk= 14 14 github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= 15 15 github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= 16 - github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= 17 - github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= 18 - github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= 16 + github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= 17 + github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= 19 18 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= 20 19 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 21 20 github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= 22 21 github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= 23 22 github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= 24 23 github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= 25 - github.com/bluesky-social/indigo v0.0.0-20251218205144-034a2c019e64 h1:84EWie083DZT0eMo76kcZ0mBDcLUmWQu5UFE8/3ZW4k= 26 - github.com/bluesky-social/indigo v0.0.0-20251218205144-034a2c019e64/go.mod h1:KIy0FgNQacp4uv2Z7xhNkV3qZiUSGuRky97s7Pa4v+o= 24 + github.com/bluesky-social/indigo v0.0.0-20260106221649-6fcd9317e725 h1:gfrLAhE6PHun4MDypO/5hpnaHPd9Dbe9+JxZL0gC4ic= 25 + github.com/bluesky-social/indigo v0.0.0-20260106221649-6fcd9317e725/go.mod h1:KIy0FgNQacp4uv2Z7xhNkV3qZiUSGuRky97s7Pa4v+o= 27 26 github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= 28 27 github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= 29 - github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= 30 - github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= 31 - github.com/bsm/ginkgo/v2 v2.7.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w= 28 + github.com/bshuster-repo/logrus-logstash-hook v1.1.0 h1:o2FzZifLg+z/DN1OFmzTWzZZx/roaqt8IPZCIVco8r4= 29 + github.com/bshuster-repo/logrus-logstash-hook v1.1.0/go.mod h1:Q2aXOe7rNuPgbBtPCOzYyWDvKX7+FpxE5sRdvcPoui0= 32 30 github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= 33 31 github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= 34 - github.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= 35 32 github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= 36 33 github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= 37 - github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= 38 - github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= 39 - github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 34 + github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= 35 + github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= 40 36 github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= 41 37 github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 42 - github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= 43 - github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= 38 + github.com/coreos/go-systemd/v22 v22.6.0 h1:aGVa/v8B7hpb0TKl0MWoAavPDmHvobFe5R5zn0bCJWo= 39 + github.com/coreos/go-systemd/v22 v22.6.0/go.mod h1:iG+pp635Fo7ZmV/j14KUcmEyWF+0X7Lua8rrTWzYgWU= 44 40 github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= 45 - github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= 41 + github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= 46 42 github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= 47 43 github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= 48 44 github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= ··· 50 46 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 51 47 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 52 48 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 53 - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= 54 - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= 49 + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc= 50 + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= 55 51 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= 56 52 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= 57 53 github.com/distribution/distribution/v3 v3.0.0 h1:q4R8wemdRQDClzoNNStftB2ZAfqOiN6UX90KJc4HjyM= 58 54 github.com/distribution/distribution/v3 v3.0.0/go.mod h1:tRNuFoZsUdyRVegq8xGNeds4KLjwLCRin/tTo6i1DhU= 59 55 github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= 60 56 github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= 61 - github.com/docker/docker-credential-helpers v0.8.2 h1:bX3YxiGzFP5sOXWc3bTPEXdEaZSeVMrFgOr3T+zrFAo= 62 - github.com/docker/docker-credential-helpers v0.8.2/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M= 63 - github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= 64 - github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= 57 + github.com/docker/docker-credential-helpers v0.9.5 h1:EFNN8DHvaiK8zVqFA2DT6BjXE0GzfLOZ38ggPTKePkY= 58 + github.com/docker/docker-credential-helpers v0.9.5/go.mod h1:v1S+hepowrQXITkEfw6o4+BMbGot02wiKpzWhGUZK6c= 59 + github.com/docker/go-events v0.0.0-20250808211157-605354379745 h1:yOn6Ze6IbYI/KAw2lw/83ELYvZh6hvsygTVkD0dzMC4= 60 + github.com/docker/go-events v0.0.0-20250808211157-605354379745/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= 65 61 github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= 66 62 github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= 67 63 github.com/earthboundkid/versioninfo/v2 v2.24.1 h1:SJTMHaoUx3GzjjnUO1QzP3ZXK6Ee/nbWyCm58eY3oUg= 68 64 github.com/earthboundkid/versioninfo/v2 v2.24.1/go.mod h1:VcWEooDEuyUJnMfbdTh0uFN4cfEIg+kHMuWB2CDCLjw= 65 + github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= 66 + github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= 69 67 github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= 70 68 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= 69 + github.com/filecoin-project/go-clock v0.1.0 h1:SFbYIM75M8NnFm1yMHhN9Ahy3W5bEZV9gd6MPfXbKVU= 70 + github.com/filecoin-project/go-clock v0.1.0/go.mod h1:4uB/O4PvOjlx1VCMdZ9MyDZXRm//gkj1ELEbxfI1AZs= 71 71 github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= 72 72 github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= 73 + github.com/gammazero/chanqueue v1.1.1 h1:n9Y+zbBxw2f7uUE9wpgs0rOSkP/I/yhDLiNuhyVjojQ= 74 + github.com/gammazero/chanqueue v1.1.1/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc= 75 + github.com/gammazero/deque v1.2.0 h1:scEFO8Uidhw6KDU5qg1HA5fYwM0+us2qdeJqm43bitU= 76 + github.com/gammazero/deque v1.2.0/go.mod h1:JVrR+Bj1NMQbPnYclvDlvSX0nVGReLrQZ0aUMuWLctg= 73 77 github.com/go-chi/chi/v5 v5.2.3 h1:WQIt9uxdsAbgIYgid+BpYc+liqQZGMHRaUwp0JUcvdE= 74 78 github.com/go-chi/chi/v5 v5.2.3/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops= 75 79 github.com/go-chi/render v1.0.3 h1:AsXqd2a1/INaIfUSKq3G5uA8weYx20FOsM7uSoCyyt4= 76 80 github.com/go-chi/render v1.0.3/go.mod h1:/gr3hVkmYR0YlEy3LxCuVRFzEu9Ruok+gFqbIofjao0= 77 - github.com/go-jose/go-jose/v4 v4.1.2 h1:TK/7NqRQZfgAh+Td8AlsrvtPoUyiHh0LqVvokh+1vHI= 78 - github.com/go-jose/go-jose/v4 v4.1.2/go.mod h1:22cg9HWM1pOlnRiY+9cQYJ9XHmya1bYW8OeDM6Ku6Oo= 81 + github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= 82 + github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= 79 83 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 80 84 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= 81 85 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= 82 86 github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= 83 - github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= 84 - github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= 87 + github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= 88 + github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= 85 89 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= 86 90 github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= 87 91 github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= ··· 90 94 github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= 91 95 github.com/gocql/gocql v1.7.0 h1:O+7U7/1gSN7QTEAaMEsJc1Oq2QHXvCWoF3DFK9HDHus= 92 96 github.com/gocql/gocql v1.7.0/go.mod h1:vnlvXyFZeLBF0Wy+RS8hrOdbn0UWsWtdg07XJnFxZ+4= 93 - github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= 94 97 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= 95 98 github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= 96 99 github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= 97 100 github.com/goki/freetype v1.0.5 h1:yi2lQeUhXnBgSMqYd0vVmPw6RnnfIeTP3N4uvaJXd7A= 98 101 github.com/goki/freetype v1.0.5/go.mod h1:wKmKxddbzKmeci9K96Wknn5kjTWLyfC8tKOqAFbEX8E= 99 - github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= 100 - github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= 102 + github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo= 103 + github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= 101 104 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 102 105 github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 103 106 github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 104 107 github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= 105 108 github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= 106 109 github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 107 - github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= 108 - github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 110 + github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= 111 + github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 109 112 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 110 - github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 113 + github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 111 114 github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= 112 115 github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= 113 - github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= 114 - github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= 116 + github.com/google/go-querystring v1.2.0 h1:yhqkPbu2/OH+V9BfpCVPZkNmUXhb2gBxJArfhIxNtP0= 117 + github.com/google/go-querystring v1.2.0/go.mod h1:8IFJqpSRITyJ8QhQ13bmbeMBDfmeEJZD5A0egEOmkqU= 115 118 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 116 - github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= 117 - github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= 118 119 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 119 120 github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= 120 121 github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 121 - github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= 122 122 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= 123 + github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c h1:7lF+Vz0LqiRidnzC1Oq86fpX1q/iEv2KJdrCtttYjT4= 124 + github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= 123 125 github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= 124 126 github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= 125 127 github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= ··· 128 130 github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= 129 131 github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= 130 132 github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 131 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= 132 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= 133 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.4 h1:kEISI/Gx67NzH3nJxAmY/dGac80kKZgZt134u7Y/k1s= 134 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.4/go.mod h1:6Nz966r3vQYCqIzWsuEl9d7cf7mRhtDmm++sOxlnfxI= 133 135 github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= 134 136 github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= 135 137 github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= 136 138 github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= 137 - github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI= 138 - github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= 139 - github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M= 140 - github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= 139 + github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= 140 + github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= 141 + github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48= 142 + github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw= 141 143 github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= 142 144 github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= 143 - github.com/hashicorp/golang-lru/arc/v2 v2.0.6 h1:4NU7uP5vSoK6TbaMj3NtY478TTAWLso/vL1gpNrInHg= 144 - github.com/hashicorp/golang-lru/arc/v2 v2.0.6/go.mod h1:cfdDIX05DWvYV6/shsxDfa/OVcRieOt+q4FnM8x+Xno= 145 + github.com/hashicorp/golang-lru/arc/v2 v2.0.7 h1:QxkVTxwColcduO+LP7eJO56r2hFiG8zEbfAAzRv52KQ= 146 + github.com/hashicorp/golang-lru/arc/v2 v2.0.7/go.mod h1:Pe7gBlGdc8clY5LJ0LpJXMt5AmgmWNH1g+oFFVUHOEc= 145 147 github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= 146 148 github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= 147 - github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= 148 - github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= 149 + github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= 150 + github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= 149 151 github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= 150 152 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= 151 153 github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= 152 154 github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= 153 - github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ= 154 - github.com/ipfs/go-bitswap v0.11.0/go.mod h1:05aE8H3XOU+LXpTedeAS0OZpcO1WFsj5niYQH9a1Tmk= 155 - github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs= 156 - github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM= 157 - github.com/ipfs/go-blockservice v0.5.2 h1:in9Bc+QcXwd1apOVM7Un9t8tixPKdaHQFdLSUM1Xgk8= 158 - github.com/ipfs/go-blockservice v0.5.2/go.mod h1:VpMblFEqG67A/H2sHKAemeH9vlURVavlysbdUI632yk= 159 - github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= 160 - github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= 161 - github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk= 162 - github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8= 155 + github.com/ipfs/boxo v0.35.2 h1:0QZJJh6qrak28abENOi5OA8NjBnZM4p52SxeuIDqNf8= 156 + github.com/ipfs/boxo v0.35.2/go.mod h1:bZn02OFWwJtY8dDW9XLHaki59EC5o+TGDECXEbe1w8U= 157 + github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA= 158 + github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU= 159 + github.com/ipfs/go-block-format v0.2.3 h1:mpCuDaNXJ4wrBJLrtEaGFGXkferrw5eqVvzaHhtFKQk= 160 + github.com/ipfs/go-block-format v0.2.3/go.mod h1:WJaQmPAKhD3LspLixqlqNFxiZ3BZ3xgqxxoSR/76pnA= 161 + github.com/ipfs/go-cid v0.6.0 h1:DlOReBV1xhHBhhfy/gBNNTSyfOM6rLiIx9J7A4DGf30= 162 + github.com/ipfs/go-cid v0.6.0/go.mod h1:NC4kS1LZjzfhK40UGmpXv5/qD2kcMzACYJNntCUiDhQ= 163 + github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q= 164 + github.com/ipfs/go-cidutil v0.1.0/go.mod h1:e7OEVBMIv9JaOxt9zaGEmAoSlXW9jdFZ5lP/0PwcfpA= 165 + github.com/ipfs/go-datastore v0.9.0 h1:WocriPOayqalEsueHv6SdD4nPVl4rYMfYGLD4bqCZ+w= 166 + github.com/ipfs/go-datastore v0.9.0/go.mod h1:uT77w/XEGrvJWwHgdrMr8bqCN6ZTW9gzmi+3uK+ouHg= 163 167 github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= 164 168 github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= 165 169 github.com/ipfs/go-ds-flatfs v0.5.1 h1:ZCIO/kQOS/PSh3vcF1H6a8fkRGS7pOfwfPdx4n/KJH4= 166 170 github.com/ipfs/go-ds-flatfs v0.5.1/go.mod h1:RWTV7oZD/yZYBKdbVIFXTX2fdY2Tbvl94NsWqmoyAX4= 171 + github.com/ipfs/go-ds-leveldb v0.5.2 h1:6nmxlQ2zbp4LCNdJVsmHfs9GP0eylfBNxpmY1csp0x0= 172 + github.com/ipfs/go-ds-leveldb v0.5.2/go.mod h1:2fAwmcvD3WoRT72PzEekHBkQmBDhc39DJGoREiuGmYo= 173 + github.com/ipfs/go-dsqueue v0.1.1 h1:6PQlHDyf9PSTN69NmwUir5+0is3tU0vRJj8zLlgK8Mc= 174 + github.com/ipfs/go-dsqueue v0.1.1/go.mod h1:Xxg353WSwwzYn3FGSzZ+taSQII3pIZ+EJC8/oWRDM10= 167 175 github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ= 168 176 github.com/ipfs/go-ipfs-blockstore v1.3.1/go.mod h1:KgtZyc9fq+P2xJUiCAzbRdhhqJHvsw8u2Dlqy2MyRTE= 169 - github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= 170 - github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= 171 177 github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= 172 178 github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= 173 179 github.com/ipfs/go-ipfs-ds-help v1.1.1 h1:B5UJOH52IbcfS56+Ul+sv8jnIV10lbjLF5eOO0C66Nw= 174 180 github.com/ipfs/go-ipfs-ds-help v1.1.1/go.mod h1:75vrVCkSdSFidJscs8n4W+77AtTpCIAdDGAwjitJMIo= 175 - github.com/ipfs/go-ipfs-exchange-interface v0.2.1 h1:jMzo2VhLKSHbVe+mHNzYgs95n0+t0Q69GQ5WhRDZV/s= 176 - github.com/ipfs/go-ipfs-exchange-interface v0.2.1/go.mod h1:MUsYn6rKbG6CTtsDp+lKJPmVt3ZrCViNyH3rfPGsZ2E= 177 - github.com/ipfs/go-ipfs-exchange-offline v0.3.0 h1:c/Dg8GDPzixGd0MC8Jh6mjOwU57uYokgWRFidfvEkuA= 178 - github.com/ipfs/go-ipfs-exchange-offline v0.3.0/go.mod h1:MOdJ9DChbb5u37M1IcbrRB02e++Z7521fMxqCNRrz9s= 179 181 github.com/ipfs/go-ipfs-pq v0.0.3 h1:YpoHVJB+jzK15mr/xsWC574tyDLkezVrDNeaalQBsTE= 180 182 github.com/ipfs/go-ipfs-pq v0.0.3/go.mod h1:btNw5hsHBpRcSSgZtiNm/SLj5gYIZ18AKtv3kERkRb4= 181 - github.com/ipfs/go-ipfs-routing v0.3.0 h1:9W/W3N+g+y4ZDeffSgqhgo7BsBSJwPMcyssET9OWevc= 182 - github.com/ipfs/go-ipfs-routing v0.3.0/go.mod h1:dKqtTFIql7e1zYsEuWLyuOU+E0WJWW8JjbTPLParDWo= 183 183 github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCmE0= 184 184 github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs= 185 - github.com/ipfs/go-ipld-cbor v0.1.0 h1:dx0nS0kILVivGhfWuB6dUpMa/LAwElHPw1yOGYopoYs= 186 - github.com/ipfs/go-ipld-cbor v0.1.0/go.mod h1:U2aYlmVrJr2wsUBU67K4KgepApSZddGRDWBYR0H4sCk= 187 - github.com/ipfs/go-ipld-format v0.6.0 h1:VEJlA2kQ3LqFSIm5Vu6eIlSxD/Ze90xtc4Meten1F5U= 188 - github.com/ipfs/go-ipld-format v0.6.0/go.mod h1:g4QVMTn3marU3qXchwjpKPKgJv+zF+OlaKMyhJ4LHPg= 189 - github.com/ipfs/go-ipld-legacy v0.2.1 h1:mDFtrBpmU7b//LzLSypVrXsD8QxkEWxu5qVxN99/+tk= 190 - github.com/ipfs/go-ipld-legacy v0.2.1/go.mod h1:782MOUghNzMO2DER0FlBR94mllfdCJCkTtDtPM51otM= 185 + github.com/ipfs/go-ipld-cbor v0.2.1 h1:H05yEJbK/hxg0uf2AJhyerBDbjOuHX4yi+1U/ogRa7E= 186 + github.com/ipfs/go-ipld-cbor v0.2.1/go.mod h1:x9Zbeq8CoE5R2WicYgBMcr/9mnkQ0lHddYWJP2sMV3A= 187 + github.com/ipfs/go-ipld-format v0.6.3 h1:9/lurLDTotJpZSuL++gh3sTdmcFhVkCwsgx2+rAh4j8= 188 + github.com/ipfs/go-ipld-format v0.6.3/go.mod h1:74ilVN12NXVMIV+SrBAyC05UJRk0jVvGqdmrcYZvCBk= 189 + github.com/ipfs/go-ipld-legacy v0.2.2 h1:DThbqCPVLpWBcGtU23KDLiY2YRZZnTkXQyfz8aOfBkQ= 190 + github.com/ipfs/go-ipld-legacy v0.2.2/go.mod h1:hhkj+b3kG9b2BcUNw8IFYAsfeNo8E3U7eYlWeAOPyDU= 191 191 github.com/ipfs/go-libipfs v0.7.0 h1:Mi54WJTODaOL2/ZSm5loi3SwI3jI2OuFWUrQIkJ5cpM= 192 192 github.com/ipfs/go-libipfs v0.7.0/go.mod h1:KsIf/03CqhICzyRGyGo68tooiBE2iFbI/rXW7FhAYr0= 193 193 github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= 194 194 github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= 195 195 github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= 196 - github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= 197 - github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= 198 - github.com/ipfs/go-merkledag v0.11.0 h1:DgzwK5hprESOzS4O1t/wi6JDpyVQdvm9Bs59N/jqfBY= 199 - github.com/ipfs/go-merkledag v0.11.0/go.mod h1:Q4f/1ezvBiJV0YCIXvt51W/9/kqJGH4I1LsA7+djsM4= 200 - github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= 201 - github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= 202 - github.com/ipfs/go-peertaskqueue v0.8.1 h1:YhxAs1+wxb5jk7RvS0LHdyiILpNmRIRnZVztekOF0pg= 203 - github.com/ipfs/go-peertaskqueue v0.8.1/go.mod h1:Oxxd3eaK279FxeydSPPVGHzbwVeHjatZ2GA8XD+KbPU= 204 - github.com/ipfs/go-verifcid v0.0.3 h1:gmRKccqhWDocCRkC+a59g5QW7uJw5bpX9HWBevXa0zs= 205 - github.com/ipfs/go-verifcid v0.0.3/go.mod h1:gcCtGniVzelKrbk9ooUSX/pM3xlH73fZZJDzQJRvOUw= 206 - github.com/ipld/go-car v0.6.1-0.20230509095817-92d28eb23ba4 h1:oFo19cBmcP0Cmg3XXbrr0V/c+xU9U1huEZp8+OgBzdI= 207 - github.com/ipld/go-car v0.6.1-0.20230509095817-92d28eb23ba4/go.mod h1:6nkFF8OmR5wLKBzRKi7/YFJpyYR7+oEn1DX+mMWnlLA= 208 - github.com/ipld/go-car/v2 v2.13.1 h1:KnlrKvEPEzr5IZHKTXLAEub+tPrzeAFQVRlSQvuxBO4= 209 - github.com/ipld/go-car/v2 v2.13.1/go.mod h1:QkdjjFNGit2GIkpQ953KBwowuoukoM75nP/JI1iDJdo= 210 - github.com/ipld/go-codec-dagpb v1.6.0 h1:9nYazfyu9B1p3NAgfVdpRco3Fs2nFC72DqVsMj6rOcc= 211 - github.com/ipld/go-codec-dagpb v1.6.0/go.mod h1:ANzFhfP2uMJxRBr8CE+WQWs5UsNa0pYtmKZ+agnUw9s= 196 + github.com/ipfs/go-log/v2 v2.9.0 h1:l4b06AwVXwldIzbVPZy5z7sKp9lHFTX0KWfTBCtHaOk= 197 + github.com/ipfs/go-log/v2 v2.9.0/go.mod h1:UhIYAwMV7Nb4ZmihUxfIRM2Istw/y9cAk3xaK+4Zs2c= 198 + github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU= 199 + github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwHieqej/jos7H4POwoY= 200 + github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU= 201 + github.com/ipfs/go-peertaskqueue v0.8.2/go.mod h1:L6QPvou0346c2qPJNiJa6BvOibxDfaiPlqHInmzg0FA= 202 + github.com/ipfs/go-test v0.2.3 h1:Z/jXNAReQFtCYyn7bsv/ZqUwS6E7iIcSpJ2CuzCvnrc= 203 + github.com/ipfs/go-test v0.2.3/go.mod h1:QW8vSKkwYvWFwIZQLGQXdkt9Ud76eQXRQ9Ao2H+cA1o= 204 + github.com/ipfs/go-unixfsnode v1.10.2 h1:TREegX1J4X+k1w4AhoDuxxFvVcS9SegMRvrmxF6Tca8= 205 + github.com/ipfs/go-unixfsnode v1.10.2/go.mod h1:ImDPTSiKZ+2h4UVdkSDITJHk87bUAp7kX/lgifjRicg= 206 + github.com/ipld/go-car v0.6.3 h1:v9pWoNHu24aoC06CStvbH4mpNPdiOhc8rqFFw/C1/ss= 207 + github.com/ipld/go-car v0.6.3/go.mod h1:jtFKq9ysYVpXiyssjvkQEQQT5fP1RrSUJ9UwHrpmfJo= 208 + github.com/ipld/go-car/v2 v2.16.0 h1:LWe0vmN/QcQmUU4tr34W5Nv5mNraW+G6jfN2s+ndBco= 209 + github.com/ipld/go-car/v2 v2.16.0/go.mod h1:RqFGWN9ifcXVmCrTAVnfnxiWZk1+jIx67SYhenlmL34= 210 + github.com/ipld/go-codec-dagpb v1.7.0 h1:hpuvQjCSVSLnTnHXn+QAMR0mLmb1gA6wl10LExo2Ts0= 211 + github.com/ipld/go-codec-dagpb v1.7.0/go.mod h1:rD3Zg+zub9ZnxcLwfol/OTQRVjaLzXypgy4UqHQvilM= 212 212 github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E= 213 213 github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ= 214 214 github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= 215 215 github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= 216 - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= 217 - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= 218 - github.com/jackc/pgx/v5 v5.5.0 h1:NxstgwndsTRy7eq9/kqYc/BZh5w2hHJV86wjvO+1xPw= 219 - github.com/jackc/pgx/v5 v5.5.0/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= 220 - github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= 221 - github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= 216 + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= 217 + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= 218 + github.com/jackc/pgx/v5 v5.8.0 h1:TYPDoleBBme0xGSAX3/+NujXXtpZn9HBONkQC7IEZSo= 219 + github.com/jackc/pgx/v5 v5.8.0/go.mod h1:QVeDInX2m9VyzvNeiCJVjCkNFqzsNb43204HshNSZKw= 220 + github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= 221 + github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= 222 222 github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= 223 223 github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= 224 - github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= 225 224 github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= 226 225 github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= 227 226 github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= ··· 239 238 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 240 239 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= 241 240 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= 242 - github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= 243 - github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= 244 - github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= 245 - github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= 241 + github.com/klauspost/compress v1.18.2 h1:iiPHWW0YrcFgpBYhsA6D1+fqHssJscY/Tm/y2Uqnapk= 242 + github.com/klauspost/compress v1.18.2/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= 243 + github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= 244 + github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= 246 245 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 247 - github.com/koron/go-ssdp v0.0.3 h1:JivLMY45N76b4p/vsWGOKewBQu6uf39y8l+AQ7sDKx8= 248 - github.com/koron/go-ssdp v0.0.3/go.mod h1:b2MxI6yh02pKrsyNoQUsk4+YNikaGhe4894J+Q5lDvA= 246 + github.com/koron/go-ssdp v0.0.6 h1:Jb0h04599eq/CY7rB5YEqPS83HmRfHP2azkxMN2rFtU= 247 + github.com/koron/go-ssdp v0.0.6/go.mod h1:0R9LfRJGek1zWTjN3JUNlm5INCDYGpRDfAptnct63fI= 249 248 github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= 250 249 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 251 250 github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= ··· 258 257 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= 259 258 github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= 260 259 github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= 261 - github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= 262 - github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= 263 - github.com/libp2p/go-libp2p v0.25.1 h1:YK+YDCHpYyTvitKWVxa5PfElgIpOONU01X5UcLEwJGA= 264 - github.com/libp2p/go-libp2p v0.25.1/go.mod h1:xnK9/1d9+jeQCVvi/f1g12KqtVi/jP/SijtKV1hML3g= 265 - github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw= 266 - github.com/libp2p/go-libp2p-asn-util v0.2.0/go.mod h1:WoaWxbHKBymSN41hWSq/lGKJEca7TNm58+gGJi2WsLI= 267 - github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0= 268 - github.com/libp2p/go-libp2p-record v0.2.0/go.mod h1:I+3zMkvvg5m2OcSdoL0KPljyJyvNDFGKX7QdlpYUcwk= 260 + github.com/libp2p/go-flow-metrics v0.3.0 h1:q31zcHUvHnwDO0SHaukewPYgwOBSxtt830uJtUx6784= 261 + github.com/libp2p/go-flow-metrics v0.3.0/go.mod h1:nuhlreIwEguM1IvHAew3ij7A8BMlyHQJ279ao24eZZo= 262 + github.com/libp2p/go-libp2p v0.45.0 h1:Pdhr2HsFXaYjtfiNcBP4CcRUONvbMFdH3puM9vV4Tiw= 263 + github.com/libp2p/go-libp2p v0.45.0/go.mod h1:NovCojezAt4dnDd4fH048K7PKEqH0UFYYqJRjIIu8zc= 264 + github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= 265 + github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= 266 + github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg= 267 + github.com/libp2p/go-libp2p-record v0.3.1/go.mod h1:T8itUkLcWQLCYMqtX7Th6r7SexyUJpIyPgks757td/E= 269 268 github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= 270 269 github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= 271 270 github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= 272 271 github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= 273 - github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= 274 - github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= 275 - github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= 276 - github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= 277 - github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= 272 + github.com/libp2p/go-netroute v0.3.0 h1:nqPCXHmeNmgTJnktosJ/sIef9hvwYCrsLxXmfNks/oc= 273 + github.com/libp2p/go-netroute v0.3.0/go.mod h1:Nkd5ShYgSMS5MUKy/MU2T57xFoOKvvLR92Lic48LEyA= 274 + github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= 275 + github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= 278 276 github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= 279 277 github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 280 - github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuErjs= 281 - github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= 278 + github.com/mattn/go-sqlite3 v1.14.33 h1:A5blZ5ulQo2AtayQ9/limgHEkFreKj1Dv226a1K73s0= 279 + github.com/mattn/go-sqlite3 v1.14.33/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= 282 280 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 283 281 github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= 284 282 github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= 285 - github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= 286 - github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= 283 + github.com/miekg/dns v1.1.68 h1:jsSRkNozw7G/mnmXULynzMNIsgY2dHC8LO6U6Ij2JEA= 284 + github.com/miekg/dns v1.1.68/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps= 287 285 github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= 288 286 github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= 289 287 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= ··· 296 294 github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= 297 295 github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= 298 296 github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= 299 - github.com/multiformats/go-multiaddr v0.8.0 h1:aqjksEcqK+iD/Foe1RRFsGZh8+XFiGo7FgUCZlpv3LU= 300 - github.com/multiformats/go-multiaddr v0.8.0/go.mod h1:Fs50eBDWvZu+l3/9S6xAE7ZYj6yhxlvaVZjakWN7xRs= 301 - github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= 302 - github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= 297 + github.com/multiformats/go-multiaddr v0.16.1 h1:fgJ0Pitow+wWXzN9do+1b8Pyjmo8m5WhGfzpL82MpCw= 298 + github.com/multiformats/go-multiaddr v0.16.1/go.mod h1:JSVUmXDjsVFiW7RjIFMP7+Ev+h1DTbiJgVeTV/tcmP0= 299 + github.com/multiformats/go-multiaddr-dns v0.4.1 h1:whi/uCLbDS3mSEUMb1MsoT4uzUeZB0N32yzufqS0i5M= 300 + github.com/multiformats/go-multiaddr-dns v0.4.1/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc= 303 301 github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= 304 302 github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= 305 303 github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= 306 304 github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= 307 - github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= 308 - github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= 305 + github.com/multiformats/go-multicodec v0.10.0 h1:UpP223cig/Cx8J76jWt91njpK3GTAO1w02sdcjZDSuc= 306 + github.com/multiformats/go-multicodec v0.10.0/go.mod h1:wg88pM+s2kZJEQfRCKBNU+g32F5aWBEjyFHXvZLTcLI= 309 307 github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= 310 308 github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= 311 - github.com/multiformats/go-multistream v0.4.1 h1:rFy0Iiyn3YT0asivDUIR05leAdwZq3de4741sbiSdfo= 312 - github.com/multiformats/go-multistream v0.4.1/go.mod h1:Mz5eykRVAjJWckE2U78c6xqdtyNUEhKSM0Lwar2p77Q= 313 - github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= 314 - github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= 309 + github.com/multiformats/go-multistream v0.6.1 h1:4aoX5v6T+yWmc2raBHsTvzmFhOI8WVOer28DeBBEYdQ= 310 + github.com/multiformats/go-multistream v0.6.1/go.mod h1:ksQf6kqHAb6zIsyw7Zm+gAuVo57Qbq84E27YlYqavqw= 311 + github.com/multiformats/go-varint v0.1.0 h1:i2wqFp4sdl3IcIxfAonHQV9qU5OsZ4Ts9IOoETFs5dI= 312 + github.com/multiformats/go-varint v0.1.0/go.mod h1:5KVAVXegtfmNQQm/lCY+ATvDzvJJhSkUlGQV9wgObdI= 315 313 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= 316 314 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= 317 315 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 318 316 github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= 319 317 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= 320 - github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= 321 - github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= 318 + github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= 319 + github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= 322 320 github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= 323 321 github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= 324 322 github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= ··· 332 330 github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 333 331 github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= 334 332 github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= 335 - github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= 336 - github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= 333 + github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= 334 + github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= 337 335 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= 338 336 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 339 - github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= 340 - github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= 337 + github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= 338 + github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= 341 339 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 342 340 github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= 343 - github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPAaSc= 344 - github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= 341 + github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= 342 + github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= 343 + github.com/prometheus/otlptranslator v1.0.0 h1:s0LJW/iN9dkIH+EnhiD3BlkkP5QVIUVEoIwkU+A6qos= 344 + github.com/prometheus/otlptranslator v1.0.0/go.mod h1:vRYWnXvI6aWGpsdY/mOT/cbeVRBlPWtBNDb7kGR3uKM= 345 345 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 346 346 github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= 347 347 github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= 348 - github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= 349 - github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= 350 - github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 h1:EaDatTxkdHG+U3Bk4EUr+DZ7fOGwTfezUiUJMaIcaho= 351 - github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5/go.mod h1:fyalQWdtzDBECAQFBJuQe5bzQ02jGd5Qcbgb97Flm7U= 352 - github.com/redis/go-redis/extra/redisotel/v9 v9.0.5 h1:EfpWLLCyXw8PSM2/XNJLjI3Pb27yVE+gIAfeqp8LUCc= 353 - github.com/redis/go-redis/extra/redisotel/v9 v9.0.5/go.mod h1:WZjPDy7VNzn77AAfnAfVjZNvfJTYfPetfZk5yoSTLaQ= 354 - github.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk= 355 - github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM= 356 - github.com/redis/go-redis/v9 v9.7.3/go.mod h1:bGUrSggJ9X9GUmZpZNEOQKaANxSGgOEBRltRTZHSvrA= 348 + github.com/prometheus/procfs v0.19.2 h1:zUMhqEW66Ex7OXIiDkll3tl9a1ZdilUOd/F6ZXw4Vws= 349 + github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw= 350 + github.com/redis/go-redis/extra/rediscmd/v9 v9.17.2 h1:KYWnHK9pwzOUo3sNJlNmzRwZ5mw7opugn8njtGThKNg= 351 + github.com/redis/go-redis/extra/rediscmd/v9 v9.17.2/go.mod h1:wsfMQVl/GFYD9Gx/tlxurlTtvHkZRAt8j1qi27eIlTk= 352 + github.com/redis/go-redis/extra/redisotel/v9 v9.17.2 h1:wthFPRW3Y50CknMrjjJoYwXUFR4U7hMVJCMeLzDI8s4= 353 + github.com/redis/go-redis/extra/redisotel/v9 v9.17.2/go.mod h1:iqfQX7U2o8MWSl8W+Ah8KqbQyi/UoR/MQNgvaUyA1wc= 354 + github.com/redis/go-redis/v9 v9.17.2 h1:P2EGsA4qVIM3Pp+aPocCJ7DguDHhqrXNhVcEp4ViluI= 355 + github.com/redis/go-redis/v9 v9.17.2/go.mod h1:u410H11HMLoB+TP67dz8rL9s6QW2j76l0//kSOd3370= 356 + github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= 357 + github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= 357 358 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 358 - github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= 359 - github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= 359 + github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= 360 + github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= 360 361 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 361 362 github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 362 363 github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= 363 364 github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 365 + github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= 364 366 github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= 365 367 github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= 366 368 github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs= ··· 369 371 github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= 370 372 github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= 371 373 github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= 372 - github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= 373 - github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= 374 - github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= 375 - github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 374 + github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= 375 + github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= 376 + github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 377 + github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= 378 + github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 376 379 github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c h1:km8GpoQut05eY3GiYWEedbTT0qnSxrCjsVbb7yKY1KE= 377 380 github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c/go.mod h1:cNQ3dwVJtS5Hmnjxy6AgTPd0Inb3pW05ftPSX7NZO7Q= 378 381 github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef h1:Ch6Q+AZUxDBCVqdkI8FSpFyZDtCVBc2VmejdNrm5rRQ= ··· 383 386 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 384 387 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 385 388 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 386 - github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= 387 - github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 389 + github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= 390 + github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= 391 + github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= 392 + github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= 388 393 github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= 389 394 github.com/warpfork/go-testmark v0.12.1 h1:rMgCpJfwy1sJ50x0M0NgyphxYYPMOODIJHhsXyEHU0s= 390 395 github.com/warpfork/go-testmark v0.12.1/go.mod h1:kHwy7wfvGSPh1rQJYKayD4AbtNaeyZdcGi9tNJTaa5Y= ··· 396 401 github.com/whyrusleeping/cbor-gen v0.3.1/go.mod h1:pM99HXyEbSQHcosHc0iW7YFmwnscr+t9Te4ibko05so= 397 402 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 398 403 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 399 - github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= 400 - github.com/yuin/goldmark v1.7.13 h1:GPddIs617DnBLFFVJFgpo1aBfe/4xcvMc3SB5t/D0pA= 401 - github.com/yuin/goldmark v1.7.13/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= 404 + github.com/yuin/goldmark v1.7.16 h1:n+CJdUxaFMiDUNnWC3dMWCIQJSkxH4uz3ZwQBkAlVNE= 405 + github.com/yuin/goldmark v1.7.16/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= 402 406 gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b h1:CzigHMRySiX3drau9C6Q5CAbNIApmLdat5jPMqChvDA= 403 407 gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b/go.mod h1:/y/V339mxv2sZmYYR64O07VuCpdNZqCTwO8ZcouTMI8= 404 408 gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 h1:qwDnMxjkyLmAFgcfgTnfJrmYKWhHnci3GjDqcZp1M3Q= 405 409 gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02/go.mod h1:JTnUj0mpYiAsuZLmKjTx/ex3AtMowcCgnE7YNyCEP0I= 406 - go.opentelemetry.io/contrib/bridges/prometheus v0.57.0 h1:UW0+QyeyBVhn+COBec3nGhfnFe5lwB0ic1JBVjzhk0w= 407 - go.opentelemetry.io/contrib/bridges/prometheus v0.57.0/go.mod h1:ppciCHRLsyCio54qbzQv0E4Jyth/fLWDTJYfvWpcSVk= 408 - go.opentelemetry.io/contrib/exporters/autoexport v0.57.0 h1:jmTVJ86dP60C01K3slFQa2NQ/Aoi7zA+wy7vMOKD9H4= 409 - go.opentelemetry.io/contrib/exporters/autoexport v0.57.0/go.mod h1:EJBheUMttD/lABFyLXhce47Wr6DPWYReCzaZiXadH7g= 410 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 h1:DheMAlT6POBP+gh8RUH19EOTnQIor5QE0uSRPtzCpSw= 411 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0/go.mod h1:wZcGmeVO9nzP67aYSLDqXNWK87EZWhi7JWj1v7ZXf94= 412 - go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= 413 - go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= 414 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 h1:WzNab7hOOLzdDF/EoWCt4glhrbMPVMOO5JYTmpz36Ls= 415 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0/go.mod h1:hKvJwTzJdp90Vh7p6q/9PAOd55dI6WA6sWj62a/JvSs= 416 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 h1:S+LdBGiQXtJdowoJoQPEtI52syEP/JYBUpjO49EQhV8= 417 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0/go.mod h1:5KXybFvPGds3QinJWQT7pmXf+TN5YIa7CNYObWRkj50= 418 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= 419 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= 420 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= 421 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8= 422 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= 423 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= 424 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= 425 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= 426 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 h1:cMyu9O88joYEaI47CnQkxO1XZdpoTF9fEnW2duIddhw= 427 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0/go.mod h1:6Am3rn7P9TVVeXYG+wtcGE7IE1tsQ+bP3AuWcKt/gOI= 428 - go.opentelemetry.io/otel/exporters/prometheus v0.54.0 h1:rFwzp68QMgtzu9PgP3jm9XaMICI6TsofWWPcBDKwlsU= 429 - go.opentelemetry.io/otel/exporters/prometheus v0.54.0/go.mod h1:QyjcV9qDP6VeK5qPyKETvNjmaaEc7+gqjh4SS0ZYzDU= 430 - go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.8.0 h1:CHXNXwfKWfzS65yrlB2PVds1IBZcdsX8Vepy9of0iRU= 431 - go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.8.0/go.mod h1:zKU4zUgKiaRxrdovSS2amdM5gOc59slmo/zJwGX+YBg= 432 - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 h1:SZmDnHcgp3zwlPBS2JX2urGYe/jBKEIT6ZedHRUyCz8= 433 - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0/go.mod h1:fdWW0HtZJ7+jNpTKUR0GpMEDP69nR8YBJQxNiVCE3jk= 434 - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0 h1:cC2yDI3IQd0Udsux7Qmq8ToKAx1XCilTQECZ0KDZyTw= 435 - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0/go.mod h1:2PD5Ex6z8CFzDbTdOlwyNIUywRr1DN0ospafJM1wJ+s= 436 - go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= 437 - go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= 438 - go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= 439 - go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= 440 - go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= 441 - go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= 442 - go.opentelemetry.io/otel/sdk/log v0.8.0 h1:zg7GUYXqxk1jnGF/dTdLPrK06xJdrXgqgFLnI4Crxvs= 443 - go.opentelemetry.io/otel/sdk/log v0.8.0/go.mod h1:50iXr0UVwQrYS45KbruFrEt4LvAdCaWWgIrsN3ZQggo= 444 - go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= 445 - go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= 446 - go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= 447 - go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= 448 - go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= 449 - go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= 410 + go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= 411 + go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= 412 + go.opentelemetry.io/contrib/bridges/prometheus v0.64.0 h1:7TYhBCu6Xz6vDJGNtEslWZLuuX2IJ/aH50hBY4MVeUg= 413 + go.opentelemetry.io/contrib/bridges/prometheus v0.64.0/go.mod h1:tHQctZfAe7e4PBPGyt3kae6mQFXNpj+iiDJa3ithM50= 414 + go.opentelemetry.io/contrib/exporters/autoexport v0.64.0 h1:9pzPj3RFyKOxBAMkM2w84LpT+rdHam1XoFA+QhARiRw= 415 + go.opentelemetry.io/contrib/exporters/autoexport v0.64.0/go.mod h1:hlVZx1btWH0XTfXpuGX9dsquB50s+tc3fYFOO5elo2M= 416 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0 h1:ssfIgGNANqpVFCndZvcuyKbl0g+UAVcbBcqGkG28H0Y= 417 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0/go.mod h1:GQ/474YrbE4Jx8gZ4q5I4hrhUzM6UPzyrqJYV2AqPoQ= 418 + go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= 419 + go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= 420 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.15.0 h1:W+m0g+/6v3pa5PgVf2xoFMi5YtNR06WtS7ve5pcvLtM= 421 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.15.0/go.mod h1:JM31r0GGZ/GU94mX8hN4D8v6e40aFlUECSQ48HaLgHM= 422 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.15.0 h1:EKpiGphOYq3CYnIe2eX9ftUkyU+Y8Dtte8OaWyHJ4+I= 423 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.15.0/go.mod h1:nWFP7C+T8TygkTjJ7mAyEaFaE7wNfms3nV/vexZ6qt0= 424 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.39.0 h1:cEf8jF6WbuGQWUVcqgyWtTR0kOOAWY1DYZ+UhvdmQPw= 425 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.39.0/go.mod h1:k1lzV5n5U3HkGvTCJHraTAGJ7MqsgL1wrGwTj1Isfiw= 426 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.39.0 h1:nKP4Z2ejtHn3yShBb+2KawiXgpn8In5cT7aO2wXuOTE= 427 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.39.0/go.mod h1:NwjeBbNigsO4Aj9WgM0C+cKIrxsZUaRmZUO7A8I7u8o= 428 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 h1:f0cb2XPmrqn4XMy9PNliTgRKJgS5WcL/u0/WRYGz4t0= 429 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0/go.mod h1:vnakAaFckOMiMtOIhFI2MNH4FYrZzXCYxmb1LlhoGz8= 430 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.39.0 h1:in9O8ESIOlwJAEGTkkf34DesGRAc/Pn8qJ7k3r/42LM= 431 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.39.0/go.mod h1:Rp0EXBm5tfnv0WL+ARyO/PHBEaEAT8UUHQ6AGJcSq6c= 432 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0 h1:Ckwye2FpXkYgiHX7fyVrN1uA/UYd9ounqqTuSNAv0k4= 433 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0/go.mod h1:teIFJh5pW2y+AN7riv6IBPX2DuesS3HgP39mwOspKwU= 434 + go.opentelemetry.io/otel/exporters/prometheus v0.61.0 h1:cCyZS4dr67d30uDyh8etKM2QyDsQ4zC9ds3bdbrVoD0= 435 + go.opentelemetry.io/otel/exporters/prometheus v0.61.0/go.mod h1:iivMuj3xpR2DkUrUya3TPS/Z9h3dz7h01GxU+fQBRNg= 436 + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.15.0 h1:0BSddrtQqLEylcErkeFrJBmwFzcqfQq9+/uxfTZq+HE= 437 + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.15.0/go.mod h1:87sjYuAPzaRCtdd09GU5gM1U9wQLrrcYrm77mh5EBoc= 438 + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.39.0 h1:5gn2urDL/FBnK8OkCfD1j3/ER79rUuTYmCvlXBKeYL8= 439 + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.39.0/go.mod h1:0fBG6ZJxhqByfFZDwSwpZGzJU671HkwpWaNe2t4VUPI= 440 + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.39.0 h1:8UPA4IbVZxpsD76ihGOQiFml99GPAEZLohDXvqHdi6U= 441 + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.39.0/go.mod h1:MZ1T/+51uIVKlRzGw1Fo46KEWThjlCBZKl2LzY5nv4g= 442 + go.opentelemetry.io/otel/log v0.15.0 h1:0VqVnc3MgyYd7QqNVIldC3dsLFKgazR6P3P3+ypkyDY= 443 + go.opentelemetry.io/otel/log v0.15.0/go.mod h1:9c/G1zbyZfgu1HmQD7Qj84QMmwTp2QCQsZH1aeoWDE4= 444 + go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= 445 + go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= 446 + go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= 447 + go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE= 448 + go.opentelemetry.io/otel/sdk/log v0.15.0 h1:WgMEHOUt5gjJE93yqfqJOkRflApNif84kxoHWS9VVHE= 449 + go.opentelemetry.io/otel/sdk/log v0.15.0/go.mod h1:qDC/FlKQCXfH5hokGsNg9aUBGMJQsrUyeOiW5u+dKBQ= 450 + go.opentelemetry.io/otel/sdk/log/logtest v0.14.0 h1:Ijbtz+JKXl8T2MngiwqBlPaHqc4YCaP/i13Qrow6gAM= 451 + go.opentelemetry.io/otel/sdk/log/logtest v0.14.0/go.mod h1:dCU8aEL6q+L9cYTqcVOk8rM9Tp8WdnHOPLiBgp0SGOA= 452 + go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8= 453 + go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew= 454 + go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= 455 + go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= 456 + go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A= 457 + go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4= 450 458 go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= 451 459 go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= 452 460 go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= 453 461 go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= 454 - go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= 455 462 go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= 456 463 go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= 457 464 go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= ··· 460 467 go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= 461 468 go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= 462 469 go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= 463 - go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= 464 - go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= 465 - go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= 466 - go.yaml.in/yaml/v4 v4.0.0-rc.2 h1:/FrI8D64VSr4HtGIlUtlFMGsm7H7pWTbj6vOLVZcA6s= 467 - go.yaml.in/yaml/v4 v4.0.0-rc.2/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= 470 + go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= 471 + go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= 472 + go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= 473 + go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= 474 + go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= 475 + go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= 476 + go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= 468 477 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 469 478 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 470 479 golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 471 480 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 472 481 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 473 - golang.org/x/crypto v0.44.0 h1:A97SsFvM3AIwEEmTBiaxPPTYpDC47w720rdiiUvgoAU= 474 - golang.org/x/crypto v0.44.0/go.mod h1:013i+Nw79BMiQiMsOPcVCB5ZIJbYkerPrGnOa00tvmc= 475 - golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= 476 - golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= 477 - golang.org/x/image v0.34.0 h1:33gCkyw9hmwbZJeZkct8XyR11yH889EQt/QH4VmXMn8= 478 - golang.org/x/image v0.34.0/go.mod h1:2RNFBZRB+vnwwFil8GkMdRvrJOFd1AzdZI6vOY+eJVU= 482 + golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= 483 + golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= 484 + golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 h1:mgKeJMpvi0yx/sU5GsxQ7p6s2wtOnGAHZWCHUM4KGzY= 485 + golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70= 486 + golang.org/x/image v0.35.0 h1:LKjiHdgMtO8z7Fh18nGY6KDcoEtVfsgLDPeLyguqb7I= 487 + golang.org/x/image v0.35.0/go.mod h1:MwPLTVgvxSASsxdLzKrl8BRFuyqMyGhLwmC+TO1Sybk= 479 488 golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 480 489 golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= 481 490 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 482 491 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 483 - golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 484 - golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= 485 - golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= 492 + golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI= 493 + golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= 486 494 golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 487 495 golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 488 496 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= ··· 490 498 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 491 499 golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 492 500 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 493 - golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= 494 - golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= 495 - golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= 501 + golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= 502 + golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= 496 503 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 497 504 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 498 505 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 499 506 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 500 507 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 501 - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 502 508 golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= 503 509 golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= 504 510 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= ··· 506 512 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 507 513 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 508 514 golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 515 + golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 509 516 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 510 - golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 511 - golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 512 - golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 513 - golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 514 517 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 515 - golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 516 518 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 517 - golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= 518 - golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= 519 - golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 519 + golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= 520 + golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= 520 521 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 521 522 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 522 - golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= 523 - golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= 524 - golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= 525 - golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= 523 + golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= 524 + golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= 525 + golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= 526 + golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= 526 527 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 527 528 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 528 529 golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= ··· 532 533 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 533 534 golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 534 535 golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 535 - golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 536 - golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= 537 - golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= 536 + golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA= 537 + golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc= 538 538 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 539 539 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 540 540 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 541 541 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 542 - golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= 543 - golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= 544 - google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= 545 - google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= 546 - google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= 547 - google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= 548 - google.golang.org/grpc v1.68.0 h1:aHQeeJbo8zAkAa3pRzrVjZlbz6uSfeOXlJNQM0RAbz0= 549 - google.golang.org/grpc v1.68.0/go.mod h1:fmSPC5AsjSBCK54MyHRx48kpOti1/jRfOlwEWywNjWA= 550 - google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= 551 - google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= 542 + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= 543 + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= 544 + gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= 545 + gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= 546 + google.golang.org/genproto/googleapis/api v0.0.0-20260112192933-99fd39fd28a9 h1:4DKBrmaqeptdEzp21EfrOEh8LE7PJ5ywH6wydSbOfGY= 547 + google.golang.org/genproto/googleapis/api v0.0.0-20260112192933-99fd39fd28a9/go.mod h1:dd646eSK+Dk9kxVBl1nChEOhJPtMXriCcVb4x3o6J+E= 548 + google.golang.org/genproto/googleapis/rpc v0.0.0-20260112192933-99fd39fd28a9 h1:IY6/YYRrFUk0JPp0xOVctvFIVuRnjccihY5kxf5g0TE= 549 + google.golang.org/genproto/googleapis/rpc v0.0.0-20260112192933-99fd39fd28a9/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= 550 + google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc= 551 + google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U= 552 + google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= 553 + google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= 552 554 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 553 555 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 554 556 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= ··· 563 565 gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 564 566 gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 565 567 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 566 - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 567 568 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 568 569 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 569 - gorm.io/driver/postgres v1.5.7 h1:8ptbNJTDbEmhdr62uReG5BGkdQyeasu/FZHxI0IMGnM= 570 - gorm.io/driver/postgres v1.5.7/go.mod h1:3e019WlBaYI5o5LIdNV+LyxCMNtLOQETBXL2h4chKpA= 571 - gorm.io/driver/sqlite v1.5.5 h1:7MDMtUZhV065SilG62E0MquljeArQZNfJnjd9i9gx3E= 572 - gorm.io/driver/sqlite v1.5.5/go.mod h1:6NgQ7sQWAIFsPrJJl1lSNSu2TABh0ZZ/zm5fosATavE= 573 - gorm.io/gorm v1.25.9 h1:wct0gxZIELDk8+ZqF/MVnHLkA1rvYlBWUMv2EdsK1g8= 574 - gorm.io/gorm v1.25.9/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= 570 + gorm.io/driver/postgres v1.6.0 h1:2dxzU8xJ+ivvqTRph34QX+WrRaJlmfyPqXmoGVjMBa4= 571 + gorm.io/driver/postgres v1.6.0/go.mod h1:vUw0mrGgrTK+uPHEhAdV4sfFELrByKVGnaVRkXDhtWo= 572 + gorm.io/driver/sqlite v1.6.0 h1:WHRRrIiulaPiPFmDcod6prc4l2VGVWHz80KspNsxSfQ= 573 + gorm.io/driver/sqlite v1.6.0/go.mod h1:AO9V1qIQddBESngQUKWL9yoH93HIeA1X6V633rBwyT8= 574 + gorm.io/gorm v1.31.1 h1:7CA8FTFz/gRfgqgpeKIBcervUn3xSyPUmr6B2WXJ7kg= 575 + gorm.io/gorm v1.31.1/go.mod h1:XyQVbO2k6YkOis7C2437jSit3SsDK72s7n7rsSHd+Gs= 575 576 honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= 576 - lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= 577 - lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= 577 + lukechampine.com/blake3 v1.4.1 h1:I3Smz7gso8w4/TunLKec6K2fn+kyKtDxr/xcQEN84Wg= 578 + lukechampine.com/blake3 v1.4.1/go.mod h1:QFosUxmjB8mnrWFSNwKmvxHpfY72bmD2tQ0kBMM3kwo=
+43
lexicons/io/atcr/hold/abortUpload.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "io.atcr.hold.abortUpload", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Cancel a multipart upload and cleanup any temporary data.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["uploadId"], 13 + "properties": { 14 + "uploadId": { 15 + "type": "string", 16 + "maxLength": 256, 17 + "description": "Upload session ID from initiateUpload" 18 + } 19 + } 20 + } 21 + }, 22 + "output": { 23 + "encoding": "application/json", 24 + "schema": { 25 + "type": "object", 26 + "required": ["status"], 27 + "properties": { 28 + "status": { 29 + "type": "string", 30 + "maxLength": 16, 31 + "const": "aborted", 32 + "description": "Always 'aborted' on success" 33 + } 34 + } 35 + } 36 + }, 37 + "errors": [ 38 + { "name": "InvalidUploadId" }, 39 + { "name": "AbortFailed" } 40 + ] 41 + } 42 + } 43 + }
+80
lexicons/io/atcr/hold/completeUpload.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "io.atcr.hold.completeUpload", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Finalize a multipart upload and move the assembled blob to its final location.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["uploadId", "digest", "parts"], 13 + "properties": { 14 + "uploadId": { 15 + "type": "string", 16 + "maxLength": 256, 17 + "description": "Upload session ID from initiateUpload" 18 + }, 19 + "digest": { 20 + "type": "string", 21 + "maxLength": 128, 22 + "description": "Final blob digest (e.g., sha256:abc123...)" 23 + }, 24 + "parts": { 25 + "type": "array", 26 + "description": "List of uploaded parts with their ETags", 27 + "items": { 28 + "type": "ref", 29 + "ref": "#partInfo" 30 + } 31 + } 32 + } 33 + } 34 + }, 35 + "output": { 36 + "encoding": "application/json", 37 + "schema": { 38 + "type": "object", 39 + "required": ["status", "digest"], 40 + "properties": { 41 + "status": { 42 + "type": "string", 43 + "maxLength": 16, 44 + "const": "completed", 45 + "description": "Always 'completed' on success" 46 + }, 47 + "digest": { 48 + "type": "string", 49 + "maxLength": 128, 50 + "description": "The digest of the completed blob" 51 + } 52 + } 53 + } 54 + }, 55 + "errors": [ 56 + { "name": "InvalidUploadId" }, 57 + { "name": "InvalidDigest" }, 58 + { "name": "MissingParts" }, 59 + { "name": "CompletionFailed" } 60 + ] 61 + }, 62 + "partInfo": { 63 + "type": "object", 64 + "description": "Information about a completed upload part", 65 + "required": ["partNumber", "etag"], 66 + "properties": { 67 + "partNumber": { 68 + "type": "integer", 69 + "minimum": 1, 70 + "description": "Part sequence number (1-indexed)" 71 + }, 72 + "etag": { 73 + "type": "string", 74 + "maxLength": 256, 75 + "description": "ETag returned when the part was uploaded" 76 + } 77 + } 78 + } 79 + } 80 + }
+46
lexicons/io/atcr/hold/deleteUserData.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "io.atcr.hold.deleteUserData", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Delete all user data from this hold (GDPR compliance). Deletes crew record (if not captain), layer records, and stats records. Does NOT delete actual blob data from S3 - only PDS records.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "properties": {} 13 + } 14 + }, 15 + "output": { 16 + "encoding": "application/json", 17 + "schema": { 18 + "type": "object", 19 + "required": ["success", "crewDeleted", "layersDeleted", "statsDeleted"], 20 + "properties": { 21 + "success": { 22 + "type": "boolean", 23 + "description": "Whether the deletion completed successfully" 24 + }, 25 + "crewDeleted": { 26 + "type": "boolean", 27 + "description": "Whether the user's crew record was deleted (false if user is captain)" 28 + }, 29 + "layersDeleted": { 30 + "type": "integer", 31 + "description": "Number of layer records deleted" 32 + }, 33 + "statsDeleted": { 34 + "type": "integer", 35 + "description": "Number of stats records deleted" 36 + } 37 + } 38 + } 39 + }, 40 + "errors": [ 41 + { "name": "AuthRequired" }, 42 + { "name": "DeletionFailed" } 43 + ] 44 + } 45 + } 46 + }
+167
lexicons/io/atcr/hold/exportUserData.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "io.atcr.hold.exportUserData", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Export all user data from this hold (GDPR compliance). Returns all records stored on this hold's PDS that reference the authenticated user's DID.", 8 + "parameters": { 9 + "type": "params", 10 + "properties": {} 11 + }, 12 + "output": { 13 + "encoding": "application/json", 14 + "schema": { 15 + "type": "object", 16 + "required": ["exportedAt", "holdDid", "userDid", "isCaptain", "layerRecords", "statsRecords", "blueskyPosts"], 17 + "properties": { 18 + "exportedAt": { 19 + "type": "string", 20 + "format": "datetime", 21 + "description": "RFC3339 timestamp of when the export was generated" 22 + }, 23 + "holdDid": { 24 + "type": "string", 25 + "format": "did", 26 + "description": "DID of this hold service" 27 + }, 28 + "userDid": { 29 + "type": "string", 30 + "format": "did", 31 + "description": "DID of the user whose data was exported" 32 + }, 33 + "isCaptain": { 34 + "type": "boolean", 35 + "description": "Whether the user is the captain (owner) of this hold" 36 + }, 37 + "crewRecord": { 38 + "type": "ref", 39 + "ref": "#crewExport", 40 + "description": "User's crew record (if they are a crew member)" 41 + }, 42 + "layerRecords": { 43 + "type": "array", 44 + "description": "Layer records uploaded by the user", 45 + "items": { 46 + "type": "ref", 47 + "ref": "#layerExport" 48 + } 49 + }, 50 + "statsRecords": { 51 + "type": "array", 52 + "description": "Repository stats records owned by the user", 53 + "items": { 54 + "type": "ref", 55 + "ref": "#statsExport" 56 + } 57 + }, 58 + "blueskyPosts": { 59 + "type": "array", 60 + "description": "Bluesky posts that mention the user", 61 + "items": { 62 + "type": "ref", 63 + "ref": "#postExport" 64 + } 65 + } 66 + } 67 + } 68 + }, 69 + "errors": [ 70 + { "name": "AuthRequired" } 71 + ] 72 + }, 73 + "crewExport": { 74 + "type": "object", 75 + "properties": { 76 + "role": { 77 + "type": "string", 78 + "maxLength": 32 79 + }, 80 + "permissions": { 81 + "type": "array", 82 + "items": { 83 + "type": "string", 84 + "maxLength": 64 85 + } 86 + }, 87 + "tier": { 88 + "type": "string", 89 + "maxLength": 32 90 + }, 91 + "addedAt": { 92 + "type": "string", 93 + "format": "datetime" 94 + } 95 + } 96 + }, 97 + "layerExport": { 98 + "type": "object", 99 + "properties": { 100 + "digest": { 101 + "type": "string", 102 + "maxLength": 128 103 + }, 104 + "size": { 105 + "type": "integer" 106 + }, 107 + "mediaType": { 108 + "type": "string", 109 + "maxLength": 256 110 + }, 111 + "manifest": { 112 + "type": "string", 113 + "format": "at-uri" 114 + }, 115 + "createdAt": { 116 + "type": "string", 117 + "format": "datetime" 118 + } 119 + } 120 + }, 121 + "statsExport": { 122 + "type": "object", 123 + "properties": { 124 + "repository": { 125 + "type": "string", 126 + "maxLength": 256 127 + }, 128 + "pullCount": { 129 + "type": "integer" 130 + }, 131 + "pushCount": { 132 + "type": "integer" 133 + }, 134 + "lastPull": { 135 + "type": "string", 136 + "format": "datetime" 137 + }, 138 + "lastPush": { 139 + "type": "string", 140 + "format": "datetime" 141 + }, 142 + "updatedAt": { 143 + "type": "string", 144 + "format": "datetime" 145 + } 146 + } 147 + }, 148 + "postExport": { 149 + "type": "object", 150 + "properties": { 151 + "uri": { 152 + "type": "string", 153 + "format": "at-uri" 154 + }, 155 + "text": { 156 + "type": "string", 157 + "maxGraphemes": 3000, 158 + "maxLength": 30000 159 + }, 160 + "createdAt": { 161 + "type": "string", 162 + "format": "datetime" 163 + } 164 + } 165 + } 166 + } 167 + }
+57
lexicons/io/atcr/hold/getPartUploadUrl.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "io.atcr.hold.getPartUploadUrl", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Get a presigned URL or endpoint info for uploading a specific part of a multipart upload.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["uploadId", "partNumber"], 13 + "properties": { 14 + "uploadId": { 15 + "type": "string", 16 + "maxLength": 256, 17 + "description": "Upload session ID from initiateUpload" 18 + }, 19 + "partNumber": { 20 + "type": "integer", 21 + "minimum": 1, 22 + "description": "Part sequence number (1-indexed)" 23 + } 24 + } 25 + } 26 + }, 27 + "output": { 28 + "encoding": "application/json", 29 + "schema": { 30 + "type": "object", 31 + "required": ["url"], 32 + "properties": { 33 + "url": { 34 + "type": "string", 35 + "format": "uri", 36 + "description": "URL to PUT the part data to" 37 + }, 38 + "method": { 39 + "type": "string", 40 + "maxLength": 16, 41 + "default": "PUT", 42 + "description": "HTTP method to use (usually PUT)" 43 + }, 44 + "headers": { 45 + "type": "unknown", 46 + "description": "Additional headers required for the request (e.g., content-type)" 47 + } 48 + } 49 + } 50 + }, 51 + "errors": [ 52 + { "name": "InvalidUploadId" }, 53 + { "name": "InvalidPartNumber" } 54 + ] 55 + } 56 + } 57 + }
+55
lexicons/io/atcr/hold/getQuota.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "io.atcr.hold.getQuota", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get storage quota information for a user. Calculates total unique blob storage by iterating layer records and deduplicating by digest.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["userDid"], 11 + "properties": { 12 + "userDid": { 13 + "type": "string", 14 + "format": "did", 15 + "description": "DID of the user to get quota for" 16 + } 17 + } 18 + }, 19 + "output": { 20 + "encoding": "application/json", 21 + "schema": { 22 + "type": "object", 23 + "required": ["userDid", "uniqueBlobs", "totalSize"], 24 + "properties": { 25 + "userDid": { 26 + "type": "string", 27 + "format": "did", 28 + "description": "DID of the user" 29 + }, 30 + "uniqueBlobs": { 31 + "type": "integer", 32 + "description": "Number of unique blob digests" 33 + }, 34 + "totalSize": { 35 + "type": "integer", 36 + "description": "Total size in bytes of unique blobs" 37 + }, 38 + "limit": { 39 + "type": "integer", 40 + "description": "Storage limit in bytes (absent if unlimited)" 41 + }, 42 + "tier": { 43 + "type": "string", 44 + "maxLength": 32, 45 + "description": "Quota tier name (e.g., 'deckhand', 'bosun', 'quartermaster')" 46 + } 47 + } 48 + } 49 + }, 50 + "errors": [ 51 + { "name": "InvalidUserDid" } 52 + ] 53 + } 54 + } 55 + }
+41
lexicons/io/atcr/hold/initiateUpload.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "io.atcr.hold.initiateUpload", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Start a new multipart upload session for an OCI blob. Returns an uploadId to be used with subsequent part upload and completion endpoints.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["digest"], 13 + "properties": { 14 + "digest": { 15 + "type": "string", 16 + "maxLength": 128, 17 + "description": "The blob digest (e.g., sha256:abc123...)" 18 + } 19 + } 20 + } 21 + }, 22 + "output": { 23 + "encoding": "application/json", 24 + "schema": { 25 + "type": "object", 26 + "required": ["uploadId"], 27 + "properties": { 28 + "uploadId": { 29 + "type": "string", 30 + "maxLength": 256, 31 + "description": "Unique identifier for this upload session" 32 + } 33 + } 34 + } 35 + }, 36 + "errors": [ 37 + { "name": "InvalidDigest" } 38 + ] 39 + } 40 + } 41 + }
+181
lexicons/io/atcr/hold/notifyManifest.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "io.atcr.hold.notifyManifest", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Notify hold about a manifest push or pull operation. For pushes: creates layer records and optionally posts to Bluesky. For pulls: just increments stats. Always increments pull/push counts.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["repository", "userDid", "manifestDigest", "manifest"], 13 + "properties": { 14 + "repository": { 15 + "type": "string", 16 + "maxLength": 256, 17 + "description": "Image repository name" 18 + }, 19 + "tag": { 20 + "type": "string", 21 + "maxLength": 128, 22 + "description": "Image tag (optional, required for Bluesky posts)" 23 + }, 24 + "userDid": { 25 + "type": "string", 26 + "format": "did", 27 + "description": "DID of the image owner" 28 + }, 29 + "manifestDigest": { 30 + "type": "string", 31 + "maxLength": 128, 32 + "description": "Manifest digest for building layer record AT-URIs" 33 + }, 34 + "operation": { 35 + "type": "string", 36 + "maxLength": 16, 37 + "knownValues": ["push", "pull"], 38 + "default": "push", 39 + "description": "Operation type (defaults to 'push' for backward compatibility)" 40 + }, 41 + "manifest": { 42 + "type": "ref", 43 + "ref": "#manifestInfo" 44 + } 45 + } 46 + } 47 + }, 48 + "output": { 49 + "encoding": "application/json", 50 + "schema": { 51 + "type": "object", 52 + "required": ["success", "operation", "statsUpdated"], 53 + "properties": { 54 + "success": { 55 + "type": "boolean", 56 + "description": "Whether the operation completed successfully" 57 + }, 58 + "operation": { 59 + "type": "string", 60 + "maxLength": 16, 61 + "description": "The operation that was performed ('push' or 'pull')" 62 + }, 63 + "statsUpdated": { 64 + "type": "boolean", 65 + "description": "Whether stats were successfully updated" 66 + }, 67 + "layersCreated": { 68 + "type": "integer", 69 + "description": "Number of layer records created (push only)" 70 + }, 71 + "postCreated": { 72 + "type": "boolean", 73 + "description": "Whether a Bluesky post was created (push only)" 74 + }, 75 + "postUri": { 76 + "type": "string", 77 + "format": "at-uri", 78 + "description": "AT-URI of the created Bluesky post (if postCreated is true)" 79 + } 80 + } 81 + } 82 + }, 83 + "errors": [ 84 + { "name": "InvalidOperation" }, 85 + { "name": "UserMismatch" }, 86 + { "name": "QuotaExceeded" } 87 + ] 88 + }, 89 + "manifestInfo": { 90 + "type": "object", 91 + "description": "OCI manifest information", 92 + "properties": { 93 + "mediaType": { 94 + "type": "string", 95 + "maxLength": 256, 96 + "description": "OCI media type" 97 + }, 98 + "config": { 99 + "type": "ref", 100 + "ref": "#blobInfo" 101 + }, 102 + "layers": { 103 + "type": "array", 104 + "items": { 105 + "type": "ref", 106 + "ref": "#layerInfo" 107 + } 108 + }, 109 + "manifests": { 110 + "type": "array", 111 + "description": "Child manifests for multi-arch images", 112 + "items": { 113 + "type": "ref", 114 + "ref": "#childManifestInfo" 115 + } 116 + } 117 + } 118 + }, 119 + "blobInfo": { 120 + "type": "object", 121 + "properties": { 122 + "digest": { 123 + "type": "string", 124 + "maxLength": 128 125 + }, 126 + "size": { 127 + "type": "integer" 128 + } 129 + } 130 + }, 131 + "layerInfo": { 132 + "type": "object", 133 + "properties": { 134 + "digest": { 135 + "type": "string", 136 + "maxLength": 128 137 + }, 138 + "size": { 139 + "type": "integer" 140 + }, 141 + "mediaType": { 142 + "type": "string", 143 + "maxLength": 256 144 + } 145 + } 146 + }, 147 + "childManifestInfo": { 148 + "type": "object", 149 + "properties": { 150 + "digest": { 151 + "type": "string", 152 + "maxLength": 128 153 + }, 154 + "size": { 155 + "type": "integer" 156 + }, 157 + "mediaType": { 158 + "type": "string", 159 + "maxLength": 256 160 + }, 161 + "platform": { 162 + "type": "ref", 163 + "ref": "#platformInfo" 164 + } 165 + } 166 + }, 167 + "platformInfo": { 168 + "type": "object", 169 + "properties": { 170 + "os": { 171 + "type": "string", 172 + "maxLength": 64 173 + }, 174 + "architecture": { 175 + "type": "string", 176 + "maxLength": 64 177 + } 178 + } 179 + } 180 + } 181 + }
+66
lexicons/io/atcr/hold/requestCrew.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "io.atcr.hold.requestCrew", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Request crew membership for the hold. Authorization depends on the captain record: if allowAllCrew is true, any authenticated user can join; otherwise, only the owner can join.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "properties": { 13 + "role": { 14 + "type": "string", 15 + "default": "member", 16 + "maxLength": 32, 17 + "description": "Requested role (default: 'member')" 18 + }, 19 + "permissions": { 20 + "type": "array", 21 + "description": "Requested permissions (default: ['blob:read', 'blob:write'])", 22 + "items": { 23 + "type": "string", 24 + "maxLength": 64 25 + } 26 + } 27 + } 28 + } 29 + }, 30 + "output": { 31 + "encoding": "application/json", 32 + "schema": { 33 + "type": "object", 34 + "required": ["status"], 35 + "properties": { 36 + "uri": { 37 + "type": "string", 38 + "format": "at-uri", 39 + "description": "AT-URI of the crew record (if created or already exists)" 40 + }, 41 + "cid": { 42 + "type": "string", 43 + "format": "cid", 44 + "description": "CID of the crew record" 45 + }, 46 + "status": { 47 + "type": "string", 48 + "maxLength": 32, 49 + "knownValues": ["created", "already_member"], 50 + "description": "Result status" 51 + }, 52 + "message": { 53 + "type": "string", 54 + "maxLength": 256, 55 + "description": "Human-readable status message" 56 + } 57 + } 58 + } 59 + }, 60 + "errors": [ 61 + { "name": "AuthRequired" }, 62 + { "name": "RegistrationDisabled" } 63 + ] 64 + } 65 + } 66 + }
+66
lexicons/io/atcr/hold/setStats.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "io.atcr.hold.setStats", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Set absolute stats values for a repository. Used for migration/admin purposes to set specific pull/push counts.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["ownerDid", "repository"], 13 + "properties": { 14 + "ownerDid": { 15 + "type": "string", 16 + "format": "did", 17 + "description": "DID of the repository owner" 18 + }, 19 + "repository": { 20 + "type": "string", 21 + "maxLength": 256, 22 + "description": "Repository name" 23 + }, 24 + "pullCount": { 25 + "type": "integer", 26 + "minimum": 0, 27 + "description": "Absolute pull count to set" 28 + }, 29 + "pushCount": { 30 + "type": "integer", 31 + "minimum": 0, 32 + "description": "Absolute push count to set" 33 + }, 34 + "lastPull": { 35 + "type": "string", 36 + "format": "datetime", 37 + "description": "RFC3339 timestamp of last pull" 38 + }, 39 + "lastPush": { 40 + "type": "string", 41 + "format": "datetime", 42 + "description": "RFC3339 timestamp of last push" 43 + } 44 + } 45 + } 46 + }, 47 + "output": { 48 + "encoding": "application/json", 49 + "schema": { 50 + "type": "object", 51 + "required": ["success"], 52 + "properties": { 53 + "success": { 54 + "type": "boolean", 55 + "description": "Whether the stats were successfully updated" 56 + } 57 + } 58 + } 59 + }, 60 + "errors": [ 61 + { "name": "InvalidOwner" }, 62 + { "name": "InvalidRepository" } 63 + ] 64 + } 65 + } 66 + }
+33
lexicons/io/atcr/hold/uploadPart.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "io.atcr.hold.uploadPart", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Direct buffered part upload. Alternative to using presigned URLs from getPartUploadUrl. Requires X-Upload-Id and X-Part-Number headers.", 8 + "input": { 9 + "encoding": "*/*", 10 + "description": "Raw binary part data" 11 + }, 12 + "output": { 13 + "encoding": "application/json", 14 + "schema": { 15 + "type": "object", 16 + "required": ["etag"], 17 + "properties": { 18 + "etag": { 19 + "type": "string", 20 + "maxLength": 256, 21 + "description": "ETag of the uploaded part, required for completeUpload" 22 + } 23 + } 24 + } 25 + }, 26 + "errors": [ 27 + { "name": "InvalidUploadId" }, 28 + { "name": "InvalidPartNumber" }, 29 + { "name": "UploadFailed" } 30 + ] 31 + } 32 + } 33 + }
+17 -38
pkg/appview/jetstream/backfill.go
··· 120 120 for _, repo := range result.Repos { 121 121 recordCount, err := b.backfillRepo(ctx, repo.DID, collection) 122 122 if err != nil { 123 - // RepoNotFound means account was deleted/deactivated 124 - // Clean up our cached data since the source is gone 125 - if strings.Contains(err.Error(), "RepoNotFound") { 123 + // Account may be deleted/deactivated/migrated - clean up our cached data 124 + errStr := err.Error() 125 + if strings.Contains(errStr, "RepoNotFound") || 126 + strings.Contains(errStr, "Could not find repo") || 127 + strings.Contains(errStr, "status 400") || 128 + strings.Contains(errStr, "status 404") { 126 129 if delErr := db.DeleteUserData(b.db, repo.DID); delErr != nil { 127 130 slog.Warn("Backfill failed to delete data for removed repo", "did", repo.DID, "error", delErr) 128 131 } else { ··· 156 159 157 160 // backfillRepo backfills all records for a single repo/DID 158 161 func (b *BackfillWorker) backfillRepo(ctx context.Context, did, collection string) (int, error) { 159 - // Ensure user exists in database and get their PDS endpoint 160 - if err := b.processor.EnsureUser(ctx, did); err != nil { 161 - return 0, fmt.Errorf("failed to ensure user: %w", err) 162 - } 163 - 164 162 // Resolve DID to get user's PDS endpoint 165 163 pdsEndpoint, err := atproto.ResolveDIDToPDS(ctx, did) 166 164 if err != nil { ··· 304 302 return nil 305 303 } 306 304 307 - // processRecord processes a single record and stores it in the database 305 + // processRecord processes a single record using the unified ProcessRecord method. 306 + // This ensures consistent handling (validation, user creation) between Worker and Backfill. 308 307 func (b *BackfillWorker) processRecord(ctx context.Context, did, collection string, record *atproto.Record) error { 309 - switch collection { 310 - case atproto.ManifestCollection: 311 - _, err := b.processor.ProcessManifest(context.Background(), did, record.Value) 312 - return err 313 - case atproto.TagCollection: 314 - return b.processor.ProcessTag(context.Background(), did, record.Value) 315 - case atproto.StarCollection: 316 - return b.processor.ProcessStar(context.Background(), did, record.Value) 317 - case atproto.SailorProfileCollection: 318 - return b.processor.ProcessSailorProfile(ctx, did, record.Value, b.queryCaptainRecordWrapper) 319 - case atproto.RepoPageCollection: 320 - // rkey is extracted from the record URI, but for repo pages we use Repository field 321 - return b.processor.ProcessRepoPage(ctx, did, record.URI, record.Value, false) 322 - case atproto.StatsCollection: 323 - // Stats are stored in hold PDSes, not user PDSes 324 - // 'did' here is the hold's DID (e.g., did:web:hold01.atcr.io) 325 - return b.processor.ProcessStats(ctx, did, record.Value, false) 326 - case atproto.CaptainCollection: 327 - // Captain records are stored in hold PDSes 328 - // 'did' here is the hold's DID (e.g., did:web:hold01.atcr.io) 329 - return b.processor.ProcessCaptain(ctx, did, record.Value) 330 - case atproto.CrewCollection: 331 - // Crew records are stored in hold PDSes 332 - // 'did' here is the hold's DID, rkey is derived from member DID 333 - // Extract rkey from record URI (at://did/collection/rkey) 334 - rkey := extractRkeyFromURI(record.URI) 335 - return b.processor.ProcessCrew(ctx, did, rkey, record.Value) 336 - default: 337 - return fmt.Errorf("unsupported collection: %s", collection) 308 + rkey := extractRkeyFromURI(record.URI) 309 + 310 + // For sailor profile collection, we need to pass the queryCaptainFn 311 + // Other collections pass nil 312 + var queryCaptainFn func(context.Context, string) error 313 + if collection == atproto.SailorProfileCollection { 314 + queryCaptainFn = b.queryCaptainRecordWrapper 338 315 } 316 + 317 + return b.processor.ProcessRecord(ctx, did, collection, rkey, record.Value, false, queryCaptainFn) 339 318 } 340 319 341 320 // queryCaptainRecordWrapper wraps queryCaptainRecord with backfill-specific logic
+138
pkg/appview/jetstream/processor.go
··· 11 11 12 12 "atcr.io/pkg/appview/db" 13 13 "atcr.io/pkg/atproto" 14 + "github.com/bluesky-social/indigo/atproto/identity" 15 + "github.com/bluesky-social/indigo/atproto/lexicon" 14 16 ) 15 17 16 18 // Processor handles shared database operations for both Worker (live) and Backfill (sync) ··· 20 22 userCache *UserCache // Optional - enabled for Worker, disabled for Backfill 21 23 statsCache *StatsCache // In-memory cache for per-hold stats aggregation 22 24 useCache bool 25 + catalog *lexicon.ResolvingCatalog // For debug logging of validation failures 23 26 } 24 27 25 28 // NewProcessor creates a new shared processor 26 29 // useCache: true for Worker (live streaming), false for Backfill (batch processing) 27 30 // statsCache: shared stats cache for aggregating across holds (nil to skip stats processing) 28 31 func NewProcessor(database *sql.DB, useCache bool, statsCache *StatsCache) *Processor { 32 + // Create lexicon catalog for debug validation logging 33 + dir := identity.DefaultDirectory() 34 + catalog := lexicon.NewResolvingCatalog() 35 + catalog.Directory = dir 36 + 29 37 p := &Processor{ 30 38 db: database, 31 39 useCache: useCache, 32 40 statsCache: statsCache, 41 + catalog: &catalog, 33 42 } 34 43 35 44 if useCache { ··· 97 106 return db.UpsertUser(p.db, user) 98 107 } 99 108 return db.UpsertUserIgnoreAvatar(p.db, user) 109 + } 110 + 111 + // ValidateRecord performs validation on records. 112 + // - Full lexicon validation is logged for debugging but does NOT block ingestion 113 + // - Targeted validation (captain/crew DID checks) DOES block bogus records 114 + func (p *Processor) ValidateRecord(ctx context.Context, collection string, data []byte) error { 115 + var recordData map[string]any 116 + if err := json.Unmarshal(data, &recordData); err != nil { 117 + return fmt.Errorf("invalid JSON: %w", err) 118 + } 119 + 120 + // Debug: Full lexicon validation (log only, don't block) 121 + if p.catalog != nil { 122 + if err := lexicon.ValidateRecord(p.catalog, recordData, collection, 0); err != nil { 123 + slog.Debug("Record failed full lexicon validation (ingesting anyway)", 124 + "component", "processor", 125 + "collection", collection, 126 + "error", err) 127 + } 128 + } 129 + 130 + // Targeted validation for collections that had bogus data issues 131 + // These DO block ingestion 132 + switch collection { 133 + case atproto.CaptainCollection: 134 + // Captain must have non-empty owner DID 135 + owner, _ := recordData["owner"].(string) 136 + if owner == "" || !strings.HasPrefix(owner, "did:") { 137 + return fmt.Errorf("captain record missing or invalid owner DID") 138 + } 139 + 140 + case atproto.CrewCollection: 141 + // Crew must have non-empty member DID 142 + member, _ := recordData["member"].(string) 143 + if member == "" || !strings.HasPrefix(member, "did:") { 144 + return fmt.Errorf("crew record missing or invalid member DID") 145 + } 146 + } 147 + 148 + return nil 149 + } 150 + 151 + // ProcessRecord is the unified entry point for processing any ATCR record. 152 + // It handles: 153 + // 1. Schema validation against published lexicons 154 + // 2. User creation for user-activity collections 155 + // 3. Dispatch to the appropriate Process* method 156 + // 157 + // queryCaptainFn is optional - used by backfill for sailor profile processing 158 + func (p *Processor) ProcessRecord(ctx context.Context, did, collection, rkey string, data []byte, isDelete bool, queryCaptainFn func(context.Context, string) error) error { 159 + // Skip validation for deletes (no record data) 160 + if !isDelete && data != nil { 161 + if err := p.ValidateRecord(ctx, collection, data); err != nil { 162 + slog.Warn("Record failed schema validation, skipping", 163 + "component", "processor", 164 + "collection", collection, 165 + "did", did, 166 + "error", err) 167 + return nil // Skip invalid records silently 168 + } 169 + } 170 + 171 + // User-activity collections create/update user entries 172 + // Skip for deletes - user should already exist, and we don't need to resolve identity 173 + if !isDelete { 174 + switch collection { 175 + case atproto.ManifestCollection, 176 + atproto.TagCollection, 177 + atproto.StarCollection, 178 + atproto.RepoPageCollection, 179 + atproto.SailorProfileCollection: 180 + if err := p.EnsureUser(ctx, did); err != nil { 181 + return fmt.Errorf("failed to ensure user: %w", err) 182 + } 183 + // Hold collections (captain, crew, stats) - don't create user entries 184 + // These are records FROM holds, not user activity 185 + } 186 + } 187 + 188 + // Dispatch to specific handler 189 + switch collection { 190 + case atproto.ManifestCollection: 191 + if isDelete { 192 + return db.DeleteManifest(p.db, did, "", rkey) 193 + } 194 + _, err := p.ProcessManifest(ctx, did, data) 195 + return err 196 + 197 + case atproto.TagCollection: 198 + if isDelete { 199 + repo, tag := atproto.RKeyToRepositoryTag(rkey) 200 + return db.DeleteTag(p.db, did, repo, tag) 201 + } 202 + return p.ProcessTag(ctx, did, data) 203 + 204 + case atproto.StarCollection: 205 + if isDelete { 206 + ownerDID, repository, err := atproto.ParseStarRecordKey(rkey) 207 + if err != nil { 208 + return err 209 + } 210 + return db.DeleteStar(p.db, did, ownerDID, repository) 211 + } 212 + return p.ProcessStar(ctx, did, data) 213 + 214 + case atproto.RepoPageCollection: 215 + return p.ProcessRepoPage(ctx, did, rkey, data, isDelete) 216 + 217 + case atproto.SailorProfileCollection: 218 + return p.ProcessSailorProfile(ctx, did, data, queryCaptainFn) 219 + 220 + case atproto.StatsCollection: 221 + return p.ProcessStats(ctx, did, data, isDelete) 222 + 223 + case atproto.CaptainCollection: 224 + if isDelete { 225 + return db.DeleteCaptainRecord(p.db, did) 226 + } 227 + return p.ProcessCaptain(ctx, did, data) 228 + 229 + case atproto.CrewCollection: 230 + if isDelete { 231 + return db.DeleteCrewMemberByRkey(p.db, did, rkey) 232 + } 233 + return p.ProcessCrew(ctx, did, rkey, data) 234 + 235 + default: 236 + return nil // Unknown collection, ignore 237 + } 100 238 } 101 239 102 240 // ProcessManifest processes a manifest record and stores it in the database
+174
pkg/appview/jetstream/processor_test.go
··· 618 618 } 619 619 } 620 620 621 + func TestProcessRecord_RoutesCorrectly(t *testing.T) { 622 + db := setupTestDB(t) 623 + defer db.Close() 624 + 625 + // Add missing tables for this test 626 + _, err := db.Exec(` 627 + CREATE TABLE repo_pages ( 628 + did TEXT NOT NULL, 629 + repository TEXT NOT NULL, 630 + description TEXT, 631 + avatar_cid TEXT, 632 + created_at TIMESTAMP NOT NULL, 633 + updated_at TIMESTAMP NOT NULL, 634 + PRIMARY KEY(did, repository) 635 + ); 636 + CREATE TABLE hold_captain_records ( 637 + hold_did TEXT PRIMARY KEY, 638 + owner_did TEXT NOT NULL, 639 + public BOOLEAN NOT NULL, 640 + allow_all_crew BOOLEAN NOT NULL, 641 + deployed_at TEXT, 642 + region TEXT, 643 + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP 644 + ); 645 + CREATE TABLE hold_crew_members ( 646 + hold_did TEXT NOT NULL, 647 + member_did TEXT NOT NULL, 648 + rkey TEXT NOT NULL, 649 + role TEXT, 650 + permissions TEXT, 651 + tier TEXT, 652 + added_at TEXT, 653 + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 654 + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 655 + PRIMARY KEY (hold_did, member_did) 656 + ); 657 + `) 658 + if err != nil { 659 + t.Fatalf("Failed to add tables: %v", err) 660 + } 661 + 662 + processor := NewProcessor(db, false, nil) 663 + ctx := context.Background() 664 + 665 + // Test 1: ProcessRecord routes manifest correctly 666 + // Note: Schema validation may fail for io.atcr.manifest since we can't resolve the schema, 667 + // but this tests the routing logic 668 + manifestRecord := map[string]any{ 669 + "$type": "io.atcr.manifest", 670 + "repository": "test-app", 671 + "digest": "sha256:route123", 672 + "mediaType": "application/vnd.oci.image.manifest.v1+json", 673 + "schemaVersion": 2, 674 + "holdDid": "did:web:hold01.atcr.io", 675 + "createdAt": time.Now().Format(time.RFC3339), 676 + } 677 + recordBytes, _ := json.Marshal(manifestRecord) 678 + 679 + // Note: ProcessRecord will skip validation if lexicon can't be resolved (expected in tests) 680 + // and will skip EnsureUser since we don't have a real PDS to resolve 681 + // Just verify the record is processed without panic 682 + err = processor.ProcessRecord(ctx, "did:plc:test123", atproto.ManifestCollection, "route123", recordBytes, false, nil) 683 + // Error expected since we can't resolve identity - that's fine for this test 684 + if err != nil { 685 + t.Logf("Expected error (can't resolve identity): %v", err) 686 + } 687 + 688 + // Test 2: ProcessRecord handles captain record without creating user 689 + captainRecord := map[string]any{ 690 + "$type": "io.atcr.hold.captain", 691 + "owner": "did:plc:owner123", 692 + "public": true, 693 + "allowAllCrew": false, 694 + "enableBlueskyPosts": false, 695 + "deployedAt": time.Now().Format(time.RFC3339), 696 + } 697 + captainBytes, _ := json.Marshal(captainRecord) 698 + 699 + // This should NOT call EnsureUser (captain is a hold collection) 700 + err = processor.ProcessRecord(ctx, "did:web:hold.example.com", atproto.CaptainCollection, "self", captainBytes, false, nil) 701 + if err != nil { 702 + t.Logf("Error processing captain (validation may fail in test): %v", err) 703 + } 704 + 705 + // Verify no user was created for the hold DID 706 + var userCount int 707 + err = db.QueryRow(`SELECT COUNT(*) FROM users WHERE did = ?`, "did:web:hold.example.com").Scan(&userCount) 708 + if err != nil { 709 + t.Fatalf("Failed to query users: %v", err) 710 + } 711 + if userCount != 0 { 712 + t.Error("Captain record processing should NOT create a user entry for holds") 713 + } 714 + 715 + // Test 3: ProcessRecord handles delete operations 716 + err = processor.ProcessRecord(ctx, "did:plc:test123", atproto.ManifestCollection, "sha256:todelete", nil, true, nil) 717 + if err != nil { 718 + t.Errorf("Delete should not error: %v", err) 719 + } 720 + } 721 + 722 + func TestProcessRecord_SkipsInvalidRecords(t *testing.T) { 723 + db := setupTestDB(t) 724 + defer db.Close() 725 + 726 + processor := NewProcessor(db, false, nil) 727 + ctx := context.Background() 728 + 729 + // Test: Invalid JSON should be skipped silently (no error returned) 730 + invalidJSON := []byte(`{invalid json}`) 731 + err := processor.ProcessRecord(ctx, "did:plc:test123", atproto.ManifestCollection, "test", invalidJSON, false, nil) 732 + // Should return nil (skipped silently) not an error 733 + if err != nil { 734 + t.Errorf("Invalid record should be skipped silently, got error: %v", err) 735 + } 736 + } 737 + 738 + func TestValidateRecord(t *testing.T) { 739 + db := setupTestDB(t) 740 + defer db.Close() 741 + 742 + processor := NewProcessor(db, false, nil) 743 + ctx := context.Background() 744 + 745 + // Test 1: Manifest passes (no strict validation) 746 + manifestJSON := []byte(`{"$type": "io.atcr.manifest", "repository": "test"}`) 747 + err := processor.ValidateRecord(ctx, atproto.ManifestCollection, manifestJSON) 748 + if err != nil { 749 + t.Errorf("Manifest should pass validation: %v", err) 750 + } 751 + 752 + // Test 2: Invalid JSON returns error 753 + invalidJSON := []byte(`{invalid}`) 754 + err = processor.ValidateRecord(ctx, atproto.ManifestCollection, invalidJSON) 755 + if err == nil { 756 + t.Error("Invalid JSON should return error") 757 + } 758 + 759 + // Test 3: Captain with valid owner passes 760 + captainValid := []byte(`{"owner": "did:plc:owner123", "public": true}`) 761 + err = processor.ValidateRecord(ctx, atproto.CaptainCollection, captainValid) 762 + if err != nil { 763 + t.Errorf("Valid captain should pass: %v", err) 764 + } 765 + 766 + // Test 4: Captain with empty owner is rejected 767 + captainEmpty := []byte(`{"owner": "", "public": true}`) 768 + err = processor.ValidateRecord(ctx, atproto.CaptainCollection, captainEmpty) 769 + if err == nil { 770 + t.Error("Captain with empty owner should be rejected") 771 + } 772 + 773 + // Test 5: Captain with invalid owner (not a DID) is rejected 774 + captainInvalid := []byte(`{"owner": "notadid", "public": true}`) 775 + err = processor.ValidateRecord(ctx, atproto.CaptainCollection, captainInvalid) 776 + if err == nil { 777 + t.Error("Captain with invalid owner should be rejected") 778 + } 779 + 780 + // Test 6: Crew with valid member passes 781 + crewValid := []byte(`{"member": "did:plc:member123", "role": "write"}`) 782 + err = processor.ValidateRecord(ctx, atproto.CrewCollection, crewValid) 783 + if err != nil { 784 + t.Errorf("Valid crew should pass: %v", err) 785 + } 786 + 787 + // Test 7: Crew with empty member is rejected 788 + crewEmpty := []byte(`{"member": "", "role": "write"}`) 789 + err = processor.ValidateRecord(ctx, atproto.CrewCollection, crewEmpty) 790 + if err == nil { 791 + t.Error("Crew with empty member should be rejected") 792 + } 793 + } 794 + 621 795 func TestProcessAccount(t *testing.T) { 622 796 db := setupTestDB(t) 623 797 defer db.Close()
+39 -247
pkg/appview/jetstream/worker.go
··· 309 309 w.debugCollectionCount++ 310 310 } 311 311 312 - // Process based on collection 313 - switch commit.Collection { 314 - case atproto.ManifestCollection: 315 - slog.Info("Jetstream processing manifest event", "did", commit.DID, "operation", commit.Operation, "rkey", commit.RKey) 316 - return w.processManifest(commit) 317 - case atproto.TagCollection: 318 - slog.Info("Jetstream processing tag event", "did", commit.DID, "operation", commit.Operation, "rkey", commit.RKey) 319 - return w.processTag(commit) 320 - case atproto.StarCollection: 321 - slog.Info("Jetstream processing star event", "did", commit.DID, "operation", commit.Operation, "rkey", commit.RKey) 322 - return w.processStar(commit) 323 - case atproto.RepoPageCollection: 324 - slog.Info("Jetstream processing repo page event", "did", commit.DID, "operation", commit.Operation, "rkey", commit.RKey) 325 - return w.processRepoPage(commit) 326 - case atproto.StatsCollection: 327 - slog.Info("Jetstream processing stats event", "did", commit.DID, "operation", commit.Operation, "rkey", commit.RKey) 328 - return w.processStats(commit) 329 - case atproto.CaptainCollection: 330 - slog.Info("Jetstream processing captain event", "did", commit.DID, "operation", commit.Operation, "rkey", commit.RKey) 331 - return w.processCaptain(commit) 332 - case atproto.CrewCollection: 333 - slog.Info("Jetstream processing crew event", "did", commit.DID, "operation", commit.Operation, "rkey", commit.RKey) 334 - return w.processCrew(commit) 335 - default: 336 - // Ignore other collections 337 - return nil 312 + // Check if this is an ATCR collection we care about 313 + if !isATCRCollection(commit.Collection) { 314 + return nil // Ignore non-ATCR collections 338 315 } 339 316 317 + slog.Info("Jetstream processing event", 318 + "collection", commit.Collection, 319 + "did", commit.DID, 320 + "operation", commit.Operation, 321 + "rkey", commit.RKey) 322 + 323 + // Marshal record to bytes for unified processing 324 + var recordBytes []byte 325 + if commit.Record != nil { 326 + var err error 327 + recordBytes, err = json.Marshal(commit.Record) 328 + if err != nil { 329 + return fmt.Errorf("failed to marshal record: %w", err) 330 + } 331 + } 332 + 333 + isDelete := commit.Operation == "delete" 334 + return w.processor.ProcessRecord(context.Background(), commit.DID, commit.Collection, commit.RKey, recordBytes, isDelete, nil) 335 + 340 336 case "identity": 341 337 if event.Identity == nil { 342 338 return nil ··· 355 351 } 356 352 } 357 353 358 - // processManifest processes a manifest commit event 359 - func (w *Worker) processManifest(commit *CommitEvent) error { 360 - // Resolve and upsert user with handle/PDS endpoint 361 - if err := w.processor.EnsureUser(context.Background(), commit.DID); err != nil { 362 - return fmt.Errorf("failed to ensure user: %w", err) 363 - } 364 - 365 - if commit.Operation == "delete" { 366 - // Delete manifest - rkey is just the digest, repository is not encoded 367 - digest := commit.RKey 368 - if err := db.DeleteManifest(w.db, commit.DID, "", digest); err != nil { 369 - return err 370 - } 371 - // Clean up any orphaned tags pointing to this manifest 372 - return db.CleanupOrphanedTags(w.db, commit.DID) 373 - } 374 - 375 - // Parse manifest record 376 - if commit.Record == nil { 377 - return nil // No record data, can't process 378 - } 379 - 380 - // Marshal map to bytes for processing 381 - recordBytes, err := json.Marshal(commit.Record) 382 - if err != nil { 383 - return fmt.Errorf("failed to marshal record: %w", err) 384 - } 385 - 386 - // Use shared processor for DB operations 387 - _, err = w.processor.ProcessManifest(context.Background(), commit.DID, recordBytes) 388 - return err 389 - } 390 - 391 - // processTag processes a tag commit event 392 - func (w *Worker) processTag(commit *CommitEvent) error { 393 - // Resolve and upsert user with handle/PDS endpoint 394 - if err := w.processor.EnsureUser(context.Background(), commit.DID); err != nil { 395 - return fmt.Errorf("failed to ensure user: %w", err) 396 - } 397 - 398 - if commit.Operation == "delete" { 399 - // Delete tag - decode rkey back to repository and tag 400 - repo, tag := atproto.RKeyToRepositoryTag(commit.RKey) 401 - slog.Info("Jetstream deleting tag", "did", commit.DID, "repository", repo, "tag", tag, "rkey", commit.RKey) 402 - if err := db.DeleteTag(w.db, commit.DID, repo, tag); err != nil { 403 - slog.Error("Jetstream ERROR deleting tag", "error", err) 404 - return err 405 - } 406 - slog.Info("Jetstream successfully deleted tag", "did", commit.DID, "repository", repo, "tag", tag) 407 - return nil 408 - } 409 - 410 - // Parse tag record 411 - if commit.Record == nil { 412 - return nil 413 - } 414 - 415 - // Marshal map to bytes for processing 416 - recordBytes, err := json.Marshal(commit.Record) 417 - if err != nil { 418 - return fmt.Errorf("failed to marshal record: %w", err) 419 - } 420 - 421 - // Use shared processor for DB operations 422 - return w.processor.ProcessTag(context.Background(), commit.DID, recordBytes) 423 - } 424 - 425 - // processStar processes a star commit event 426 - func (w *Worker) processStar(commit *CommitEvent) error { 427 - // Resolve and upsert the user who starred (starrer) 428 - if err := w.processor.EnsureUser(context.Background(), commit.DID); err != nil { 429 - return fmt.Errorf("failed to ensure user: %w", err) 430 - } 431 - 432 - if commit.Operation == "delete" { 433 - // Unstar - parse the rkey to get the subject (owner DID and repository) 434 - // Delete events don't include the full record, but the rkey contains the info we need 435 - ownerDID, repository, err := atproto.ParseStarRecordKey(commit.RKey) 436 - if err != nil { 437 - return fmt.Errorf("failed to parse star rkey: %w", err) 438 - } 439 - 440 - // Delete the star record 441 - return db.DeleteStar(w.db, commit.DID, ownerDID, repository) 442 - } 443 - 444 - // Parse star record 445 - if commit.Record == nil { 446 - return nil 447 - } 448 - 449 - // Marshal map to bytes for processing 450 - recordBytes, err := json.Marshal(commit.Record) 451 - if err != nil { 452 - return fmt.Errorf("failed to marshal record: %w", err) 453 - } 454 - 455 - // Use shared processor for DB operations 456 - return w.processor.ProcessStar(context.Background(), commit.DID, recordBytes) 457 - } 458 - 459 - // processRepoPage processes a repo page commit event 460 - func (w *Worker) processRepoPage(commit *CommitEvent) error { 461 - // Resolve and upsert user with handle/PDS endpoint 462 - if err := w.processor.EnsureUser(context.Background(), commit.DID); err != nil { 463 - return fmt.Errorf("failed to ensure user: %w", err) 464 - } 465 - 466 - isDelete := commit.Operation == "delete" 467 - 468 - if isDelete { 469 - // Delete - rkey is the repository name 470 - slog.Info("Jetstream deleting repo page", "did", commit.DID, "repository", commit.RKey) 471 - if err := w.processor.ProcessRepoPage(context.Background(), commit.DID, commit.RKey, nil, true); err != nil { 472 - slog.Error("Jetstream ERROR deleting repo page", "error", err) 473 - return err 474 - } 475 - slog.Info("Jetstream successfully deleted repo page", "did", commit.DID, "repository", commit.RKey) 476 - return nil 477 - } 478 - 479 - // Parse repo page record 480 - if commit.Record == nil { 481 - return nil 482 - } 483 - 484 - // Marshal map to bytes for processing 485 - recordBytes, err := json.Marshal(commit.Record) 486 - if err != nil { 487 - return fmt.Errorf("failed to marshal record: %w", err) 488 - } 489 - 490 - // Use shared processor for DB operations 491 - return w.processor.ProcessRepoPage(context.Background(), commit.DID, commit.RKey, recordBytes, false) 492 - } 493 - 494 - // processStats processes a stats commit event from a hold PDS 495 - func (w *Worker) processStats(commit *CommitEvent) error { 496 - isDelete := commit.Operation == "delete" 497 - 498 - if isDelete { 499 - // For delete events, we need to parse the rkey to get ownerDID + repository 500 - // The rkey is deterministic: base32(sha256(ownerDID + "/" + repository)[:16]) 501 - // Unfortunately, we can't reverse this - we need the record data 502 - // Delete events don't include record data, so we can't delete from cache 503 - // This is acceptable - stats will be refreshed on next update from hold 504 - slog.Debug("Jetstream ignoring stats delete event (cannot reverse rkey)", "did", commit.DID, "rkey", commit.RKey) 505 - return nil 506 - } 507 - 508 - // Parse stats record 509 - if commit.Record == nil { 510 - return nil 511 - } 512 - 513 - // Marshal map to bytes for processing 514 - recordBytes, err := json.Marshal(commit.Record) 515 - if err != nil { 516 - return fmt.Errorf("failed to marshal record: %w", err) 517 - } 518 - 519 - // Use shared processor - commit.DID is the hold's DID 520 - return w.processor.ProcessStats(context.Background(), commit.DID, recordBytes, false) 521 - } 522 - 523 - // processCaptain processes a captain record event from a hold's PDS 524 - func (w *Worker) processCaptain(commit *CommitEvent) error { 525 - holdDID := commit.DID // The repo DID IS the hold DID 526 - 527 - if commit.Operation == "delete" { 528 - // Delete captain record - this cascades to crew members 529 - if err := db.DeleteCaptainRecord(w.db, holdDID); err != nil { 530 - return fmt.Errorf("failed to delete captain record: %w", err) 531 - } 532 - slog.Info("Deleted captain record for hold", "hold_did", holdDID) 533 - return nil 534 - } 535 - 536 - // Parse captain record 537 - if commit.Record == nil { 538 - return nil 539 - } 540 - 541 - // Marshal map to bytes for processing 542 - recordBytes, err := json.Marshal(commit.Record) 543 - if err != nil { 544 - return fmt.Errorf("failed to marshal captain record: %w", err) 545 - } 546 - 547 - // Use shared processor 548 - return w.processor.ProcessCaptain(context.Background(), holdDID, recordBytes) 549 - } 550 - 551 - // processCrew processes a crew record event from a hold's PDS 552 - func (w *Worker) processCrew(commit *CommitEvent) error { 553 - holdDID := commit.DID // The repo DID IS the hold DID 554 - 555 - if commit.Operation == "delete" { 556 - // Delete crew member by rkey 557 - if err := db.DeleteCrewMemberByRkey(w.db, holdDID, commit.RKey); err != nil { 558 - return fmt.Errorf("failed to delete crew member: %w", err) 559 - } 560 - slog.Info("Deleted crew member from hold", "hold_did", holdDID, "rkey", commit.RKey) 561 - return nil 562 - } 563 - 564 - // Parse crew record 565 - if commit.Record == nil { 566 - return nil 567 - } 568 - 569 - // Marshal map to bytes for processing 570 - recordBytes, err := json.Marshal(commit.Record) 571 - if err != nil { 572 - return fmt.Errorf("failed to marshal crew record: %w", err) 573 - } 574 - 575 - // Use shared processor - pass rkey for storage 576 - return w.processor.ProcessCrew(context.Background(), holdDID, commit.RKey, recordBytes) 577 - } 578 - 579 354 // processIdentity processes an identity event (handle change) 580 355 func (w *Worker) processIdentity(event *JetstreamEvent) error { 581 356 if event.Identity == nil { ··· 596 371 account := event.Account 597 372 // Process via shared processor (only ATCR users will be logged at Info level) 598 373 return w.processor.ProcessAccount(context.Background(), account.DID, account.Active, account.Status) 374 + } 375 + 376 + // isATCRCollection returns true if the collection is one we process 377 + func isATCRCollection(collection string) bool { 378 + switch collection { 379 + case atproto.ManifestCollection, 380 + atproto.TagCollection, 381 + atproto.StarCollection, 382 + atproto.RepoPageCollection, 383 + atproto.SailorProfileCollection, 384 + atproto.StatsCollection, 385 + atproto.CaptainCollection, 386 + atproto.CrewCollection: 387 + return true 388 + default: 389 + return false 390 + } 599 391 } 600 392 601 393 // JetstreamEvent represents a Jetstream event