From 5da2a9fd26b9b4ebda83f5b20cdbff2fb772487b Mon Sep 17 00:00:00 2001 From: Andrey Meshkov Date: Mon, 29 Sep 2025 10:32:55 +0300 Subject: [PATCH] Sync v2.16.0 --- .markdownlint.json | 1 + CHANGELOG.md | 10 + Makefile | 16 +- doc/configuration.md | 2 +- doc/development.md | 18 +- doc/environment.md | 42 + go.mod | 76 +- go.sum | 156 +- go.work | 2 +- go.work.sum | 121 +- internal/access/access_test.go | 26 +- internal/access/engine_internal_test.go | 26 +- internal/access/profile_test.go | 10 +- internal/access/standardaccess_test.go | 19 +- internal/agd/customdomain.go | 4 +- internal/agd/tls.go | 53 + internal/agd/tls_test.go | 51 + internal/agdtest/interface.go | 34 +- internal/backendpb/customdomain.go | 5 +- internal/backendpb/profile.go | 8 +- internal/cmd/additional.go | 2 +- internal/cmd/builder.go | 43 +- internal/cmd/cmd.go | 4 + internal/cmd/crash.go | 145 ++ internal/cmd/env.go | 70 +- internal/cmd/runtime.go | 23 + internal/dnsserver/example_test.go | 3 - internal/dnsserver/go.mod | 28 +- internal/dnsserver/go.sum | 38 +- internal/dnsserver/serverbase.go | 37 +- internal/dnsserver/serverdns.go | 54 +- internal/dnsserver/serverdnstcp.go | 88 +- internal/dnsserver/serverdnsudp.go | 52 +- internal/dnsserver/serverhttps.go | 20 +- internal/dnsserver/serverquic.go | 108 +- internal/dnsserver/servertls.go | 19 +- internal/dnsserver/task.go | 81 + internal/dnsserver/workerpool.go | 43 - internal/dnssvc/integration_test.go | 6 +- .../dnssvc/internal/mainmw/mainmw_test.go | 12 +- internal/dnssvc/internal/mainmw/record.go | 2 +- .../internal/mainmw/record_internal_test.go | 6 +- .../internal/ratelimitmw/access_test.go | 2 +- .../internal/ratelimitmw/requestinfo.go | 2 +- internal/ecscache/ecsblocklist.go | 2094 +++++++++-------- internal/ecscache/ecsblocklist_generate.go | 5 +- internal/ecscache/ecscache.go | 2 +- internal/ecscache/ecscache_test.go | 1 + internal/experiment/experiment.go | 2 +- internal/filter/custom/custom_test.go | 2 +- .../filter/filterstorage/standardaccess.go | 5 +- internal/filter/hashprefix/storage.go | 2 + internal/filter/hashprefix/storage_test.go | 24 +- .../composite/composite_internal_test.go | 3 +- internal/filter/internal/composite/result.go | 6 +- .../filter/internal/rulelist/dnsrewrite.go | 75 +- .../internal/rulelist/refreshable_test.go | 20 +- internal/filter/internal/rulelist/rulelist.go | 15 +- .../rulelist/rulelist_internal_test.go | 20 +- .../internal/safesearch/safesearch_test.go | 51 +- internal/geoip/asntops_generate.go | 10 +- internal/geoip/country_generate.go | 6 +- internal/geoip/file.go | 26 +- internal/geoip/file_test.go | 40 +- internal/geoip/geoip.go | 9 +- internal/metrics/metrics.go | 2 +- internal/metrics/metrics_test.go | 2 - internal/metrics/querylog.go | 13 +- internal/metrics/tlsconfig.go | 7 +- internal/profiledb/default.go | 2 +- .../internal/filecachepb/filecachepb.go | 7 +- internal/querylog/fs.go | 37 +- internal/querylog/fs_test.go | 19 +- internal/querylog/metrics.go | 16 +- .../{certstorage.go => certindex.go} | 24 +- ...nal_test.go => certindex_internal_test.go} | 22 +- internal/tlsconfig/customdomaindb.go | 22 +- internal/tlsconfig/customdomaindb_test.go | 22 +- internal/tlsconfig/customdomainindex.go | 12 +- internal/tlsconfig/customdomainstorage.go | 5 +- internal/tlsconfig/manager.go | 34 +- internal/websvc/server.go | 2 + scripts/make/go-bench.sh | 2 +- scripts/make/go-gen.sh | 79 +- scripts/make/go-lint.sh | 24 +- scripts/make/go-test.sh | 4 +- scripts/make/txt-lint.sh | 4 +- 87 files changed, 2603 insertions(+), 1744 deletions(-) create mode 100644 internal/agd/tls.go create mode 100644 internal/agd/tls_test.go create mode 100644 internal/cmd/crash.go create mode 100644 internal/cmd/runtime.go create mode 100644 internal/dnsserver/task.go delete mode 100644 internal/dnsserver/workerpool.go rename internal/tlsconfig/{certstorage.go => certindex.go} (76%) rename internal/tlsconfig/{certstorage_internal_test.go => certindex_internal_test.go} (73%) diff --git a/.markdownlint.json b/.markdownlint.json index 445ee06..8cebd0d 100644 --- a/.markdownlint.json +++ b/.markdownlint.json @@ -21,5 +21,6 @@ }, "line-length": false, "no-bare-urls": false, + "no-emphasis-as-heading": false, "link-fragments": false } diff --git a/CHANGELOG.md b/CHANGELOG.md index 74897e3..2a4575f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,16 @@ The format is **not** based on [Keep a Changelog][kec], since the project **does [kec]: https://keepachangelog.com/en/1.0.0/ [sem]: https://semver.org/spec/v2.0.0.html +## AGDNS-3241 / Build 1067 + +- The environment variables `QUERYLOG_SEMAPHORE_ENABLED` and `QUERYLOG_SEMAPHORE_LIMIT` have been added. + +- The environment variable `MAX_THREADS` has been added. + +## AGDNS-3228 / Build 1063 + +- The environment variables `CRASH_OUTPUT_DIR`, `CRASH_OUTPUT_ENABLED`, and `CRASH_OUTPUT_PREFIX` have been added. + ## AGDNS-2998 / Build 1042 - Profiles’ file cache version has been incremented. The new field `StandardEnabled` has been added to access’ object. diff --git a/Makefile b/Makefile index 0dd7888..d143b1d 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ BRANCH = $${BRANCH:-$$(git rev-parse --abbrev-ref HEAD)} GOAMD64 = v1 GOPROXY = https://proxy.golang.org|direct GOTELEMETRY = off -GOTOOLCHAIN = go1.24.6 +GOTOOLCHAIN = go1.25.1 RACE = 0 REVISION = $${REVISION:-$$(git rev-parse --short HEAD)} VERSION = 0 @@ -36,6 +36,7 @@ ENV = env \ GOPROXY='$(GOPROXY)' \ GOTELEMETRY='$(GOTELEMETRY)' \ GOTOOLCHAIN='$(GOTOOLCHAIN)' \ + ONLY="$(ONLY)" \ PATH="$${PWD}/bin:$$("$(GO.MACRO)" env GOPATH)/bin:$${PATH}" \ RACE='$(RACE)' \ REVISION="$(REVISION)" \ @@ -52,12 +53,16 @@ ENV_MISC = env \ # Keep this target first, so that a naked make invocation triggers a # full build. +.PHONY: build build: go-deps go-build +.PHONY: init init: ; git config core.hooksPath ./scripts/hooks +.PHONY: test test: go-test +.PHONY: go-bench go-build go-deps go-env go-fuzz go-gen go-lint go-test go-tools go-upd-tools go-bench: ; $(ENV) "$(SHELL)" ./scripts/make/go-bench.sh go-build: ; $(ENV) "$(SHELL)" ./scripts/make/go-build.sh go-deps: ; $(ENV) "$(SHELL)" ./scripts/make/go-deps.sh @@ -69,23 +74,28 @@ go-test: ; $(ENV) RACE='1' "$(SHELL)" ./scripts/make/go-test.sh go-tools: ; $(ENV) "$(SHELL)" ./scripts/make/go-tools.sh go-upd-tools: ; $(ENV) "$(SHELL)" ./scripts/make/go-upd-tools.sh +.PHONY: go-check go-check: go-tools go-lint go-test # A quick check to make sure that all operating systems relevant to the # development of the project can be typechecked and built successfully. +.PHONY: go-os-check go-os-check: - $(ENV) GOOS='darwin' "$(GO.MACRO)" vet ./internal/... ./internal/dnsserver/... - $(ENV) GOOS='linux' "$(GO.MACRO)" vet ./internal/... ./internal/dnsserver/... + $(ENV) GOOS='darwin' "$(GO.MACRO)" vet work + $(ENV) GOOS='linux' "$(GO.MACRO)" vet work # Additionally, check the AdGuard Home OSs in the dnsserver module. $(ENV) GOOS='freebsd' "$(GO.MACRO)" vet ./internal/dnsserver/... $(ENV) GOOS='openbsd' "$(GO.MACRO)" vet ./internal/dnsserver/... $(ENV) GOOS='windows' "$(GO.MACRO)" vet ./internal/dnsserver/... +.PHONY: txt-lint txt-lint: ; $(ENV) "$(SHELL)" ./scripts/make/txt-lint.sh +.PHONY: md-lint md-lint: ; $(ENV_MISC) "$(SHELL)" ./scripts/make/md-lint.sh sh-lint: ; $(ENV_MISC) "$(SHELL)" ./scripts/make/sh-lint.sh # Targets related to AdGuard DNS start here. +.PHONY: sync-github sync-github: ; $(ENV) "$(SHELL)" ./scripts/make/github-sync.sh diff --git a/doc/configuration.md b/doc/configuration.md index a21fc42..2b46c8a 100644 --- a/doc/configuration.md +++ b/doc/configuration.md @@ -640,7 +640,7 @@ The items of the `filtering_groups` array have the following properties: **Example:** `true`. -- `block_chrome_prefetch`: If true, Chrome prefetch domain queries are blocked for requests using this filtering group, forcing the preferch proxy into preflight mode. +- `block_chrome_prefetch`: If true, Chrome prefetch domain queries are blocked for requests using this filtering group, forcing the prefetch proxy into preflight mode. **Example:** `true`. diff --git a/doc/development.md b/doc/development.md index d0fb83e..db14a4b 100644 --- a/doc/development.md +++ b/doc/development.md @@ -11,7 +11,7 @@ Development is supported on Linux and macOS (aka Darwin) systems. -1. Install Go 1.24 or later. +1. Install Go 1.25 or later. 2. Call `make init` to set up the Git pre-commit hook. @@ -43,13 +43,27 @@ This is not an extensive list. See `../Makefile`. - `../internal/backendpb/dns.pb.go` - `../internal/backendpb/dns_grpc.pb.go` - - `../internal/ecscache/ecsblockilist_generate.go` + - `../internal/ecscache/ecsblocklist_generate.go` - `../internal/geoip/asntops_generate.go` - `../internal/geoip/country_generate.go` - `../internal/profiledb/internal/filecachepb/filecache.pb.go` You'll need to [install `protoc`][protoc] for the last one. + Use the `ONLY` environment variable to generate selected parts. This generates only the backend and file-cache protobuf files: + + ```sh + make ONLY='backendpb filecachepb' go-gen + ``` + + Available values: + + - `backendpb` + - `ecscache` + - `filecachepb` + - `geoip_asntops` + - `geoip_country` + - `make go-lint`: Run Go checkers and static analysis. - `make go-test`: Run Go tests. diff --git a/doc/environment.md b/doc/environment.md index c778541..51e67ae 100644 --- a/doc/environment.md +++ b/doc/environment.md @@ -16,6 +16,9 @@ AdGuard DNS uses [environment variables][wiki-env] to store some of the more sen - [`CONSUL_ALLOWLIST_URL`](#CONSUL_ALLOWLIST_URL) - [`CONSUL_DNSCHECK_KV_URL`](#CONSUL_DNSCHECK_KV_URL) - [`CONSUL_DNSCHECK_SESSION_URL`](#CONSUL_DNSCHECK_SESSION_URL) +- [`CRASH_OUTPUT_DIR`](#CRASH_OUTPUT_DIR) +- [`CRASH_OUTPUT_ENABLED`](#CRASH_OUTPUT_ENABLED) +- [`CRASH_OUTPUT_PREFIX`](#CRASH_OUTPUT_PREFIX) - [`CUSTOM_DOMAINS_API_KEY`](#CUSTOM_DOMAINS_API_KEY) - [`CUSTOM_DOMAINS_CACHE_PATH`](#CUSTOM_DOMAINS_CACHE_PATH) - [`CUSTOM_DOMAINS_ENABLED`](#CUSTOM_DOMAINS_ENABLED) @@ -36,6 +39,7 @@ AdGuard DNS uses [environment variables][wiki-env] to store some of the more sen - [`LISTEN_PORT`](#LISTEN_PORT) - [`LOG_FORMAT`](#LOG_FORMAT) - [`LOG_TIMESTAMP`](#LOG_TIMESTAMP) +- [`MAX_THREADS`](#MAX_THREADS) - [`METRICS_NAMESPACE`](#METRICS_NAMESPACE) - [`NEW_REG_DOMAINS_ENABLED`](#NEW_REG_DOMAINS_ENABLED) - [`NEW_REG_DOMAINS_URL`](#NEW_REG_DOMAINS_URL) @@ -54,6 +58,8 @@ AdGuard DNS uses [environment variables][wiki-env] to store some of the more sen - [`REDIS_PORT`](#REDIS_PORT) - [`REDIS_WAIT`](#REDIS_WAIT) - [`QUERYLOG_PATH`](#QUERYLOG_PATH) +- [`QUERYLOG_SEMAPHORE_ENABLED`](#QUERYLOG_SEMAPHORE_ENABLED) +- [`QUERYLOG_SEMAPHORE_LIMIT`](#QUERYLOG_SEMAPHORE_LIMIT) - [`RATELIMIT_ALLOWLIST_TYPE`](#RATELIMIT_ALLOWLIST_TYPE) - [`RULESTAT_URL`](#RULESTAT_URL) - [`SAFE_BROWSING_ENABLED`](#SAFE_BROWSING_ENABLED) @@ -166,6 +172,24 @@ The HTTP(S) URL of the session API of the Consul instance used as a key-value da **Default:** **Unset.** +## `CRASH_OUTPUT_DIR` + +The path to the directory used to create crash reports. The directory must exist. + +**Default:** No default value, the variable is required if `CRASH_OUTPUT_ENABLED` is set to `1`. + +## `CRASH_OUTPUT_ENABLED` + +When set to `1`, put a crash report to `CRASH_OUTPUT_DIR`. + +**Default:** `0`. + +## `CRASH_OUTPUT_PREFIX` + +The prefix to use for the crash report files. The variable is required if `CRASH_OUTPUT_ENABLED` is set to `1`. + +**Default:** `agdns`. + ## `CUSTOM_DOMAINS_API_KEY` The API key to use when authenticating queries to the backend custom-domain API, if any. The API key should be valid as defined by [RFC 6750]. @@ -311,6 +335,12 @@ If `1`, show timestamps in the plain text logs. If `0`, don't show the timestamp **Default:** `1`. +## `MAX_THREADS` + +If greater than zero, sets the maximum number of threads for the Go runtime. If zero, the number remains the default one, which is 10 000. It must not be negative. + +**Default:** `0`. + ## `METRICS_NAMESPACE` The namespace to be used for Prometheus metrics. It must be a valid Prometheus metric label. @@ -454,6 +484,18 @@ The path to the file into which the query log is going to be written. **Default:** `./querylog.jsonl`. +## `QUERYLOG_SEMAPHORE_ENABLED` + +If `1`, enabled the querylog semaphore used to limit the parallelism of writing to the querylog and thus reducing the amount of OS threads that are created. + +**Default:** `0`. + +## `QUERYLOG_SEMAPHORE_LIMIT` + +The amount of writes to the querylog that can run in parallel. + +**Default:** No default value, the variable is required if `QUERYLOG_SEMAPHORE_ENABLED` is set to `1`. + ## `RATELIMIT_ALLOWLIST_TYPE` Defines where the rate limit settings are received from. Allowed values are `backend` and `consul`. diff --git a/go.mod b/go.mod index 4e4af79..b7c02db 100644 --- a/go.mod +++ b/go.mod @@ -1,12 +1,12 @@ module github.com/AdguardTeam/AdGuardDNS -go 1.24.6 +go 1.25.1 require ( // NOTE: Do not change the pseudoversion. github.com/AdguardTeam/AdGuardDNS/internal/dnsserver v0.0.0-00010101000000-000000000000 - github.com/AdguardTeam/golibs v0.34.0 - github.com/AdguardTeam/urlfilter v0.21.0 + github.com/AdguardTeam/golibs v0.34.1 + github.com/AdguardTeam/urlfilter v0.22.0 github.com/ameshkov/dnscrypt/v2 v2.4.0 github.com/axiomhq/hyperloglog v0.2.5 github.com/bluele/gcache v0.0.2 @@ -19,23 +19,23 @@ require ( github.com/miekg/dns v1.1.68 github.com/oschwald/maxminddb-golang v1.13.1 github.com/patrickmn/go-cache v2.1.1-0.20191004192108-46f407853014+incompatible - github.com/prometheus/client_golang v1.23.0 + github.com/prometheus/client_golang v1.23.1 github.com/prometheus/client_model v0.6.2 - github.com/prometheus/common v0.65.0 + github.com/prometheus/common v0.66.0 github.com/quic-go/quic-go v0.54.0 github.com/stretchr/testify v1.11.1 github.com/viktordanov/golang-lru v0.5.6 - golang.org/x/crypto v0.41.0 - golang.org/x/net v0.43.0 - golang.org/x/sys v0.35.0 - golang.org/x/time v0.12.0 - google.golang.org/grpc v1.75.0 - google.golang.org/protobuf v1.36.8 + golang.org/x/crypto v0.42.0 + golang.org/x/net v0.44.0 + golang.org/x/sys v0.36.0 + golang.org/x/time v0.13.0 + google.golang.org/grpc v1.75.1 + google.golang.org/protobuf v1.36.9 gopkg.in/yaml.v2 v2.4.0 ) require ( - cloud.google.com/go v0.121.6 // indirect + cloud.google.com/go v0.122.0 // indirect cloud.google.com/go/ai v0.12.1 // indirect cloud.google.com/go/auth v0.16.5 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect @@ -61,8 +61,9 @@ require ( github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect github.com/googleapis/gax-go/v2 v2.15.0 // indirect - github.com/gookit/color v1.5.4 // indirect + github.com/gookit/color v1.6.0 // indirect github.com/gordonklaus/ineffassign v0.2.0 // indirect + github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect github.com/jstemmer/go-junit-report/v2 v2.1.0 // indirect github.com/kamstrup/intmap v0.5.1 // indirect github.com/kisielk/errcheck v1.9.0 // indirect @@ -77,35 +78,46 @@ require ( github.com/securego/gosec/v2 v2.22.8 // indirect github.com/uudashr/gocognit v1.2.0 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect - go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect - go.opentelemetry.io/otel v1.37.0 // indirect - go.opentelemetry.io/otel/metric v1.37.0 // indirect - go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 // indirect + go.opentelemetry.io/otel v1.38.0 // indirect + go.opentelemetry.io/otel/metric v1.38.0 // indirect + go.opentelemetry.io/otel/trace v1.38.0 // indirect go.uber.org/mock v0.6.0 // indirect - golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b // indirect - golang.org/x/exp/typeparams v0.0.0-20250819193227-8b4c13bb791b // indirect - golang.org/x/mod v0.27.0 // indirect - golang.org/x/oauth2 v0.30.0 // indirect - golang.org/x/sync v0.16.0 // indirect - golang.org/x/telemetry v0.0.0-20250822161441-f407b8c191ff // indirect - golang.org/x/term v0.34.0 // indirect - golang.org/x/text v0.28.0 // indirect - golang.org/x/tools v0.36.0 // indirect + golang.org/x/exp v0.0.0-20250911091902-df9299821621 // indirect + golang.org/x/exp/typeparams v0.0.0-20250911091902-df9299821621 // indirect + golang.org/x/mod v0.28.0 // indirect + golang.org/x/oauth2 v0.31.0 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/telemetry v0.0.0-20250908211612-aef8a434d053 // indirect + golang.org/x/term v0.35.0 // indirect + golang.org/x/text v0.29.0 // indirect + golang.org/x/tools v0.37.0 // indirect golang.org/x/vuln v1.1.4 // indirect - google.golang.org/api v0.248.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250826171959-ef028d996bc1 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250826171959-ef028d996bc1 // indirect + google.golang.org/api v0.249.0 // indirect + google.golang.org/genproto v0.0.0-20250908214217-97024824d090 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250908214217-97024824d090 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250908214217-97024824d090 // indirect google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect honnef.co/go/tools v0.6.1 // indirect mvdan.cc/editorconfig v0.3.0 // indirect - mvdan.cc/gofumpt v0.8.0 // indirect + mvdan.cc/gofumpt v0.9.1 // indirect mvdan.cc/sh/v3 v3.12.0 // indirect mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4 // indirect ) +// NOTE: Keep in sync with .gitignore. +ignore ( + ./bin/ + ./filters/ + ./github-mirror/ + ./test-reports/ + ./test/ + ./tmp/ +) + tool ( github.com/fzipp/gocyclo/cmd/gocyclo github.com/golangci/misspell/cmd/misspell diff --git a/go.sum b/go.sum index ad8f376..5536130 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -cloud.google.com/go v0.121.6 h1:waZiuajrI28iAf40cWgycWNgaXPO06dupuS+sgibK6c= -cloud.google.com/go v0.121.6/go.mod h1:coChdst4Ea5vUpiALcYKXEpR1S9ZgXbhEzzMcMR66vI= +cloud.google.com/go v0.122.0 h1:0JTLGrcSIs3HIGsgVPvTx3cfyFSP/k9CI8vLPHTd6Wc= +cloud.google.com/go v0.122.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= cloud.google.com/go/ai v0.12.1 h1:m1n/VjUuHS+pEO/2R4/VbuuEIkgk0w67fDQvFaMngM0= cloud.google.com/go/ai v0.12.1/go.mod h1:5vIPNe1ZQsVZqCliXIPL4QnhObQQY4d9hAGHdVc4iw4= cloud.google.com/go/auth v0.16.5 h1:mFWNQ2FEVWAliEQWpAdH80omXFokmrnbDhUS9cBywsI= @@ -10,10 +10,10 @@ cloud.google.com/go/compute/metadata v0.8.0 h1:HxMRIbao8w17ZX6wBnjhcDkW6lTFpgcao cloud.google.com/go/compute/metadata v0.8.0/go.mod h1:sYOGTp851OV9bOFJ9CH7elVvyzopvWQFNNghtDQ/Biw= cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE= cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY= -github.com/AdguardTeam/golibs v0.34.0 h1:JQK024DkTYxE7vsPVsYsoyDHW/53Nun7OYb9qscniK8= -github.com/AdguardTeam/golibs v0.34.0/go.mod h1:K4C2EbfSEM1zY5YXoti9SfbTAHN/kIX97LpDtCwORrM= -github.com/AdguardTeam/urlfilter v0.21.0 h1:ThIxiP7yoaXt8JTEroGQeU5ftQSoFpUq+t1L+TIx2pA= -github.com/AdguardTeam/urlfilter v0.21.0/go.mod h1:xoZ3AF5qpE9ngbbeSShY9hgVeyHtm9MdH5xH1u714Wg= +github.com/AdguardTeam/golibs v0.34.1 h1:RyBpZiXnJqlO3T+xjWldlxsEZDelmaFfKvXiJHDZZFQ= +github.com/AdguardTeam/golibs v0.34.1/go.mod h1:K4C2EbfSEM1zY5YXoti9SfbTAHN/kIX97LpDtCwORrM= +github.com/AdguardTeam/urlfilter v0.22.0 h1:ybOz3FywbpGDGC+8gFFkM1LMUOSosY7CWSBXIYXnG1U= +github.com/AdguardTeam/urlfilter v0.22.0/go.mod h1:q0lWKapXlYTA4TUWUM1YDwU6Q0PKvQEokztcvRV2OW0= github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= @@ -57,8 +57,6 @@ github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI= github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= @@ -90,10 +88,14 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= github.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81vgd/bo= github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc= -github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= -github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= +github.com/gookit/assert v0.1.1 h1:lh3GcawXe/p+cU7ESTZ5Ui3Sm/x8JWpIis4/1aF0mY0= +github.com/gookit/assert v0.1.1/go.mod h1:jS5bmIVQZTIwk42uXl4lyj4iaaxx32tqH16CFj0VX2E= +github.com/gookit/color v1.6.0 h1:JjJXBTk1ETNyqyilJhkTXJYYigHG24TM9Xa2M1xAhRA= +github.com/gookit/color v1.6.0/go.mod h1:9ACFc7/1IpHGBW8RwuDm/0YEnhg3dwwXpoMsmtyHfjs= github.com/gordonklaus/ineffassign v0.2.0 h1:Uths4KnmwxNJNzq87fwQQDDnbNb7De00VOk9Nu0TySs= github.com/gordonklaus/ineffassign v0.2.0/go.mod h1:TIpymnagPSexySzs7F9FnO1XFTy8IT3a59vmZp5Y9Lw= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= github.com/jstemmer/go-junit-report/v2 v2.1.0 h1:X3+hPYlSczH9IMIpSC9CQSZA0L+BipYafciZUWHEmsc= github.com/jstemmer/go-junit-report/v2 v2.1.0/go.mod h1:mgHVr7VUo5Tn8OLVr1cKnLuEy0M92wdRntM99h7RkgQ= github.com/kamstrup/intmap v0.5.1 h1:ENGAowczZA+PJPYYlreoqJvWgQVtAmX1l899WfYFVK0= @@ -108,8 +110,6 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/miekg/dns v1.1.68 h1:jsSRkNozw7G/mnmXULynzMNIsgY2dHC8LO6U6Ij2JEA= github.com/miekg/dns v1.1.68/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= @@ -130,14 +130,12 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= -github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= +github.com/prometheus/client_golang v1.23.1 h1:w6gXMLQGgd0jXXlote9lRHMe0nG01EbnJT+C0EJru2Y= +github.com/prometheus/client_golang v1.23.1/go.mod h1:br8j//v2eg2K5Vvna5klK8Ku5pcU5r4ll73v6ik5dIQ= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE= -github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= +github.com/prometheus/common v0.66.0 h1:K/rJPHrG3+AoQs50r2+0t7zMnMzek2Vbv31OFVsMeVY= +github.com/prometheus/common v0.66.0/go.mod h1:Ux6NtV1B4LatamKE63tJBntoxD++xmtI/lK0VtEplN4= github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= @@ -150,74 +148,64 @@ github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0t github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/securego/gosec/v2 v2.22.8 h1:3NMpmfXO8wAVFZPNsd3EscOTa32Jyo6FLLlW53bexMI= github.com/securego/gosec/v2 v2.22.8/go.mod h1:ZAw8K2ikuH9qDlfdV87JmNghnVfKB1XC7+TVzk6Utto= -github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI= -github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= -github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= -github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/uudashr/gocognit v1.2.0 h1:3BU9aMr1xbhPlvJLSydKwdLN3tEUUrzPSSM8S4hDYRA= github.com/uudashr/gocognit v1.2.0/go.mod h1:k/DdKPI6XBZO1q7HgoV2juESI2/Ofj9AcHPZhBBdrTU= github.com/viktordanov/golang-lru v0.5.6 h1:wEyMgglEo5IZ7Maxeh8E2jCPskpQnt6FJAYl1/TJ6ac= github.com/viktordanov/golang-lru v0.5.6/go.mod h1:R91CBCcMhp6TYUy8NHP/PJ09sk5BTDwb8KMO21CELes= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= -github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= -github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= -go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 h1:rbRJ8BBoVMsQShESYZ0FkvcITu8X8QNwJogcLUmDNNw= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0/go.mod h1:ru6KHrNtNHxM4nD/vd6QrLVWgKhxPYgblq4VAtNawTQ= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= -go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= -go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= -go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= -go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= -go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= -go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= -go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= -go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= -go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= -go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/auto/sdk v1.2.0 h1:YpRtUFjvhSymycLS2T81lT6IGhcUP+LUPtv0iv1N8bM= +go.opentelemetry.io/auto/sdk v1.2.0/go.mod h1:1deq2zL7rwjwC8mR7XgY2N+tlIl6pjmEUoLDENMEzwk= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 h1:YH4g8lQroajqUwWbq/tr2QX1JFmEXaDLgG+ew9bLMWo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0/go.mod h1:fvPi2qXDqFs8M4B4fmJhE92TyQs9Ydjlg3RvfUp+NbQ= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 h1:RbKq8BG0FI8OiXhBfcRtqqHcZcka+gU3cskNuf05R18= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0/go.mod h1:h06DGIukJOevXaj/xrNjhi/2098RZzcLTbc0jDAUbsg= +go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= +go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= +go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= +go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= +go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= +go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= +go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= +go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= +go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= +go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= -golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= -golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= -golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b h1:DXr+pvt3nC887026GRP39Ej11UATqWDmWuS99x26cD0= -golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4= -golang.org/x/exp/typeparams v0.0.0-20250819193227-8b4c13bb791b h1:GU1ttDuJS89SePnuEsEuLj7dMMFP2JkGsDV1Z51iDXo= -golang.org/x/exp/typeparams v0.0.0-20250819193227-8b4c13bb791b/go.mod h1:4Mzdyp/6jzw9auFDJ3OMF5qksa7UvPnzKqTVGcb04ms= -golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= -golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= -golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= -golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= -golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= -golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= -golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/telemetry v0.0.0-20250822161441-f407b8c191ff h1:ey0rzo8V0Po6WkHMbhGVL6zNkuYDBe9iP5toIRchj9Q= -golang.org/x/telemetry v0.0.0-20250822161441-f407b8c191ff/go.mod h1:JIJwPkb04vX0KeIBbQ7epGtgIjA8ihHbsAtW4A/lIQ4= -golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= -golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= -golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= -golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= -golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= -golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= -golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= -golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= +golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= +golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= +golang.org/x/exp v0.0.0-20250911091902-df9299821621 h1:2id6c1/gto0kaHYyrixvknJ8tUK/Qs5IsmBtrc+FtgU= +golang.org/x/exp v0.0.0-20250911091902-df9299821621/go.mod h1:TwQYMMnGpvZyc+JpB/UAuTNIsVJifOlSkrZkhcvpVUk= +golang.org/x/exp/typeparams v0.0.0-20250911091902-df9299821621 h1:Yl4H5w2RV7L/dvSHp2GerziT5K2CORgFINPaMFxWGWw= +golang.org/x/exp/typeparams v0.0.0-20250911091902-df9299821621/go.mod h1:4Mzdyp/6jzw9auFDJ3OMF5qksa7UvPnzKqTVGcb04ms= +golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= +golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= +golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= +golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= +golang.org/x/oauth2 v0.31.0 h1:8Fq0yVZLh4j4YA47vHKFTa9Ew5XIrCP8LC6UeNZnLxo= +golang.org/x/oauth2 v0.31.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= +golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/telemetry v0.0.0-20250908211612-aef8a434d053 h1:dHQOQddU4YHS5gY33/6klKjq7Gp3WwMyOXGNp5nzRj8= +golang.org/x/telemetry v0.0.0-20250908211612-aef8a434d053/go.mod h1:+nZKN+XVh4LCiA9DV3ywrzN4gumyCnKjau3NGb9SGoE= +golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ= +golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA= +golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= +golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= +golang.org/x/time v0.13.0 h1:eUlYslOIt32DgYD6utsuUeHs4d7AsEYLuIAdg7FlYgI= +golang.org/x/time v0.13.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= +golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE= +golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w= golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM= golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM= @@ -226,20 +214,20 @@ golang.org/x/vuln v1.1.4 h1:Ju8QsuyhX3Hk8ma3CesTbO8vfJD9EvUBgHvkxHBzj0I= golang.org/x/vuln v1.1.4/go.mod h1:F+45wmU18ym/ca5PLTPLsSzr2KppzswxPP603ldA67s= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -google.golang.org/api v0.248.0 h1:hUotakSkcwGdYUqzCRc5yGYsg4wXxpkKlW5ryVqvC1Y= -google.golang.org/api v0.248.0/go.mod h1:yAFUAF56Li7IuIQbTFoLwXTCI6XCFKueOlS7S9e4F9k= -google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4= -google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s= -google.golang.org/genproto/googleapis/api v0.0.0-20250826171959-ef028d996bc1 h1:APHvLLYBhtZvsbnpkfknDZ7NyH4z5+ub/I0u8L3Oz6g= -google.golang.org/genproto/googleapis/api v0.0.0-20250826171959-ef028d996bc1/go.mod h1:xUjFWUnWDpZ/C0Gu0qloASKFb6f8/QXiiXhSPFsD668= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250826171959-ef028d996bc1 h1:pmJpJEvT846VzausCQ5d7KreSROcDqmO388w5YbnltA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250826171959-ef028d996bc1/go.mod h1:GmFNa4BdJZ2a8G+wCe9Bg3wwThLrJun751XstdJt5Og= -google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= -google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/api v0.249.0 h1:0VrsWAKzIZi058aeq+I86uIXbNhm9GxSHpbmZ92a38w= +google.golang.org/api v0.249.0/go.mod h1:dGk9qyI0UYPwO/cjt2q06LG/EhUpwZGdAbYF14wHHrQ= +google.golang.org/genproto v0.0.0-20250908214217-97024824d090 h1:ywCL7vA2n3vVHyf+bx1ZV/knaTPRI8GIeKY0MEhEeOc= +google.golang.org/genproto v0.0.0-20250908214217-97024824d090/go.mod h1:zwJI9HzbJJlw2KXy0wX+lmT2JuZoaKK9JC4ppqmxxjk= +google.golang.org/genproto/googleapis/api v0.0.0-20250908214217-97024824d090 h1:d8Nakh1G+ur7+P3GcMjpRDEkoLUcLW2iU92XVqR+XMQ= +google.golang.org/genproto/googleapis/api v0.0.0-20250908214217-97024824d090/go.mod h1:U8EXRNSd8sUYyDfs/It7KVWodQr+Hf9xtxyxWudSwEw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250908214217-97024824d090 h1:/OQuEa4YWtDt7uQWHd3q3sUMb+QOLQUg1xa8CEsRv5w= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250908214217-97024824d090/go.mod h1:GmFNa4BdJZ2a8G+wCe9Bg3wwThLrJun751XstdJt5Og= +google.golang.org/grpc v1.75.1 h1:/ODCNEuf9VghjgO3rqLcfg8fiOP0nSluljWFlDxELLI= +google.golang.org/grpc v1.75.1/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 h1:F29+wU6Ee6qgu9TddPgooOdaqsxTMunOoj8KA5yuS5A= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1/go.mod h1:5KF+wpkbTSbGcR9zteSqZV6fqFOWBl4Yde8En8MryZA= -google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= -google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= +google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= @@ -251,8 +239,8 @@ honnef.co/go/tools v0.6.1 h1:R094WgE8K4JirYjBaOpz/AvTyUu/3wbmAoskKN/pxTI= honnef.co/go/tools v0.6.1/go.mod h1:3puzxxljPCe8RGJX7BIy1plGbxEOZni5mR2aXe3/uk4= mvdan.cc/editorconfig v0.3.0 h1:D1D2wLYEYGpawWT5SpM5pRivgEgXjtEXwC9MWhEY0gQ= mvdan.cc/editorconfig v0.3.0/go.mod h1:NcJHuDtNOTEJ6251indKiWuzK6+VcrMuLzGMLKBFupQ= -mvdan.cc/gofumpt v0.8.0 h1:nZUCeC2ViFaerTcYKstMmfysj6uhQrA2vJe+2vwGU6k= -mvdan.cc/gofumpt v0.8.0/go.mod h1:vEYnSzyGPmjvFkqJWtXkh79UwPWP9/HMxQdGEXZHjpg= +mvdan.cc/gofumpt v0.9.1 h1:p5YT2NfFWsYyTieYgwcQ8aKV3xRvFH4uuN/zB2gBbMQ= +mvdan.cc/gofumpt v0.9.1/go.mod h1:3xYtNemnKiXaTh6R4VtlqDATFwBbdXI8lJvH/4qk7mw= mvdan.cc/sh/v3 v3.12.0 h1:ejKUR7ONP5bb+UGHGEG/k9V5+pRVIyD+LsZz7o8KHrI= mvdan.cc/sh/v3 v3.12.0/go.mod h1:Se6Cj17eYSn+sNooLZiEUnNNmNxg0imoYlTu4CyaGyg= mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4 h1:WjUu4yQoT5BHT1w8Zu56SP8367OuBV5jvo+4Ulppyf8= diff --git a/go.work b/go.work index 03ae774..15f0c39 100644 --- a/go.work +++ b/go.work @@ -1,4 +1,4 @@ -go 1.24.6 +go 1.25.1 use ( . diff --git a/go.work.sum b/go.work.sum index f0e2372..7f94cfe 100644 --- a/go.work.sum +++ b/go.work.sum @@ -11,6 +11,7 @@ cel.dev/expr v0.20.0 h1:OunBvVCfvpWlt4dN7zg3FM6TDkzOePe1+foGJ9AXeeI= cel.dev/expr v0.20.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= cel.dev/expr v0.23.0 h1:wUb94w6OYQS4uXraxo9U+wUAs9jT47Xvl4iPgAwM2ss= cel.dev/expr v0.23.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= +cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -31,21 +32,37 @@ cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eA cloud.google.com/go v0.65.0 h1:Dg9iHVQfrhq82rUNu9ZxUDrJLaxFUe/HlCVaLyRruq8= cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= cloud.google.com/go/accessapproval v1.7.5/go.mod h1:g88i1ok5dvQ9XJsxpUInWWvUBrIZhyPDPbk4T01OoJ0= +cloud.google.com/go/accessapproval v1.8.7/go.mod h1:BFvZOW4GJjJnl6aA/YDEg0TGViFHyusa/bMdcVFmh8A= cloud.google.com/go/accesscontextmanager v1.8.5/go.mod h1:TInEhcZ7V9jptGNqN3EzZ5XMhT6ijWxTGjzyETwmL0Q= +cloud.google.com/go/accesscontextmanager v1.9.6/go.mod h1:884XHwy1AQpCX5Cj2VqYse77gfLaq9f8emE2bYriilk= cloud.google.com/go/aiplatform v1.60.0/go.mod h1:eTlGuHOahHprZw3Hio5VKmtThIOak5/qy6pzdsqcQnM= +cloud.google.com/go/aiplatform v1.100.0/go.mod h1:oZUOTz6+cMt9eVNe62CXPfIQQQ+QjR4rW3GBGD9r6Fg= cloud.google.com/go/analytics v0.23.0/go.mod h1:YPd7Bvik3WS95KBok2gPXDqQPHy08TsCQG6CdUCb+u0= +cloud.google.com/go/analytics v0.30.0/go.mod h1:dneJtsGmmK6EkEPg59vRlncKFWt3xzmKNOc9aKXCTrI= cloud.google.com/go/apigateway v1.6.5/go.mod h1:6wCwvYRckRQogyDDltpANi3zsCDl6kWi0b4Je+w2UiI= +cloud.google.com/go/apigateway v1.7.7/go.mod h1:j1bCmrUK1BzVHpiIyTApxB7cRyhivKzltqLmp6j6i7U= cloud.google.com/go/apigeeconnect v1.6.5/go.mod h1:MEKm3AiT7s11PqTfKE3KZluZA9O91FNysvd3E6SJ6Ow= +cloud.google.com/go/apigeeconnect v1.7.7/go.mod h1:ftGK3nca0JePiVLl0A6alaMjKdOc5C+sAkFMyH2RH8U= cloud.google.com/go/apigeeregistry v0.8.3/go.mod h1:aInOWnqF4yMQx8kTjDqHNXjZGh/mxeNlAf52YqtASUs= +cloud.google.com/go/apigeeregistry v0.9.6/go.mod h1:AFEepJBKPtGDfgabG2HWaLH453VVWWFFs3P4W00jbPs= cloud.google.com/go/appengine v1.8.5/go.mod h1:uHBgNoGLTS5di7BvU25NFDuKa82v0qQLjyMJLuPQrVo= +cloud.google.com/go/appengine v1.9.7/go.mod h1:y1XpGVeAhbsNzHida79cHbr3pFRsym0ob8xnC8yphbo= cloud.google.com/go/area120 v0.8.5/go.mod h1:BcoFCbDLZjsfe4EkCnEq1LKvHSK0Ew/zk5UFu6GMyA0= +cloud.google.com/go/area120 v0.9.7/go.mod h1:5nJ0yksmjOMfc4Zpk+okWfJ3A1004FvB82rfia+ZLaY= cloud.google.com/go/artifactregistry v1.14.7/go.mod h1:0AUKhzWQzfmeTvT4SjfI4zjot72EMfrkvL9g9aRjnnM= +cloud.google.com/go/artifactregistry v1.17.1/go.mod h1:06gLv5QwQPWtaudI2fWO37gfwwRUHwxm3gA8Fe568Hc= cloud.google.com/go/asset v1.17.2/go.mod h1:SVbzde67ehddSoKf5uebOD1sYw8Ab/jD/9EIeWg99q4= +cloud.google.com/go/asset v1.21.1/go.mod h1:7AzY1GCC+s1O73yzLM1IpHFLHz3ws2OigmCpOQHwebk= cloud.google.com/go/assuredworkloads v1.11.5/go.mod h1:FKJ3g3ZvkL2D7qtqIGnDufFkHxwIpNM9vtmhvt+6wqk= +cloud.google.com/go/assuredworkloads v1.12.6/go.mod h1:QyZHd7nH08fmZ+G4ElihV1zoZ7H0FQCpgS0YWtwjCKo= cloud.google.com/go/automl v1.13.5/go.mod h1:MDw3vLem3yh+SvmSgeYUmUKqyls6NzSumDm9OJ3xJ1Y= +cloud.google.com/go/automl v1.14.7/go.mod h1:8a4XbIH5pdvrReOU72oB+H3pOw2JBxo9XTk39oljObE= cloud.google.com/go/baremetalsolution v1.2.4/go.mod h1:BHCmxgpevw9IEryE99HbYEfxXkAEA3hkMJbYYsHtIuY= +cloud.google.com/go/baremetalsolution v1.3.6/go.mod h1:7/CS0LzpLccRGO0HL3q2Rofxas2JwjREKut414sE9iM= cloud.google.com/go/batch v1.8.0/go.mod h1:k8V7f6VE2Suc0zUM4WtoibNrA6D3dqBpB+++e3vSGYc= +cloud.google.com/go/batch v1.12.2/go.mod h1:tbnuTN/Iw59/n1yjAYKV2aZUjvMM2VJqAgvUgft6UEU= cloud.google.com/go/beyondcorp v1.0.4/go.mod h1:Gx8/Rk2MxrvWfn4WIhHIG1NV7IBfg14pTKv1+EArVcc= +cloud.google.com/go/beyondcorp v1.1.6/go.mod h1:V1PigSWPGh5L/vRRmyutfnjAbkxLI2aWqJDdxKbwvsQ= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -54,13 +71,22 @@ cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4g cloud.google.com/go/bigquery v1.8.0 h1:PQcPefKFdaIzjQFbiyOgAqyx8q5djaE7x9Sqe712DPA= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/bigquery v1.59.1/go.mod h1:VP1UJYgevyTwsV7desjzNzDND5p6hZB+Z8gZJN1GQUc= +cloud.google.com/go/bigquery v1.70.0/go.mod h1:6lEAkgTJN+H2JcaX1eKiuEHTKyqBaJq5U3SpLGbSvwI= +cloud.google.com/go/bigtable v1.39.0/go.mod h1:zgL2Vxux9Bx+TcARDJDUxVyE+BCUfP2u4Zm9qeHF+g0= cloud.google.com/go/billing v1.18.2/go.mod h1:PPIwVsOOQ7xzbADCwNe8nvK776QpfrOAUkvKjCUcpSE= +cloud.google.com/go/billing v1.20.4/go.mod h1:hBm7iUmGKGCnBm6Wp439YgEdt+OnefEq/Ib9SlJYxIU= cloud.google.com/go/binaryauthorization v1.8.1/go.mod h1:1HVRyBerREA/nhI7yLang4Zn7vfNVA3okoAR9qYQJAQ= +cloud.google.com/go/binaryauthorization v1.9.5/go.mod h1:CV5GkS2eiY461Bzv+OH3r5/AsuB6zny+MruRju3ccB8= cloud.google.com/go/certificatemanager v1.7.5/go.mod h1:uX+v7kWqy0Y3NG/ZhNvffh0kuqkKZIXdvlZRO7z0VtM= +cloud.google.com/go/certificatemanager v1.9.5/go.mod h1:kn7gxT/80oVGhjL8rurMUYD36AOimgtzSBPadtAeffs= cloud.google.com/go/channel v1.17.5/go.mod h1:FlpaOSINDAXgEext0KMaBq/vwpLMkkPAw9b2mApQeHc= +cloud.google.com/go/channel v1.20.0/go.mod h1:nBR1Lz+/1TjSA16HTllvW9Y+QULODj3o3jEKrNNeOp4= cloud.google.com/go/cloudbuild v1.15.1/go.mod h1:gIofXZSu+XD2Uy+qkOrGKEx45zd7s28u/k8f99qKals= +cloud.google.com/go/cloudbuild v1.23.0/go.mod h1:BkxnZUIHUHkl+oNpEbwc7n9id4pZRDQRVKIa6sDCuJI= cloud.google.com/go/clouddms v1.7.4/go.mod h1:RdrVqoFG9RWI5AvZ81SxJ/xvxPdtcRhFotwdE79DieY= +cloud.google.com/go/clouddms v1.8.7/go.mod h1:DhWLd3nzHP8GoHkA6hOhso0R9Iou+IGggNqlVaq/KZ4= cloud.google.com/go/cloudtasks v1.12.6/go.mod h1:b7c7fe4+TJsFZfDyzO51F7cjq7HLUlRi/KZQLQjDsaY= +cloud.google.com/go/cloudtasks v1.13.6/go.mod h1:/IDaQqGKMixD+ayM43CfsvWF2k36GeomEuy9gL4gLmU= cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute v1.21.0 h1:JNBsyXVoOoNJtTQcnEY5uYpZIbeCTYIeDe0Xh1bySMk= cloud.google.com/go/compute v1.21.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= @@ -70,6 +96,8 @@ cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1Yl cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40= cloud.google.com/go/compute v1.25.1 h1:ZRpHJedLtTpKgr3RV1Fx23NuaAEN1Zfx9hw1u4aJdjU= cloud.google.com/go/compute v1.25.1/go.mod h1:oopOIR53ly6viBYxaDhBfJwzUAxf1zE//uf3IB011ls= +cloud.google.com/go/compute v1.45.0 h1:bcq5kVYiC6O62afoM/rh40jnLpLUw6GP1O+8a8NiI+Y= +cloud.google.com/go/compute v1.45.0/go.mod h1:wQjjP1m9aYkZAPbYxilUyJ0RSAAb+/PFNGHBVLzDiRM= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= @@ -80,38 +108,68 @@ cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixA cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= cloud.google.com/go/contactcenterinsights v1.13.0/go.mod h1:ieq5d5EtHsu8vhe2y3amtZ+BE+AQwX5qAy7cpo0POsI= +cloud.google.com/go/contactcenterinsights v1.17.3/go.mod h1:7Uu2CpxS3f6XxhRdlEzYAkrChpR5P5QfcdGAFEdHOG8= cloud.google.com/go/container v1.31.0/go.mod h1:7yABn5s3Iv3lmw7oMmyGbeV6tQj86njcTijkkGuvdZA= +cloud.google.com/go/container v1.44.0/go.mod h1:tVK2o4UZUTkg9WpBcgj4qRzwGA1dSFdWA3mil3YkLIQ= cloud.google.com/go/containeranalysis v0.11.4/go.mod h1:cVZT7rXYBS9NG1rhQbWL9pWbXCKHWJPYraE8/FTSYPE= +cloud.google.com/go/containeranalysis v0.14.1/go.mod h1:28e+tlZgauWGHmEbnI5UfIsjMmrkoR1tFN0K2i71jBI= cloud.google.com/go/datacatalog v1.19.3/go.mod h1:ra8V3UAsciBpJKQ+z9Whkxzxv7jmQg1hfODr3N3YPJ4= +cloud.google.com/go/datacatalog v1.26.0/go.mod h1:bLN2HLBAwB3kLTFT5ZKLHVPj/weNz6bR0c7nYp0LE14= cloud.google.com/go/dataflow v0.9.5/go.mod h1:udl6oi8pfUHnL0z6UN9Lf9chGqzDMVqcYTcZ1aPnCZQ= +cloud.google.com/go/dataflow v0.11.0/go.mod h1:gNHC9fUjlV9miu0hd4oQaXibIuVYTQvZhMdPievKsPk= cloud.google.com/go/dataform v0.9.2/go.mod h1:S8cQUwPNWXo7m/g3DhWHsLBoufRNn9EgFrMgne2j7cI= +cloud.google.com/go/dataform v0.12.0/go.mod h1:PuDIEY0lSVuPrZqcFji1fmr5RRvz3DGz4YP/cONc8g4= cloud.google.com/go/datafusion v1.7.5/go.mod h1:bYH53Oa5UiqahfbNK9YuYKteeD4RbQSNMx7JF7peGHc= +cloud.google.com/go/datafusion v1.8.6/go.mod h1:fCyKJF2zUKC+O3hc2F9ja5EUCAbT4zcH692z8HiFZFw= cloud.google.com/go/datalabeling v0.8.5/go.mod h1:IABB2lxQnkdUbMnQaOl2prCOfms20mcPxDBm36lps+s= +cloud.google.com/go/datalabeling v0.9.6/go.mod h1:n7o4x0vtPensZOoFwFa4UfZgkSZm8Qs0Pg/T3kQjXSM= cloud.google.com/go/dataplex v1.14.2/go.mod h1:0oGOSFlEKef1cQeAHXy4GZPB/Ife0fz/PxBf+ZymA2U= +cloud.google.com/go/dataplex v1.26.0/go.mod h1:12R9nlLUzxOscbb2HgoYnkGNibmv4sXEVMXxrdw2a90= cloud.google.com/go/dataproc/v2 v2.4.0/go.mod h1:3B1Ht2aRB8VZIteGxQS/iNSJGzt9+CA0WGnDVMEm7Z4= +cloud.google.com/go/dataproc/v2 v2.14.0/go.mod h1:AqfdObN5w70H7meRXZOEY52WMK4yMrLtiOd9kROahSM= cloud.google.com/go/dataqna v0.8.5/go.mod h1:vgihg1mz6n7pb5q2YJF7KlXve6tCglInd6XO0JGOlWM= +cloud.google.com/go/dataqna v0.9.7/go.mod h1:4ac3r7zm7Wqm8NAc8sDIDM0v7Dz7d1e/1Ka1yMFanUM= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0 h1:/May9ojXjRkPBNVrq+oWLqmWCkr4OU5uRY29bu0mRyQ= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/datastore v1.15.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= +cloud.google.com/go/datastore v1.20.0/go.mod h1:uFo3e+aEpRfHgtp5pp0+6M0o147KoPaYNaPAKpfh8Ew= cloud.google.com/go/datastream v1.10.4/go.mod h1:7kRxPdxZxhPg3MFeCSulmAJnil8NJGGvSNdn4p1sRZo= +cloud.google.com/go/datastream v1.15.0/go.mod h1:eA4ZWd7e21YtG6Yx5SWSwRV5U9wbAb9rKHTcb0x20cQ= cloud.google.com/go/deploy v1.17.1/go.mod h1:SXQyfsXrk0fBmgBHRzBjQbZhMfKZ3hMQBw5ym7MN/50= +cloud.google.com/go/deploy v1.27.2/go.mod h1:4NHWE7ENry2A4O1i/4iAPfXHnJCZ01xckAKpZQwhg1M= cloud.google.com/go/dialogflow v1.49.0/go.mod h1:dhVrXKETtdPlpPhE7+2/k4Z8FRNUp6kMV3EW3oz/fe0= +cloud.google.com/go/dialogflow v1.69.0/go.mod h1:+2drAzrguQ8vltf6qn6foBPHrT/fFa1S3FQ40byV2WU= cloud.google.com/go/dlp v1.11.2/go.mod h1:9Czi+8Y/FegpWzgSfkRlyz+jwW6Te9Rv26P3UfU/h/w= +cloud.google.com/go/dlp v1.24.0/go.mod h1:y6EsWNgMDye72NtqjGHYZjN/wUDnO9CUygLV8iuFeW0= cloud.google.com/go/documentai v1.25.0/go.mod h1:ftLnzw5VcXkLItp6pw1mFic91tMRyfv6hHEY5br4KzY= +cloud.google.com/go/documentai v1.38.0/go.mod h1:zNhZmHJ4/VbvhA0h2U5JRbOHm2BTMq4FxJ276mYAohk= cloud.google.com/go/domains v0.9.5/go.mod h1:dBzlxgepazdFhvG7u23XMhmMKBjrkoUNaw0A8AQB55Y= +cloud.google.com/go/domains v0.10.6/go.mod h1:3xzG+hASKsVBA8dOPc4cIaoV3OdBHl1qgUpAvXK7pGY= cloud.google.com/go/edgecontainer v1.1.5/go.mod h1:rgcjrba3DEDEQAidT4yuzaKWTbkTI5zAMu3yy6ZWS0M= +cloud.google.com/go/edgecontainer v1.4.3/go.mod h1:q9Ojw2ox0uhAvFisnfPRAXFTB1nfRIOIXVWzdXMZLcE= cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/errorreporting v0.3.2/go.mod h1:s5kjs5r3l6A8UUyIsgvAhGq6tkqyBCUss0FRpsoVTww= cloud.google.com/go/essentialcontacts v1.6.6/go.mod h1:XbqHJGaiH0v2UvtuucfOzFXN+rpL/aU5BCZLn4DYl1Q= +cloud.google.com/go/essentialcontacts v1.7.6/go.mod h1:/Ycn2egr4+XfmAfxpLYsJeJlVf9MVnq9V7OMQr9R4lA= cloud.google.com/go/eventarc v1.13.4/go.mod h1:zV5sFVoAa9orc/52Q+OuYUG9xL2IIZTbbuTHC6JSY8s= +cloud.google.com/go/eventarc v1.15.5/go.mod h1:vDCqGqyY7SRiickhEGt1Zhuj81Ya4F/NtwwL3OZNskg= cloud.google.com/go/filestore v1.8.1/go.mod h1:MbN9KcaM47DRTIuLfQhJEsjaocVebNtNQhSLhKCF5GM= +cloud.google.com/go/filestore v1.10.2/go.mod h1:w0Pr8uQeSRQfCPRsL0sYKW6NKyooRgixCkV9yyLykR4= cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= +cloud.google.com/go/firestore v1.18.0/go.mod h1:5ye0v48PhseZBdcl0qbl3uttu7FIEwEYVaWm0UIEOEU= cloud.google.com/go/functions v1.16.0/go.mod h1:nbNpfAG7SG7Duw/o1iZ6ohvL7mc6MapWQVpqtM29n8k= +cloud.google.com/go/functions v1.19.6/go.mod h1:0G0RnIlbM4MJEycfbPZlCzSf2lPOjL7toLDwl+r0ZBw= cloud.google.com/go/gkebackup v1.3.5/go.mod h1:KJ77KkNN7Wm1LdMopOelV6OodM01pMuK2/5Zt1t4Tvc= +cloud.google.com/go/gkebackup v1.8.0/go.mod h1:FjsjNldDilC9MWKEHExnK3kKJyTDaSdO1vF0QeWSOPU= cloud.google.com/go/gkeconnect v0.8.5/go.mod h1:LC/rS7+CuJ5fgIbXv8tCD/mdfnlAadTaUufgOkmijuk= +cloud.google.com/go/gkeconnect v0.12.4/go.mod h1:bvpU9EbBpZnXGo3nqJ1pzbHWIfA9fYqgBMJ1VjxaZdk= cloud.google.com/go/gkehub v0.14.5/go.mod h1:6bzqxM+a+vEH/h8W8ec4OJl4r36laxTs3A/fMNHJ0wA= +cloud.google.com/go/gkehub v0.15.6/go.mod h1:sRT0cOPAgI1jUJrS3gzwdYCJ1NEzVVwmnMKEwrS2QaM= cloud.google.com/go/gkemulticloud v1.1.1/go.mod h1:C+a4vcHlWeEIf45IB5FFR5XGjTeYhF83+AYIpTy4i2Q= +cloud.google.com/go/gkemulticloud v1.5.3/go.mod h1:KPFf+/RcfvmuScqwS9/2MF5exZAmXSuoSLPuaQ98Xlk= cloud.google.com/go/gsuiteaddons v1.6.5/go.mod h1:Lo4P2IvO8uZ9W+RaC6s1JVxo42vgy+TX5a6hfBZ0ubs= +cloud.google.com/go/gsuiteaddons v1.7.7/go.mod h1:zTGmmKG/GEBCONsvMOY2ckDiEsq3FN+lzWGUiXccF9o= cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= cloud.google.com/go/iam v1.4.0/go.mod h1:gMBgqPaERlriaOV0CUl//XUzDhSfXevn4OEUbg6VRs4= cloud.google.com/go/iam v1.4.1 h1:cFC25Nv+u5BkTR/BT1tXdoF2daiVbZ1RLx2eqfQ9RMM= @@ -119,34 +177,58 @@ cloud.google.com/go/iam v1.4.1/go.mod h1:2vUEJpUG3Q9p2UdsyksaKpDzlwOrnMzS30isdRe cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= cloud.google.com/go/iap v1.9.4/go.mod h1:vO4mSq0xNf/Pu6E5paORLASBwEmphXEjgCFg7aeNu1w= +cloud.google.com/go/iap v1.11.2/go.mod h1:Bh99DMUpP5CitL9lK0BC8MYgjjYO4b3FbyhgW1VHJvg= cloud.google.com/go/ids v1.4.5/go.mod h1:p0ZnyzjMWxww6d2DvMGnFwCsSxDJM666Iir1bK1UuBo= +cloud.google.com/go/ids v1.5.6/go.mod h1:y3SGLmEf9KiwKsH7OHvYYVNIJAtXybqsD2z8gppsziQ= cloud.google.com/go/iot v1.7.5/go.mod h1:nq3/sqTz3HGaWJi1xNiX7F41ThOzpud67vwk0YsSsqs= +cloud.google.com/go/iot v1.8.6/go.mod h1:MThnkiihNkMysWNeNje2Hp0GSOpEq2Wkb/DkBCVYa0U= cloud.google.com/go/kms v1.15.7/go.mod h1:ub54lbsa6tDkUwnu4W7Yt1aAIFLnspgh0kPGToDukeI= +cloud.google.com/go/kms v1.22.0/go.mod h1:U7mf8Sva5jpOb4bxYZdtw/9zsbIjrklYwPcvMk34AL8= cloud.google.com/go/language v1.12.3/go.mod h1:evFX9wECX6mksEva8RbRnr/4wi/vKGYnAJrTRXU8+f8= +cloud.google.com/go/language v1.14.5/go.mod h1:nl2cyAVjcBct1Hk73tzxuKebk0t2eULFCaruhetdZIA= cloud.google.com/go/lifesciences v0.9.5/go.mod h1:OdBm0n7C0Osh5yZB7j9BXyrMnTRGBJIZonUMxo5CzPw= +cloud.google.com/go/lifesciences v0.10.6/go.mod h1:1nnZwaZcBThDujs9wXzECnd1S5d+UiDkPuJWAmhRi7Q= cloud.google.com/go/logging v1.9.0/go.mod h1:1Io0vnZv4onoUnsVUQY3HZ3Igb1nBchky0A0y7BBBhE= +cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA= cloud.google.com/go/longrunning v0.5.5/go.mod h1:WV2LAxD8/rg5Z1cNW6FJ/ZpX4E4VnDnoTk0yawPBB7s= cloud.google.com/go/managedidentities v1.6.5/go.mod h1:fkFI2PwwyRQbjLxlm5bQ8SjtObFMW3ChBGNqaMcgZjI= +cloud.google.com/go/managedidentities v1.7.6/go.mod h1:pYCWPaI1AvR8Q027Vtp+SFSM/VOVgbjBF4rxp1/z5p4= cloud.google.com/go/maps v1.6.4/go.mod h1:rhjqRy8NWmDJ53saCfsXQ0LKwBHfi6OSh5wkq6BaMhI= +cloud.google.com/go/maps v1.23.0/go.mod h1:8tjxLplMV7FEoR9FIwqoY7siDnaOdE7FBWnjaXK/xts= cloud.google.com/go/mediatranslation v0.8.5/go.mod h1:y7kTHYIPCIfgyLbKncgqouXJtLsU+26hZhHEEy80fSs= +cloud.google.com/go/mediatranslation v0.9.6/go.mod h1:WS3QmObhRtr2Xu5laJBQSsjnWFPPthsyetlOyT9fJvE= cloud.google.com/go/memcache v1.10.5/go.mod h1:/FcblbNd0FdMsx4natdj+2GWzTq+cjZvMa1I+9QsuMA= +cloud.google.com/go/memcache v1.11.6/go.mod h1:ZM6xr1mw3F8TWO+In7eq9rKlJc3jlX2MDt4+4H+/+cc= cloud.google.com/go/metastore v1.13.4/go.mod h1:FMv9bvPInEfX9Ac1cVcRXp8EBBQnBcqH6gz3KvJ9BAE= +cloud.google.com/go/metastore v1.14.7/go.mod h1:0dka99KQofeUgdfu+K/Jk1KeT9veWZlxuZdJpZPtuYU= cloud.google.com/go/monitoring v1.18.0/go.mod h1:c92vVBCeq/OB4Ioyo+NbN2U7tlg5ZH41PZcdvfc+Lcg= cloud.google.com/go/monitoring v1.24.0 h1:csSKiCJ+WVRgNkRzzz3BPoGjFhjPY23ZTcaenToJxMM= cloud.google.com/go/monitoring v1.24.0/go.mod h1:Bd1PRK5bmQBQNnuGwHBfUamAV1ys9049oEPHnn4pcsc= cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U= cloud.google.com/go/networkconnectivity v1.14.4/go.mod h1:PU12q++/IMnDJAB+3r+tJtuCXCfwfN+C6Niyj6ji1Po= +cloud.google.com/go/networkconnectivity v1.18.0/go.mod h1:8MFjpAsCqTKUO+U5y9C6iGAsq2KkrfpQ43/XbqSbICc= cloud.google.com/go/networkmanagement v1.9.4/go.mod h1:daWJAl0KTFytFL7ar33I6R/oNBH8eEOX/rBNHrC/8TA= +cloud.google.com/go/networkmanagement v1.20.0/go.mod h1:t/GQe1ICzaxeETse/6EPEjmjOr9zGyNImVLlxAX+YB4= cloud.google.com/go/networksecurity v0.9.5/go.mod h1:KNkjH/RsylSGyyZ8wXpue8xpCEK+bTtvof8SBfIhMG8= +cloud.google.com/go/networksecurity v0.10.6/go.mod h1:FTZvabFPvK2kR/MRIH3l/OoQ/i53eSix2KA1vhBMJec= cloud.google.com/go/notebooks v1.11.3/go.mod h1:0wQyI2dQC3AZyQqWnRsp+yA+kY4gC7ZIVP4Qg3AQcgo= +cloud.google.com/go/notebooks v1.12.6/go.mod h1:3Z4TMEqAKP3pu6DI/U+aEXrNJw9hGZIVbp+l3zw8EuA= cloud.google.com/go/optimization v1.6.3/go.mod h1:8ve3svp3W6NFcAEFr4SfJxrldzhUl4VMUJmhrqVKtYA= +cloud.google.com/go/optimization v1.7.6/go.mod h1:4MeQslrSJGv+FY4rg0hnZBR/tBX2awJ1gXYp6jZpsYY= cloud.google.com/go/orchestration v1.8.5/go.mod h1:C1J7HesE96Ba8/hZ71ISTV2UAat0bwN+pi85ky38Yq8= +cloud.google.com/go/orchestration v1.11.9/go.mod h1:KKXK67ROQaPt7AxUS1V/iK0Gs8yabn3bzJ1cLHw4XBg= cloud.google.com/go/orgpolicy v1.12.1/go.mod h1:aibX78RDl5pcK3jA8ysDQCFkVxLj3aOQqrbBaUL2V5I= +cloud.google.com/go/orgpolicy v1.15.0/go.mod h1:NTQLwgS8N5cJtdfK55tAnMGtvPSsy95JJhESwYHaJVs= cloud.google.com/go/osconfig v1.12.5/go.mod h1:D9QFdxzfjgw3h/+ZaAb5NypM8bhOMqBzgmbhzWViiW8= +cloud.google.com/go/osconfig v1.15.0/go.mod h1:0nY8bfGKWJB0Ft5bBKd2zMkjT4Uf0rM3NBFrAGUv1Lk= cloud.google.com/go/oslogin v1.13.1/go.mod h1:vS8Sr/jR7QvPWpCjNqy6LYZr5Zs1e8ZGW/KPn9gmhws= +cloud.google.com/go/oslogin v1.14.6/go.mod h1:xEvcRZTkMXHfNSKdZ8adxD6wvRzeyAq3cQX3F3kbMRw= cloud.google.com/go/phishingprotection v0.8.5/go.mod h1:g1smd68F7mF1hgQPuYn3z8HDbNre8L6Z0b7XMYFmX7I= +cloud.google.com/go/phishingprotection v0.9.6/go.mod h1:VmuGg03DCI0wRp/FLSvNyjFj+J8V7+uITgHjCD/x4RQ= cloud.google.com/go/policytroubleshooter v1.10.3/go.mod h1:+ZqG3agHT7WPb4EBIRqUv4OyIwRTZvsVDHZ8GlZaoxk= +cloud.google.com/go/policytroubleshooter v1.11.6/go.mod h1:jdjYGIveoYolk38Dm2JjS5mPkn8IjVqPsDHccTMu3mY= cloud.google.com/go/privatecatalog v0.9.5/go.mod h1:fVWeBOVe7uj2n3kWRGlUQqR/pOd450J9yZoOECcQqJk= +cloud.google.com/go/privatecatalog v0.10.7/go.mod h1:Fo/PF/B6m4A9vUYt0nEF1xd0U6Kk19/Je3eZGrQ6l60= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -154,24 +236,43 @@ cloud.google.com/go/pubsub v1.3.1 h1:ukjixP1wl0LpnZ6LWtZJ0mX5tBmjp1f8Sqer8Z2OMUU cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= cloud.google.com/go/pubsub v1.36.1/go.mod h1:iYjCa9EzWOoBiTdd4ps7QoMtMln5NwaZQpK1hbRfBDE= +cloud.google.com/go/pubsub v1.50.1/go.mod h1:6YVJv3MzWJUVdvQXG081sFvS0dWQOdnV+oTo++q/xFk= +cloud.google.com/go/pubsub/v2 v2.0.0/go.mod h1:0aztFxNzVQIRSZ8vUr79uH2bS3jwLebwK6q1sgEub+E= cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= +cloud.google.com/go/pubsublite v1.8.2/go.mod h1:4r8GSa9NznExjuLPEJlF1VjOPOpgf3IT6k8x/YgaOPI= cloud.google.com/go/recaptchaenterprise/v2 v2.9.2/go.mod h1:trwwGkfhCmp05Ll5MSJPXY7yvnO0p4v3orGANAFHAuU= +cloud.google.com/go/recaptchaenterprise/v2 v2.20.4/go.mod h1:3H8nb8j8N7Ss2eJ+zr+/H7gyorfzcxiDEtVBDvDjwDQ= cloud.google.com/go/recommendationengine v0.8.5/go.mod h1:A38rIXHGFvoPvmy6pZLozr0g59NRNREz4cx7F58HAsQ= +cloud.google.com/go/recommendationengine v0.9.6/go.mod h1:nZnjKJu1vvoxbmuRvLB5NwGuh6cDMMQdOLXTnkukUOE= cloud.google.com/go/recommender v1.12.1/go.mod h1:gf95SInWNND5aPas3yjwl0I572dtudMhMIG4ni8nr+0= +cloud.google.com/go/recommender v1.13.5/go.mod h1:v7x/fzk38oC62TsN5Qkdpn0eoMBh610UgArJtDIgH/E= cloud.google.com/go/redis v1.14.2/go.mod h1:g0Lu7RRRz46ENdFKQ2EcQZBAJ2PtJHJLuiiRuEXwyQw= +cloud.google.com/go/redis v1.18.2/go.mod h1:q6mPRhLiR2uLf584Lcl4tsiRn0xiFlu6fnJLwCORMtY= cloud.google.com/go/resourcemanager v1.9.5/go.mod h1:hep6KjelHA+ToEjOfO3garMKi/CLYwTqeAw7YiEI9x8= +cloud.google.com/go/resourcemanager v1.10.6/go.mod h1:VqMoDQ03W4yZmxzLPrB+RuAoVkHDS5tFUUQUhOtnRTg= cloud.google.com/go/resourcesettings v1.6.5/go.mod h1:WBOIWZraXZOGAgoR4ukNj0o0HiSMO62H9RpFi9WjP9I= +cloud.google.com/go/resourcesettings v1.8.3/go.mod h1:BzgfXFHIWOOmHe6ZV9+r3OWfpHJgnqXy8jqwx4zTMLw= cloud.google.com/go/retail v1.16.0/go.mod h1:LW7tllVveZo4ReWt68VnldZFWJRzsh9np+01J9dYWzE= +cloud.google.com/go/retail v1.24.0/go.mod h1:pvLFfRzTnqGf3yHNnIq4R+A5nfEy56SYE9optVPOuSk= cloud.google.com/go/run v1.3.4/go.mod h1:FGieuZvQ3tj1e9GnzXqrMABSuir38AJg5xhiYq+SF3o= +cloud.google.com/go/run v1.12.0/go.mod h1:/APJ89UqgGdIdaD1yaTiSYXozx3fNoqKR/cueDFRueI= cloud.google.com/go/scheduler v1.10.6/go.mod h1:pe2pNCtJ+R01E06XCDOJs1XvAMbv28ZsQEbqknxGOuE= +cloud.google.com/go/scheduler v1.11.7/go.mod h1:gqYs8ndLx2M5D0oMJh48aGS630YYvC432tHCnVWN13s= cloud.google.com/go/secretmanager v1.11.5/go.mod h1:eAGv+DaCHkeVyQi0BeXgAHOU0RdrMeZIASKc+S7VqH4= +cloud.google.com/go/secretmanager v1.15.0/go.mod h1:1hQSAhKK7FldiYw//wbR/XPfPc08eQ81oBsnRUHEvUc= cloud.google.com/go/security v1.15.5/go.mod h1:KS6X2eG3ynWjqcIX976fuToN5juVkF6Ra6c7MPnldtc= +cloud.google.com/go/security v1.19.1/go.mod h1:+T4yyeDXqBYESnCzswqbq/Oip+IYkIrTfRF4UmeT4Bk= cloud.google.com/go/securitycenter v1.24.4/go.mod h1:PSccin+o1EMYKcFQzz9HMMnZ2r9+7jbc+LvPjXhpwcU= +cloud.google.com/go/securitycenter v1.37.0/go.mod h1:DdQi6OEzw1rmLtPpqtUx6bqnQq8ZdCVuG9eZRYz2QAE= cloud.google.com/go/servicedirectory v1.11.4/go.mod h1:Bz2T9t+/Ehg6x+Y7Ycq5xiShYLD96NfEsWNHyitj1qM= +cloud.google.com/go/servicedirectory v1.12.6/go.mod h1:OojC1KhOMDYC45oyTn3Mup08FY/S0Kj7I58dxUMMTpg= cloud.google.com/go/shell v1.7.5/go.mod h1:hL2++7F47/IfpfTO53KYf1EC+F56k3ThfNEXd4zcuiE= +cloud.google.com/go/shell v1.8.6/go.mod h1:GNbTWf1QA/eEtYa+kWSr+ef/XTCDkUzRpV3JPw0LqSk= cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= cloud.google.com/go/spanner v1.56.0/go.mod h1:DndqtUKQAt3VLuV2Le+9Y3WTnq5cNKrnLb/Piqcj+h0= +cloud.google.com/go/spanner v1.85.0/go.mod h1:9zhmtOEoYV06nE4Orbin0dc/ugHzZW9yXuvaM61rpxs= cloud.google.com/go/speech v1.21.1/go.mod h1:E5GHZXYQlkqWQwY5xRSLHw2ci5NMQNG52FfMU1aZrIA= +cloud.google.com/go/speech v1.28.0/go.mod h1:hJf6oa+1rzCW/CeDE/qCXedV20B2TXEUje5iaGwW+JI= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= @@ -186,22 +287,37 @@ cloud.google.com/go/storage v1.53.0/go.mod h1:7/eO2a/srr9ImZW9k5uufcNahT2+fPb8w5 cloud.google.com/go/storage v1.55.0/go.mod h1:ztSmTTwzsdXe5syLVS0YsbFxXuvEmEyZj7v7zChEmuY= cloud.google.com/go/storage v1.56.0/go.mod h1:Tpuj6t4NweCLzlNbw9Z9iwxEkrSem20AetIeH/shgVU= cloud.google.com/go/storagetransfer v1.10.4/go.mod h1:vef30rZKu5HSEf/x1tK3WfWrL0XVoUQN/EPDRGPzjZs= +cloud.google.com/go/storagetransfer v1.13.0/go.mod h1:+aov7guRxXBYgR3WCqedkyibbTICdQOiXOdpPcJCKl8= cloud.google.com/go/talent v1.6.6/go.mod h1:y/WQDKrhVz12WagoarpAIyKKMeKGKHWPoReZ0g8tseQ= +cloud.google.com/go/talent v1.8.3/go.mod h1:oD3/BilJpJX8/ad8ZUAxlXHCslTg2YBbafFH3ciZSLQ= cloud.google.com/go/texttospeech v1.7.5/go.mod h1:tzpCuNWPwrNJnEa4Pu5taALuZL4QRRLcb+K9pbhXT6M= +cloud.google.com/go/texttospeech v1.14.0/go.mod h1:l25ywjIgXS+mSE2f5LQdXdU7r3MOLwVOGaYZQMiYIWE= cloud.google.com/go/tpu v1.6.5/go.mod h1:P9DFOEBIBhuEcZhXi+wPoVy/cji+0ICFi4TtTkMHSSs= +cloud.google.com/go/tpu v1.8.3/go.mod h1:Do6Gq+/Jx6Xs3LcY2WhHyGwKDKVw++9jIJp+X+0rxRE= cloud.google.com/go/trace v1.10.5/go.mod h1:9hjCV1nGBCtXbAE4YK7OqJ8pmPYSxPA0I67JwRd5s3M= +cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI= cloud.google.com/go/translate v1.10.1/go.mod h1:adGZcQNom/3ogU65N9UXHOnnSvjPwA/jKQUMnsYXOyk= cloud.google.com/go/translate v1.10.3 h1:g+B29z4gtRGsiKDoTF+bNeH25bLRokAaElygX2FcZkE= cloud.google.com/go/translate v1.10.3/go.mod h1:GW0vC1qvPtd3pgtypCv4k4U8B7EdgK9/QEF2aJEUovs= +cloud.google.com/go/translate v1.12.6/go.mod h1:nB3AXuX+iHbV8ZURmElcW85qkEDWZw68sf4kqMT/E5o= cloud.google.com/go/video v1.20.4/go.mod h1:LyUVjyW+Bwj7dh3UJnUGZfyqjEto9DnrvTe1f/+QrW0= +cloud.google.com/go/video v1.26.0/go.mod h1:iqsrblPUfkxvyH31rnS02Z0dp9p5lySdq7+I0XzozQI= cloud.google.com/go/videointelligence v1.11.5/go.mod h1:/PkeQjpRponmOerPeJxNPuxvi12HlW7Em0lJO14FC3I= +cloud.google.com/go/videointelligence v1.12.6/go.mod h1:/l34WMndN5/bt04lHodxiYchLVuWPQjCU6SaiTswrIw= cloud.google.com/go/vision/v2 v2.8.0/go.mod h1:ocqDiA2j97pvgogdyhoxiQp2ZkDCyr0HWpicywGGRhU= +cloud.google.com/go/vision/v2 v2.9.5/go.mod h1:1SiNZPpypqZDbOzU052ZYRiyKjwOcyqgGgqQCI/nlx8= cloud.google.com/go/vmmigration v1.7.5/go.mod h1:pkvO6huVnVWzkFioxSghZxIGcsstDvYiVCxQ9ZH3eYI= +cloud.google.com/go/vmmigration v1.8.6/go.mod h1:uZ6/KXmekwK3JmC8PzBM/cKQmq404TTfWtThF6bbf0U= cloud.google.com/go/vmwareengine v1.1.1/go.mod h1:nMpdsIVkUrSaX8UvmnBhzVzG7PPvNYc5BszcvIVudYs= +cloud.google.com/go/vmwareengine v1.3.5/go.mod h1:QuVu2/b/eo8zcIkxBYY5QSwiyEcAy6dInI7N+keI+Jg= cloud.google.com/go/vpcaccess v1.7.5/go.mod h1:slc5ZRvvjP78c2dnL7m4l4R9GwL3wDLcpIWz6P/ziig= +cloud.google.com/go/vpcaccess v1.8.6/go.mod h1:61yymNplV1hAbo8+kBOFO7Vs+4ZHYI244rSFgmsHC6E= cloud.google.com/go/webrisk v1.9.5/go.mod h1:aako0Fzep1Q714cPEM5E+mtYX8/jsfegAuS8aivxy3U= +cloud.google.com/go/webrisk v1.11.1/go.mod h1:+9SaepGg2lcp1p0pXuHyz3R2Yi2fHKKb4c1Q9y0qbtA= cloud.google.com/go/websecurityscanner v1.6.5/go.mod h1:QR+DWaxAz2pWooylsBF854/Ijvuoa3FCyS1zBa1rAVQ= +cloud.google.com/go/websecurityscanner v1.7.6/go.mod h1:ucaaTO5JESFn5f2pjdX01wGbQ8D6h79KHrmO2uGZeiY= cloud.google.com/go/workflows v1.12.4/go.mod h1:yQ7HUqOkdJK4duVtMeBCAOPiN1ZF1E9pAMX51vpwB/w= +cloud.google.com/go/workflows v1.14.2/go.mod h1:5nqKjMD+MsJs41sJhdVrETgvD5cOK3hUcAs8ygqYvXQ= contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3 h1:hJiie5Bf3QucGRa4ymsAUOxyhYwGEz1xrsVk0P8erlw= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= @@ -234,8 +350,6 @@ github.com/AdguardTeam/golibs v0.32.11/go.mod h1:LXr0gqqZuVpt+L+bP3Nnr0/CecLmm3r github.com/AdguardTeam/gomitmproxy v0.2.0 h1:rvCOf17pd1/CnMyMQW891zrEiIQBpQ8cIGjKN9pinUU= github.com/AdguardTeam/gomitmproxy v0.2.1 h1:p9gr8Er1TYvf+7ic81Ax1sZ62UNCsMTZNbm7tC59S9o= github.com/AdguardTeam/gomitmproxy v0.2.1/go.mod h1:Qdv0Mktnzer5zpdpi5rAwixNJzW2FN91LjKJCkVbYGU= -github.com/AdguardTeam/urlfilter v0.21.0 h1:ThIxiP7yoaXt8JTEroGQeU5ftQSoFpUq+t1L+TIx2pA= -github.com/AdguardTeam/urlfilter v0.21.0/go.mod h1:xoZ3AF5qpE9ngbbeSShY9hgVeyHtm9MdH5xH1u714Wg= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0= @@ -370,6 +484,7 @@ github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42 h1:Om6kYQYDUk5wWbT0t0q github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f h1:C5bqEmzEPLsHm9Mv73lSE9e9bKV23aB1vxOsmZrkl3k= github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls= github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= @@ -461,6 +576,7 @@ github.com/go-jose/go-jose/v4 v4.0.4 h1:VsjPI33J0SB9vQM6PLmNjoHqMQNGPiZ0rHL7Ni7Q github.com/go-jose/go-jose/v4 v4.0.4/go.mod h1:NKb5HO1EZccyMpiZNbdUw/14tiXNyUJh188dfnMCAfc= github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE= github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA= +github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI= github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= @@ -1174,6 +1290,7 @@ go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzK go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= diff --git a/internal/access/access_test.go b/internal/access/access_test.go index 55b9a47..5aee4ff 100644 --- a/internal/access/access_test.go +++ b/internal/access/access_test.go @@ -139,7 +139,9 @@ func BenchmarkGlobal_IsBlockedHost(b *testing.B) { for _, tc := range testCases { b.Run(tc.name, func(b *testing.B) { - var blocked bool + // Warmup to fill the pools and the slices. + blocked := global.IsBlockedHost(tc.host, tc.qt) + tc.want(b, blocked) b.ReportAllocs() for b.Loop() { @@ -151,19 +153,18 @@ func BenchmarkGlobal_IsBlockedHost(b *testing.B) { } // Most recent results: - // // goos: linux // goarch: amd64 // pkg: github.com/AdguardTeam/AdGuardDNS/internal/access // cpu: AMD Ryzen 7 PRO 4750U with Radeon Graphics - // BenchmarkGlobal_IsBlockedHost/pass-16 2313513 515.0 ns/op 16 B/op 1 allocs/op - // BenchmarkGlobal_IsBlockedHost/blocked_domain_a-16 1604049 683.4 ns/op 24 B/op 1 allocs/op - // BenchmarkGlobal_IsBlockedHost/blocked_domain_https-16 1981204 597.7 ns/op 24 B/op 1 allocs/op - // BenchmarkGlobal_IsBlockedHost/uppercase_domain-16 2093197 590.5 ns/op 24 B/op 1 allocs/op - // BenchmarkGlobal_IsBlockedHost/pass_qt-16 1961065 653.3 ns/op 24 B/op 1 allocs/op - // BenchmarkGlobal_IsBlockedHost/block_qt-16 768783 1567 ns/op 24 B/op 1 allocs/op - // BenchmarkGlobal_IsBlockedHost/allowlist_block-16 759159 1890 ns/op 32 B/op 1 allocs/op - // BenchmarkGlobal_IsBlockedHost/allowlist_test-16 371722 3170 ns/op 32 B/op 1 allocs/op + // BenchmarkGlobal_IsBlockedHost/pass-16 3085917 384.7 ns/op 16 B/op 1 allocs/op + // BenchmarkGlobal_IsBlockedHost/blocked_domain_a-16 2521102 475.8 ns/op 24 B/op 1 allocs/op + // BenchmarkGlobal_IsBlockedHost/blocked_domain_https-16 2520067 476.0 ns/op 24 B/op 1 allocs/op + // BenchmarkGlobal_IsBlockedHost/uppercase_domain-16 2445049 490.7 ns/op 24 B/op 1 allocs/op + // BenchmarkGlobal_IsBlockedHost/pass_qt-16 2228846 535.7 ns/op 24 B/op 1 allocs/op + // BenchmarkGlobal_IsBlockedHost/block_qt-16 822028 1375 ns/op 24 B/op 1 allocs/op + // BenchmarkGlobal_IsBlockedHost/allowlist_block-16 765939 1530 ns/op 32 B/op 1 allocs/op + // BenchmarkGlobal_IsBlockedHost/allowlist_test-16 448230 2677 ns/op 32 B/op 1 allocs/op } func BenchmarkGlobal_IsBlockedIP(b *testing.B) { @@ -199,11 +200,10 @@ func BenchmarkGlobal_IsBlockedIP(b *testing.B) { }) // Most recent results: - // // goos: linux // goarch: amd64 // pkg: github.com/AdguardTeam/AdGuardDNS/internal/access // cpu: AMD Ryzen 7 PRO 4750U with Radeon Graphics - // BenchmarkGlobal_IsBlockedIP/pass-16 100000000 10.18 ns/op 0 B/op 0 allocs/op - // BenchmarkGlobal_IsBlockedIP/block-16 141876058 8.545 ns/op 0 B/op 0 allocs/op + // BenchmarkGlobal_IsBlockedIP/pass-16 152113686 7.893 ns/op 0 B/op 0 allocs/op + // BenchmarkGlobal_IsBlockedIP/block-16 156828942 7.659 ns/op 0 B/op 0 allocs/op } diff --git a/internal/access/engine_internal_test.go b/internal/access/engine_internal_test.go index 0165777..589d939 100644 --- a/internal/access/engine_internal_test.go +++ b/internal/access/engine_internal_test.go @@ -10,6 +10,7 @@ import ( "github.com/AdguardTeam/golibs/testutil" "github.com/miekg/dns" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) // testTimeout is the common timeout for tests. @@ -95,16 +96,12 @@ func TestBlockedHostEngine_IsBlocked_concurrent(t *testing.T) { wg := &sync.WaitGroup{} for i := range routinesLimit { - wg.Add(1) - host := fmt.Sprintf("%d.%s", i, "block.test") - go func() { - defer wg.Done() - + wg.Go(func() { req := dnsservertest.NewReq(host, dns.TypeA, dns.ClassINET) assert.True(t, engine.isBlocked(testutil.ContextWithTimeout(t, testTimeout), req)) - }() + }) } wg.Wait() @@ -120,35 +117,38 @@ func BenchmarkBlockedHostEngine_IsBlocked(b *testing.B) { b.Run("pass", func(b *testing.B) { req := dnsservertest.NewReq("pass.test", dns.TypeA, dns.ClassINET) - var blocked bool + // Warmup to fill the pools and the slices. + blocked := engine.isBlocked(ctx, req) + require.False(b, blocked) b.ReportAllocs() for b.Loop() { blocked = engine.isBlocked(ctx, req) } - assert.False(b, blocked) + require.False(b, blocked) }) b.Run("block", func(b *testing.B) { req := dnsservertest.NewReq("block.test", dns.TypeA, dns.ClassINET) - var blocked bool + // Warmup to fill the pools and the slices. + blocked := engine.isBlocked(ctx, req) + require.True(b, blocked) b.ReportAllocs() for b.Loop() { blocked = engine.isBlocked(ctx, req) } - assert.True(b, blocked) + require.True(b, blocked) }) // Most recent results: - // // goos: linux // goarch: amd64 // pkg: github.com/AdguardTeam/AdGuardDNS/internal/access // cpu: AMD Ryzen 7 PRO 4750U with Radeon Graphics - // BenchmarkBlockedHostEngine_IsBlocked/pass-16 3362199 369.1 ns/op 16 B/op 1 allocs/op - // BenchmarkBlockedHostEngine_IsBlocked/block-16 2299890 510.6 ns/op 24 B/op 1 allocs/op + // BenchmarkBlockedHostEngine_IsBlocked/pass-16 3750295 317.8 ns/op 16 B/op 1 allocs/op + // BenchmarkBlockedHostEngine_IsBlocked/block-16 3407104 350.2 ns/op 24 B/op 1 allocs/op } diff --git a/internal/access/profile_test.go b/internal/access/profile_test.go index f692509..f76bf59 100644 --- a/internal/access/profile_test.go +++ b/internal/access/profile_test.go @@ -385,8 +385,11 @@ func BenchmarkDefaultProfile_IsBlocked(b *testing.B) { for _, bc := range benchCases { b.Run(bc.name, func(b *testing.B) { + // Warmup to fill the pools and the slices. + blocked := a.IsBlocked(ctx, bc.req, passAddrPort, nil) + bc.want(b, blocked) + b.ReportAllocs() - var blocked bool for b.Loop() { blocked = a.IsBlocked(ctx, bc.req, passAddrPort, nil) } @@ -396,11 +399,10 @@ func BenchmarkDefaultProfile_IsBlocked(b *testing.B) { } // Most recent results: - // // goos: linux // goarch: amd64 // pkg: github.com/AdguardTeam/AdGuardDNS/internal/access // cpu: AMD Ryzen 7 PRO 4750U with Radeon Graphics - // BenchmarkDefaultProfile_IsBlocked/pass-16 2679700 468.8 ns/op 16 B/op 1 allocs/op - // BenchmarkDefaultProfile_IsBlocked/block-16 2081113 576.4 ns/op 24 B/op 1 allocs/op + // BenchmarkDefaultProfile_IsBlocked/pass-16 2638284 452.4 ns/op 16 B/op 1 allocs/op + // BenchmarkDefaultProfile_IsBlocked/block-16 2224564 539.1 ns/op 24 B/op 1 allocs/op } diff --git a/internal/access/standardaccess_test.go b/internal/access/standardaccess_test.go index 9e6df63..b939313 100644 --- a/internal/access/standardaccess_test.go +++ b/internal/access/standardaccess_test.go @@ -8,7 +8,7 @@ import ( "github.com/AdguardTeam/AdGuardDNS/internal/dnsserver/dnsservertest" "github.com/AdguardTeam/golibs/testutil" "github.com/miekg/dns" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func BenchmarkStandardBlocker_IsBlocked(b *testing.B) { @@ -24,35 +24,38 @@ func BenchmarkStandardBlocker_IsBlocked(b *testing.B) { b.Run("pass", func(b *testing.B) { req := dnsservertest.NewReq("pass.test", dns.TypeA, dns.ClassINET) - var blocked bool + // Warmup to fill the pools and the slices. + blocked := blocker.IsBlocked(ctx, req, remoteAddr, nil) + require.False(b, blocked) b.ReportAllocs() for b.Loop() { blocked = blocker.IsBlocked(ctx, req, remoteAddr, nil) } - assert.False(b, blocked) + require.False(b, blocked) }) b.Run("block", func(b *testing.B) { req := dnsservertest.NewReq("block.test", dns.TypeA, dns.ClassINET) - var blocked bool + // Warmup to fill the pools and the slices. + blocked := blocker.IsBlocked(ctx, req, remoteAddr, nil) + require.True(b, blocked) b.ReportAllocs() for b.Loop() { blocked = blocker.IsBlocked(ctx, req, remoteAddr, nil) } - assert.True(b, blocked) + require.True(b, blocked) }) // Most recent results: - // // goos: linux // goarch: amd64 // pkg: github.com/AdguardTeam/AdGuardDNS/internal/access // cpu: AMD Ryzen 7 PRO 4750U with Radeon Graphics - // BenchmarkStandardBlocker_IsBlocked/pass-16 3009312 378.2 ns/op 16 B/op 1 allocs/op - // BenchmarkStandardBlocker_IsBlocked/block-16 2518006 421.9 ns/op 24 B/op 1 allocs/op + // BenchmarkStandardBlocker_IsBlocked/pass-16 3568975 335.4 ns/op 16 B/op 1 allocs/op + // BenchmarkStandardBlocker_IsBlocked/block-16 3286392 364.1 ns/op 24 B/op 1 allocs/op } diff --git a/internal/agd/customdomain.go b/internal/agd/customdomain.go index 42e88b4..c35cd08 100644 --- a/internal/agd/customdomain.go +++ b/internal/agd/customdomain.go @@ -47,9 +47,7 @@ type CustomDomainStateCurrent struct { // CertName is the unique name for fetching the actual certificate data. If // [CustomDomainStateCurrent.Enabled] is true, it must not be empty. - // - // TODO(a.garipov): Make a newtype. - CertName string + CertName CertificateName // Enabled shows if this certificate is enabled. Enabled bool diff --git a/internal/agd/tls.go b/internal/agd/tls.go new file mode 100644 index 0000000..7ef6d40 --- /dev/null +++ b/internal/agd/tls.go @@ -0,0 +1,53 @@ +package agd + +import ( + "fmt" + + "github.com/AdguardTeam/golibs/errors" + "github.com/AdguardTeam/golibs/validate" +) + +// maxCertificateNameLen is the maximum length of a [CertificateName]. +const maxCertificateNameLen = 32 + +// CertificateName is the unique name identifying the TLS certificate. +type CertificateName string + +// NewCertificateName creates a new CertificateName from the given string. +func NewCertificateName(str string) (name CertificateName, err error) { + if str == "" { + return "", errors.ErrEmptyValue + } + + err = validate.InRange("length", len(str), 1, maxCertificateNameLen) + if err != nil { + // Don't wrap the error, since it's informative enough as is. + return "", err + } + + for i, r := range str { + // Don't use [agdvalidate.FirstNonIDRune] as it allows invalid symbols + // for file names. + if !isValidCertNameRune(r) { + return "", fmt.Errorf("at index %d: bad symbol: %q", i, r) + } + } + + return CertificateName(str), nil +} + +// isValidCertNameRune returns true if the given rune is valid to be used in a +// [CertificateName]. It essentially allows alphanumeric symbols, underscores, +// and hyphens. +func isValidCertNameRune(r rune) (ok bool) { + switch { + case + r >= 'a' && r <= 'z', + r >= 'A' && r <= 'Z', + r >= '0' && r <= '9', + r == '_', r == '-': + return true + default: + return false + } +} diff --git a/internal/agd/tls_test.go b/internal/agd/tls_test.go new file mode 100644 index 0000000..1384d60 --- /dev/null +++ b/internal/agd/tls_test.go @@ -0,0 +1,51 @@ +package agd_test + +import ( + "testing" + + "github.com/AdguardTeam/AdGuardDNS/internal/agd" + "github.com/AdguardTeam/golibs/testutil" +) + +func TestNewCertificateName(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + value string + wantErrMsg string + }{{ + name: "empty", + value: "", + wantErrMsg: "empty value", + }, { + name: "bad_symbol", + value: "not valid", + wantErrMsg: "at index 3: bad symbol: ' '", + }, { + name: "bad_base_name", + value: "bad/base_name", + wantErrMsg: "at index 3: bad symbol: '/'", + }, { + name: "too_long", + value: "this_is_a_very_long_certificate_name", + wantErrMsg: "length: out of range: must be no greater than 32, got 36", + }, { + name: "ok", + value: "ok_cert_name", + wantErrMsg: "", + }, { + name: "ok_numeric", + value: "1234567890", + wantErrMsg: "", + }} + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + _, err := agd.NewCertificateName(tc.value) + testutil.AssertErrorMsg(t, tc.wantErrMsg, err) + }) + } +} diff --git a/internal/agdtest/interface.go b/internal/agdtest/interface.go index 43d7bd6..2322b16 100644 --- a/internal/agdtest/interface.go +++ b/internal/agdtest/interface.go @@ -270,34 +270,52 @@ var _ geoip.Interface = (*GeoIP)(nil) // GeoIP is a [geoip.Interface] for tests. type GeoIP struct { - OnData func(host string, ip netip.Addr) (l *geoip.Location, err error) - OnSubnetByLocation func(l *geoip.Location, fam netutil.AddrFamily) (n netip.Prefix, err error) + OnData func( + сtx context.Context, + host string, + ip netip.Addr, + ) (l *geoip.Location, err error) + OnSubnetByLocation func( + ctx context.Context, + l *geoip.Location, + fam netutil.AddrFamily, + ) (n netip.Prefix, err error) } // Data implements the [geoip.Interface] interface for *GeoIP. -func (g *GeoIP) Data(host string, ip netip.Addr) (l *geoip.Location, err error) { - return g.OnData(host, ip) +func (g *GeoIP) Data( + ctx context.Context, + host string, + ip netip.Addr, +) (l *geoip.Location, err error) { + return g.OnData(ctx, host, ip) } // SubnetByLocation implements the [geoip.Interface] interface for *GeoIP. func (g *GeoIP) SubnetByLocation( + ctx context.Context, l *geoip.Location, fam netutil.AddrFamily, ) (n netip.Prefix, err error) { - return g.OnSubnetByLocation(l, fam) + return g.OnSubnetByLocation(ctx, l, fam) } // NewGeoIP returns a new *GeoIP all methods of which panic. func NewGeoIP() (c *GeoIP) { return &GeoIP{ - OnData: func(host string, ip netip.Addr) (l *geoip.Location, err error) { - panic(testutil.UnexpectedCall(host, ip)) + OnData: func( + ctx context.Context, + host string, + ip netip.Addr, + ) (l *geoip.Location, err error) { + panic(testutil.UnexpectedCall(ctx, host, ip)) }, OnSubnetByLocation: func( + ctx context.Context, l *geoip.Location, fam netutil.AddrFamily, ) (n netip.Prefix, err error) { - panic(testutil.UnexpectedCall(l, fam)) + panic(testutil.UnexpectedCall(ctx, l, fam)) }, } } diff --git a/internal/backendpb/customdomain.go b/internal/backendpb/customdomain.go index c295002..ca776d4 100644 --- a/internal/backendpb/customdomain.go +++ b/internal/backendpb/customdomain.go @@ -7,6 +7,7 @@ import ( "net/url" "time" + "github.com/AdguardTeam/AdGuardDNS/internal/agd" "github.com/AdguardTeam/AdGuardDNS/internal/tlsconfig" "github.com/AdguardTeam/golibs/timeutil" ) @@ -76,7 +77,7 @@ var _ tlsconfig.CustomDomainStorage = (*CustomDomainStorage)(nil) // *CustomDomainStorage. func (s *CustomDomainStorage) CertificateData( ctx context.Context, - name string, + name agd.CertificateName, ) (cert, key []byte, err error) { start := s.clock.Now() defer func() { s.metrics.ObserveRequest(ctx, time.Since(start), err) }() @@ -84,7 +85,7 @@ func (s *CustomDomainStorage) CertificateData( s.logger.DebugContext(ctx, "getting cert data", "name", name) req := &CustomDomainCertificateRequest{ - CertName: name, + CertName: string(name), } ctx = ctxWithAuthentication(ctx, s.apiKey) diff --git a/internal/backendpb/profile.go b/internal/backendpb/profile.go index ff000cf..38ee31d 100644 --- a/internal/backendpb/profile.go +++ b/internal/backendpb/profile.go @@ -248,8 +248,14 @@ func (x *CustomDomain) toInternal() (c *agd.CustomDomainConfig, err error) { switch s := x.State.(type) { case *CustomDomain_Current_: + var certName agd.CertificateName + certName, err = agd.NewCertificateName(s.Current.CertName) + if err != nil { + return nil, fmt.Errorf("certificate name: %q: %w", s.Current.CertName, err) + } + st := &agd.CustomDomainStateCurrent{ - CertName: s.Current.CertName, + CertName: certName, NotBefore: s.Current.NotBefore.AsTime(), NotAfter: s.Current.NotAfter.AsTime(), Enabled: s.Current.Enabled, diff --git a/internal/cmd/additional.go b/internal/cmd/additional.go index ea71537..bfefeba 100644 --- a/internal/cmd/additional.go +++ b/internal/cmd/additional.go @@ -20,7 +20,7 @@ var _ validate.Interface = additionalInfo(nil) func (c additionalInfo) Validate() (err error) { var errs []error for _, k := range slices.Sorted(maps.Keys(c)) { - if !model.LabelName(k).IsValid() { + if !model.LegacyValidation.IsValidLabelName(k) { errs = append(errs, fmt.Errorf( "prometheus labels must match %s, got %q", model.LabelNameRE, diff --git a/internal/cmd/builder.go b/internal/cmd/builder.go index f0aeafe..49d7957 100644 --- a/internal/cmd/builder.go +++ b/internal/cmd/builder.go @@ -50,6 +50,7 @@ import ( "github.com/AdguardTeam/golibs/netutil/urlutil" "github.com/AdguardTeam/golibs/osutil" "github.com/AdguardTeam/golibs/service" + "github.com/AdguardTeam/golibs/syncutil" "github.com/AdguardTeam/golibs/timeutil" "github.com/c2h5oh/datasize" "github.com/prometheus/client_golang/prometheus" @@ -200,6 +201,32 @@ func newBuilder(c *builderConfig) (b *builder) { } } +// initCrashReporter initializes the crash reporter. +func (b *builder) initCrashReporter(ctx context.Context) (err error) { + crashRep, err := newCrashReporter(&crashReporterConfig{ + logger: b.baseLogger.With(slogutil.KeyPrefix, "crash_reporter"), + dirPath: b.env.CrashOutputDir, + prefix: b.env.CrashOutputPrefix, + enabled: bool(b.env.CrashOutputEnabled), + }) + if err != nil { + // Don't wrap the error, because it's informative enough as is. + return err + } + + err = crashRep.Start(ctx) + if err != nil { + // Don't wrap the error, because it's informative enough as is. + return err + } + + b.sigHdlr.AddService(crashRep) + + b.logger.DebugContext(ctx, "initialized crash reporter") + + return nil +} + // startGeoIP starts the concurrent initialization of the GeoIP database. The // GeoIP initialization is started early and concurrently, because it takes // time. Later methods wait for the completion and continue with GeoIP. @@ -880,11 +907,19 @@ func (b *builder) initQueryLog(ctx context.Context) (err error) { return fmt.Errorf("registering querylog metrics: %w", err) } + var sema syncutil.Semaphore + if b.env.QueryLogSemaphoreEnabled { + sema = syncutil.NewChanSemaphore(b.env.QueryLogSemaphoreLimit) + } else { + sema = syncutil.EmptySemaphore{} + } + b.queryLog = querylog.NewFileSystem(&querylog.FileSystemConfig{ - Logger: b.baseLogger.With(slogutil.KeyPrefix, "querylog"), - Path: b.env.QueryLogPath, - Metrics: mtrc, - RandSeed: randutil.MustNewSeed(), + Logger: b.baseLogger.With(slogutil.KeyPrefix, "querylog"), + Path: b.env.QueryLogPath, + Metrics: mtrc, + Semaphore: sema, + RandSeed: randutil.MustNewSeed(), }) b.logger.DebugContext(ctx, "initialized file-based query log") diff --git a/internal/cmd/cmd.go b/internal/cmd/cmd.go index e3bb189..ccb691f 100644 --- a/internal/cmd/cmd.go +++ b/internal/cmd/cmd.go @@ -65,6 +65,8 @@ func Main(plugins *plugin.Registry) { defer reportPanics(ctx, errColl, mainLogger) + setMaxThreads(ctx, mainLogger, envs.MaxThreads) + c := errors.Must(parseConfig(envs.ConfPath)) errors.Check(c.Validate()) @@ -84,6 +86,8 @@ func Main(plugins *plugin.Registry) { profilesEnabled: profilesEnabled, }) + errors.Check(b.initCrashReporter(ctx)) + errors.Check(experiment.Init(baseLogger, b.promRegisterer)) errors.Check(metrics.SetAdditionalInfo(b.promRegisterer, c.AdditionalMetricsInfo)) diff --git a/internal/cmd/crash.go b/internal/cmd/crash.go new file mode 100644 index 0000000..4220f6f --- /dev/null +++ b/internal/cmd/crash.go @@ -0,0 +1,145 @@ +package cmd + +import ( + "context" + "fmt" + "log/slog" + "os" + "runtime/debug" + "time" + + "github.com/AdguardTeam/golibs/errors" + "github.com/AdguardTeam/golibs/service" +) + +// crashReporter is a helper that sets a file for Go runtime crashes and +// unhandled panics. +type crashReporter struct { + file *os.File + logger *slog.Logger + + dirPath string + pattern string +} + +// crashReporterConfig is the configuration structure for a [crashReporter]. +type crashReporterConfig struct { + // logger is used to log the operation of the crash reporter. If enabled is + // true, logger must not be nil. + logger *slog.Logger + + // dirPath is the path to the directory where the crash report is created. + // If enabled is true, dirPath should not be nil and should point to a + // directory. + dirPath string + + // prefix is the prefix to use when creating the file. If enabled is true, + // prefix should not be nil. + prefix string + + // enabled shows if a crash report file should be created. + enabled bool +} + +// newCrashReporter returns a new properly initialized crash reporter. c must +// not be nil and must be valid. +// +// TODO(a.garipov): Consider moving to golibs. +func newCrashReporter(c *crashReporterConfig) (r *crashReporter, err error) { + defer func() { err = errors.Annotate(err, "crash reporter: %w") }() + + if !c.enabled { + return nil, nil + } + + err = validateDir(c.dirPath) + if err != nil { + // Don't wrap the error, because it's informative enough as is, and + // there is already errors.Annotate here. + return nil, err + } + + pat := fmt.Sprintf( + "%s_%s_%07d_*.txt", + c.prefix, + time.Now().Format("20060102150405"), + os.Getpid(), + ) + + return &crashReporter{ + logger: c.logger, + dirPath: c.dirPath, + pattern: pat, + }, nil +} + +// type check +var _ service.Interface = (*crashReporter)(nil) + +// Start implements the [service.Interface] for *crashReporter. If r is nil, +// err is nil. +func (r *crashReporter) Start(ctx context.Context) (err error) { + if r == nil { + return nil + } + + defer func() { err = errors.Annotate(err, "starting crash reporter: %w") }() + + r.logger.InfoContext(ctx, "creating crash output file") + + r.file, err = os.CreateTemp(r.dirPath, r.pattern) + if err != nil { + // Don't wrap the error, because it's informative enough as is, and + // there is already errors.Annotate here. + return err + } + + r.logger = r.logger.With("path", r.file.Name()) + + r.logger.InfoContext(ctx, "setting crash output") + + err = debug.SetCrashOutput(r.file, debug.CrashOptions{}) + if err != nil { + return fmt.Errorf("setting crash output: %w", err) + } + + r.logger.DebugContext(ctx, "set crash output") + + return nil +} + +// Shutdown implements the [service.Interface] for *crashReporter. If r is nil, +// err is nil. +func (r *crashReporter) Shutdown(ctx context.Context) (err error) { + if r == nil { + return nil + } + + r.logger.InfoContext(ctx, "closing crash output") + + s, err := r.file.Stat() + if err != nil { + return fmt.Errorf("getting stat of crash file: %w", err) + } + + if s.Size() > 0 { + r.logger.InfoContext(ctx, "crash output is not empty; not removing") + + return nil + } + + name := r.file.Name() + err = r.file.Close() + if err != nil { + return fmt.Errorf("closing crash file: %w", err) + } + + r.logger.InfoContext(ctx, "crash output is empty; removing") + + err = os.Remove(name) + if err != nil { + return fmt.Errorf("removing crash file: %w", err) + } + + return nil +} diff --git a/internal/cmd/env.go b/internal/cmd/env.go index a7681c2..cde9b27 100644 --- a/internal/cmd/env.go +++ b/internal/cmd/env.go @@ -55,6 +55,8 @@ type environment struct { BackendRateLimitAPIKey string `env:"BACKEND_RATELIMIT_API_KEY"` BillStatAPIKey string `env:"BILLSTAT_API_KEY"` ConfPath string `env:"CONFIG_PATH" envDefault:"./config.yaml"` + CrashOutputDir string `env:"CRASH_OUTPUT_DIR"` + CrashOutputPrefix string `env:"CRASH_OUTPUT_PREFIX" envDefault:"agdns"` CustomDomainsAPIKey string `env:"CUSTOM_DOMAINS_API_KEY"` CustomDomainsCachePath string `env:"CUSTOM_DOMAINS_CACHE_PATH"` DNSCheckKVType string `env:"DNSCHECK_KV_TYPE"` @@ -94,17 +96,22 @@ type environment struct { // TODO(a.garipov): Rename to DNSCHECK_CACHE_KV_COUNT? DNSCheckCacheKVSize int `env:"DNSCHECK_CACHE_KV_SIZE"` + MaxThreads int `env:"MAX_THREADS"` + + QueryLogSemaphoreLimit uint `env:"QUERYLOG_SEMAPHORE_LIMIT"` ListenPort uint16 `env:"LISTEN_PORT" envDefault:"8181"` Verbosity uint8 `env:"VERBOSE" envDefault:"0"` AdultBlockingEnabled strictBool `env:"ADULT_BLOCKING_ENABLED" envDefault:"1"` + CrashOutputEnabled strictBool `env:"CRASH_OUTPUT_ENABLED" envDefault:"0"` CustomDomainsEnabled strictBool `env:"CUSTOM_DOMAINS_ENABLED" envDefault:"1"` LogTimestamp strictBool `env:"LOG_TIMESTAMP" envDefault:"1"` NewRegDomainsEnabled strictBool `env:"NEW_REG_DOMAINS_ENABLED" envDefault:"1"` SafeBrowsingEnabled strictBool `env:"SAFE_BROWSING_ENABLED" envDefault:"1"` BlockedServiceEnabled strictBool `env:"BLOCKED_SERVICE_ENABLED" envDefault:"1"` + QueryLogSemaphoreEnabled strictBool `env:"QUERYLOG_SEMAPHORE_ENABLED"` GeneralSafeSearchEnabled strictBool `env:"GENERAL_SAFE_SEARCH_ENABLED" envDefault:"1"` YoutubeSafeSearchEnabled strictBool `env:"YOUTUBE_SAFE_SEARCH_ENABLED" envDefault:"1"` WebStaticDirEnabled strictBool `env:"WEB_STATIC_DIR_ENABLED" envDefault:"0"` @@ -126,7 +133,9 @@ var _ validate.Interface = (*environment)(nil) // Validate implements the [validate.Interface] interface for *environment. func (envs *environment) Validate() (err error) { - var errs []error + errs := []error{ + validate.NotNegative("MAX_THREADS", envs.MaxThreads), + } errs = envs.validateHTTPURLs(errs) @@ -153,12 +162,14 @@ func (envs *environment) Validate() (err error) { errs = append(errs, fmt.Errorf("VERBOSE: %w", err)) } + errs = envs.validateCrashOutput(errs) errs = envs.validateCustomDomains(errs) errs = envs.validateDNSCheck(errs) + errs = envs.validateQueryLogSemaphore(errs) errs = envs.validateRateLimit(errs) + errs = envs.validateRateLimitURLs(errs) errs = envs.validateSessionTickets(errs) errs = envs.validateStandardAccess(errs) - errs = envs.validateRateLimitURLs(errs) return errors.Join(errs...) } @@ -244,13 +255,19 @@ func (envs *environment) validateWebStaticDir() (err error) { return nil } - dir := envs.WebStaticDir - if dir == "" { + dirPath := envs.WebStaticDir + if dirPath == "" { return errors.ErrEmptyValue } - // Use a best-effort check to make sure the directory exists. - fi, err := os.Stat(dir) + return validateDir(dirPath) +} + +// validateDir is a best-effort check to make sure the directory exists. +// +// TODO(a.garipov): Consider moving to golibs. +func validateDir(dirPath string) (err error) { + fi, err := os.Stat(dirPath) if err != nil { return err } @@ -262,6 +279,29 @@ func (envs *environment) validateWebStaticDir() (err error) { return nil } +// validateCrashOutput appends validation errors to errs if the environment +// variables for crash reporting contain errors. +func (envs *environment) validateCrashOutput(orig []error) (errs []error) { + errs = orig + + if !envs.CrashOutputEnabled { + return errs + } + + dirPath := envs.WebStaticDir + if dirPath != "" { + err := validateDir(dirPath) + if err != nil { + errs = append(errs, err) + } + } + + return append(errs, + validate.NotEmpty("CRASH_OUTPUT_DIR", envs.CrashOutputDir), + validate.NotEmpty("CRASH_OUTPUT_PREFIX", envs.CrashOutputPrefix), + ) +} + // validateCustomDomains appends validation errors to errs if the environment // variables for custom domains contain errors. func (envs *environment) validateCustomDomains(errs []error) (res []error) { @@ -420,6 +460,24 @@ func (envs *environment) validateProfilesConf(profilesEnabled bool) (err error) return errors.Join(errs...) } +// validateCache appends validation errors to orig if environment variables for +// the querylog semaphore contain errors. +func (envs *environment) validateQueryLogSemaphore(orig []error) (errs []error) { + errs = orig + + if !envs.QueryLogSemaphoreEnabled { + return errs + } + + err := validate.Positive("QUERYLOG_SEMAPHORE_LIMIT", envs.QueryLogSemaphoreLimit) + if err != nil { + // Don't wrap the error, because it's informative enough as is. + errs = append(errs, err) + } + + return errs +} + // validateCache appends validation errors to the given errs if environment // variables for KV Cache contain errors. func (envs *environment) validateCache(errs []error) (res []error) { diff --git a/internal/cmd/runtime.go b/internal/cmd/runtime.go new file mode 100644 index 0000000..5c4255b --- /dev/null +++ b/internal/cmd/runtime.go @@ -0,0 +1,23 @@ +package cmd + +import ( + "context" + "log/slog" + "runtime/debug" + + "github.com/AdguardTeam/golibs/logutil/slogutil" +) + +// setMaxThreads sets the maximum number of threads for the Go runtime, if +// necessary. l must not be nil, envs must not be negative. +func setMaxThreads(ctx context.Context, l *slog.Logger, n int) { + if n == 0 { + l.Log(ctx, slogutil.LevelTrace, "go max threads not set") + + return + } + + debug.SetMaxThreads(n) + + l.InfoContext(ctx, "set go max threads", "n", n) +} diff --git a/internal/dnsserver/example_test.go b/internal/dnsserver/example_test.go index 9fab102..073086f 100644 --- a/internal/dnsserver/example_test.go +++ b/internal/dnsserver/example_test.go @@ -2,7 +2,6 @@ package dnsserver_test import ( "context" - "log/slog" "net/netip" "os" @@ -30,7 +29,6 @@ func ExampleNewServerDNS() { baseLogger := slogutil.New(&slogutil.Config{ Format: slogutil.FormatText, - Level: slog.LevelDebug, }).With("server_name", "test") // Init the server with this handler func @@ -81,7 +79,6 @@ func ExampleWithMiddlewares() { baseLogger := slogutil.New(&slogutil.Config{ Format: slogutil.FormatText, - Level: slog.LevelDebug, }) middleware := querylog.NewLogMiddleware(os.Stdout, baseLogger) diff --git a/internal/dnsserver/go.mod b/internal/dnsserver/go.mod index 1354ec4..20c0ac1 100644 --- a/internal/dnsserver/go.mod +++ b/internal/dnsserver/go.mod @@ -1,9 +1,9 @@ module github.com/AdguardTeam/AdGuardDNS/internal/dnsserver -go 1.24.6 +go 1.25.1 require ( - github.com/AdguardTeam/golibs v0.34.0 + github.com/AdguardTeam/golibs v0.34.1 github.com/ameshkov/dnscrypt/v2 v2.4.0 github.com/ameshkov/dnsstamps v1.0.3 github.com/bluele/gcache v0.0.2 @@ -11,32 +11,34 @@ require ( github.com/miekg/dns v1.1.68 github.com/panjf2000/ants/v2 v2.11.3 github.com/patrickmn/go-cache v2.1.1-0.20191004192108-46f407853014+incompatible - github.com/prometheus/client_golang v1.23.0 + github.com/prometheus/client_golang v1.23.1 github.com/quic-go/quic-go v0.54.0 github.com/stretchr/testify v1.11.1 - golang.org/x/net v0.43.0 - golang.org/x/sys v0.35.0 + golang.org/x/net v0.44.0 + golang.org/x/sys v0.36.0 ) require ( github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect github.com/kr/text v0.2.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.65.0 // indirect + github.com/prometheus/common v0.66.0 // indirect github.com/prometheus/procfs v0.17.0 // indirect github.com/quic-go/qpack v0.5.1 // indirect github.com/robfig/cron/v3 v3.0.1 // indirect go.uber.org/mock v0.6.0 // indirect - golang.org/x/crypto v0.41.0 // indirect - golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b // indirect - golang.org/x/mod v0.27.0 // indirect - golang.org/x/sync v0.16.0 // indirect - golang.org/x/text v0.28.0 // indirect - golang.org/x/tools v0.36.0 // indirect - google.golang.org/protobuf v1.36.8 // indirect + golang.org/x/crypto v0.42.0 // indirect + golang.org/x/exp v0.0.0-20250911091902-df9299821621 // indirect + golang.org/x/mod v0.28.0 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/text v0.29.0 // indirect + golang.org/x/tools v0.37.0 // indirect + google.golang.org/protobuf v1.36.9 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/internal/dnsserver/go.sum b/internal/dnsserver/go.sum index b2b555d..1246476 100644 --- a/internal/dnsserver/go.sum +++ b/internal/dnsserver/go.sum @@ -1,5 +1,4 @@ -github.com/AdguardTeam/golibs v0.34.0 h1:JQK024DkTYxE7vsPVsYsoyDHW/53Nun7OYb9qscniK8= -github.com/AdguardTeam/golibs v0.34.0/go.mod h1:K4C2EbfSEM1zY5YXoti9SfbTAHN/kIX97LpDtCwORrM= +github.com/AdguardTeam/golibs v0.34.1 h1:RyBpZiXnJqlO3T+xjWldlxsEZDelmaFfKvXiJHDZZFQ= github.com/ameshkov/dnscrypt/v2 v2.4.0 h1:if6ZG2cuQmcP2TwSY+D0+8+xbPfoatufGlOQTMNkI9o= github.com/ameshkov/dnscrypt/v2 v2.4.0/go.mod h1:WpEFV2uhebXb8Jhes/5/fSdpmhGV8TL22RDaeWwV6hI= github.com/ameshkov/dnsstamps v1.0.3 h1:Srzik+J9mivH1alRACTbys2xOxs0lRH9qnTA7Y1OYVo= @@ -17,6 +16,7 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -31,12 +31,10 @@ github.com/patrickmn/go-cache v2.1.1-0.20191004192108-46f407853014+incompatible github.com/patrickmn/go-cache v2.1.1-0.20191004192108-46f407853014+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= -github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= +github.com/prometheus/client_golang v1.23.1 h1:w6gXMLQGgd0jXXlote9lRHMe0nG01EbnJT+C0EJru2Y= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE= -github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= +github.com/prometheus/common v0.66.0 h1:K/rJPHrG3+AoQs50r2+0t7zMnMzek2Vbv31OFVsMeVY= github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= @@ -53,26 +51,18 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= -golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= -golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= -golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b h1:DXr+pvt3nC887026GRP39Ej11UATqWDmWuS99x26cD0= -golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4= -golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= -golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= -golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= -golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= -golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= -golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= -golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= -golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= -google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= -google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= +golang.org/x/exp v0.0.0-20250911091902-df9299821621 h1:2id6c1/gto0kaHYyrixvknJ8tUK/Qs5IsmBtrc+FtgU= +golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= +golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= +golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= +golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE= +google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/dnsserver/serverbase.go b/internal/dnsserver/serverbase.go index 9fe2535..6e2349f 100644 --- a/internal/dnsserver/serverbase.go +++ b/internal/dnsserver/serverbase.go @@ -103,9 +103,12 @@ type ServerBase struct { // that don't use UDP. udpListener net.PacketConn - // wg tracks active workers, both listeners and workers processing queries. - // Shutdown won't finish until there's at least one active worker. - wg *sync.WaitGroup + // activeTaskWG tracks goroutines processing UDP and TCP connections and + // queries. Shutdown doesn't finish as long as there's at least one active + // task. + // + // TODO(a.garipov): Consider also using it for listeners. + activeTaskWG *sync.WaitGroup // name is used for logging and it may be used for perf counters reporting. // @@ -153,7 +156,7 @@ func newServerBase(proto Protocol, c *ConfigBase) (s *ServerBase) { disposer: cmp.Or[Disposer](c.Disposer, EmptyDisposer{}), listenConfig: c.ListenConfig, mu: &sync.RWMutex{}, - wg: &sync.WaitGroup{}, + activeTaskWG: &sync.WaitGroup{}, name: c.Name, addr: c.Addr, network: c.Network, @@ -465,21 +468,12 @@ func (s *ServerBase) handlePanicAndExit(ctx context.Context) { func (s *ServerBase) handlePanic(ctx context.Context, v any) { s.metrics.OnPanic(ctx, v) - logger, ok := slogutil.LoggerFromContext(ctx) + l, ok := slogutil.LoggerFromContext(ctx) if !ok { - logger = s.baseLogger + l = s.baseLogger } - var args []any - err, ok := v.(error) - if ok { - args = []any{slogutil.KeyError, err} - } else { - args = []any{"value", v} - } - - logger.ErrorContext(ctx, "recovered from panic", args...) - slogutil.PrintStack(ctx, logger, slog.LevelError) + slogutil.PrintRecovered(ctx, l, v) } // handlePanicAndRecover writes panic info to log, reports it to the registered @@ -558,20 +552,17 @@ func (s *ServerBase) waitShutdown(ctx context.Context) (err error) { go func() { defer slogutil.RecoverAndLog(ctx, s.baseLogger) - // wait until all queries are processed - s.wg.Wait() + // Wait until all tasks exit. + s.activeTaskWG.Wait() close(closed) }() - var ctxErr error select { case <-closed: - // Do nothing here + return nil case <-ctx.Done(): - ctxErr = ctx.Err() + return ctx.Err() } - - return ctxErr } // isStarted returns true if the server is started. diff --git a/internal/dnsserver/serverdns.go b/internal/dnsserver/serverdns.go index 061fca2..306b7d9 100644 --- a/internal/dnsserver/serverdns.go +++ b/internal/dnsserver/serverdns.go @@ -15,7 +15,6 @@ import ( "github.com/AdguardTeam/golibs/logutil/slogutil" "github.com/AdguardTeam/golibs/syncutil" "github.com/miekg/dns" - "github.com/panjf2000/ants/v2" ) const ( @@ -84,11 +83,9 @@ type ConfigDNS struct { type ServerDNS struct { *ServerBase - // workerPool is a goroutine workerPool we use to process DNS queries. - // Complicated logic may require growing the goroutine's stack, and we - // experienced it in AdGuard DNS. The easiest way to avoid spending extra - // time on this is to reuse already existing goroutines. - workerPool *ants.Pool + // taskPool is a goroutine pool used to process DNS queries. It is used to + // prevent excessive growth of goroutine stacks. + taskPool *taskPool // udpPool is a pool for UDP request buffers. udpPool *syncutil.Pool[[]byte] @@ -171,7 +168,9 @@ func newServerDNS(proto Protocol, c *ConfigDNS) (s *ServerDNS) { maxPipelineEnabled: c.MaxPipelineEnabled, } - s.workerPool = mustNewPoolNonblocking(s.baseLogger) + s.taskPool = mustNewTaskPool(&taskPoolConfig{ + logger: s.baseLogger, + }) return s } @@ -206,8 +205,9 @@ func (s *ServerDNS) Start(ctx context.Context) (err error) { return err } - s.wg.Add(1) - go s.startServeUDP(ctx) + s.activeTaskWG.Go(func() { + s.serveUDP(ctx, s.udpListener) + }) } // Start listening to TCP on the specified address. @@ -217,8 +217,9 @@ func (s *ServerDNS) Start(ctx context.Context) (err error) { return err } - s.wg.Add(1) - go s.startServeTCP(ctx) + s.activeTaskWG.Go(func() { + s.serveTCP(ctx, s.tcpListener, "tcp") + }) } s.started = true @@ -245,42 +246,13 @@ func (s *ServerDNS) Shutdown(ctx context.Context) (err error) { err = s.waitShutdown(ctx) // Close the workerPool and releases all workers. - s.workerPool.Release() + s.taskPool.Release() s.baseLogger.InfoContext(ctx, "server has been shut down") return err } -// startServeUDP starts the UDP listener loop. -func (s *ServerDNS) startServeUDP(ctx context.Context) { - // Do not recover from panics here since if this goroutine panics, the - // application won't be able to continue listening to UDP. - defer s.handlePanicAndExit(ctx) - defer s.wg.Done() - - s.baseLogger.InfoContext(ctx, "starting listening udp") - - err := s.serveUDP(ctx, s.udpListener) - if err != nil { - s.baseLogger.WarnContext(ctx, "listening udp failed", slogutil.KeyError, err) - } -} - -// startServeTCP starts the TCP listener loop. -func (s *ServerDNS) startServeTCP(ctx context.Context) { - // Do not recover from panics here since if this goroutine panics, the - // application won't be able to continue listening to TCP. - defer s.handlePanicAndExit(ctx) - defer s.wg.Done() - - s.baseLogger.InfoContext(ctx, "starting listening tcp") - err := s.serveTCP(ctx, s.tcpListener) - if err != nil { - s.baseLogger.WarnContext(ctx, "listening tcp failed", slogutil.KeyError, err) - } -} - // shutdown marks the server as stopped and closes active listeners. func (s *ServerDNS) shutdown(ctx context.Context) (err error) { s.mu.Lock() diff --git a/internal/dnsserver/serverdnstcp.go b/internal/dnsserver/serverdnstcp.go index 1596c71..3bfdc04 100644 --- a/internal/dnsserver/serverdnstcp.go +++ b/internal/dnsserver/serverdnstcp.go @@ -18,22 +18,42 @@ import ( "github.com/miekg/dns" ) -// serveTCP runs the TCP serving loop. -func (s *ServerDNS) serveTCP(ctx context.Context, l net.Listener) (err error) { +// serveTCP runs the TCP serving loop. It is intended to be used as a +// goroutine. l must not be nil. +func (s *ServerDNS) serveTCP(ctx context.Context, l net.Listener, proto string) { + // Do not recover from panics here since if this goroutine panics, the + // application won't be able to continue listening to TCP. + defer s.handlePanicAndExit(ctx) + + s.baseLogger.InfoContext(ctx, "starting listening tcp") defer func() { closeWithLog(ctx, s.baseLogger, "closing tcp listener", l) }() for s.isStarted() { - err = s.acceptTCPConn(ctx, l) - if err != nil { - if !s.isStarted() { - return nil - } - - return err + err := s.acceptTCPConn(ctx, l) + if err == nil { + continue } - } - return nil + // TODO(ameshkov): Consider the situation where the server is shut down + // and restarted between the two calls to isStarted. + if !s.isStarted() { + s.baseLogger.DebugContext( + ctx, + "listening tcp failed: server not started", + "proto", proto, + slogutil.KeyError, err, + ) + } else { + s.baseLogger.ErrorContext( + ctx, + "listening tcp failed", + "proto", proto, + slogutil.KeyError, err, + ) + } + + return + } } // acceptTCPConn reads and starts processing a single TCP connection. @@ -60,9 +80,7 @@ func (s *ServerDNS) acceptTCPConn(ctx context.Context, l net.Listener) (err erro s.tcpConns.Add(conn) }() - s.wg.Add(1) - - return s.workerPool.Submit(func() { + return s.taskPool.submitWG(s.activeTaskWG, func() { s.serveTCPConn(ctx, conn) }) } @@ -89,16 +107,14 @@ func handshake(conn net.Conn, timeout time.Duration) (err error) { return shaker.HandshakeContext(ctx) } -// serveTCPConn serves a single TCP connection. +// serveTCPConn serves a single TCP connection. It is intended to be used as a +// goroutine. conn must not be nil. func (s *ServerDNS) serveTCPConn(ctx context.Context, conn net.Conn) { - // Use this to wait until all queries from this connection has been - // processed before closing it. - wg := &sync.WaitGroup{} + defer s.handlePanicAndRecover(ctx) + connWG := &sync.WaitGroup{} defer func() { - defer s.wg.Done() - - wg.Wait() + connWG.Wait() closeWithLog(ctx, s.baseLogger, "closing tcp conn", conn) @@ -108,8 +124,6 @@ func (s *ServerDNS) serveTCPConn(ctx context.Context, conn net.Conn) { s.tcpConns.Delete(conn) }() - defer s.handlePanicAndRecover(ctx) - var msgSema syncutil.Semaphore = syncutil.EmptySemaphore{} if s.maxPipelineEnabled { msgSema = syncutil.NewChanSemaphore(s.maxPipelineCount) @@ -129,7 +143,7 @@ func (s *ServerDNS) serveTCPConn(ctx context.Context, conn net.Conn) { } for s.isStarted() { - err = s.acceptTCPMsg(conn, wg, writeMu, timeout, msgSema) + err = s.acceptTCPMsg(conn, connWG, writeMu, timeout, msgSema) if err != nil { s.logReadErr(ctx, "reading from conn", err) @@ -155,7 +169,7 @@ func (s *ServerDNS) logReadErr(ctx context.Context, msg string, err error) { // TLS connection, the handshake must have already been performed. func (s *ServerDNS) acceptTCPMsg( conn net.Conn, - wg *sync.WaitGroup, + connWG *sync.WaitGroup, writeMu *sync.Mutex, timeout time.Duration, msgSema syncutil.Semaphore, @@ -182,13 +196,11 @@ func (s *ServerDNS) acceptTCPMsg( // RFC 7766 recommends implementing query pipelining, i.e. process all // incoming queries concurrently and write responses out of order. - wg.Add(1) - - return s.workerPool.Submit(func() { + return s.taskPool.submitWG(connWG, func() { defer reqCancel() defer msgSema.Release() - s.serveTCPMessage(reqCtx, wg, writeMu, *bufPtr, conn) + s.serveTCPMessage(reqCtx, writeMu, *bufPtr, conn) s.tcpPool.Put(bufPtr) }) } @@ -199,31 +211,27 @@ type tlsConnectionStater interface { ConnectionState() tls.ConnectionState } -// serveTCPMessage processes a single TCP message. +// serveTCPMessage processes a single TCP message. It is intended to be used as +// a goroutine. All arguments must not be nil. func (s *ServerDNS) serveTCPMessage( ctx context.Context, - wg *sync.WaitGroup, writeMu *sync.Mutex, buf []byte, conn net.Conn, ) { - defer wg.Done() defer s.handlePanicAndRecover(ctx) - rw := &tcpResponseWriter{ + written := s.serveDNS(ctx, buf, &tcpResponseWriter{ respPool: s.respPool, writeMu: writeMu, conn: conn, writeTimeout: s.writeTimeout, idleTimeout: s.tcpIdleTimeout, - } - written := s.serveDNS(ctx, buf, rw) - + }) if !written { - // Nothing has been written, we should close the connection in order to - // avoid hanging connections. Than might happen if the handler - // rate-limited connections or if we received garbage data instead of - // a DNS query. + // Nothing has been written, so close the connection in order to avoid + // hanging connections. That can happen when the handler rate-limited a + // connection or if garbage data has been received. slogutil.CloseAndLog(ctx, s.baseLogger, conn, slog.LevelDebug) } } diff --git a/internal/dnsserver/serverdnsudp.go b/internal/dnsserver/serverdnsudp.go index 091a747..159aa75 100644 --- a/internal/dnsserver/serverdnsudp.go +++ b/internal/dnsserver/serverdnsudp.go @@ -8,28 +8,41 @@ import ( "github.com/AdguardTeam/AdGuardDNS/internal/dnsserver/netext" "github.com/AdguardTeam/golibs/errors" + "github.com/AdguardTeam/golibs/logutil/slogutil" "github.com/AdguardTeam/golibs/syncutil" "github.com/miekg/dns" ) -// serveUDP runs the UDP serving loop. -func (s *ServerDNS) serveUDP(ctx context.Context, conn net.PacketConn) (err error) { +// serveUDP runs the UDP serving loop. It is intended to be used as a +// goroutine. conn must not be nil. +func (s *ServerDNS) serveUDP(ctx context.Context, conn net.PacketConn) { + // Do not recover from panics here since if this goroutine panics, the + // application won't be able to continue listening to UDP. + defer s.handlePanicAndExit(ctx) + + s.baseLogger.InfoContext(ctx, "starting listening udp") defer func() { closeWithLog(ctx, s.baseLogger, "closing udp conn", conn) }() for s.isStarted() { - err = s.acceptUDPMsg(ctx, conn) - if err != nil { - // TODO(ameshkov): Consider the situation where the server is shut - // down and restarted between the two calls to isStarted. - if !s.isStarted() { - return nil - } - - return err + err := s.acceptUDPMsg(ctx, conn) + if err == nil { + continue } - } - return nil + // TODO(ameshkov): Consider the situation where the server is shut down + // and restarted between the two calls to isStarted. + if !s.isStarted() { + s.baseLogger.DebugContext( + ctx, + "listening udp failed: server not started", + slogutil.KeyError, err, + ) + } else { + s.baseLogger.ErrorContext(ctx, "listening udp failed", slogutil.KeyError, err) + } + + return + } } // acceptUDPMsg reads and starts processing a single UDP message. @@ -48,8 +61,6 @@ func (s *ServerDNS) acceptUDPMsg(ctx context.Context, conn net.PacketConn) (err return err } - s.wg.Add(1) - // Save the start time here, but create the context inside the goroutine, // since s.requestContext can be slow. // @@ -58,7 +69,7 @@ func (s *ServerDNS) acceptUDPMsg(ctx context.Context, conn net.PacketConn) (err // version. startTime := time.Now() - return s.workerPool.Submit(func() { + return s.taskPool.submitWG(s.activeTaskWG, func() { reqCtx, reqCancel := s.requestContext(context.Background()) defer reqCancel() @@ -71,24 +82,23 @@ func (s *ServerDNS) acceptUDPMsg(ctx context.Context, conn net.PacketConn) (err }) } -// serveUDPPacket serves a new UDP request. +// serveUDPPacket serves a new UDP request. It is intended to be used as a +// goroutine. buf, conn, and sess must not be nil. func (s *ServerDNS) serveUDPPacket( ctx context.Context, buf []byte, conn net.PacketConn, sess netext.PacketSession, ) { - defer s.wg.Done() defer s.handlePanicAndRecover(ctx) - rw := &udpResponseWriter{ + s.serveDNS(ctx, buf, &udpResponseWriter{ respPool: s.respPool, udpSession: sess, conn: conn, writeTimeout: s.writeTimeout, maxRespSize: s.maxUDPRespSize, - } - s.serveDNS(ctx, buf, rw) + }) } // readUDPMsg reads the next incoming DNS message. diff --git a/internal/dnsserver/serverhttps.go b/internal/dnsserver/serverhttps.go index c661118..3eca3c8 100644 --- a/internal/dnsserver/serverhttps.go +++ b/internal/dnsserver/serverhttps.go @@ -231,8 +231,9 @@ func (s *ServerHTTPS) startHTTPSServer(ctx context.Context) (err error) { } // Start the server worker goroutine. - s.wg.Add(1) - go s.serveHTTPS(ctx, s.httpServer, s.tcpListener) + s.activeTaskWG.Go(func() { + s.serveHTTPS(ctx, s.httpServer, s.tcpListener) + }) return nil } @@ -257,8 +258,9 @@ func (s *ServerHTTPS) startH3Server(ctx context.Context) (err error) { } // Start the server worker goroutine. - s.wg.Add(1) - go s.serveH3(ctx, s.h3Server, s.quicListener) + s.activeTaskWG.Go(func() { + s.serveH3(ctx, s.h3Server, s.quicListener) + }) return nil } @@ -320,10 +322,9 @@ func (s *ServerHTTPS) shutdownH3(ctx context.Context) { } // serveHTTPS is launched in a worker goroutine and serves HTTP/1.1 and HTTP/2 -// requests. +// requests. It is intended to be used as a goroutine. All arguments must not +// be nil. func (s *ServerHTTPS) serveHTTPS(ctx context.Context, hs *http.Server, l net.Listener) { - defer s.wg.Done() - // Do not recover from panics here since if this goroutine panics, the // application won't be able to continue listening to DoH. defer s.handlePanicAndExit(ctx) @@ -341,10 +342,9 @@ func (s *ServerHTTPS) serveHTTPS(ctx context.Context, hs *http.Server, l net.Lis } } -// serveH3 is launched in a worker goroutine and serves HTTP/3 requests. +// serveH3 is launched in a worker goroutine and serves HTTP/3 requests. It is +// intended to be used as a goroutine. All arguments must not be nil. func (s *ServerHTTPS) serveH3(ctx context.Context, hs *http3.Server, ql *quic.EarlyListener) { - defer s.wg.Done() - // Do not recover from panics here since if this goroutine panics, the // application won't be able to continue listening to DoH. defer s.handlePanicAndExit(ctx) diff --git a/internal/dnsserver/serverquic.go b/internal/dnsserver/serverquic.go index c814ef1..4329309 100644 --- a/internal/dnsserver/serverquic.go +++ b/internal/dnsserver/serverquic.go @@ -18,7 +18,6 @@ import ( "github.com/AdguardTeam/golibs/syncutil" "github.com/bluele/gcache" "github.com/miekg/dns" - "github.com/panjf2000/ants/v2" "github.com/quic-go/quic-go" ) @@ -94,11 +93,9 @@ type ConfigQUIC struct { type ServerQUIC struct { *ServerBase - // pool is a goroutine pool we use to process DNS queries. Complicated - // logic may require growing the goroutine's stack and we experienced it - // in AdGuard DNS. The easiest way to avoid spending extra time on this is - // to reuse already existing goroutines. - pool *ants.Pool + // taskPool is a goroutine pool used to process DNS queries. It is used to + // prevent excessive growth of goroutine stacks. + taskPool *taskPool // reqPool is a pool to avoid unnecessary allocations when reading // DNS packets. @@ -140,7 +137,9 @@ func NewServerQUIC(c *ConfigQUIC) (s *ServerQUIC) { quicLimitsEnabled: c.QUICLimitsEnabled, } - s.pool = mustNewPoolNonblocking(s.baseLogger) + s.taskPool = mustNewTaskPool(&taskPoolConfig{ + logger: s.baseLogger, + }) return s } @@ -173,9 +172,9 @@ func (s *ServerQUIC) Start(ctx context.Context) (err error) { return err } - // Run the serving goroutine. - s.wg.Add(1) - go s.startServeQUIC(ctx) + s.activeTaskWG.Go(func() { + s.serveQUIC(ctx, s.quicListener) + }) s.started = true @@ -199,8 +198,8 @@ func (s *ServerQUIC) Shutdown(ctx context.Context) (err error) { err = s.waitShutdown(ctx) - // Close the workerPool and releases all workers. - s.pool.Release() + // Close the taskPool and release all workers. + s.taskPool.Release() s.baseLogger.InfoContext(ctx, "server has been shut down") @@ -234,45 +233,43 @@ func (s *ServerQUIC) shutdown(ctx context.Context) (err error) { return nil } -// startServeQUIC starts the QUIC listener loop. -func (s *ServerQUIC) startServeQUIC(ctx context.Context) { +// serveQUIC listens for incoming QUIC connections. +func (s *ServerQUIC) serveQUIC(ctx context.Context, l *quic.Listener) { // We do not recover from panics here since if this go routine panics // the application won't be able to continue listening to DoQ. defer s.handlePanicAndExit(ctx) - defer s.wg.Done() s.baseLogger.InfoContext(ctx, "starting listening quic") - err := s.serveQUIC(ctx, s.quicListener) - if err != nil { - s.baseLogger.WarnContext(ctx, "listening quic failed", slogutil.KeyError, err) - } -} - -// serveQUIC listens for incoming QUIC connections. -func (s *ServerQUIC) serveQUIC(ctx context.Context, l *quic.Listener) (err error) { wg := &sync.WaitGroup{} - // Wait until all conns are processed before exiting this method defer wg.Wait() // Use a context that is canceled once this connection ends to mitigate - // quic-go's mishandling of contexts. See TODO in serveQUICConn. - var cancel context.CancelFunc - ctx, cancel = context.WithCancel(ctx) + // quic-go's mishandling of contexts. See the TODO in + // [ServerQUIC.serveQUICConn]. + ctx, cancel := context.WithCancel(ctx) defer cancel() for s.isStarted() { - err = s.acceptQUICConn(ctx, l, wg) - if err != nil { - if !s.isStarted() { - return nil - } - - return err + err := s.acceptQUICConn(ctx, l, wg) + if err == nil { + continue } - } - return nil + // TODO(ameshkov): Consider the situation where the server is shut down + // and restarted between the two calls to isStarted. + if !s.isStarted() { + s.baseLogger.DebugContext( + ctx, + "listening quic failed: server not started", + slogutil.KeyError, err, + ) + } else { + s.baseLogger.ErrorContext(ctx, "listening quic failed", slogutil.KeyError, err) + } + + return + } } // acceptQUICConn reads and starts processing a single QUIC connection. @@ -295,10 +292,8 @@ func (s *ServerQUIC) acceptQUICConn( return err } - wg.Add(1) - - err = s.pool.Submit(func() { - s.serveQUICConnAsync(ctx, conn, wg) + err = s.taskPool.submitWG(wg, func() { + s.serveQUICConnAsync(ctx, conn) }) if err != nil { // Most likely the workerPool is closed, and we can exit right away. @@ -311,15 +306,13 @@ func (s *ServerQUIC) acceptQUICConn( return nil } -// serveQUICConnAsync wraps serveQUICConn call and handles all possible errors -// that might happen there. It also makes sure that the WaitGroup will be -// decremented. -func (s *ServerQUIC) serveQUICConnAsync( - ctx context.Context, - conn *quic.Conn, - connWg *sync.WaitGroup, -) { - defer connWg.Done() +// serveQUICConnAsync wraps [ServerQUIC.serveQUICConn] call and handles errors +// that could happen in it. It is intended to be used as a goroutine. conn +// must not be nil. +// +// TODO(a.garipov): Refactor ServerQUIC.serveQUICConn and merge this one into +// it. +func (s *ServerQUIC) serveQUICConnAsync(ctx context.Context, conn *quic.Conn) { defer s.handlePanicAndRecover(ctx) err := s.serveQUICConn(ctx, conn) @@ -379,12 +372,10 @@ func (s *ServerQUIC) serveQUICConn(ctx context.Context, conn *quic.Conn) (err er reqCtx, reqCancel := s.requestContext(context.Background()) reqCtx = ContextWithRequestInfo(reqCtx, ri) - streamWg.Add(1) - - err = s.pool.Submit(func() { + err = s.taskPool.submitWG(streamWg, func() { defer reqCancel() - s.serveQUICStreamAsync(reqCtx, stream, conn, streamWg) + s.serveQUICStreamAsync(reqCtx, stream, conn) }) if err != nil { // The workerPool is closed, we should simply exit. Make sure that @@ -398,16 +389,17 @@ func (s *ServerQUIC) serveQUICConn(ctx context.Context, conn *quic.Conn) (err er return nil } -// serveQUICStreamAsync wraps serveQUICStream call and handles all possible -// errors that might happen there. It also makes sure that the WaitGroup will -// be decremented. +// serveQUICStreamAsync wraps [ServerQUIC.serveQUICStream] call and handle +// errors that could happen in it. It is intended to be used as a goroutine. +// stream and conn must not be nil. +// +// TODO(a.garipov): Refactor ServerQUIC.serveQUICStream and merge this one into +// it. func (s *ServerQUIC) serveQUICStreamAsync( ctx context.Context, stream *quic.Stream, conn *quic.Conn, - wg *sync.WaitGroup, ) { - defer wg.Done() defer s.handlePanicAndRecover(ctx) err := s.serveQUICStream(ctx, stream, conn) diff --git a/internal/dnsserver/servertls.go b/internal/dnsserver/servertls.go index 93c7da6..ce103ac 100644 --- a/internal/dnsserver/servertls.go +++ b/internal/dnsserver/servertls.go @@ -5,7 +5,6 @@ import ( "crypto/tls" "github.com/AdguardTeam/golibs/errors" - "github.com/AdguardTeam/golibs/logutil/slogutil" ) // ConfigTLS is a struct that needs to be passed to NewServerTLS to @@ -71,10 +70,10 @@ func (s *ServerTLS) Start(ctx context.Context) (err error) { // Start the TLS server loop if s.tcpListener != nil { - go s.startServeTCP(ctx) + go s.serveTCP(ctx, s.tcpListener, "tls") } - // TODO(ameshkov): Consider only setting s.started to true once the + // TODO(ameshkov): Consider only setting s.started to true once the // listeners are up. s.started = true @@ -90,20 +89,6 @@ func (s *ServerTLS) Shutdown(ctx context.Context) (err error) { return s.ServerDNS.Shutdown(ctx) } -// startServeTCP starts the TCP listen loop and handles errors if any. -func (s *ServerTLS) startServeTCP(ctx context.Context) { - // We do not recover from panics here since if this go routine panics - // the application won't be able to continue listening to DoT - defer s.handlePanicAndExit(ctx) - - s.baseLogger.InfoContext(ctx, "starting listening tls") - - err := s.serveTCP(ctx, s.tcpListener) - if err != nil { - s.baseLogger.WarnContext(ctx, "listening tls failed", slogutil.KeyError, err) - } -} - // listenTLS creates the TLS listener for s.addr. func (s *ServerTLS) listenTLS(ctx context.Context) (err error) { l, err := s.listenConfig.Listen(ctx, "tcp", s.addr) diff --git a/internal/dnsserver/task.go b/internal/dnsserver/task.go new file mode 100644 index 0000000..e81c6b1 --- /dev/null +++ b/internal/dnsserver/task.go @@ -0,0 +1,81 @@ +package dnsserver + +import ( + "fmt" + "log/slog" + "sync" + "time" + + "github.com/AdguardTeam/golibs/errors" + "github.com/AdguardTeam/golibs/logutil/slogutil" + "github.com/panjf2000/ants/v2" +) + +// task is a function that is intended to be used as a goroutine in a +// [taskPool]. +type task func() + +// taskPool is a wrapper around [ants.Pool] with convenience methods for using +// it with [sync.WaitGroup]s. +type taskPool struct { + ants.Pool +} + +// taskPoolConfig is the configuration for a [taskPool]. +type taskPoolConfig struct { + // logger is used for logging the operation of the task pool. It must not + // be nil. + logger *slog.Logger +} + +// mustNewTaskPool creates a new properly initialized *taskPool configured +// optimally for using it in DNS servers. It panics if there are errors. +// c must not be nil and must be valid. +func mustNewTaskPool(c *taskPoolConfig) (p *taskPool) { + pool, err := ants.NewPool(0, ants.WithOptions(ants.Options{ + ExpiryDuration: time.Minute, + PreAlloc: false, + Nonblocking: true, + DisablePurge: false, + Logger: &antsLogger{ + logger: c.logger, + }, + })) + errors.Check(err) + + return &taskPool{ + Pool: *pool, + } +} + +// submitWG is a convenience method that submits t to the pool and accounts +// for it in wg. All arguments must not be nil. +func (p *taskPool) submitWG(wg *sync.WaitGroup, t task) (err error) { + wg.Add(1) + + err = p.Submit(func() { + defer wg.Done() + + t() + }) + if err != nil { + // Decrease the counter if the goroutine hasn't been started. + wg.Done() + } + + return err +} + +// antsLogger implements the [ants.Logger] interface and writes everything +// to its logger. +type antsLogger struct { + logger *slog.Logger +} + +// type check +var _ ants.Logger = (*antsLogger)(nil) + +// Printf implements the [ants.Logger] interface for *antsLogger. +func (l *antsLogger) Printf(format string, args ...any) { + l.logger.Info("ants pool", slogutil.KeyMessage, fmt.Sprintf(format, args...)) +} diff --git a/internal/dnsserver/workerpool.go b/internal/dnsserver/workerpool.go deleted file mode 100644 index 00fbfca..0000000 --- a/internal/dnsserver/workerpool.go +++ /dev/null @@ -1,43 +0,0 @@ -package dnsserver - -import ( - "fmt" - "log/slog" - "time" - - "github.com/AdguardTeam/golibs/errors" - "github.com/AdguardTeam/golibs/logutil/slogutil" - "github.com/panjf2000/ants/v2" -) - -// antsLogger implements the [ants.Logger] interface and writes everything -// to its logger. -type antsLogger struct { - logger *slog.Logger -} - -// type check -var _ ants.Logger = (*antsLogger)(nil) - -// Printf implements the [ants.Logger] interface for *antsLogger. -func (l *antsLogger) Printf(format string, args ...interface{}) { - l.logger.Info("ants pool", slogutil.KeyMessage, fmt.Sprintf(format, args...)) -} - -// mustNewPoolNonblocking creates a new instance of [*ants.Pool] configured -// optimally for using it in DNS servers. It panics if there are errors. -// logger must not be nil. -func mustNewPoolNonblocking(logger *slog.Logger) (p *ants.Pool) { - p, err := ants.NewPool(0, ants.WithOptions(ants.Options{ - ExpiryDuration: time.Minute, - PreAlloc: false, - Nonblocking: true, - DisablePurge: false, - Logger: &antsLogger{ - logger: logger, - }, - })) - errors.Check(err) - - return p -} diff --git a/internal/dnssvc/integration_test.go b/internal/dnssvc/integration_test.go index 91f8e43..2c27c49 100644 --- a/internal/dnssvc/integration_test.go +++ b/internal/dnssvc/integration_test.go @@ -126,7 +126,11 @@ func newTestService( } geoIP := agdtest.NewGeoIP() - geoIP.OnData = func(host string, _ netip.Addr) (l *geoip.Location, err error) { + geoIP.OnData = func( + _ context.Context, + host string, + _ netip.Addr, + ) (l *geoip.Location, err error) { testutil.RequireSend(pt, geoIPCh, host, dnssvctest.Timeout) return loc, nil diff --git a/internal/dnssvc/internal/mainmw/mainmw_test.go b/internal/dnssvc/internal/mainmw/mainmw_test.go index 362a0d7..46f2a05 100644 --- a/internal/dnssvc/internal/mainmw/mainmw_test.go +++ b/internal/dnssvc/internal/mainmw/mainmw_test.go @@ -118,7 +118,11 @@ func TestMiddleware_Wrap(t *testing.T) { } geoIP := agdtest.NewGeoIP() - geoIP.OnData = func(host string, addr netip.Addr) (l *geoip.Location, err error) { + geoIP.OnData = func( + _ context.Context, + host string, + addr netip.Addr, + ) (l *geoip.Location, err error) { pt := testutil.PanicT{} require.Equal(pt, dnssvctest.Domain, host) if addr.Is4() { @@ -419,7 +423,11 @@ func TestMiddleware_Wrap_filtering(t *testing.T) { ) geoIP := agdtest.NewGeoIP() - geoIP.OnData = func(_ string, _ netip.Addr) (l *geoip.Location, err error) { + geoIP.OnData = func( + _ context.Context, + _ string, + _ netip.Addr, + ) (l *geoip.Location, err error) { return nil, nil } diff --git a/internal/dnssvc/internal/mainmw/record.go b/internal/dnssvc/internal/mainmw/record.go index 39482fd..27b0f4d 100644 --- a/internal/dnssvc/internal/mainmw/record.go +++ b/internal/dnssvc/internal/mainmw/record.go @@ -226,7 +226,7 @@ func ipFromHTTPSRRKV(kv dns.SVCBKeyValue) (fam netutil.AddrFamily, netIP net.IP) // country is a wrapper around the GeoIP call that contains the handling of // non-critical GeoIP errors. func (mw *Middleware) country(ctx context.Context, host string, ip netip.Addr) (c geoip.Country) { - l, err := mw.geoIP.Data(host, ip) + l, err := mw.geoIP.Data(ctx, host, ip) if err != nil { // Consider GeoIP errors non-critical. errcoll.Collect(ctx, mw.errColl, mw.logger, "getting geoip data", err) diff --git a/internal/dnssvc/internal/mainmw/record_internal_test.go b/internal/dnssvc/internal/mainmw/record_internal_test.go index 87d0a80..855a8a0 100644 --- a/internal/dnssvc/internal/mainmw/record_internal_test.go +++ b/internal/dnssvc/internal/mainmw/record_internal_test.go @@ -135,7 +135,11 @@ func TestMiddleware_recordQueryInfo_respCtry(t *testing.T) { } geoIP := agdtest.NewGeoIP() - geoIP.OnData = func(_ string, _ netip.Addr) (l *geoip.Location, err error) { + geoIP.OnData = func( + _ context.Context, + _ string, + _ netip.Addr, + ) (l *geoip.Location, err error) { if !tc.wantGeoIP { t.Error("unexpected call to geoip") } diff --git a/internal/dnssvc/internal/ratelimitmw/access_test.go b/internal/dnssvc/internal/ratelimitmw/access_test.go index 2852562..e3d12fb 100644 --- a/internal/dnssvc/internal/ratelimitmw/access_test.go +++ b/internal/dnssvc/internal/ratelimitmw/access_test.go @@ -56,7 +56,7 @@ func TestMiddleware_Wrap_access(t *testing.T) { require.NoError(t, accessErr) geoIP := agdtest.NewGeoIP() - geoIP.OnData = func(_ string, _ netip.Addr) (l *geoip.Location, err error) { + geoIP.OnData = func(_ context.Context, _ string, _ netip.Addr) (l *geoip.Location, err error) { return nil, nil } diff --git a/internal/dnssvc/internal/ratelimitmw/requestinfo.go b/internal/dnssvc/internal/ratelimitmw/requestinfo.go index c5c8953..fc11bbd 100644 --- a/internal/dnssvc/internal/ratelimitmw/requestinfo.go +++ b/internal/dnssvc/internal/ratelimitmw/requestinfo.go @@ -102,7 +102,7 @@ func (mw *Middleware) locationData( ip netip.Addr, typ string, ) (l *geoip.Location) { - l, err := mw.geoIP.Data("", ip) + l, err := mw.geoIP.Data(ctx, "", ip) if err != nil { // Consider GeoIP errors non-critical. Report and go on. err = fmt.Errorf("getting data for %s ip: %w", typ, err) diff --git a/internal/ecscache/ecsblocklist.go b/internal/ecscache/ecsblocklist.go index 4ebc3b8..5496ab3 100644 --- a/internal/ecscache/ecsblocklist.go +++ b/internal/ecscache/ecsblocklist.go @@ -11,27 +11,25 @@ var FakeECSFQDNs = container.NewMapSet( "0cf.io.", "0cf17917-395b-4f25-91cc-db3bdd6044b0.prmutv.co.", "1.eu.ntp.huan.tv.", - "1024sj.com.", "103.chtsite.com.", "12-alarm-mop.meshare.com.", "126.com.", "126.net.", "127.net.", "13-alarm-mop.meshare.com.", - "15969-ipv4v6e.clump.dprodmgd104.aa-rt.sharepoint.com.", + "14-alarm-mop.meshare.com.", "163.com.", "163jiasu.com.", "163yun.com.", "166.net.", "1688.com.", "18ea70d2d9a945cfb97d818ba71817dc.pacloudflare.com.", - "1adr.com.", - "1ato.com.", "1osb.com.", "2.401402081.west-gcloud.codm.activision.com.", "2.realtime.services.box.net.", "21cn.com.", "2591j46p8g-3.algolianet.com.", + "27f19c7c68e3eadf7756fb7efdb661dd8909acf9.cws.conviva.com.", "2acdb9b66bb242618283aadb21ede6c1.pacloudflare.com.", "2e4b93d1-a8ae-4a89-8885-6109135ac0de.prmutv.co.", "2gis.ru.", @@ -47,18 +45,18 @@ var FakeECSFQDNs = container.NewMapSet( "401402081.west-gcloud.codm.activision.com.", "4513764478418944-content.customer.pendo.io.", "4b32bb64ce554875ae3f8836479c89d4.pacloudflare.com.", - "4dmax.space.", + "50.img.avito.st.", "507b28fb-2ef1-4c34-8bda-ba32030bb199.prmutv.co.", "520.jp.", "5d79bce7-5d2b-427e-a6c4-b89b6c7bf048.prmutv.co.", "6.401402081.west-gcloud.codm.activision.com.", "6093eccf-6734-4877-ac8b-83d6d0e27b46.prmutv.co.", - "66yahoo.com.", - "68547f8f-2fd8-4ff3-9b63-51e86e2edee8.prmutv.co.", "7c7b02d4bc3d48dd81a7c7738d4de1ab.pacloudflare.com.", + "88a66e5c-8fe8-48af-9c6c-3ec3f4983aad.prmutv.co.", "8x8.com.cdn.cloudflare.net.", "920.ncsis.gov.", "998law.com.", + "9game.cn.", "9pumbooc7hqedhjmeavbpmp5ik9u0ngr-data.customer.pendo.io.", "a-api.anthropic.com.", "a-cdn.anthropic.com.", @@ -72,119 +70,59 @@ var FakeECSFQDNs = container.NewMapSet( "a.nel.cloudflare.com.", "a.nitropay.com.", "a.simplemdm.com.", - "a048.casalemedia.com.", - "a087.casalemedia.com.", - "a1477.casalemedia.com.", - "a1478.casalemedia.com.", - "a1479.casalemedia.com.", - "a1518.casalemedia.com.", - "a1523.casalemedia.com.", - "a1527.casalemedia.com.", - "a1537.casalemedia.com.", - "a1544.casalemedia.com.", - "a1549.casalemedia.com.", - "a1556.casalemedia.com.", - "a1577.casalemedia.com.", - "a1623.casalemedia.com.", - "a1635.casalemedia.com.", - "a1637.casalemedia.com.", - "a1667.casalemedia.com.", - "a1678.casalemedia.com.", - "a1681.casalemedia.com.", - "a1684.casalemedia.com.", - "a1687.casalemedia.com.", - "a1688.casalemedia.com.", - "a1689.casalemedia.com.", - "a1690.casalemedia.com.", - "a1691.casalemedia.com.", - "a1692.casalemedia.com.", - "a22711502979.cdn.optimizely.com.", - "a252.casalemedia.com.", - "a25758810713.cdn.optimizely.com.", - "a2806.casalemedia.com.", - "a2811.casalemedia.com.", - "a2828.casalemedia.com.", - "a2836.casalemedia.com.", - "a2839.casalemedia.com.", - "a2849.casalemedia.com.", - "a2850.casalemedia.com.", - "a2854.casalemedia.com.", - "a2859.casalemedia.com.", - "a2869.casalemedia.com.", - "a2884.casalemedia.com.", - "a2898.casalemedia.com.", - "a2900.casalemedia.com.", - "a2901.casalemedia.com.", - "a2916.casalemedia.com.", - "a2928.casalemedia.com.", - "a2935.casalemedia.com.", - "a2941.casalemedia.com.", - "a2944.casalemedia.com.", + "a14721270268.cdn.optimizely.com.", + "a17957420003.cdn.optimizely.com.", "a2a5c7f9-3fa0-4182-889a-15aa61acf59b.prmutv.co.", - "a364.casalemedia.com.", - "a366.casalemedia.com.", - "a375.casalemedia.com.", - "a389.casalemedia.com.", - "a392.casalemedia.com.", - "a410.casalemedia.com.", - "a416.casalemedia.com.", - "a4621041136.cdn.optimizely.com.", "a5551.casalemedia.com.", + "a5556.casalemedia.com.", "a5557.casalemedia.com.", "a5558.casalemedia.com.", + "a5559.casalemedia.com.", "a5560.casalemedia.com.", "a5561.casalemedia.com.", "a5562.casalemedia.com.", "a5563.casalemedia.com.", "a5564.casalemedia.com.", - "a5565.casalemedia.com.", "a5567.casalemedia.com.", "a5568.casalemedia.com.", "a5569.casalemedia.com.", - "a5570.casalemedia.com.", + "a5571.casalemedia.com.", "a5572.casalemedia.com.", - "a5573.casalemedia.com.", "a5574.casalemedia.com.", "a5575.casalemedia.com.", - "a5576.casalemedia.com.", - "a5578.casalemedia.com.", "a5579.casalemedia.com.", + "a5580.casalemedia.com.", "a5581.casalemedia.com.", "a5582.casalemedia.com.", + "a5583.casalemedia.com.", "a5584.casalemedia.com.", "a5585.casalemedia.com.", "a5586.casalemedia.com.", "a5587.casalemedia.com.", "a5588.casalemedia.com.", "a5589.casalemedia.com.", - "a5590.casalemedia.com.", "a5591.casalemedia.com.", "a5593.casalemedia.com.", "a5594.casalemedia.com.", "a5595.casalemedia.com.", "a5596.casalemedia.com.", - "a5599.casalemedia.com.", + "a5597.casalemedia.com.", + "a5598.casalemedia.com.", "a55a84b3-9632-4869-b625-3d8ef43ed18d.prmutv.co.", "a5600.casalemedia.com.", "a5601.casalemedia.com.", - "a5602.casalemedia.com.", "a5603.casalemedia.com.", "a5604.casalemedia.com.", "a5605.casalemedia.com.", "a5606.casalemedia.com.", "a5607.casalemedia.com.", - "a5608.casalemedia.com.", "a5609.casalemedia.com.", "a5610.casalemedia.com.", "a5611.casalemedia.com.", "a5612.casalemedia.com.", "a5613.casalemedia.com.", - "a5614.casalemedia.com.", - "a5615.casalemedia.com.", "a5616.casalemedia.com.", "a5617.casalemedia.com.", - "a5618.casalemedia.com.", - "a5619.casalemedia.com.", "a5620.casalemedia.com.", "a5621.casalemedia.com.", "a5622.casalemedia.com.", @@ -195,8 +133,6 @@ var FakeECSFQDNs = container.NewMapSet( "a5628.casalemedia.com.", "a5630.casalemedia.com.", "a5631.casalemedia.com.", - "a5632.casalemedia.com.", - "a5633.casalemedia.com.", "a5634.casalemedia.com.", "a5635.casalemedia.com.", "a5636.casalemedia.com.", @@ -205,33 +141,28 @@ var FakeECSFQDNs = container.NewMapSet( "a5639.casalemedia.com.", "a5640.casalemedia.com.", "a5671.casalemedia.com.", - "a5672.casalemedia.com.", "a5673.casalemedia.com.", + "a5674.casalemedia.com.", "a5675.casalemedia.com.", "a5676.casalemedia.com.", "a5677.casalemedia.com.", "a5679.casalemedia.com.", - "a568.casalemedia.com.", - "a5680.casalemedia.com.", - "a5681.casalemedia.com.", - "a5682.casalemedia.com.", "a5683.casalemedia.com.", "a5684.casalemedia.com.", "a5685.casalemedia.com.", + "a5686.casalemedia.com.", + "a5687.casalemedia.com.", "a5688.casalemedia.com.", "a5689.casalemedia.com.", "a5690.casalemedia.com.", - "a5692.casalemedia.com.", "a5693.casalemedia.com.", - "a5694.casalemedia.com.", "a5695.casalemedia.com.", "a5696.casalemedia.com.", "a5697.casalemedia.com.", "a5698.casalemedia.com.", - "a5699.casalemedia.com.", "a5700.casalemedia.com.", "a5701.casalemedia.com.", - "a5702.casalemedia.com.", + "a5703.casalemedia.com.", "a5704.casalemedia.com.", "a5705.casalemedia.com.", "a5706.casalemedia.com.", @@ -239,10 +170,10 @@ var FakeECSFQDNs = container.NewMapSet( "a5708.casalemedia.com.", "a5709.casalemedia.com.", "a5710.casalemedia.com.", - "a572.casalemedia.com.", "a5731.casalemedia.com.", "a5732.casalemedia.com.", "a5733.casalemedia.com.", + "a5734.casalemedia.com.", "a5735.casalemedia.com.", "a5736.casalemedia.com.", "a5737.casalemedia.com.", @@ -253,7 +184,6 @@ var FakeECSFQDNs = container.NewMapSet( "a5742.casalemedia.com.", "a5743.casalemedia.com.", "a5744.casalemedia.com.", - "a5745.casalemedia.com.", "a5746.casalemedia.com.", "a5747.casalemedia.com.", "a5748.casalemedia.com.", @@ -265,9 +195,12 @@ var FakeECSFQDNs = container.NewMapSet( "a5754.casalemedia.com.", "a5755.casalemedia.com.", "a5756.casalemedia.com.", + "a5757.casalemedia.com.", "a5758.casalemedia.com.", "a5759.casalemedia.com.", - "a576.casalemedia.com.", + "a5760.casalemedia.com.", + "a5761.casalemedia.com.", + "a5762.casalemedia.com.", "a5763.casalemedia.com.", "a5764.casalemedia.com.", "a5765.casalemedia.com.", @@ -275,7 +208,6 @@ var FakeECSFQDNs = container.NewMapSet( "a5767.casalemedia.com.", "a5768.casalemedia.com.", "a5769.casalemedia.com.", - "a577.casalemedia.com.", "a5770.casalemedia.com.", "a5771.casalemedia.com.", "a5772.casalemedia.com.", @@ -284,21 +216,17 @@ var FakeECSFQDNs = container.NewMapSet( "a5775.casalemedia.com.", "a5776.casalemedia.com.", "a5777.casalemedia.com.", - "a5778.casalemedia.com.", "a5779.casalemedia.com.", - "a578.casalemedia.com.", - "a5780.casalemedia.com.", "a5781.casalemedia.com.", "a5782.casalemedia.com.", "a5783.casalemedia.com.", + "a5784.casalemedia.com.", "a5785.casalemedia.com.", - "a5786.casalemedia.com.", "a5787.casalemedia.com.", "a5788.casalemedia.com.", "a5789.casalemedia.com.", "a5790.casalemedia.com.", "a5791.casalemedia.com.", - "a5792.casalemedia.com.", "a5793.casalemedia.com.", "a5794.casalemedia.com.", "a5795.casalemedia.com.", @@ -311,11 +239,10 @@ var FakeECSFQDNs = container.NewMapSet( "a5802.casalemedia.com.", "a5803.casalemedia.com.", "a5804.casalemedia.com.", - "a5805.casalemedia.com.", - "a5806.casalemedia.com.", "a5809.casalemedia.com.", "a5810.casalemedia.com.", "a5811.casalemedia.com.", + "a5812.casalemedia.com.", "a5813.casalemedia.com.", "a5814.casalemedia.com.", "a5815.casalemedia.com.", @@ -337,7 +264,6 @@ var FakeECSFQDNs = container.NewMapSet( "a5871.casalemedia.com.", "a5872.casalemedia.com.", "a5873.casalemedia.com.", - "a5874.casalemedia.com.", "a5875.casalemedia.com.", "a5876.casalemedia.com.", "a5877.casalemedia.com.", @@ -357,12 +283,14 @@ var FakeECSFQDNs = container.NewMapSet( "abtest-aws-us-east-01.saas.sensorsdata.com.", "accela.com.", "accentuate.io.", + "accenture.com.", "access.mp.lura.live.", "account.box.com.", "account.cpanel.net.", "account.meraki.com.", "account.premierleague.com.", "accountapi.agoda.com.", + "accounts.finsweet.com.", "accounts.pointclickcare.com.", "accounts.shopify.com.", "accounts.superhuman.com.", @@ -370,6 +298,7 @@ var FakeECSFQDNs = container.NewMapSet( "acdn.tinkoff.ru.", "acfun.cn.", "acgvideo.com.", + "acm.org.", "acme-v02.api.letsencrypt.org.", "acr01.prd.dc01.adaptiva.cloud.", "acr02.prd.dc02.adaptiva.cloud.", @@ -389,45 +318,44 @@ var FakeECSFQDNs = container.NewMapSet( "ad-host-backup-america.oss-us-west-1.aliyuncs.com.", "ad-host-backup-asia.oss-ap-southeast-1.aliyuncs.com.", "ad-host-backup-europe.oss-eu-central-1.aliyuncs.com.", + "ad.nvdvr.cn.", "adapex.io.", "adaptiva.cloud.", "adash.man.aliyuncs.com.", "adblock.telemetry.getadblock.com.", "adder.feeder.co.", "additionfi.com.", - "adexchangeclear.com.", - "adguard.com.", "adiam.tech.", "aditude.io.", + "adlook.tech.", "adm.wsms.haplat.net.", "admbk.wsms.haplat.net.", + "admin.cloud.microsoft.", "admin.shopify.com.", "admixer.com.", "adopt.jaggaer.com.", - "ads.playstream.media.", - "ads.themoneytizer.com.", "adsco.re.", "adsinteractive.com.", + "adspector.io.", "adstatistics.av380.net.", "adtarget.market.", "adtech.ink.", "adtidy.org.", "advantage.purpleguys.com.", "advantage2.purpleguys.com.", - "advertise.cloudlinks.cn.", "adview.com.", "adxpremium.services.", "aeries.com.", "afd-lnkd.www.linkedin.com.", + "affiliate-api.marketing.us.platform.afterpay.com.", "afss.zhiqinyun.cn.", + "afterpay.com.", "ag.dns-finder.com.", - "agelesslivingny.com.", "agent-healthcheck.defensx.com.", "agent-logos.storage.googleapis.com.", "agent.marketingcloudfx.com.", "agentio.com.", "agents.fxpasu01.manage.microsoft.us.", - "ai-assistant.foxit.com.", "ai-voice.cloudbirds.cn.", "ai.finalsite.com.", "aicdn.com.", @@ -437,12 +365,12 @@ var FakeECSFQDNs = container.NewMapSet( "air-quality-api.open-meteo.com.", "airasia.com.", "airtory.com.", + "aitopia.ai.", "ajcloud.net.", "akrdinfo.cn.", "akulaku.com.", "alarm.wsms.haplat.net.", "alarmbk.wsms.haplat.net.", - "alb.mobile.devnet.helium.wtf.", "albany.remotepc.com.", "album-sg01a.ocloud.heytapmobi.com.", "alfasense.com.", @@ -458,12 +386,8 @@ var FakeECSFQDNs = container.NewMapSet( "aliyuncs.com.", "aloyoga.com.", "alpha1-ap-public.val.qq.com.", - "alpha1-nj-gp4-mix2.val.qq.com.", "ambari.dvr163.com.", "amdcopen.m.taobao.com.", - "americanchemicalsociety-my.sharepoint.com.", - "ameritas-my.sharepoint.com.", - "amp-static.cbsnews.com.", "amp.permutive.com.", "amplitudelab.usemotion.com.", "ams-api.video.intl.xiaomi.com.", @@ -479,24 +403,23 @@ var FakeECSFQDNs = container.NewMapSet( "analytics.qumucloud.com.", "analytics.talbots.com.", "android.crashsight.wetest.net.", + "android.linguee.com.", "ankara.remotepc.com.", "anlian.co.", "announce.torrentsmd.com.", - "announcekit.app.", "anthropic.com.", "antstream.com.", "aocde.com.", "ap.sd-rtn.com.", + "api-2.curalate.com.", "api-asyncgw-gcc-teams.usgovtrafficmanager.net.", "api-auth.flysleep.cn.", "api-auth.zztfly.com.", "api-decider.vsco.co.", "api-eu1.hubspot.com.", - "api-glb-aapne1a.smoot.apple.com.", - "api-glb-aapne1c.smoot.apple.com.", "api-glb-aaps1b.smoot.apple.com.", "api-glb-aapse1c.smoot.apple.com.", - "api-glb-aeun1b.smoot.apple.com.", + "api-glb-aeun1a.smoot.apple.com.", "api-glb-aeus2a.smoot.apple.com.", "api-glb-aeus2b.smoot.apple.com.", "api-glb-aeuw1b.smoot.apple.com.", @@ -508,14 +431,16 @@ var FakeECSFQDNs = container.NewMapSet( "api-glb-ause2c.smoot.apple.com.", "api-glb-ausw2b.smoot.apple.com.", "api-glb-ausw2c.smoot.apple.com.", + "api-in-orc.v-videoapp.com.", "api-mayi.django.t.taobao.com.", "api-mifit-us3.zepp.com.", "api-player.musicstylingonline.com.", + "api-pos.schoolnutrition.linq.com.", "api-preview.luckyorange.com.", "api-private.atlassian.com.", - "api-prod-2.optisigns.com.", "api-proxy.conveythis.com.", "api-safari-aapse1c.smoot.apple.com.", + "api-safari-aeun1a.smoot.apple.com.", "api-safari-aeun1b.smoot.apple.com.", "api-safari-aeus2a.smoot.apple.com.", "api-safari-aeus2b.smoot.apple.com.", @@ -528,7 +453,6 @@ var FakeECSFQDNs = container.NewMapSet( "api-safari-ause2c.smoot.apple.com.", "api-safari-ausw2b.smoot.apple.com.", "api-safari-ausw2c.smoot.apple.com.", - "api-service.shein.com.cdn.cloudflare.net.", "api-sh.django.t.taobao.com.gds.alibabadns.com.", "api-spotlight-ause1a.smoot.apple.com.", "api-spotlight-ause1b.smoot.apple.com.", @@ -540,9 +464,9 @@ var FakeECSFQDNs = container.NewMapSet( "api-us.mida.so.", "api-user.dalyfeds.com.", "api-westus.classroom.cloud.", + "api.1clickvpn.net.", "api.56myu5u3v.com.", "api.adguard.org.", - "api.agent.dcca.dell.com.", "api.al-array.com.", "api.ams.gcc.teams.microsoft.com.", "api.anthropic.com.", @@ -553,57 +477,58 @@ var FakeECSFQDNs = container.NewMapSet( "api.btloader.com.", "api.bugreport.huorong.cn.", "api.cdo.oppomobile.com.", + "api.ceros.com.", "api.cloud.tenda.com.cn.", "api.config-security.com.", - "api.crazygames.com.", "api.crobox.com.", "api.crush.163.com.", - "api.cyberghostvpn.com.", + "api.dashboard.3dos.io.", "api.dealersocket.com.", - "api.f6kyf.com.", "api.facemojikeyboard.com.", - "api.funneljourney.io.", "api.gelighting.com.", + "api.get-just-api.com.", "api.glanceapis.com.", "api.gleap.io.", "api.gravitec.media.", + "api.gslb.pinterest.net.", "api.internal.temp-mail.io.", "api.ipgeolocation.io.", - "api.kingdata.ksyun.com.", + "api.kinogram.best.", "api.letsplaywell.com.", "api.lightboxcdn.com.", "api.linkr.com.", + "api.love8.ltd.", "api.mavenoid.com.", "api.moyoung.com.", "api.nkryu17dc.com.", "api.onedrive.com.", "api.open-meteo.com.", - "api.owhealth.com.cdn.cloudflare.net.", "api.permutive.app.", "api.permutive.com.", - "api.pixelpioneerss.com.", - "api.poki.com.", "api.polaris.al-array.com.", "api.popin.cc.", "api.production.gstcpx.site.", "api.queryly.com.", "api.ringcentral.biz.", "api.rollbar.com.", + "api.samsungweather.com.", "api.sdk.cqsjd.xyz.", "api.snapchat.com.", - "api.tamosplayer.com.", "api.tracking.al-array.com.", "api.transitapp.com.", - "api.transmitsecurity.io.cdn.cloudflare.net.", + "api.tx4.pw.adn.cloud.", "api.unity.com.", + "api.us.minga.io.", "api.us.xiaoyi.com.", + "api.us2.backdrop.cloud.", "api.usercentrics.eu.", "api.vieon.vn.", "api.vsco.co.", - "api.x1skf.com.", "api.zmcyu9ypy.com.", "api000.backblazeb2.com.", "api001.backblazeb2.com.", + "api22-normal-quic-alisg.tmtreader.com.", + "api6.aoneroom.com.", "apiblink.ru.", "apiisgp.ezvizlife.com.", "apiisgp.hik-connect.com.", @@ -611,15 +536,18 @@ var FakeECSFQDNs = container.NewMapSet( "apixeu.b2c.com.", "app-atl.five9.com.", "app-scl.five9.com.", + "app-student.atitesting.com.", "app.box.com.", + "app.cart-bot.net.", "app.cybba.solutions.", "app.ee-share.com.", - "app.eu.securiti.ai.", "app.firmguard.com.", + "app.linguee.com.", "app.pdq.com.", "app.pendo.qgenda.com.", "app.pendo.uptodate.com.", "app.sealsubscriptions.com.", + "app.signnow.com.", "app.talkingpts.org.", "app.usercentrics.eu.", "app.zoom.us.", @@ -628,11 +556,8 @@ var FakeECSFQDNs = container.NewMapSet( "applog.matrix.easebar.com.", "appocean.media.", "apps-ds.shopifynetwork.com.", - "apps.samsung.com.", - "apps.shopify.com.", "apps.wix.com.", "appstoreonrt-stsdk.vivo.com.cn.", - "appstoreort-stsdk.vivo.com.cn.", "aralego.net.", "arbitrum.io.", "arenabg.com.", @@ -642,18 +567,18 @@ var FakeECSFQDNs = container.NewMapSet( "arm1.maxhost.io.", "armexfort.uk.", "arms-retcode-sg.aliyuncs.com.", - "article.writeswonder.com.", "as-api.asm.skype.com.", "as-prod.asyncgw.teams.microsoft.com.", + "as.inspi-dsp.com.", "asanalytics.booking.com.", "asc-a.hbwrapper.com.", "asia-browser.vivoglobal.com.", "asia-ex-adlog.vivoglobal.com.", "asia-minor-appstore.vivoglobal.com.", + "asia-rommc-api.vivoglobal.com.", "asia-timer-appstore.vivoglobal.com.", "asia-timesync.vivoglobal.com.", "asia-upload-appstore.vivoglobal.com.", - "asia-usrsys-api.vivoglobal.com.", "asia-wifi.vivoglobal.com.", "asia.remotepc.com.", "asm-api-golocal-geo-am-teams.trafficmanager.net.", @@ -663,15 +588,13 @@ var FakeECSFQDNs = container.NewMapSet( "asm-api-prod-geo-am-skype.trafficmanager.net.", "asm-api-prod-geo-as-skype.trafficmanager.net.", "asm-api-prod-geo-eu-skype.trafficmanager.net.", - "aspirit.art.", "asset.fwcdn3.com.", "asset.fwpub1.com.", "asset.fwscripts.com.", "assets.api.stairwell.com.", + "assets.contentstack.io.cdn.cloudflare.net.", "assets.id.me.", "assets.ovid.com.", - "assets.secure.checkout.visa.com.", - "async-motiondetection-us-1d.oss-us-west-1.aliyuncs.com.", "asyncim.zoom.us.", "atka.aibansg.com.", "atlanta.remotepc.com.", @@ -679,52 +602,54 @@ var FakeECSFQDNs = container.NewMapSet( "atlanta4.remotepc.com.", "atlas.shopifysvc.com.", "atlassian.net.", - "atlassianblog.wpengine.com.", "atm-broker-ws-1314297-sg.vasdgame.com.", - "atom-tag-acc-real-hwp.gamedistribution.com.", "au-prod.asyncgw.teams.microsoft.com.", "au.ff.avast.sec.miui.com.", "auckland.remotepc.com.", + "audienceye.com.", "audio.vivintsky.com.", "audiostatlog.cc.easebar.com.", "audrte.com.", "australiaeast.api.cognitive.microsoft.com.", "auth-l7.bereal.com.", "auth.atlassian.com.", - "auth.prod.ims.adobejanus.com.", - "auto-load-balancer.likr.com.tw.", + "auth.xello.world.", + "autohome.com.cn.", "automate.itsasap.com.", - "avigilon.com.", + "autonavi.com.", + "autotrack.studyquicks.com.", + "avatar.canva.com.", "aws-aus-e-rdvz.g.nssvc.net.", "aws-bz-s-rdvz.g.nssvc.net.", "aws-us-e-rdvz.g.nssvc.net.", "aws-us-nc-rdvz.g.nssvc.net.", - "ayads.co.", + "axiom.co.", "az-us-e-rdvz.g.nssvc.net.", "az-us-sc-features.netscalergateway.net.", + "az-us-sc-rdvz.g.nssvc.net.", "azchicago.remotepc.com.", "azchicago2.remotepc.com.", "azure-reg.c.nssvc.net.", "azurgames.com.", "b2b.filesyscrm.com.", "bablosoft.com.", - "backend.deepl.com.", "badambiz.com.", "badoo.app.", "baganintel.com.", "bahrain.remotepc.com.", "baishan-cloud.net.", "balancer.api.net2fast.com.", - "ballstate-my.sharepoint.com.", "baltimore.remotepc.com.", + "bam-cell.cell.nr-data.net.", "bam.nr-data.net.cdn.cloudflare.net.", + "bancomermovil.com.", "bangalore2.remotepc.com.", "bangalore3.remotepc.com.", "bangalore4.remotepc.com.", - "bankozarks.sharepoint.com.", "bankwithunited-my.sharepoint.com.", "barstoolsports.com.", "batesvilletechnology.com.", + "bbb.org.", "bbvaexperience.com.", "bd1cec50-00d1-4ce9-9572-785857419a1e.prmutv.co.", "bdreporting.com.", @@ -733,31 +658,27 @@ var FakeECSFQDNs = container.NewMapSet( "beacon.qq.com.", "beacons4.gvt2.com.", "beacons5.gvt2.com.", - "becn.sharepoint.com.", - "bee.tc.easebar.com.", "beizi.biz.", "belgium.remotepc.com.", "belgrad.remotepc.com.", "bend.remotepc.com.", + "bestialitysextaboo.net.", + "beta.character.ai.", "bgtfs.transitapp.com.", "bi-tracker-global.rivergame.net.", "bidster.net.", + "bifrost-v10.getpostman.com.", "bifrost.vivaldi.com.", "bigdata.talkie-ai.com.", "bik.gov.tr.", - "bildanat.com.", - "bistro-la-nature.com.", - "bitdefender.com.cdn.cloudflare.net.", - "bithumb.com.", - "bitmovin.com.", "bj-td-menta-01-callback.advlion.com.", - "bl.listrakbi.com.", "black-cat.crypto.com.", "blackboard.com.", "blackbox.dropbox-dns.com.", "blacknut.net.", "bloomerang.co.", "bluebuffalo.com.", + "bluepurple.cn.", "bluffdale.remotepc.com.", "bmaus.bumble.com.", "boardgamearena.com.", @@ -774,9 +695,11 @@ var FakeECSFQDNs = container.NewMapSet( "box.com.", "box.net.", "br.chat.si.riotgames.com.", + "brands-prod.cdn-tinkoff.ru.", "bratislava.remotepc.com.", "brazilsouth.api.cognitive.microsoft.com.", "breitbart.com.", + "brenntag01nam-my.sharepoint.com.", "bringads.ru.", "broadstreetads.com.", "broker-projectd.vasdgame.com.", @@ -784,13 +707,13 @@ var FakeECSFQDNs = container.NewMapSet( "bsclink.cn.", "bsgslb.cn.", "bsgslb.com.", + "bsrgi.usage.trgscreen.com.", "bt.moack.co.kr.", "btinstall-artifacts.bittorrent.com.", "btrace.qq.com.", "bucharest.remotepc.com.", "budapest.remotepc.com.", "buenosaires.remotepc.com.", - "bugly.qcloud.com.", "bugly.weplayer.cc.", "bugreport.huorong.cn.", "bx01.optimix.cn.", @@ -803,31 +726,29 @@ var FakeECSFQDNs = container.NewMapSet( "c.appbaqend.com.", "c.pub.network.", "c1.ttcache.com.", - "c10.patreonusercontent.com.", + "c2-eu.piano.io.", "c2.ttcache.com.", "c2c.wechat.com.", "c3.ttcache.com.", "c4.ttcache.com.", "ca-prod.asyncgw.teams.microsoft.com.", - "ca.4dmax.space.", "ca.rogers.rcs.telephony.goog.", "ca000.backblaze.com.", "ca001.backblaze.com.", "ca80a1adb12a4fbdac5ffcbc944e9a61.pacloudflare.com.", "cachenetworks.com.", + "cactus.vividshort.com.", "caixa.gov.br.", "caldav.163.com.", "california.remotepc.com.", "caltech.edu.", "campuslabsengage.com.", - "camstore.vsco.co.", "canada.remotepc.com.", "canadacentral.api.cognitive.microsoft.com.", "canadaeast.api.cognitive.microsoft.com.", "canberra.remotepc.com.", "cantor-lite-api.vsco.co.", "capetown.remotepc.com.", - "capig.stape.id.", "captaina.co.", "car-cloud-cn.net.", "cardiff.remotepc.com.", @@ -835,40 +756,36 @@ var FakeECSFQDNs = container.NewMapSet( "cartx.cloud.", "cas-us8.wfs.cloud.", "cask.qg2.apps.qualys.com.", - "cask.qg3.apps.qualys.com.", - "cask.qg4.apps.qualys.com.", "cat1.hbwrapper.com.", "cat2.hbwrapper.com.", "cat3.hbwrapper.com.", + "catholiccompany.com.", "cbox.ws.", "cc.easebar.com.", "ccare2.ccr1.com.", - "ccf.ivalua.com.", "ccs.c.nssvc.net.", "cdn-audio-gcp-media.getepic.com.", "cdn-c.skcrtxr.com.", "cdn-cname.pendo.io.", "cdn-gcp-media-drm.getepic.com.", "cdn-gcp-media.getepic.com.", - "cdn-gop.garenanow.com.", "cdn-probe-jobs.mrgcdn.ru.", "cdn-us.algoliaradar.com.", "cdn-video-gcp-media.getepic.com.", "cdn.adjust.com.", "cdn.adtarget.market.", - "cdn.aimtell.com.cdn.cloudflare.net.", + "cdn.aitopia.ai.", "cdn.ap.bittorrent.com.", "cdn.chargeafter.com.", "cdn.conveythis.com.", "cdn.deepintent.com.", - "cdn.flightradar24.com.", + "cdn.embed.ly.cdn.cloudflare.net.", "cdn.ftd.agency.", "cdn.groupbycloud.com.", "cdn.hw.gcloudcs.com.", - "cdn.inappstory.ru.", "cdn.instapagemetrics.com.", - "cdn.justuno.com.", "cdn.lgrckt-in.com.", + "cdn.lr-in.com.", "cdn.minga.io.", "cdn.nmcorp.video.", "cdn.pandora.xiaomi.com.", @@ -885,15 +802,12 @@ var FakeECSFQDNs = container.NewMapSet( "cdn.us.minga.io.", "cdn.uxfeedback.ru.", "cdn.viously.com.", - "cdn02.humeysha.com.", + "cdn.vstar.app.", "cdn05.humeysha.com.", - "cdn1.wixdns.net.", - "cdn11.bigcommerce.com.cdn.cloudflare.net.", - "cdn3.fireworktv.com.", "cdn4.fireworktv.com.", "cdnapps.avada.io.", - "cdnfp.accurint.com.", "cdngslb.com.", + "cdnimg.izooto.com.", "cdntm.hsbc.co.uk.", "cdnwidget.com.", "cds.glanceapis.com.", @@ -901,45 +815,30 @@ var FakeECSFQDNs = container.NewMapSet( "cedexis-test.com.", "cedock.com.", "cef.com.br.", - "center00.deltaork.com.", - "center01.deltaork.com.", - "center02.deltaork.com.", - "center03.deltaork.com.", - "center04.deltaork.com.", - "center05.deltaork.com.", - "center06.deltaork.com.", - "center07.deltaork.com.", - "center08.deltaork.com.", - "center09.deltaork.com.", - "center10.deltaork.com.", - "center11.deltaork.com.", - "center12.deltaork.com.", - "center13.deltaork.com.", - "center14.deltaork.com.", - "center15.deltaork.com.", - "center16.deltaork.com.", - "center17.deltaork.com.", - "center18.deltaork.com.", - "center19.deltaork.com.", "centralindia.api.cognitive.microsoft.com.", "centralus.api.cognitive.microsoft.com.", "centrexit.com.", "cf-3ip.web.us-east-1.prod.diagnostic.networking.aws.dev.", "cfa.fidelity.com.", + "cgi.twns.qq.com.", "challenges.app.", "chanjet.com.", "chargeafter.com.", "charlotte.remotepc.com.", "chaseprod.quantummetric.com.", - "chat.openai.com.", "check2.lloydsbank.co.uk.", "check2.zennolab.com.", + "checkout-blocks.shopifyapps.com.", "checkout.shopify.com.", "checkout.www.deepl.com.", + "chek.zennolab.com.", "chekfast.zennolab.com.", "chennai.remotepc.com.", + "chewycomllc-my.sharepoint.com.", "chicago2.remotepc.com.", + "china-dcr-ccl-zj-a.haplat.net.", "china-dcr-ccl-zj-b.haplat.net.", + "china-dcr-ccl-zj-c.haplat.net.", "chinaccl-a.haplat.net.", "chinaccl-b.haplat.net.", "chinaccl-c.haplat.net.", @@ -951,35 +850,35 @@ var FakeECSFQDNs = container.NewMapSet( "chub2.imp.us.contentkeeper.net.", "cicd-release-api.dalyfeds.com.", "cimcsouth.com.", - "cisa.gov.", + "cinemark.com.", "citrix-cloud-content.customer.pendo.io.", "citrix-cloud-data.customer.pendo.io.", "citrix-sharefile-content.customer.pendo.io.", "citrix-sharefile-data.customer.pendo.io.", "citrix.com.", "cl-data.ads.heytapmobi.com.", - "claphands20.com.", "claude.ai.", + "clearesult5.sharepoint.com.", "cleveland.remotepc.com.", - "click-v4.clkoplardir.com.", - "click-v4.exmainclckback.com.", "click-v4.junclikrmedi.com.", - "click-v4.mainexclkdir.com.", "clickiocmp.com.", "client-log.box.com.", "client-tracking.omiapp.me.", "client-updates.lumu.io.", "client.otcollector.com.", "clientlogsf.music.163.com.", - "clipchamp.com.", "cloud-agent.policypak.com.", "cloud-config-service.rtc.aliyuncs.com.", "cloud-links.net.", - "cloud-x-21-srb.pugiwora.xyz.", - "cloud.huawei.ru.", + "cloud-x-21-srb.guvupade.xyz.", + "cloud-x-21-srb.morazoku.xyz.", + "cloud-x-21-srb.noqibave.xyz.", + "cloud-x-21-srb.zelunaku.xyz.", + "cloud.huawei.asia.", "cloud.v-key.com.", "cloud.vmp.onezapp.com.", "cloudbirds.cn.", + "cloudlink.balena-cloud.com.", "cloudlinks.cn.", "cm-x.mgid.com.", "cmpassport.com.", @@ -987,9 +886,9 @@ var FakeECSFQDNs = container.NewMapSet( "cn-mib2high-mbbservices.audi-connect.cn.", "cn-mib2plus.mbbservices-1a.audi-connect.cn.", "cn.cdn.dnsv1.com.", + "cn.gcloudcs.com.", "cname.pendo.io.", "cname.shopify.com.", - "cnhtcsales.com.", "cnt.woxh.world.", "cnzz.com.", "codacloud.net.", @@ -1010,15 +909,12 @@ var FakeECSFQDNs = container.NewMapSet( "com.yangyi19.com.", "cometglobal.cf.t3cloud.pb.com.", "cometservd1.pb.com.", - "comfrt-us.attn.tv.", - "comicbook.com.", "commercial.ocsp.identrust.com.", "common-afd.fe.1drv.com.", "common-afdrk.fe.1drv.com.", - "common-geo.wac.trafficmanager.net.", "company.rt.ru.", "compiles.overleafusercontent.com.", - "concursolutions.report-uri.com.", + "comserver.us3.swi-rc.com.", "config-alps.y5en.com.", "config-security.com.", "config.a-m-p.xyz.", @@ -1026,6 +922,7 @@ var FakeECSFQDNs = container.NewMapSet( "config.config-factory.com.", "config.content-settings.com.", "config.office.net.", + "config.seedtag.com.", "config.silk.al-array.com.", "config.y5en.com.", "config2.cmpassport.com.", @@ -1039,6 +936,7 @@ var FakeECSFQDNs = container.NewMapSet( "content.adopt.jaggaer.com.", "content.assist.chromeriver.com.", "content.bhrpendo.bamboohr.com.", + "content.bt.co.", "content.dap.paylocity.com.", "content.data.aleks.com.", "content.data.mheducation.com.", @@ -1049,7 +947,6 @@ var FakeECSFQDNs = container.NewMapSet( "content.fisglobal.com.", "content.gap.com.", "content.help.explorelearning.com.", - "content.maxconnector.com.", "content.pendo.brightlysoftware.com.", "content.pendo.careporthealth.com.", "content.pendo.follettdestiny.com.", @@ -1060,8 +957,8 @@ var FakeECSFQDNs = container.NewMapSet( "content22.citicards.com.", "content22.online.citi.com.", "contentexchange.me.", + "contentlmsp.student.atitesting.com.", "control-out.mna.qq.com.", - "conversion-assistant.apps.seabroadnet.com.", "cookiereports.com.", "coolccloud.com.", "coolkit.cc.", @@ -1077,6 +974,7 @@ var FakeECSFQDNs = container.NewMapSet( "cpm.aserve1.net.", "cpm.qortex.ai.", "cpm.vuukle.net.", + "cpm.xrtb.io.", "cpr-pusa01.app.blackbaud.net.", "cpx-research.com.", "crash.xiaohongshu.com.", @@ -1084,6 +982,7 @@ var FakeECSFQDNs = container.NewMapSet( "crashsight.qq.com.", "crashsight.wetest.net.", "crealitycloud.com.", + "creative.cambaddies.com.", "creator.pdf24.org.", "creditmaven.com.", "credova.com.", @@ -1091,7 +990,6 @@ var FakeECSFQDNs = container.NewMapSet( "croatia.remotepc.com.", "crobox.com.", "crobox.io.", - "crossborder-integration.global-e.com.", "crossforward.com.", "crowd.transitapp.com.", "cs.globalsun.io.", @@ -1102,25 +1000,23 @@ var FakeECSFQDNs = container.NewMapSet( "cstse02.ultipro.com.", "cstsew02.ultipro.com.", "cstsn02.ultipro.com.", + "ct.automox.com.", + "ct.canva.com.", "cta-eu1.hubspot.com.", "ctmail.com.", - "ctripins.com.", - "ctrk.klclick.com.", + "ctrmi.cn.", "cts.appmeta.store.", "ctt-er.hnzkclouds.com.", "ctx-akadns-features.netscalergateway.net.", - "cummins365-my.sharepoint.com.", - "custom-cf.video.twimg.com.cdn.cloudflare.net.", + "cust-dv.zentrick.com.", "customer.gopayapi.com.", "customer.homedepot.com.", "cvs.quantummetric.com.", "cwa-ma01.ntiva.com.", "cwa-mw01.ntiva.com.", "cwmpb-as.ruijienetworks.com.", - "cybersource.com.", "cza.crazygames.com.", "czechrepublic.remotepc.com.", - "czhuaqiang.com.", "d.docs.live.net.", "d.pub.network.", "d2fb08da-1c03-4c8a-978f-ad8a96b4c31f.partner.permutive.app.", @@ -1142,11 +1038,10 @@ var FakeECSFQDNs = container.NewMapSet( "daraz.com.", "dashi.163.com.", "data-detect.nie.easebar.com.", - "data-feed.flightradar24.com.", - "data-tr.rethinkad.com.", "data.analytics.clockwisemd.com.", "data.analytics.thomsonreuters.com.", "data.analytics.ux.quickbase.com.", + "data.appexnw.com.", "data.armexfort.uk.", "data.assist.chromeriver.com.", "data.bhrpendo.bamboohr.com.", @@ -1155,8 +1050,8 @@ var FakeECSFQDNs = container.NewMapSet( "data.data.aleks.com.", "data.data.mheducation.com.", "data.guide-app.zoominfo.co.", + "data.hicloud.com.", "data.hockeystack.com.", - "data.info.costar.com.", "data.ipd.goto.com.", "data.kuiniuca.com.", "data.meitu.com.", @@ -1169,14 +1064,12 @@ var FakeECSFQDNs = container.NewMapSet( "data.pendo.careporthealth.com.", "data.pendo.follettdestiny.com.", "data.pendo.gomotive.com.", - "data.pendo.looker.app.", "data.pendo.progresslearning.com.", "data.pendo.saashr.com.", "data.pendo.udemy.com.", "data.pendoanalytics.dayforcehcm.com.", "data.productanalytics.coconutcalendar.com.", "data.productinsights.blackline.com.", - "data.riotgames.com.cdn.cloudflare.net.", "data.tracking.billtrust.com.", "data00.adlooxtracking.com.", "datacollection.uve.weibo.com.", @@ -1187,7 +1080,6 @@ var FakeECSFQDNs = container.NewMapSet( "datatheorem.com.", "dayunlinks.cn.", "dbankcdn.ru.cdn.dnsv1.com.", - "dc-device-service.v.aaplimg.com.", "dc-dragate-cn.heytapmobi.com.", "dc.ads.linkedin.com.", "dc.di.atlas.samsung.com.", @@ -1208,38 +1100,34 @@ var FakeECSFQDNs = container.NewMapSet( "dc13.adaptiva.cloud.", "dc14.adaptiva.cloud.", "dca-cdsltm-2b.dataremote.com.", - "dcs-live-uc1.mp.lura.live.", - "dcs-live-ue1.mp.lura.live.", - "dcs-live-ue4.mp.lura.live.", - "dcs-live-uw1.mp.lura.live.", "dcs-live.mp.lura.live.", - "dcs-mcdn.mp.lura.live.", "dcs-png.mp.lura.live.", "dcs-vod.mp.lura.live.", - "dcs.mp.lura.live.", "dcs4-vod.mp.lura.live.", "ddata.huntingtonbank.com.", - "ddnsclient.ivview.net.", + "ddyongqin.com.", "de-prod.asyncgw.teams.microsoft.com.", "de.dt.rcs.telephony.goog.", "dealmoon.com.", "debugbear.com.", "decagon.ai.", + "dedog-server.moomoo.com.", "delivery.upremium.asia.", "dellsupportcenter.com.", "delta.quantummetric.com.", + "demeter.trendyol.com.", "denver.remotepc.com.", - "desktop.gonitro.com.", "desync.com.", "dev-silent-upgrade.cloudbirds.cn.", "dev.av380.net.", "dev.visualwebsiteoptimizer.com.", "devc.flysleep.cn.", "devc.zztfly.com.", + "develop.muxintu.com.", "deviceapi.ca1.absolute.com.", "deviceops.hstgps.com.", "devicetrust.com.", - "devs-api.poki.com.", + "dewasyscrm.com.", "diagnostics.api.speechify.com.", "dialpad.com.", "dicontent.ckapis.com.", @@ -1251,22 +1139,22 @@ var FakeECSFQDNs = container.NewMapSet( "dir.4.401402081.west-gcloud.codm.activision.com.", "directadvert.ru.", "discovery.ringcentral.biz.", + "diskapi.baidu.com.", + "dispatcher.is.autonavi.com.gds.alibabadns.com.", "dispatcher.omiapp.me.", "distservp1.pb.com.", "divide.dalyfeds.com.", "dl2.discordapp.net.", - "dler.com.", "dls-udc.dqa.samsung.com.", "dls.di.atlas.samsung.com.", "dm-us.hybrid.ai.", - "dm.hybrid.ai.", - "dm.wo.com.cn.", "dmv.ca.gov.", "dns-e.ns4v.icu.", "dns-finder.com.", "dns-tunnel-check.googlezip.net.", "dns.rubyfish.cn.", "dns1.nettica.com.", + "dns101.register.com.", "doceditor.wrike.com.", "docs.live.net.", "docs.zoom.us.", @@ -1279,18 +1167,22 @@ var FakeECSFQDNs = container.NewMapSet( "dorpat-usw.geo.iponweb.net.", "dosfo1.remotepc.com.", "dosfo2.remotepc.com.", - "doublenix.com.", "douyin.starrydyn.com.", + "down-cvs-sg.vod.susercontent.com.", + "down.taodocs.com.", "download.2.401402081.west-gcloud.codm.activision.com.", "download.gep.mtss.gov.pt.", "downloadcenter.genetec.com.", "dp.barclaysus.com.", - "dpf.authorize.net.", "dpool.sina.com.cn.", + "dpsdq.com.", + "draw-it-session.nearpod.com.", "dreame.tech.", "drfdisvc.walmart.com.", "drown.org.", + "drweb.com.", "ds.gsma.com.", + "ds.iexpertify.com.", "dsa-eu.hybrid.ai.", "dsp-ap.eskimi.com.", "dsp-trk.eskimi.com.", @@ -1302,7 +1194,6 @@ var FakeECSFQDNs = container.NewMapSet( "dun.163yun.com.", "duolingo.cn.", "dz.cyberhaven.io.", - "dzfread.cn.", "e-signlive.com.", "e.189.cn.", "e.cdnwidget.com.", @@ -1393,11 +1284,24 @@ var FakeECSFQDNs = container.NewMapSet( "e2c82.gcp.gvt2.com.", "e2c83.gcp.gvt2.com.", "e2c9.gcp.gvt2.com.", + "e2cs10.gcp.gvt2.com.", + "e2cs11.gcp.gvt2.com.", + "e2cs17.gcp.gvt2.com.", + "e2cs19.gcp.gvt2.com.", + "e2cs20.gcp.gvt2.com.", + "e2cs26.gcp.gvt2.com.", + "e2cs28.gcp.gvt2.com.", + "e2cs32.gcp.gvt2.com.", + "e2cs33.gcp.gvt2.com.", + "e2cs39.gcp.gvt2.com.", + "e2cs42.gcp.gvt2.com.", + "e2cs43.gcp.gvt2.com.", + "e2cs45.gcp.gvt2.com.", + "e2cs47.gcp.gvt2.com.", "e43.ultipro.com.", "e488cdb0-e7cb-4d91-9648-60d437d8e491.prmutv.co.", "e5de3d23065c4748b155c28e6fa36f3e.pacloudflare.com.", "eafddirect.msedge.net.", - "easel.teacherspayteachers.com.", "easeus.com.", "eastasia.api.cognitive.microsoft.com.", "eastmoney.com.", @@ -1406,13 +1310,12 @@ var FakeECSFQDNs = container.NewMapSet( "easycounter.com.", "ecatholic.com.", "eccdnx.com.", - "echo.websocket.org.", + "ecds.onesourcecorp.com.", "ecouser.net.", "ed.link.", "edevice.toshiba-solutions.com.", "edge-term4-atl1.roblox.com.", "edge-term4-dfw2.roblox.com.", - "edge-term4-fra2.roblox.com.", "edge-term4-iad4.roblox.com.", "edge-term4-lax2.roblox.com.", "edge-term4-lax4.roblox.com.", @@ -1425,13 +1328,13 @@ var FakeECSFQDNs = container.NewMapSet( "edge-term4-sin2.roblox.com.", "edge-term4-sin4.roblox.com.", "edge-term4-sin6.roblox.com.", + "edge.rgs.pmc.pay.riotgames.com.", "edgecdn.ru.", "edgedl.me.gvt1.com.", "edgelocation.ivanticloud.com.", "editor.wix.com.", "edna.id.", "edrawsoft.com.", - "edubit.vn.", "education-certification.youdao.com.", "ee-share.com.", "efercro.com.", @@ -1440,14 +1343,15 @@ var FakeECSFQDNs = container.NewMapSet( "ei.5gtb.com.", "elemecdn.com.", "elitebidder.com.", - "emails.zappos.com.", - "embed.ly.cdn.cloudflare.net.", - "en.linguee.com.", + "email.cdn-tinkoff.ru.", + "email.mg-d1.substack.com.", "en.woxh.world.", + "endpoint1.archonph.com.", "endpointprotector.com.", "engage.wixapps.net.", "enplug.com.", "ent.box.com.", + "entitlements.auth.riotgames.com.", "envoy-ios-prod.getepic.com.", "epdg.vowifi.cspire.com.", "epic.us.production.appliedcloudplatform.com.", @@ -1461,14 +1365,14 @@ var FakeECSFQDNs = container.NewMapSet( "errortracking-lb.deepl.com.", "errortracking.deepl.com.", "esignlive.com.", + "eskimi.com.", + "esrs3-core.dell.com.", "essence.com.", - "ethicagarden.com.", "etsv2.datalake.gameloft.com.", "eu-aa.online-metrix.net.", "eu-api.asm.skype.com.", "eu-prod.asyncgw.teams.microsoft.com.", "eu.global.market.xiaomi.com.", - "eu.inspi-dsp.com.", "eu.statusapi.micloud.xiaomi.net.", "eu.whatfix.com.", "eu1.badoo.com.", @@ -1490,11 +1394,13 @@ var FakeECSFQDNs = container.NewMapSet( "exodus.desync.com.", "exp.host.", "expedia.quantummetric.com.", + "experian-my.sharepoint.com.", "experimentation-grpc.deepl.com.", "expf.ru.", "explicit-explicit.bing.net.trafficmanager.net.", "expo.olo.com.", "extension.savvy.security.", + "extensions.aitopia.ai.", "extensions.shopifycdn.com.", "external-ams2-1.xx.fbcdn.net.", "external-ams4-1.xx.fbcdn.net.", @@ -1534,32 +1440,32 @@ var FakeECSFQDNs = container.NewMapSet( "external-sea5-1.xx.fbcdn.net.", "external-sjc3-1.xx.fbcdn.net.", "external-sjc6-1.xx.fbcdn.net.", + "ezodn.com.", "f002.backblazeb2.com.", "fa3fca7ce79f4b81a39f216e916397d5.pacloudflare.com.", "factset.com.", "fanatics.ent.box.com.", "fanyiegg.youdao.com.", - "fastenal-my.sharepoint.com.", + "fcus.openrtbx.com.", "fdccpaadaptor.forddirectservices.com.", "fdl.flysleep.cn.", "fdl.zztfly.com.", "features.netscalergateway.net.", + "federation.campuslabs.com.", "feeder.co.", + "felochina.cn.", "fengkongcloud.com.", "fgwn01.ultipro.com.", "fi.telephony.goog.", "field59.com.", "fil-pusa01.app.blackbaud.net.", "filemail.com.", - "files.ivaws.com.", "files.jotform.com.", "filesyscrm.com.", - "finalforms.com.", "finalsite.com.", "finalsite.net.", "fireeye.com.", "fireflies.ai.", - "fit-pay.com.", "five9.com.", "flip.to.", "flixcdn.com.", @@ -1567,9 +1473,8 @@ var FakeECSFQDNs = container.NewMapSet( "flypgs.com.", "fm.printaudit.com.", "fmsi-lts.com.", + "fngw-svc-ds-livefn.ol.epicgames.com.cdn.cloudflare.net.", "foisonad.com.", - "followlyrics.com.", - "fonts.cdnfonts.com.", "fonts.shopify.com.", "fonts.shopifycdn.com.", "forcesafesearch.google.com.", @@ -1580,7 +1485,6 @@ var FakeECSFQDNs = container.NewMapSet( "fortisimperious.com.", "fortworth.remotepc.com.", "foundation-ipv4.youdao.com.", - "foxmodeq.com.", "fp-ca-bell.rcs.telephony.goog.", "fp-ca-telus.rcs.telephony.goog.", "fp-de-carrier-vodafone.rcs.telephony.goog.", @@ -1598,7 +1502,6 @@ var FakeECSFQDNs = container.NewMapSet( "fp-us-xfinity.rcs.telephony.goog.", "fp.ca.rogers.rcs.telephony.goog.", "fp.de.dt.rcs.telephony.goog.", - "fp.marketingcloudfx.com.", "fp.ps.easebar.com.", "fp.ups.com.", "fp.us.tracfone.rcs.telephony.goog.", @@ -1608,11 +1511,8 @@ var FakeECSFQDNs = container.NewMapSet( "fr.resolver.msg.global.xiaomi.net.", "fran.frvr.com.", "francecentral.api.cognitive.microsoft.com.", - "franecki.net.", "frankfurt.remotepc.com.", - "free-sg.cyrohost.in.", "fremont.remotepc.com.", - "friends.crazygames.com.", "frontend-event-collector.shopifysvc.com.", "fs.ultiproworkplace.com.", "ftke02.ultipro.com.", @@ -1633,24 +1533,26 @@ var FakeECSFQDNs = container.NewMapSet( "galleryn1.vcmdiawe.com.", "galleryn2.vcmdiawe.com.", "galleryn3.vcmdiawe.com.", - "game-api-acc-real-hwp.gamedistribution.com.", "game.zuiqiangyingyu.net.", "gamechanger.quantummetric.com.", "gameloft.com.", "gamemonkey.org.", "gamepigeon.net.", + "gateway.glorioushop.com.", "gateway.ultiproworkplace.com.", "gateway.zscalerone.net.", "gb.o2.rcs.telephony.goog.", "gcdn.co.", + "gce-beacons.gcp.gvt2.com.", "gcloud.qq.com.", "gcloudcs.com.", "gcloudsdk.com.", "gdid.datalake.gameloft.com.", "geappl.io.", + "geappliances-my.sharepoint.com.", + "gecko-sg.tiktokv.com.ttdns2.com.", "geniex.com.", "geniusmonkey.com.", - "gentil.info.", "geo-dra.platform.hicloud.com.", "geoip.apps.getjoy.ai.", "geoplugin.net.", @@ -1658,7 +1560,6 @@ var FakeECSFQDNs = container.NewMapSet( "germanywestcentral.api.cognitive.microsoft.com.", "getadmiral.com.", "getbutton.io.", - "getepic.com.", "getjoy.ai.", "getnodejs.com.", "getshop.tv.", @@ -1667,11 +1568,10 @@ var FakeECSFQDNs = container.NewMapSet( "gigabyte.com.", "giraff.io.", "gitlab.com.", + "gitlab.haskell.org.", "gjapplog.ucweb.com.", "gla.gameloft.com.", "gleap.io.", - "glennedia.com.", - "glic-my.sharepoint.com.", "global-all.g.nssvc.net.", "global.datasite.com.", "global.gme.qcloud.com.", @@ -1679,8 +1579,7 @@ var FakeECSFQDNs = container.NewMapSet( "globalsigncdn.com.cdn.cloudflare.net.", "globalsun.io.", "gme.qcloud.com.", - "gmfinancial.com.", - "go.myavlive.com.", + "go.xlirdr.com.", "go2yd.com.", "goadserver.com.", "goaffpro.com.", @@ -1689,25 +1588,24 @@ var FakeECSFQDNs = container.NewMapSet( "googledomains.com.", "googlesync.permutive.com.", "gosport.remotepc.com.", + "gotmmm9atx.cloudflare-gateway.com.", "gov-bam.nr-data.net.", "gov-bam.nr-data.net.cdn.cloudflare.net.", "gr-api.gotii.com.", "graph-us.avepointonlineservices.com.", "graphql.usercentrics.eu.", "gravitec.net.", - "greatwolf-my.sharepoint.com.", "greenville.remotepc.com.", + "grindr.mobi.", "grist.org.", - "gropulse.com.", "group-ib.com.", - "grouponeauto-my.sharepoint.com.", - "grouponeauto.sharepoint.com.", "grow.me.", "growone.sg.", + "growthbook-proxy.lenta.tech.", "grpc.vivintsky.com.", + "gsdk-quic-gcp-va.bytegsdk.com.", "gslb.finzfin.com.", "gslb.sgw.shopeemobile.com.", - "gss.gaijin.net.", "gtm.deepl.com.", "gtm.quillbot.com.", "gtm.shopify.com.", @@ -1718,7 +1616,9 @@ var FakeECSFQDNs = container.NewMapSet( "h-5h8i3ud8.online-metrix.net.", "h-adp.online-metrix.net.", "h-discover.online-metrix.net.", + "h-e04kqxof.online-metrix.net.", "h-ebay.online-metrix.net.", + "h-fisglobal.online-metrix.net.", "h-homedepot.online-metrix.net.", "h-online.citi.online-metrix.net.", "h-sdk.online-metrix.net.", @@ -1729,7 +1629,6 @@ var FakeECSFQDNs = container.NewMapSet( "h.online-metrix.net.", "h104216-dcdn.mp.lura.live.", "h104216-fcdn.mp.lura.live.", - "h104216-hcdn.mp.lura.live.", "h107833-ecdn.mp.lura.live.", "h64.online-metrix.net.", "hamina.remotepc.com.", @@ -1738,16 +1637,19 @@ var FakeECSFQDNs = container.NewMapSet( "hapsee.cn.", "hapseemate.cn.", "harry.lu.", + "haskell.org.", "hawaii.remotepc.com.", "hbopenbid-apac-v2.pubmnet.com.", "hbwrapper.com.", - "health.avid.com.", + "hc.tdm.qq.com.", + "healthequity-my.sharepoint.com.", + "healthequity.com.", + "healthequity.sharepoint.com.", "hecheck.bitmyanmar.info.", "hetangsmart.com.", "heytapdownload.com.", "heytapmobi.com.", "hft-prod.actioniq.mr-in.com.", - "hidanoriko.net.", "highwire.org.", "hiido.com.", "hisearch-dra.dt.dbankcloud.com.", @@ -1756,7 +1658,6 @@ var FakeECSFQDNs = container.NewMapSet( "hk.gcloudcs.com.", "hk.ntp.org.cn.", "hk.wechat.com.", - "hls.xingyouc.com.", "hnzkclouds.com.", "holykjvbible.com.", "home.imgsmail.ru.", @@ -1768,22 +1669,24 @@ var FakeECSFQDNs = container.NewMapSet( "hpplay.cn.", "hprofits.com.", "hstgps.com.", + "html.it.", "html5.qq.com.", "htms.heytapmobi.com.", "httpdns.y5en.com.", "huan.tv.", "huaweicloud.com.", "huaweicloudwaf.com.", - "hub.gibraltarsoftware.com.", + "hub.zoom.us.", "hubcloud.com.cn.", "hubspotemail.net.", "huion.cn.", "humix.com.cdn.cloudflare.net.", "huorong.cn.", - "husunward.com.", + "hw-edge.biliapi.net.", "hw.gcloudcs.com.", "hwapps-o.api.leiniao.com.", "hwmsg-as1-usa-o.api.leiniao.com.", + "hwmsg-as2-usa-o.api.leiniao.com.", "hwmsg-as3-usa-o.api.leiniao.com.", "hwmsg-as4-usa-o.api.leiniao.com.", "hybrid.ai.", @@ -1793,7 +1696,6 @@ var FakeECSFQDNs = container.NewMapSet( "i.omiapp.me.", "i.one-bid.com.", "i.qchannel03.cn.", - "i.search.heytapmobi.com.", "i.vsco.co.", "i1.nhentai.net.", "i2.nhentai.net.", @@ -1806,7 +1708,6 @@ var FakeECSFQDNs = container.NewMapSet( "ibm.account.box.com.", "ibm.box.com.", "ibsrv.net.", - "ic.wps.cn.", "icare.infranetgroup.com.", "iceudpstat.xdrtc.com.", "ichano.cn.", @@ -1816,7 +1717,6 @@ var FakeECSFQDNs = container.NewMapSet( "id-telkom.rcs.telephony.goog.", "id-timer-appstore.vivoglobal.com.", "id.atlassian.com.", - "id.pinterest.com.", "id.woxh.world.", "iddallas1.remotepc.com.", "iddenver.remotepc.com.", @@ -1828,30 +1728,25 @@ var FakeECSFQDNs = container.NewMapSet( "idr.cdnwidget.com.", "ids.cdnwidget.com.", "iemiq.com.", + "ig-us-notice.igamecj.com.", "igame.gcloudcs.com.", - "iili.io.", "ijoysoftconnect.com.", "ilog-sea-aliyun.alipayplus.com.", "im.vsco.co.", "im360.sentry.cloudlinux.com.", "image.myqcloud.com.", "image.online.adp.com.", - "image.providesupport.com.", - "images.fptplay53.net.", + "image.shishitao.com.", "images.getadmiral.com.", "imap.earthlink.net.", - "ime-reporter.badambiz.com.", - "img.11467.com.", "img.3dmxku.com.", + "img.hotimg.com.", "img2021.navyfederal.org.", "img9.target.com.", "imgs.signifyd.com.", - "imgs2.imgsmail.ru.", - "imgs3.hcaptcha.com.", "immomo.com.", "imou-sg-ali-online-paas-iot-private-picture.oss-ap-southeast-1.aliyuncs.com.", "imoulife.com.", - "imp.adx.roockmobile.com.", "impactify.media.", "imptrk.siteplug.com.", "in-api.asm.skype.com.", @@ -1860,22 +1755,22 @@ var FakeECSFQDNs = container.NewMapSet( "in.gov.", "in.visitors.live.", "inaccuracy.net.", - "inc-collabrtc.officeapps.live.com.", "incoming.thunderbird.net.", - "indiamart.com.", + "indeed.com.", "indianapolis.remotepc.com.", - "indodax.com.", + "indie-api.britannica.com.", "inf.miui.com.", "infinitecampus.com.", "infinitecampus.org.", "ingest.quantummetric.com.", "ingest.webeyez.com.", "ingesteu.quantummetric.com.", - "ingestion.zetta.so.", "ingress.us2.rum-ingress-coralogix.com.", "inneraudioms.cc.easebar.com.", "innity.com.", "innity.net.", + "inside.chat.", + "insights-collector.cell.nr-data.net.", "inspi-dsp.com.", "inspirebrands.quantummetric.com.", "instantmessaging-pa-jms-ap.googleapis.com.", @@ -1883,11 +1778,13 @@ var FakeECSFQDNs = container.NewMapSet( "instantmessaging-pa-jms-preprod-us.googleapis.com.", "instantmessaging-pa-jms-us.googleapis.com.", "instatus.com.", + "internetbrands.com.", "intl-im-conn.iq.com.", "intuit.zoom.us.", "ios-api-2.duolingo.cn.", "ios-app.y5en.com.", "ios-init.y5en.com.", + "ios.chat.openai.com.cdn.cloudflare.net.", "ios.crashsight.wetest.net.", "iosack.tuisong.baidu.com.", "iot.services-edge.paloaltonetworks.com.", @@ -1896,21 +1793,11 @@ var FakeECSFQDNs = container.NewMapSet( "ip-tools.tanjingpaas.com.", "ip0.zenno.services.", "ip1.zenno.services.", + "ipm-klca.kaspersky.com.", "ipm.atm.youku.com.", - "iprep1.t.ctmail.com.", - "iprep2.t.ctmail.com.", - "iprep3.t.ctmail.com.", - "iprep4.t.ctmail.com.", - "iprep5.t.ctmail.com.", - "ipres.1.geo.ctmail.com.", - "ipres.2.geo.ctmail.com.", - "ipres.3.geo.ctmail.com.", - "ipres.4.geo.ctmail.com.", - "ipres.5.geo.ctmail.com.", "iprofiles.apple.com.", "iprofiles.v.aaplimg.com.", "iprom.net.", - "ipt.pw.", "ipv4.cadc.absolute.com.", "ipv4.games.", "ipv4.geojs.io.", @@ -1926,6 +1813,7 @@ var FakeECSFQDNs = container.NewMapSet( "istatmenus.app.", "ita-free-lb.deepl.com.", "ita-free.www.deepl.com.", + "itad.indeed.com.", "italynorth.api.cognitive.microsoft.com.", "itc.cn.", "itch.io.", @@ -1936,12 +1824,9 @@ var FakeECSFQDNs = container.NewMapSet( "ittpx-us-e.eskimi.com.", "ittpx.eskimi.com.", "itzmx.com.", - "ivalua.com.", + "iuapcb.muoapeicp.top.", "ivview.com.", - "ivview.net.", - "ivytechccofindiana-my.sharepoint.com.", "izatcloud.net.", - "jabfm.org.", "japanwest.api.cognitive.microsoft.com.", "jazzpharmaceuticals.cyberhaven.io.", "jdadelivers.com.", @@ -1949,15 +1834,15 @@ var FakeECSFQDNs = container.NewMapSet( "jilliandescribecompany.com.", "jira.com.", "jitsu.com.", - "jocombssd.aristotleinsight.com.", "johannesburg.remotepc.com.", "johnmuirhealth.com.", - "johnmuirhealth.sharepoint.com.", "joinhandshake.com.", "jp-prod.asyncgw.teams.microsoft.com.", "jp.cinarra.com.", "jp1.chat.si.riotgames.com.", + "jpost.com.", "jpush.cn.", + "jpush.html5.qq.com.", "jpush.io.", "jrustonapps.net.", "js-eu1.hs-analytics.net.", @@ -1968,34 +1853,36 @@ var FakeECSFQDNs = container.NewMapSet( "js-eu1.hsforms.net.", "js-eu1.hubspot.com.", "js.eruptr.io.", - "jspm.io.", - "jtt.rsmjournals.com.", + "js.shrinetheme.com.", + "jsnflowmeter.com.", "junglefrog.com.", "justice.gov.", "jxappgtw.jhahosted.com.", "k-aeu1.contentsquare.net.", "k-aus1.contentsquare.net.", + "k8s1-event-tracker-am.lb.indexww.com.", + "k8s1-event-tracker-fr.lb.indexww.com.", "k8s1-event-tracker-la.lb.indexww.com.", - "k8s1-event-tracker-ny.lb.indexww.com.", "k8s1-event-tracker-sg.lb.indexww.com.", "k8s1-event-tracker-sj.lb.indexww.com.", "k8s1-event-tracker-ty.lb.indexww.com.", "k8s1-event-tracker-va.lb.indexww.com.", "k8s1-la-ext-haproxy.lb.indexww.com.", + "k8s1-ny-ext-haproxy.lb.indexww.com.", "k8s1-sj-ext-haproxy.lb.indexww.com.", "ka-aus1.contentsquare.net.", "kajicam.com.", - "kaziya-ryokan.com.", + "keells-my.sharepoint.com.", "khabarban.com.", - "khronos.org.", + "kickfire.com.", "kiev.remotepc.com.", - "kilat.io.", "kinogram.best.", "kiprotect.com.", + "kit-uploads.fontawesome.com.", + "kiteaai.org.", "kiwisizing.com.", "klagenfurt.remotepc.com.", "knoxville.remotepc.com.", - "kntxy.com.", "komect.com.", "komiku.org.", "koreacentral.api.cognitive.microsoft.com.", @@ -2008,9 +1895,9 @@ var FakeECSFQDNs = container.NewMapSet( "kunlunhuf.com.", "kunlunsl.com.", "kunlunso.com.", - "kunvertads.com.", + "kurogame.com.", "kurogame.xyz.", - "kuwo.cn.", + "kvs-service-beta.wyzecam.com.", "kwimgs.com.", "la.remotepc.com.", "la1.chat.si.riotgames.com.", @@ -2028,7 +1915,6 @@ var FakeECSFQDNs = container.NewMapSet( "lahuashanbx.com.", "lan.sdk.linkedin.com.", "lansing.remotepc.com.", - "larkoffice.com.", "larksuite.com.", "lastwar-game-us-cf-ali.lastwarapp.com.", "lax.remotepc.com.", @@ -2042,8 +1928,11 @@ var FakeECSFQDNs = container.NewMapSet( "leadmanagerfx.com.", "leihuo.netease.com.", "leiniao.com.", + "lenovomm.com.", "lens.l.google.com.", + "lenta.tech.", "levect.com.", + "level10gc.com.", "leveldata.poki.io.", "lexicon.33across.com.", "library.pdq.com.", @@ -2052,10 +1941,8 @@ var FakeECSFQDNs = container.NewMapSet( "licensing.bitmovin.com.", "licensing.sbullet.com.", "lichess.org.", - "lifestancecom.sharepoint.com.", "liftdsp.com.", "lightwidget.com.", - "lima-tpgateway3.factset.com.", "lima.remotepc.com.", "linguee-lb.linguee.com.", "linguee.com.", @@ -2068,7 +1955,6 @@ var FakeECSFQDNs = container.NewMapSet( "litedev.sgp.hik-connect.com.", "litedev.us.hik-connect.com.", "litespeedtech.com.", - "littler-my.sharepoint.com.", "live-smshopv2.v.trpcdn.net.", "live.126.net.", "live.ngb.haplat.net.", @@ -2091,8 +1977,10 @@ var FakeECSFQDNs = container.NewMapSet( "liveoversea8.ngb.haplat.net.", "liveoversea9.ngb.haplat.net.", "ljubljana.remotepc.com.", + "loaduk.betfred.com.", "loandepot.zoom.us.", "local.adguard.org.", + "log-api.newrelic.com.", "log-api.newrelic.com.cdn.cloudflare.net.", "log-auth.flysleep.cn.", "log-auth.zztfly.com.", @@ -2100,12 +1988,12 @@ var FakeECSFQDNs = container.NewMapSet( "log.webmaxlogger.net.", "log.zoom.us.", "logging-service-prod.getepic.com.", - "logging.mp.lura.live.", "loggly.com.", "login.shift.com.", - "login.teamviewer.com.", "login.vivaldi.net.", + "login.wolterskluwer.com.", "logo.dev.", + "logrocket.io.", "logu.hpplay.cn.", "logus.xiaoyi.com.", "logx.optimizely.com.", @@ -2119,16 +2007,14 @@ var FakeECSFQDNs = container.NewMapSet( "look.360.cn.", "lotus-dsp.ru.", "lpa.ds.gsma.com.", - "lplfinancial.app.box.com.", "lplfinancial.atlassian.net.", "lsagentrelay.lansweeper.com.", "ltfl.librarything.com.", - "lumberjack.vitalsource.com.", + "lumberjack-cfw.vitalsource.com.", "luxembourg.remotepc.com.", "lycraservice-pa-cam-prod.googleapis.com.", "lyric.alarmnet.com.", "m-aus1.contentsquare.net.", - "m-shindo.com.", "m.csqtrk.net.", "m1.ubianet.com.", "m2.ubianet.com.", @@ -2147,7 +2033,6 @@ var FakeECSFQDNs = container.NewMapSet( "mailings.lmcdn.ru.", "maintenanceconnection.com.", "malware-filter.gitlab.io.", - "mam.manage.microsoft.us.", "manage.wix.com.", "manage1.esna.com.", "management-2.dataremote.com.", @@ -2156,7 +2041,9 @@ var FakeECSFQDNs = container.NewMapSet( "manassas.remotepc.com.", "manchester.remotepc.com.", "mapixl.com.", + "markas-pg.com.", "marmot-cloud.com.", + "marriottcloud.atlassian.net.", "marseille.remotepc.com.", "master1.teamviewer.com.", "master10.teamviewer.com.", @@ -2177,14 +2064,15 @@ var FakeECSFQDNs = container.NewMapSet( "match.contentexchange.me.", "matrix.netease.com.", "max-l.mediav.com.", + "max-r.mediav.com.", "maxhost.io.", "mbboauth-1c.prd.cn.vwg-connect.cn.", + "mbda.commerce.gov.", "mcallen.remotepc.com.", - "mcdermottwillemery.sharepoint.com.", - "mcdn.podbean.com.", + "mcc505.pub.3gppnetwork.org.", "mcds.dalyfeds.com.", - "mclife.xtools.info.", "mcount.easebar.com.", + "mdapp136.cc.", "meari-oss-us.oss-us-west-1.aliyuncs.com.", "meari-us.oss-us-west-1.aliyuncs.com.", "medellin.remotepc.com.", @@ -2216,7 +2104,6 @@ var FakeECSFQDNs = container.NewMapSet( "media-fra3-2.cdn.whatsapp.net.", "media-fra5-1.cdn.whatsapp.net.", "media-fra5-2.cdn.whatsapp.net.", - "media-gru1-1.cdn.whatsapp.net.", "media-gru1-2.cdn.whatsapp.net.", "media-gru2-2.cdn.whatsapp.net.", "media-gua1-1.cdn.whatsapp.net.", @@ -2229,7 +2116,6 @@ var FakeECSFQDNs = container.NewMapSet( "media-hou1-1.cdn.whatsapp.net.", "media-iad3-1.cdn.whatsapp.net.", "media-iad3-2.cdn.whatsapp.net.", - "media-ist1-1.cdn.whatsapp.net.", "media-kul2-1.cdn.whatsapp.net.", "media-kul2-2.cdn.whatsapp.net.", "media-kul3-1.cdn.whatsapp.net.", @@ -2284,13 +2170,15 @@ var FakeECSFQDNs = container.NewMapSet( "media.ringcentral.com.", "media.superhuman.com.", "media.tinkoff.ru.", + "mediation-sg.pangle.io.", + "mediation.pangle.io.", "mediav.com.", "medproad.com.", "melbourne.remotepc.com.", "memphis.remotepc.com.", "mentamob.com.", "merchant-analytics-api.shopifyapps.com.", - "messaging-api.shopifyapps.com.", + "mesangui.com.", "metadata.decagon.ai.", "metrics-dre.dt.dbankcloud.cn.", "metrics-dre.dt.dbankcloud.com.", @@ -2308,16 +2196,19 @@ var FakeECSFQDNs = container.NewMapSet( "middleburycsin.aristotleinsight.com.", "milan.remotepc.com.", "milestoneinternet.com.cdn.cloudflare.net.", + "milwaukeetool.sharepoint.com.", "mimir2.vivaldi.com.", "min-api.cryptocompare.com.", + "minga.io.", "mini.browser.360.cn.", "minigame.vip.", "mintkeyboard.com.", - "miqe.sdxpkgyaq.com.", + "mirrors.gbnetwork.com.", "mixi.media.", "mm.fcix.net.", - "mn365.sharepoint.com.", "mobile-bank.cdn-tinkoff.ru.", + "mobile-collector.eu01.nr-data.net.", + "mobile-collector.newrelic.com.", "mobile-collector.newrelic.com.cdn.cloudflare.net.", "mobile-gw-plas.ultipro.com.", "mobile-l7.bereal.com.", @@ -2325,17 +2216,22 @@ var FakeECSFQDNs = container.NewMapSet( "mobiledataplan-pa.googleapis.com.", "mobilemaps-pa-gz.googleapis.com.", "mobilemaps.googleapis.com.", + "modat.io.", "modelportrait.xiaohongshu.com.", "modesto.remotepc.com.", "modoro360.com.", + "momentjs.com.", + "mon.isnssdk.com.", + "mon.isnssdk.com.ttdns2.com.", "moni-onrt-stsdk.vivo.com.cn.", "monitor.fraudblocker.com.", - "monorail-edge.shopifysvc.com.", - "monorail-edge.tm.shopifysvc.com.", + "monitor.growone.sg.", + "monitoring.getelevar.com.", "montage-discovery.displaynote.com.", "montage-updates.displaynote.com.", "montreal.remotepc.com.", "monumetric.com.", + "mosevura.com.", "motiondetection-us-1d.oss-us-west-1.aliyuncs.com.", "motiondetection-us-7d.oss-us-west-1.aliyuncs.com.", "mouser.com.", @@ -2346,8 +2242,7 @@ var FakeECSFQDNs = container.NewMapSet( "msdl.microsoft.com.", "msf.3g.qq.com.", "msg-img-hk.oss-cn-hongkong.aliyuncs.com.", - "msgrt-hwp.gamedistribution.com.", - "msp.meituan.com.", + "msg-intl.qy.net.", "mu.ariba.com.", "mumbai.remotepc.com.", "mumu.nie.netease.com.", @@ -2359,25 +2254,22 @@ var FakeECSFQDNs = container.NewMapSet( "mxptint.net.", "my.apps.factset.com.", "my.getadmiral.com.", + "my.jst.ai.", "my.nalpeiron.com.", - "myapi.arlo.com.cdn.cloudflare.net.", + "my.olo.com.", "myisolved.com.", "myqcloud.com.", "myqcloud.com.cdn.dnsv1.com.", - "mystery-game-tile.poki.io.", + "mytdsnet.com.", "myvscloud.com.", "myworkdaycdn.com.cn.", "n10.xyz.", "n1022-spare.network-auth.com.", "n1022.network-auth.com.", "n1036.network-auth.com.", - "n21.ultipro.com.", "n219.network-auth.com.", - "n259-spare.network-auth.com.", - "n259.network-auth.com.", "n32.ultipro.com.", "n35.ultipro.com.", - "n43foto.com.", "n44.network-auth.com.", "n509.network-auth.com.", "n677.network-auth.com.", @@ -2387,10 +2279,9 @@ var FakeECSFQDNs = container.NewMapSet( "n715.network-auth.com.", "n866-spare.network-auth.com.", "n866.network-auth.com.", - "na171.epm.cyberark.com.", + "na-data.kameleoon.eu.", "na2.chat.si.riotgames.com.", "nab.com.au.", - "nagumosan.com.", "namequery.com.", "naperville.remotepc.com.", "napps.zoom.us.", @@ -2400,9 +2291,10 @@ var FakeECSFQDNs = container.NewMapSet( "nawzryhwatm.broker.amsoveasea.com.", "nc.com.", "ncentral.centrexit.com.", + "ncontracts.com.", "nearme.com.cn.", "nechicago.remotepc.com.", - "neonataltherapists.com.", + "neonrated.com.", "net.cdn.dnsv1.com.", "netapm.music.163.com.", "netease.com.", @@ -2422,7 +2314,6 @@ var FakeECSFQDNs = container.NewMapSet( "newyork.remotepc.com.", "newyork2.remotepc.com.", "newyork3.remotepc.com.", - "nexstar.amp.permutive.com.", "nexx360.io.", "ng1.angus.mrisoftware.com.", "ngb.haplat.net.", @@ -2432,14 +2323,12 @@ var FakeECSFQDNs = container.NewMapSet( "nitroapps.co.", "nitropay.com.", "nmcorp.video.", - "noah.n43foto.com.", + "nmhealth.sharepoint.com.", "noc.computerhelpnj.com.", "node.setupad.com.", - "nogigiddy.com.", + "noemamag.com.", "nokia.com.", - "nolagov-my.sharepoint.com.", "noodlemagazine.com.", - "nordvpn.com.", "northcentralus.api.cognitive.microsoft.com.", "northeurope.api.cognitive.microsoft.com.", "nortic.ogtic.gob.do.", @@ -2447,6 +2336,7 @@ var FakeECSFQDNs = container.NewMapSet( "notes.services.box.com.", "notice.sg.bidder.paddlewaver.com.", "notification889.com.", + "notify.bubble.io.", "notify.music.163.com.", "novabeyond.com.", "novaicare.com.", @@ -2488,7 +2378,6 @@ var FakeECSFQDNs = container.NewMapSet( "ns4.cloudflare.net.", "ns4.g.aaplimg.com.", "ns4.google.com.", - "ns4v.icu.", "ns5.cloudflare.net.", "nsa.nalpeiron.com.", "ntes53.netease.com.", @@ -2516,11 +2405,10 @@ var FakeECSFQDNs = container.NewMapSet( "nws.zoom.us.", "nxs.mp.lura.live.", "nycrt.marphezis.com.", - "oauth-login-drcn.platform.dbankcloud.com.", "obihai.telephony.goog.", "obs.ap-southeast-1.myhuaweicloud.com.", "obs.ap-southeast-3.myhuaweicloud.com.", - "obs.line-apps.com.", + "obs.eu-west-101.myhuaweicloud.eu.", "observability-l7.bereal.com.", "obsproject.com.", "obus-dc136101-cn.heytapmobi.com.", @@ -2528,26 +2416,30 @@ var FakeECSFQDNs = container.NewMapSet( "obus-dc20123-cn.heytapmobi.com.", "obus-dc20157-cn.heytapmobi.com.", "obus-dctech-cn.heytapmobi.com.", - "oce.ovid.com.", "ocean-components.com.", "ocloud.oppomobile.com.", "ocps-xfer.kronos.net.", + "ocsp.crlocsp.cn.", "ocsp.identrust.com.", + "odc-eu.officeapps.live.com.", "odrs.fda.gov.ph.", "oec22-normal-alisg.tokopediax.com.", + "officeredir.microsoft.com.", + "offline-pkg-api.dalyfeds.com.", "ogma-l7.bereal.com.", "okko.tv.", + "okra.pinterest.com.", + "ol-collector.quillbot.com.", "ollama.com.", "omaha.formlabs.com.", "omiapp.me.", + "omnihotels-my.sharepoint.com.", "on-hwapps-o.api.leiniao.com.", - "onboard.triptease.io.", - "one.newrelic.com.", "onekey1.cmpassport.com.", "oneplus.net.", "onethingpcs.com.", "onezapp.com.", - "online-store-web.shopifyapps.com.", + "online-stopwatch.com.", "onlinewebfonts.com.", "oozf.9vuyy.xyz.", "op.mykonf.com.", @@ -2557,7 +2449,6 @@ var FakeECSFQDNs = container.NewMapSet( "open.oppomobile.com.", "opendsp.ru.", "opex-service-cn.allawntech.com.", - "opml.radiotime.com.", "oppomobile.com.", "opposhop.cn.", "opps-api.getwarmly.com.", @@ -2565,11 +2456,9 @@ var FakeECSFQDNs = container.NewMapSet( "optimize.urekamedia.com.", "optimizely.com.", "orangehire.com.au.", - "orchidworld.jp.", "oregon.remotepc.com.", "origin.fe-image-cache-ttp.useast8.byteglb.com.", "orlando.remotepc.com.", - "orthoclinical.sharepoint.com.", "os.ydmob.com.", "osaka.remotepc.com.", "oss-ap-southeast-1.aliyuncs.com.", @@ -2584,23 +2473,21 @@ var FakeECSFQDNs = container.NewMapSet( "oss-us-east-1.aliyuncs.com.", "oss-us-west-1.aliyuncs.com.", "otlp-http-production.shopifysvc.com.", - "otsu-jva.com.", - "ott-lb.deepl.com.", "ott.deepl.com.", + "ourdream.ai.", "ovative.com.", "overleaf.com.", "overleafusercontent.com.", "overseasccl-a.haplat.net.", "overseasccl-b.haplat.net.", + "overseasccl-c.haplat.net.", + "overseasccl-d.haplat.net.", "overseasccl-e.haplat.net.", "ovh.maxhost.io.", "ownadx-xml.tri.media.", - "oxsquare.net.", "p.adlooxtracking.com.", "p.myisolved.com.", "p.vsco.co.", - "p0-pu-private-useast8.tiktokv.us.", - "p0-tiktok-dm-ttp2-private.tiktokv.us.", "p107609.cedexis-test.com.", "p109522.cedexis-test.com.", "p118600.itm.cloud.com.", @@ -2613,12 +2500,15 @@ var FakeECSFQDNs = container.NewMapSet( "p20311.cedexis-test.com.", "p20314.cedexis-test.com.", "p20315.cedexis-test.com.", + "p23.zdusercontent.com.", "p2p-cal-2.anker-in.com.", "p2p-cal-3.anker-in.com.", "p2p-cal-4.anker-in.com.", "p2p-cal.anker-in.com.", "p2p-ohi-2.anker-in.com.", "p2p-ohi-4.anker-in.com.", + "p2p-par.anker-in.com.", + "p2p-sgp.anker-in.com.", "p2p-vir.anker-in.com.", "p2p.qq.com.", "p2p2-usa.aqara.com.", @@ -2644,19 +2534,15 @@ var FakeECSFQDNs = container.NewMapSet( "p34856.cedexis-test.com.", "p34858.cedexis-test.com.", "p35883.cedexis-test.com.", - "p39266.cedexis-test.com.", "p39604.cedexis-test.com.", "p40255.cedexis-test.com.", - "p40256.cedexis-test.com.", "p40259.cedexis-test.com.", "p40264.cedexis-test.com.", - "p40265.cedexis-test.com.", "p40266.cedexis-test.com.", "p40267.cedexis-test.com.", "p40480.cedexis-test.com.", "p40488.cedexis-test.com.", "p40491.cedexis-test.com.", - "p40952.cedexis-test.com.", "p41237.cedexis-test.com.", "p41238.cedexis-test.com.", "p41905.cedexis-test.com.", @@ -2676,21 +2562,20 @@ var FakeECSFQDNs = container.NewMapSet( "p95708.cedexis-test.com.", "p95711.cedexis-test.com.", "p95722.cedexis-test.com.", - "pa.authenticator.beyondidentity.com.", "paddlewaver.com.", "pai.googlezip.net.", "palermo.remotepc.com.", "palm.tech.", "panorama.wixapps.net.", + "paramount.com.", "paris.remotepc.com.", - "parlovoz.com.", - "partner-identity.myq-cloud.com.", "pasadena.remotepc.com.", "passportalmsp.com.", + "patreon.com.", "pay.shopify.com.", - "payment.api.speechify.com.", "payment.omiapp.me.", "pbdlsp1.pb.com.", + "pbe1.chat.si.riotgames.com.", "pbjs.rbstsystems.live.", "pbs.atmtd.com.", "pbs.btloader.com.", @@ -2702,54 +2587,61 @@ var FakeECSFQDNs = container.NewMapSet( "pcdn.brave.com.", "pcworld.com.", "pd.cdnwidget.com.", + "pd.eu.a.pvp.net.", "pdf24.org.", "pdfforge.org.", "pearcommerce.com.", - "people.com.cdn.cloudflare.net.", + "pelicanparts.com.", "peopleadmin.com.", "perf-eu1.hsforms.com.", + "perf-na1.hsforms.com.", "perfsight.qq.com.", "perfsight.wetest.net.", "perkspot-api.perkspot.com.", "permutive.businessinsider.com.", "perr.brightvpn.com.", + "perrisunionca.infinitecampus.org.", + "peso-virginia.dsp.youappi.com.", + "petalokasi.org.", "pf.intuit.com.", + "pft.val.sgp.pvp.net.", "pharos.studyquicks.com.", "phonebridge.zoho.com.", "photoroom.com.", - "piicmgvmss.polaris.com.", "pikabu.ru.", "pin.apiblink.ru.", "pingler.com.", - "pingma.qq.com.", "pioneer.ghtinc.com.", - "pirateparty.gr.", + "pitaya-sg.tiktokv.com.ttdns2.com.", + "pitaya-va.tiktokv.com.", + "pitaya.tiktokv.com.", "pitk.unioneeu.com.", "pittsburgh.remotepc.com.", "pix.cdnwidget.com.", "pixel.adlooxtracking.ru.", "pixel.dashfi.dev.", "pixel.gliacloud.com.", + "pjcr-my.sharepoint.com.", + "planconfig.openspeech.cn.", "planner.cloud.microsoft.", "platform-alib.linkedin.cn.", - "play-bs-las.livetech.shopee.co.id.", "playdigo.com.", + "player.vimeo.com.cdn.cloudflare.net.", "playstream.media.", - "pllatdpr.cn.", "plrm.zone.", + "plrsrvcs.com.", "plt-api-us.xiaoyi.com.", - "pluralsight.com.", + "plus.komiku.org.", "pm.geniusmonkey.com.", + "pod-13-sunco-ws.zendesk.com.", "poizon.com.", "polandcentral.api.cognitive.microsoft.com.", "policy.cookiereports.com.", "polling.zoom.us.", "polymarket.com.", "pool-bid-gce-us.dorpat.iponweb.net.", - "pool-usw.dorpat.iponweb.net.", "pop-convert.com.", "popt.in.", - "portal.us.ubianet.com.", "portals.mobi.", "portland.remotepc.com.", "posthog.com.", @@ -2758,7 +2650,6 @@ var FakeECSFQDNs = container.NewMapSet( "pp.cadc.absolute.com.", "pp.usdc.absolute.com.", "ppgames.net.", - "pragmaticplay.net.", "prd.dc01.adaptiva.cloud.", "prd.dc02.adaptiva.cloud.", "prd.dc03.adaptiva.cloud.", @@ -2772,9 +2663,9 @@ var FakeECSFQDNs = container.NewMapSet( "prd.dc12.adaptiva.cloud.", "prd.dc13.adaptiva.cloud.", "prd.dc14.adaptiva.cloud.", - "prd.pck.netskrt.net.", "prebid.adipolo.live.", "prebid.anyclip.com.", + "prebid.intergient.com.", "prebid.trustedstack.com.", "premium.xvpn.io.", "presentation-hkg1.turn.com.", @@ -2782,7 +2673,6 @@ var FakeECSFQDNs = container.NewMapSet( "privacy-proxy.usercentrics.eu.", "privy.com.", "privy.io.", - "privymktg.com.", "pro-glswish-aks-tm.trafficmanager.net.", "procore.com.", "prod-client-api.v.aaplimg.com.", @@ -2800,26 +2690,24 @@ var FakeECSFQDNs = container.NewMapSet( "productreviews.shopifycdn.com.", "profile.zoho.com.", "profiler-collector.dalyfeds.com.", - "prominder360.com.", - "propertyview.net.", "proquest.com.", "protonvpn.com.", "provaltech.com.", "proxy-safebrowsing.googleapis.com.", "proxy.mob.maps.yandex.net.", "proxy.shopifycdn.com.", - "psav-my.sharepoint.com.", "pub.affilimateapis.com.", - "pub.dev.", "pub.network.", "public-api.uxfeedback.ru.", "puffer.6.401402081.west-gcloud.codm.activision.com.", + "pull-f5-gcp01.tiktokcdn.com.c.bytefcdn-oversea.com.", "punch.p2p.qq.com.", "purpleguys.com.", "push-ads-cn.heytapmobi.com.", "push-row.zui.com.", "push.omiapp.me.", "pushmac.flexibits.com.", + "puswdsprmtprs.dealersocket.com.", "pvvstream.pro.", "pw.mediav.com.", "pwa.zoom.us.", @@ -2838,14 +2726,15 @@ var FakeECSFQDNs = container.NewMapSet( "qagpublic.qg4.apps.qualys.com.", "qatarcentral.api.cognitive.microsoft.com.", "qc-static.coccoc.com.", + "qcloud-sg-datareceiver.kurogame.xyz.", "qfp.intuit.com.", "qiezibenpao.com.", "qikify.com.", - "qiyeku.cn.", "qm2.progressive.com.", "qmi.cdw.com.", "qntv.io.", "qookkagames.com.", + "qoria-mza-auto-update.linewize.net.cdn.cloudflare.net.", "qpic.cn.cdn.dnsv1.com.", "qualcomm.cn.", "qualcomm.com.", @@ -2853,9 +2742,7 @@ var FakeECSFQDNs = container.NewMapSet( "quantummetric.com.", "quicinc.com.", "quickcep.com.", - "quyou8.com.", "qxwz.com.", - "r.3gl.net.", "r.akulaku.net.", "r.ingest-lr.com.", "r.intake-lr.com.", @@ -2869,141 +2756,69 @@ var FakeECSFQDNs = container.NewMapSet( "r.lr-intake.com.", "r.lrkt-in.com.", "r.superhuman.com.", - "r1---sn-ab5sznz6.c.2mdn.net.", "r1---sn-ab5sznzy.c.2mdn.net.", - "r1---sn-bvvbaxivnuxq5uu-p5ie.googlevideo.com.", - "r1---sn-bvvbaxivnuxq5uu-p5il.googlevideo.com.", - "r1---sn-bvvbaxivnuxq5uu-p5is.googlevideo.com.", - "r1---sn-bvvbaxivnuxq5uu-q4f6.googlevideo.com.", "r1---sn-bvvbaxivnuxq5uu-q4fe.googlevideo.com.", "r1---sn-bvvbaxivnuxq5uu-q4fl.googlevideo.com.", - "r1---sn-bvvbaxivnuxq5uu-q4fs.googlevideo.com.", - "r1---sn-bvvbaxivnuxq5uu-q4fz.googlevideo.com.", - "r1---sn-bvvbaxivnuxq5uu-vgqe.googlevideo.com.", - "r1---sn-bvvbaxivnuxq5uu-vgql.googlevideo.com.", - "r1---sn-bvvbaxivnuxq5uu-vgqs.googlevideo.com.", - "r1---sn-bvvbaxivnuxq5uu-vgqz.googlevideo.com.", - "r1---sn-n2uxaxjvh-j5xl.gvt1.com.", - "r1---sn-nh5gujvh-h4xe.googlevideo.com.", - "r1---sn-nh5gujvh-h4xl.googlevideo.com.", "r1---sn-nh5gujvh-h4xl.gvt1.com.", - "r1---sn-q4fl6nd7.c.2mdn.net.", "r1---sn-q4fl6nz7.c.2mdn.net.", + "r1---sn-q4flrn7y.c.2mdn.net.", "r1---sn-q4flrne6.c.2mdn.net.", + "r1---sn-q4flrnld.c.2mdn.net.", + "r1---sn-q4fzen7l.c.2mdn.net.", + "r1---sn-q4fzen7y.c.2mdn.net.", "r1---sn-tn.googlevideo.com.", - "r1---sn-vgqskne6.c.2mdn.net.", + "r1---sn-vgqsknlk.c.2mdn.net.", "r1---sn-vgqsknlr.c.2mdn.net.", "r1---sn-vgqsknz6.c.2mdn.net.", "r1---sn-vgqsknz7.c.2mdn.net.", "r1---sn-vgqsknzl.c.2mdn.net.", "r1---sn-vgqsrne6.c.2mdn.net.", - "r1---sn-vgqsrnzr.c.2mdn.net.", + "r1---sn-vgqsrnls.c.2mdn.net.", + "r1---sn-vgqsrns6.c.2mdn.net.", "r1---sn-vgqsrnzz.c.2mdn.net.", "r1.sn-tn.googlevideo.com.", "r1.visualwebsiteoptimizer.com.", - "r10---sn-bvvbaxivnuxq5uu-p5ie.googlevideo.com.", - "r10---sn-bvvbaxivnuxq5uu-p5il.googlevideo.com.", - "r10---sn-bvvbaxivnuxq5uu-p5is.googlevideo.com.", - "r10---sn-bvvbaxivnuxq5uu-q4f6.googlevideo.com.", - "r10---sn-bvvbaxivnuxq5uu-q4fs.googlevideo.com.", - "r10---sn-bvvbaxivnuxq5uu-q4fz.googlevideo.com.", - "r10---sn-bvvbaxivnuxq5uu-vgqe.googlevideo.com.", - "r10---sn-bvvbaxivnuxq5uu-vgql.googlevideo.com.", - "r10---sn-bvvbaxivnuxq5uu-vgqs.googlevideo.com.", - "r10---sn-bvvbaxivnuxq5uu-vgqz.googlevideo.com.", - "r11---sn-bvvbaxivnuxq5uu-p5ie.googlevideo.com.", - "r11---sn-bvvbaxivnuxq5uu-p5il.googlevideo.com.", - "r11---sn-bvvbaxivnuxq5uu-p5is.googlevideo.com.", - "r11---sn-bvvbaxivnuxq5uu-q4f6.googlevideo.com.", - "r11---sn-bvvbaxivnuxq5uu-q4fs.googlevideo.com.", - "r11---sn-bvvbaxivnuxq5uu-q4fz.googlevideo.com.", - "r11---sn-bvvbaxivnuxq5uu-vgqe.googlevideo.com.", - "r11---sn-bvvbaxivnuxq5uu-vgql.googlevideo.com.", - "r11---sn-bvvbaxivnuxq5uu-vgqs.googlevideo.com.", - "r11---sn-bvvbaxivnuxq5uu-vgqz.googlevideo.com.", - "r12---sn-bvvbaxivnuxq5uu-p5ie.googlevideo.com.", - "r12---sn-bvvbaxivnuxq5uu-p5il.googlevideo.com.", - "r12---sn-bvvbaxivnuxq5uu-p5is.googlevideo.com.", - "r12---sn-bvvbaxivnuxq5uu-q4f6.googlevideo.com.", - "r12---sn-bvvbaxivnuxq5uu-q4fs.googlevideo.com.", - "r12---sn-bvvbaxivnuxq5uu-q4fz.googlevideo.com.", - "r12---sn-bvvbaxivnuxq5uu-vgqe.googlevideo.com.", - "r12---sn-bvvbaxivnuxq5uu-vgql.googlevideo.com.", - "r12---sn-bvvbaxivnuxq5uu-vgqs.googlevideo.com.", - "r12---sn-bvvbaxivnuxq5uu-vgqz.googlevideo.com.", - "r13---sn-bvvbaxivnuxq5uu-p5ie.googlevideo.com.", - "r13---sn-bvvbaxivnuxq5uu-p5il.googlevideo.com.", - "r13---sn-bvvbaxivnuxq5uu-p5is.googlevideo.com.", - "r13---sn-bvvbaxivnuxq5uu-q4f6.googlevideo.com.", - "r13---sn-bvvbaxivnuxq5uu-q4fs.googlevideo.com.", - "r13---sn-bvvbaxivnuxq5uu-q4fz.googlevideo.com.", - "r13---sn-bvvbaxivnuxq5uu-vgqe.googlevideo.com.", - "r13---sn-bvvbaxivnuxq5uu-vgql.googlevideo.com.", - "r13---sn-bvvbaxivnuxq5uu-vgqs.googlevideo.com.", - "r13---sn-bvvbaxivnuxq5uu-vgqz.googlevideo.com.", "r2---sn-ab5l6nrd.c.2mdn.net.", + "r2---sn-ab5l6nrr.c.2mdn.net.", "r2---sn-ab5l6nrz.c.2mdn.net.", "r2---sn-ab5sznz6.c.2mdn.net.", "r2---sn-ab5sznzd.c.2mdn.net.", - "r2---sn-ab5sznze.c.2mdn.net.", "r2---sn-ab5sznzr.c.2mdn.net.", - "r2---sn-ab5sznzy.c.2mdn.net.", - "r2---sn-ab5sznzz.c.2mdn.net.", - "r2---sn-bvvbaxivnuxq5uu-p5ie.googlevideo.com.", - "r2---sn-bvvbaxivnuxq5uu-p5il.googlevideo.com.", - "r2---sn-bvvbaxivnuxq5uu-p5is.googlevideo.com.", - "r2---sn-bvvbaxivnuxq5uu-q4f6.googlevideo.com.", "r2---sn-bvvbaxivnuxq5uu-q4fe.googlevideo.com.", "r2---sn-bvvbaxivnuxq5uu-q4fl.googlevideo.com.", - "r2---sn-bvvbaxivnuxq5uu-q4fs.googlevideo.com.", - "r2---sn-bvvbaxivnuxq5uu-q4fz.googlevideo.com.", - "r2---sn-bvvbaxivnuxq5uu-vgqe.googlevideo.com.", - "r2---sn-bvvbaxivnuxq5uu-vgql.googlevideo.com.", - "r2---sn-bvvbaxivnuxq5uu-vgqs.googlevideo.com.", - "r2---sn-bvvbaxivnuxq5uu-vgqz.googlevideo.com.", - "r2---sn-n2uxaxjvh-j5xs.gvt1.com.", - "r2---sn-nh5gujvh-h4xe.googlevideo.com.", "r2---sn-nh5gujvh-h4xe.gvt1.com.", - "r2---sn-nh5gujvh-h4xl.googlevideo.com.", "r2---sn-nh5gujvh-h4xl.gvt1.com.", "r2---sn-nx57ynsk.c.2mdn.net.", + "r2---sn-q4fzen7e.c.2mdn.net.", "r2---sn-q4fzen7l.c.2mdn.net.", "r2---sn-q4fzen7s.c.2mdn.net.", "r2---sn-tn.googlevideo.com.", - "r2---sn-vgqskn6s.c.2mdn.net.", - "r2---sn-vgqsknld.c.2mdn.net.", "r2---sn-vgqsknlr.c.2mdn.net.", "r2---sn-vgqsknse.c.2mdn.net.", - "r2---sn-vgqsknzd.c.2mdn.net.", + "r2---sn-vgqsknzk.c.2mdn.net.", + "r2---sn-vgqsrn66.c.2mdn.net.", "r2---sn-vgqsrn67.c.2mdn.net.", "r2---sn-vgqsrn6z.c.2mdn.net.", - "r2---sn-vgqsrnll.c.2mdn.net.", "r2---sn-vgqsrnls.c.2mdn.net.", "r2---sn-vgqsrnsd.c.2mdn.net.", "r2---sn-vgqsrnsr.c.2mdn.net.", "r2---sn-vgqsrnsy.c.2mdn.net.", + "r2---sn-vgqsrnz7.c.2mdn.net.", "r2---sn-vgqsrnzz.c.2mdn.net.", "r2.sn-tn.googlevideo.com.", "r2.visualwebsiteoptimizer.com.", + "r3---sn-a5meknd6.c.2mdn.net.", "r3---sn-ab5l6nr6.c.2mdn.net.", - "r3---sn-ab5sznzr.c.2mdn.net.", - "r3---sn-bvvbaxivnuxq5uu-p5ie.googlevideo.com.", - "r3---sn-bvvbaxivnuxq5uu-p5il.googlevideo.com.", - "r3---sn-bvvbaxivnuxq5uu-p5is.googlevideo.com.", - "r3---sn-bvvbaxivnuxq5uu-q4f6.googlevideo.com.", + "r3---sn-ab5l6nrk.c.2mdn.net.", + "r3---sn-ab5sznzs.c.2mdn.net.", "r3---sn-bvvbaxivnuxq5uu-q4fe.googlevideo.com.", "r3---sn-bvvbaxivnuxq5uu-q4fl.googlevideo.com.", - "r3---sn-bvvbaxivnuxq5uu-q4fs.googlevideo.com.", - "r3---sn-bvvbaxivnuxq5uu-q4fz.googlevideo.com.", - "r3---sn-bvvbaxivnuxq5uu-vgqe.googlevideo.com.", - "r3---sn-bvvbaxivnuxq5uu-vgql.googlevideo.com.", - "r3---sn-bvvbaxivnuxq5uu-vgqs.googlevideo.com.", - "r3---sn-bvvbaxivnuxq5uu-vgqz.googlevideo.com.", "r3---sn-jxopj-nh4e.gvt1.com.", - "r3---sn-q4fl6nsd.c.2mdn.net.", - "r3---sn-q4flrnlz.c.2mdn.net.", + "r3---sn-nx57ynsk.c.2mdn.net.", + "r3---sn-p5qddn7d.c.2mdn.net.", + "r3---sn-q4fl6nsl.c.2mdn.net.", "r3---sn-q4flrnss.c.2mdn.net.", - "r3---sn-q4fzene7.c.2mdn.net.", + "r3---sn-q4fzen7l.c.2mdn.net.", "r3---sn-q4fzenee.c.2mdn.net.", "r3---sn-tn.googlevideo.com.", "r3---sn-vgqskn67.c.2mdn.net.", @@ -3012,108 +2827,55 @@ var FakeECSFQDNs = container.NewMapSet( "r3---sn-vgqsknz7.c.2mdn.net.", "r3---sn-vgqsrn6e.c.2mdn.net.", "r3---sn-vgqsrnll.c.2mdn.net.", - "r3---sn-vgqsrnzs.c.2mdn.net.", + "r3---sn-vgqsrnzk.c.2mdn.net.", "r3.sn-tn.googlevideo.com.", "r3.visualwebsiteoptimizer.com.", - "r4---sn-ab5l6nrz.c.2mdn.net.", - "r4---sn-ab5sznzr.c.2mdn.net.", - "r4---sn-bvvbaxivnuxq5uu-p5ie.googlevideo.com.", - "r4---sn-bvvbaxivnuxq5uu-p5il.googlevideo.com.", - "r4---sn-bvvbaxivnuxq5uu-p5is.googlevideo.com.", - "r4---sn-bvvbaxivnuxq5uu-q4f6.googlevideo.com.", + "r4---sn-2ovgq5-cw.c.2mdn.net.", + "r4---sn-ab5l6nrl.c.2mdn.net.", + "r4---sn-ab5l6nrr.c.2mdn.net.", + "r4---sn-ab5sznzy.c.2mdn.net.", "r4---sn-bvvbaxivnuxq5uu-q4fe.googlevideo.com.", "r4---sn-bvvbaxivnuxq5uu-q4fl.googlevideo.com.", - "r4---sn-bvvbaxivnuxq5uu-q4fs.googlevideo.com.", - "r4---sn-bvvbaxivnuxq5uu-q4fz.googlevideo.com.", - "r4---sn-bvvbaxivnuxq5uu-vgqe.googlevideo.com.", - "r4---sn-bvvbaxivnuxq5uu-vgql.googlevideo.com.", - "r4---sn-bvvbaxivnuxq5uu-vgqs.googlevideo.com.", - "r4---sn-bvvbaxivnuxq5uu-vgqz.googlevideo.com.", - "r4---sn-q4fl6n6d.c.2mdn.net.", + "r4---sn-nx57ynsk.c.2mdn.net.", "r4---sn-q4flrn7k.c.2mdn.net.", + "r4---sn-q4flrnee.c.2mdn.net.", "r4---sn-q4flrnlz.c.2mdn.net.", - "r4---sn-q4fzen7s.c.2mdn.net.", + "r4---sn-q4fzen7l.c.2mdn.net.", "r4---sn-q4fzenee.c.2mdn.net.", + "r4---sn-vgqskn6d.c.2mdn.net.", + "r4---sn-vgqskn6s.c.2mdn.net.", + "r4---sn-vgqsknlr.c.2mdn.net.", "r4---sn-vgqsknz6.c.2mdn.net.", "r4---sn-vgqsknz7.c.2mdn.net.", + "r4---sn-vgqsknzd.c.2mdn.net.", "r4---sn-vgqsrnll.c.2mdn.net.", - "r4---sn-vgqsrnlz.c.2mdn.net.", - "r4---sn-vgqsrnsy.c.2mdn.net.", "r4---sn-vgqsrnz6.c.2mdn.net.", - "r4---sn-vgqsrnzr.c.2mdn.net.", "r5---sn-ab5l6nr6.c.2mdn.net.", - "r5---sn-ab5l6nrl.c.2mdn.net.", - "r5---sn-bvvbaxivnuxq5uu-p5ie.googlevideo.com.", - "r5---sn-bvvbaxivnuxq5uu-p5il.googlevideo.com.", - "r5---sn-bvvbaxivnuxq5uu-p5is.googlevideo.com.", - "r5---sn-bvvbaxivnuxq5uu-q4f6.googlevideo.com.", + "r5---sn-ab5sznze.c.2mdn.net.", "r5---sn-bvvbaxivnuxq5uu-q4fe.googlevideo.com.", "r5---sn-bvvbaxivnuxq5uu-q4fl.googlevideo.com.", - "r5---sn-bvvbaxivnuxq5uu-q4fs.googlevideo.com.", - "r5---sn-bvvbaxivnuxq5uu-q4fz.googlevideo.com.", - "r5---sn-bvvbaxivnuxq5uu-vgqe.googlevideo.com.", - "r5---sn-bvvbaxivnuxq5uu-vgql.googlevideo.com.", - "r5---sn-bvvbaxivnuxq5uu-vgqs.googlevideo.com.", - "r5---sn-bvvbaxivnuxq5uu-vgqz.googlevideo.com.", + "r5---sn-q4fl6nds.c.2mdn.net.", "r5---sn-q4fzen7l.c.2mdn.net.", - "r5---sn-vgqskn6d.c.2mdn.net.", + "r5---sn-q4fzen7s.c.2mdn.net.", "r5---sn-vgqskne6.c.2mdn.net.", "r5---sn-vgqsknlk.c.2mdn.net.", - "r5---sn-vgqsknlr.c.2mdn.net.", "r5---sn-vgqsknls.c.2mdn.net.", "r5---sn-vgqsknsk.c.2mdn.net.", + "r5---sn-vgqsknzk.c.2mdn.net.", "r5---sn-vgqsrn6e.c.2mdn.net.", - "r5---sn-vgqsrnlz.c.2mdn.net.", - "r5---sn-vgqsrnz6.c.2mdn.net.", + "r5---sn-vgqsrnld.c.2mdn.net.", + "r5---sn-vgqsrnsy.c.2mdn.net.", + "r5---sn-vgqsrnzd.c.2mdn.net.", "r5---sn-vgqsrnzz.c.2mdn.net.", - "r6---sn-bvvbaxivnuxq5uu-p5ie.googlevideo.com.", - "r6---sn-bvvbaxivnuxq5uu-p5il.googlevideo.com.", - "r6---sn-bvvbaxivnuxq5uu-p5is.googlevideo.com.", - "r6---sn-bvvbaxivnuxq5uu-q4f6.googlevideo.com.", "r6---sn-bvvbaxivnuxq5uu-q4fe.googlevideo.com.", "r6---sn-bvvbaxivnuxq5uu-q4fl.googlevideo.com.", - "r6---sn-bvvbaxivnuxq5uu-q4fs.googlevideo.com.", - "r6---sn-bvvbaxivnuxq5uu-q4fz.googlevideo.com.", - "r6---sn-bvvbaxivnuxq5uu-vgqe.googlevideo.com.", - "r6---sn-bvvbaxivnuxq5uu-vgql.googlevideo.com.", - "r6---sn-bvvbaxivnuxq5uu-vgqs.googlevideo.com.", - "r6---sn-bvvbaxivnuxq5uu-vgqz.googlevideo.com.", - "r7---sn-bvvbaxivnuxq5uu-p5ie.googlevideo.com.", - "r7---sn-bvvbaxivnuxq5uu-p5il.googlevideo.com.", - "r7---sn-bvvbaxivnuxq5uu-p5is.googlevideo.com.", - "r7---sn-bvvbaxivnuxq5uu-q4f6.googlevideo.com.", - "r7---sn-bvvbaxivnuxq5uu-q4fs.googlevideo.com.", - "r7---sn-bvvbaxivnuxq5uu-q4fz.googlevideo.com.", - "r7---sn-bvvbaxivnuxq5uu-vgqe.googlevideo.com.", - "r7---sn-bvvbaxivnuxq5uu-vgql.googlevideo.com.", - "r7---sn-bvvbaxivnuxq5uu-vgqs.googlevideo.com.", - "r7---sn-bvvbaxivnuxq5uu-vgqz.googlevideo.com.", - "r8---sn-bvvbaxivnuxq5uu-p5ie.googlevideo.com.", - "r8---sn-bvvbaxivnuxq5uu-p5il.googlevideo.com.", - "r8---sn-bvvbaxivnuxq5uu-p5is.googlevideo.com.", - "r8---sn-bvvbaxivnuxq5uu-q4f6.googlevideo.com.", - "r8---sn-bvvbaxivnuxq5uu-q4fs.googlevideo.com.", - "r8---sn-bvvbaxivnuxq5uu-q4fz.googlevideo.com.", - "r8---sn-bvvbaxivnuxq5uu-vgqe.googlevideo.com.", - "r8---sn-bvvbaxivnuxq5uu-vgql.googlevideo.com.", - "r8---sn-bvvbaxivnuxq5uu-vgqs.googlevideo.com.", - "r8---sn-bvvbaxivnuxq5uu-vgqz.googlevideo.com.", - "r9---sn-bvvbaxivnuxq5uu-p5ie.googlevideo.com.", - "r9---sn-bvvbaxivnuxq5uu-p5il.googlevideo.com.", - "r9---sn-bvvbaxivnuxq5uu-p5is.googlevideo.com.", - "r9---sn-bvvbaxivnuxq5uu-q4f6.googlevideo.com.", - "r9---sn-bvvbaxivnuxq5uu-q4fs.googlevideo.com.", - "r9---sn-bvvbaxivnuxq5uu-q4fz.googlevideo.com.", - "r9---sn-bvvbaxivnuxq5uu-vgqe.googlevideo.com.", - "r9---sn-bvvbaxivnuxq5uu-vgql.googlevideo.com.", - "r9---sn-bvvbaxivnuxq5uu-vgqs.googlevideo.com.", - "r9---sn-bvvbaxivnuxq5uu-vgqz.googlevideo.com.", "radar.cedexis.com.", "raleigh.remotepc.com.", "rba-screen.healthsafe-id.com.", "rba.onehealthcareid.com.", "rbm-ap.storage.googleapis.com.", "rbm-us.storage.googleapis.com.", + "rcs-acs-att-carrier-us.jibe.google.com.", "rcs-acs-att-us.jibe.google.com.", "rcs-acs-mcc311.jibe.google.com.", "rcs-acs-mcc510.jibe.google.com.", @@ -3125,21 +2887,25 @@ var FakeECSFQDNs = container.NewMapSet( "readingplus.com.", "readwise.io.", "realtime-data-api.transitapp.com.", - "realtime.kabutoservices.com.", + "realtime-go.dewasyscrm.com.", "realtime.luckyorange.com.", "realtime.services.box.net.", + "realtime2ws.nitrotype.com.", "rec-cgi.evgcdn.net.", "recognizedpotential.com.", "recombee.com.", "recruiting.ultipro.com.", "recruiting2.ultipro.com.", + "referee.xiaohongshu.com.", "reg.c.nssvc.net.", "regions.com.", - "register.com.", "reichelcormier.bid.", "relatoriounico.pt.", + "relay.gov.teams.microsoft.us.", "remote-config.gslb.sgw.shopeemobile.com.", "remote.control4.com.", + "remotevs.com.", + "renzoi.com.", "repo.zabbix.com.", "report.apkpure.net.", "resideo.com.", @@ -3148,22 +2914,20 @@ var FakeECSFQDNs = container.NewMapSet( "resolver.3.geo.ctmail.com.", "resolver.4.geo.ctmail.com.", "resolver.5.geo.ctmail.com.", - "resolver1.ast.ctmail.com.", - "resolver2.ast.ctmail.com.", - "resolver3.ast.ctmail.com.", - "resolver4.ast.ctmail.com.", - "resolver5.ast.ctmail.com.", + "resources-minvest-prod.cdn-tinkoff.ru.", "restaurantguru.com.", "restproxy-analytics.ascendlearning.com.", "restrict.youtube.com.", "restrictmoderate.youtube.com.", "retcode-us-west-1.arms.aliyuncs.com.", + "retool.com.", "revize.com.", - "rhmail.sharepoint.com.", "ri9864.ci.managedwhitelisting.com.", "richrelevance.com.", "rivergame.net.", "riverside.remotepc.com.", + "rjiqyxqvpjnd5wjfi.ay.delivery.", + "rjs.3gl.net.cdn.cloudflare.net.", "rl.progressive.com.", "rl.quantummetric.com.", "rlm.haokan.mobi.", @@ -3171,9 +2935,7 @@ var FakeECSFQDNs = container.NewMapSet( "rmm2.jmark.com.", "rms-dra.platform.dbankcloud.com.", "rn-resource-app.xiaohongshu.com.", - "ro.zoominfo.com.", "roborock.com.", - "rocketsoftwareinc-my.sharepoint.com.", "rockhillssch.aristotleinsight.com.", "rockylinux.org.", "roistat.com.", @@ -3189,15 +2951,17 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-2aqu-hoas7.googlevideo.com.", "rr1---sn-2aqu-hoasz.googlevideo.com.", "rr1---sn-2imern76.googlevideo.com.", + "rr1---sn-2imern76.gvt1.com.", "rr1---sn-2imern7d.googlevideo.com.", "rr1---sn-2imern7d.gvt1.com.", "rr1---sn-2imern7r.googlevideo.com.", + "rr1---sn-2imern7r.gvt1.com.", "rr1---sn-2imeyn7k.googlevideo.com.", "rr1---sn-2o5ua5-53.googlevideo.com.", "rr1---sn-2oaig5-55.googlevideo.com.", + "rr1---sn-2op5q5-58.googlevideo.com.", "rr1---sn-2oq4f5-c4.googlevideo.com.", "rr1---sn-2oq4f5-c4.gvt1.com.", - "rr1---sn-2ovgq5-cw.googlevideo.com.", "rr1---sn-30a7rned.googlevideo.com.", "rr1---sn-30a7rnek.googlevideo.com.", "rr1---sn-30a7rner.googlevideo.com.", @@ -3205,7 +2969,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-30a7yner.googlevideo.com.", "rr1---sn-30a7yney.googlevideo.com.", "rr1---sn-30a7ynl7.googlevideo.com.", - "rr1---sn-42u-nboze.googlevideo.com.", + "rr1---sn-42u-nbozl.googlevideo.com.", "rr1---sn-42u-nbozz.googlevideo.com.", "rr1---sn-4g5e6ns6.googlevideo.com.", "rr1---sn-4g5e6ns7.googlevideo.com.", @@ -3255,32 +3019,49 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-4g5lznle.googlevideo.com.", "rr1---sn-4g5lznls.googlevideo.com.", "rr1---sn-4g5lznlz.googlevideo.com.", - "rr1---sn-5abxgpxuxaxjvh-9n4s.googlevideo.com.", "rr1---sn-5abxgpxuxaxjvh-9n4z.googlevideo.com.", + "rr1---sn-5go7yner.googlevideo.com.", "rr1---sn-5goeenes.googlevideo.com.", + "rr1---sn-5goeenez.googlevideo.com.", "rr1---sn-5gxo-in8l.googlevideo.com.", "rr1---sn-5gxo-in8s.googlevideo.com.", "rr1---sn-5hne6n6e.googlevideo.com.", + "rr1---sn-5hne6n6e.gvt1.com.", + "rr1---sn-5hne6n6l.googlevideo.com.", + "rr1---sn-5hne6n6l.gvt1.com.", "rr1---sn-5hne6ns6.googlevideo.com.", "rr1---sn-5hne6nsd.googlevideo.com.", + "rr1---sn-5hne6nsk.googlevideo.com.", + "rr1---sn-5hne6nsr.googlevideo.com.", "rr1---sn-5hne6nsy.googlevideo.com.", "rr1---sn-5hne6nsz.googlevideo.com.", "rr1---sn-5hne6nz6.googlevideo.com.", + "rr1---sn-5hne6nzd.googlevideo.com.", "rr1---sn-5hne6nzk.googlevideo.com.", + "rr1---sn-5hne6nzk.gvt1.com.", "rr1---sn-5hne6nzs.googlevideo.com.", "rr1---sn-5hne6nzy.googlevideo.com.", + "rr1---sn-5hne6nzy.gvt1.com.", "rr1---sn-5hnednss.googlevideo.com.", + "rr1---sn-5hnednss.gvt1.com.", "rr1---sn-5hnekn76.googlevideo.com.", "rr1---sn-5hnekn7d.googlevideo.com.", "rr1---sn-5hnekn7l.googlevideo.com.", "rr1---sn-5hnekn7s.googlevideo.com.", "rr1---sn-5hnekn7z.googlevideo.com.", "rr1---sn-5hneknee.googlevideo.com.", + "rr1---sn-5hneknee.gvt1.com.", "rr1---sn-5hneknek.googlevideo.com.", + "rr1---sn-5hneknek.gvt1.com.", "rr1---sn-5hneknes.googlevideo.com.", "rr1---sn-5pgnugx5h-hn26.googlevideo.com.", "rr1---sn-5pgnugx5h-hn2d.googlevideo.com.", "rr1---sn-5pgnugx5h-hn2k.googlevideo.com.", + "rr1---sn-5uaezn67.googlevideo.com.", + "rr1---sn-5uaezn6l.googlevideo.com.", + "rr1---sn-5uaezn6s.googlevideo.com.", + "rr1---sn-5uaezn6z.googlevideo.com.", + "rr1---sn-5uaezndd.googlevideo.com.", "rr1---sn-5uaezne6.googlevideo.com.", "rr1---sn-5uaezned.googlevideo.com.", "rr1---sn-5uaeznel.googlevideo.com.", @@ -3300,7 +3081,6 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-5ualdnle.googlevideo.com.", "rr1---sn-5ualdnll.googlevideo.com.", "rr1---sn-5ualdnlr.googlevideo.com.", - "rr1---sn-5ualdns6.googlevideo.com.", "rr1---sn-5ualdns7.googlevideo.com.", "rr1---sn-5ualdnsd.googlevideo.com.", "rr1---sn-5ualdnse.googlevideo.com.", @@ -3310,23 +3090,41 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-5ualdnss.googlevideo.com.", "rr1---sn-5ualdnsy.googlevideo.com.", "rr1---sn-5ualdnsz.googlevideo.com.", + "rr1---sn-5ualdnz6.googlevideo.com.", "rr1---sn-5ualdnz7.googlevideo.com.", "rr1---sn-5ualdnze.googlevideo.com.", + "rr1---sn-5ualdnzz.googlevideo.com.", + "rr1---sn-8qj-8j5sz.googlevideo.com.", + "rr1---sn-8qj-i2ies.googlevideo.com.", + "rr1---sn-8qj-i2iez.googlevideo.com.", + "rr1---sn-8qj-i5o6k.googlevideo.com.", + "rr1---sn-8qj-i5ode.googlevideo.com.", + "rr1---sn-8qj-i5ody.googlevideo.com.", "rr1---sn-8qj-i5okl.googlevideo.com.", - "rr1---sn-8qj-i5ozd.googlevideo.com.", + "rr1---sn-8qj-i5oks.googlevideo.com.", + "rr1---sn-8qj-i5oze.googlevideo.com.", + "rr1---sn-8qj-i5ozr.googlevideo.com.", "rr1---sn-8qj-nbo66.googlevideo.com.", + "rr1---sn-8qj-nbo67.googlevideo.com.", + "rr1---sn-8qj-nbo6r.googlevideo.com.", "rr1---sn-8qj-nbo6y.googlevideo.com.", "rr1---sn-8qj-nbod6.googlevideo.com.", + "rr1---sn-8qj-nbod7.googlevideo.com.", + "rr1---sn-8qj-nbosd.googlevideo.com.", + "rr1---sn-8qj-qap6.googlevideo.com.", + "rr1---sn-8xgp1vo-a5ml.googlevideo.com.", "rr1---sn-8xgp1vo-ab56.googlevideo.com.", "rr1---sn-8xgp1vo-ab5d.googlevideo.com.", "rr1---sn-8xgp1vo-ab5e.googlevideo.com.", "rr1---sn-8xgp1vo-ab5l.googlevideo.com.", "rr1---sn-8xgp1vo-ab5s.googlevideo.com.", + "rr1---sn-8xgp1vo-nh4l.googlevideo.com.", "rr1---sn-8xgp1vo-p5il.googlevideo.com.", + "rr1---sn-8xgp1vo-p5qe.googlevideo.com.", + "rr1---sn-8xgp1vo-p5qe7.googlevideo.com.", "rr1---sn-8xgp1vo-p5qee.googlevideo.com.", "rr1---sn-8xgp1vo-p5qel.googlevideo.com.", "rr1---sn-8xgp1vo-p5qes.googlevideo.com.", - "rr1---sn-8xgp1vo-poql.googlevideo.com.", "rr1---sn-8xgp1vo-vgqe.googlevideo.com.", "rr1---sn-8xgp1vo-xfge.googlevideo.com.", "rr1---sn-8xgp1vo-xfgl.googlevideo.com.", @@ -3334,29 +3132,35 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-9gv76n7s.googlevideo.com.", "rr1---sn-9gv76n7z.googlevideo.com.", "rr1---sn-9gv7zn76.googlevideo.com.", - "rr1---sn-9gv7zn7e.googlevideo.com.", "rr1---sn-9gv7zn7y.googlevideo.com.", "rr1---sn-a5m7lnl6.googlevideo.com.", + "rr1---sn-a5m7lnl6.gvt1.com.", "rr1---sn-a5m7lnld.googlevideo.com.", "rr1---sn-a5mekn6d.googlevideo.com.", "rr1---sn-a5mekn6k.googlevideo.com.", + "rr1---sn-a5mekn6k.gvt1.com.", "rr1---sn-a5mekn6l.googlevideo.com.", "rr1---sn-a5mekn6r.googlevideo.com.", "rr1---sn-a5mekn6s.googlevideo.com.", + "rr1---sn-a5mekn6s.gvt1.com.", "rr1---sn-a5mekn6z.googlevideo.com.", - "rr1---sn-a5meknd6.googlevideo.com.", + "rr1---sn-a5mekn6z.gvt1.com.", + "rr1---sn-a5mekndd.googlevideo.com.", + "rr1---sn-a5mekndd.gvt1.com.", "rr1---sn-a5meknde.googlevideo.com.", + "rr1---sn-a5mekndk.googlevideo.com.", "rr1---sn-a5mekndl.googlevideo.com.", "rr1---sn-a5meknds.googlevideo.com.", "rr1---sn-a5mekndz.googlevideo.com.", "rr1---sn-a5meknsd.googlevideo.com.", "rr1---sn-a5meknsy.googlevideo.com.", "rr1---sn-a5meknzk.googlevideo.com.", + "rr1---sn-a5meknzk.gvt1.com.", "rr1---sn-a5meknzl.googlevideo.com.", "rr1---sn-a5meknzr.googlevideo.com.", "rr1---sn-a5meknzs.googlevideo.com.", - "rr1---sn-a5mlrnek.googlevideo.com.", "rr1---sn-a5mlrnl6.googlevideo.com.", + "rr1---sn-a5mlrnl6.gvt1.com.", "rr1---sn-a5mlrnll.googlevideo.com.", "rr1---sn-a5mlrnls.googlevideo.com.", "rr1---sn-a5mlrnlz.googlevideo.com.", @@ -3365,15 +3169,19 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-a5msen7s.googlevideo.com.", "rr1---sn-a5msen7z.googlevideo.com.", "rr1---sn-a5msenek.googlevideo.com.", + "rr1---sn-a5msenek.gvt1.com.", "rr1---sn-a5msener.googlevideo.com.", + "rr1---sn-a5msener.gvt1.com.", "rr1---sn-a5msenes.googlevideo.com.", "rr1---sn-a5msenl7.googlevideo.com.", "rr1---sn-a5msenle.googlevideo.com.", + "rr1---sn-a5msenle.gvt1.com.", "rr1---sn-ab5l6ndr.googlevideo.com.", "rr1---sn-ab5l6ndy.googlevideo.com.", "rr1---sn-ab5l6nkd.googlevideo.com.", "rr1---sn-ab5l6nr6.googlevideo.com.", "rr1---sn-ab5l6nrd.googlevideo.com.", + "rr1---sn-ab5l6nrd.gvt1.com.", "rr1---sn-ab5l6nrk.googlevideo.com.", "rr1---sn-ab5l6nrl.googlevideo.com.", "rr1---sn-ab5l6nrr.googlevideo.com.", @@ -3387,6 +3195,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-ab5sznzk.googlevideo.com.", "rr1---sn-ab5sznzl.googlevideo.com.", "rr1---sn-ab5sznzr.googlevideo.com.", + "rr1---sn-ab5sznzr.gvt1.com.", "rr1---sn-ab5sznzs.googlevideo.com.", "rr1---sn-ab5sznzy.googlevideo.com.", "rr1---sn-ab5sznzz.googlevideo.com.", @@ -3395,17 +3204,22 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-aigl6nek.googlevideo.com.", "rr1---sn-aigl6ner.googlevideo.com.", "rr1---sn-aigl6ney.googlevideo.com.", + "rr1---sn-aigl6ney.gvt1.com.", "rr1---sn-aigl6nl7.googlevideo.com.", "rr1---sn-aigl6ns6.googlevideo.com.", "rr1---sn-aigl6nsd.googlevideo.com.", + "rr1---sn-aigl6nsd.gvt1.com.", "rr1---sn-aigl6nsk.googlevideo.com.", "rr1---sn-aigl6nsr.googlevideo.com.", "rr1---sn-aigl6nz7.googlevideo.com.", "rr1---sn-aigl6nze.googlevideo.com.", + "rr1---sn-aigl6nze.gvt1.com.", "rr1---sn-aigl6nzk.googlevideo.com.", "rr1---sn-aigl6nzl.googlevideo.com.", "rr1---sn-aigl6nzr.googlevideo.com.", + "rr1---sn-aigl6nzr.gvt1.com.", "rr1---sn-aigl6nzs.googlevideo.com.", + "rr1---sn-aigl6nzs.gvt1.com.", "rr1---sn-aigzrn76.googlevideo.com.", "rr1---sn-aigzrn7d.googlevideo.com.", "rr1---sn-aigzrn7e.googlevideo.com.", @@ -3419,9 +3233,9 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-aigzrnsr.googlevideo.com.", "rr1---sn-aigzrnss.googlevideo.com.", "rr1---sn-aigzrnsz.googlevideo.com.", - "rr1---sn-aigzrnz7.googlevideo.com.", "rr1---sn-aigzrnze.googlevideo.com.", "rr1---sn-aj4g55-5v.googlevideo.com.", + "rr1---sn-aj5ua5-5c.googlevideo.com.", "rr1---sn-ajab55-55.googlevideo.com.", "rr1---sn-avbpj-cq5e.googlevideo.com.", "rr1---sn-bvvbaxivnuxq5uu-q4f6.googlevideo.com.", @@ -3439,14 +3253,18 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-bvvbaxivnuxqjvhj5nu-vgqs.googlevideo.com.", "rr1---sn-bvvbaxivnuxqjvhj5nu-vgqz.googlevideo.com.", "rr1---sn-bvvbaxivnuxqjvm-2ime.googlevideo.com.", + "rr1---sn-bvvbaxivnuxqjvm-2iml.googlevideo.com.", + "rr1---sn-bvvbaxivnuxqjvm-2imz.googlevideo.com.", "rr1---sn-bvvbaxivnuxqjvm-q4fe.googlevideo.com.", "rr1---sn-bvvbaxivnuxqjvm-q4fl.googlevideo.com.", "rr1---sn-cvb7lne7.googlevideo.com.", "rr1---sn-cvb7lnee.googlevideo.com.", + "rr1---sn-cvb7lnls.googlevideo.com.", "rr1---sn-cvb7lnlz.googlevideo.com.", "rr1---sn-cvb7sn7k.googlevideo.com.", "rr1---sn-cvb7sn7r.googlevideo.com.", - "rr1---sn-gxuo03g-ig3l.googlevideo.com.", + "rr1---sn-fpnjoxu-hnos.googlevideo.com.", + "rr1---sn-gpuuxg-hxhz.googlevideo.com.", "rr1---sn-hjoj-poul.googlevideo.com.", "rr1---sn-hjoj-pous.googlevideo.com.", "rr1---sn-hoa7kn76.googlevideo.com.", @@ -3461,26 +3279,34 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-hp57kn6r.gvt1.com.", "rr1---sn-hp57kn6y.googlevideo.com.", "rr1---sn-hp57knd6.googlevideo.com.", + "rr1---sn-hp57knd6.gvt1.com.", "rr1---sn-hp57kndd.googlevideo.com.", + "rr1---sn-hp57kndd.gvt1.com.", "rr1---sn-hp57kndk.googlevideo.com.", + "rr1---sn-hp57kndk.gvt1.com.", "rr1---sn-hp57kndr.googlevideo.com.", "rr1---sn-hp57knds.googlevideo.com.", "rr1---sn-hp57kndy.googlevideo.com.", - "rr1---sn-hp57kndy.gvt1.com.", "rr1---sn-hp57kndz.googlevideo.com.", "rr1---sn-hp57knk7.googlevideo.com.", + "rr1---sn-hp57knk7.gvt1.com.", + "rr1---sn-hp57knkl.googlevideo.com.", + "rr1---sn-hp57knks.googlevideo.com.", "rr1---sn-hp57yn7r.googlevideo.com.", "rr1---sn-hp57yn7y.googlevideo.com.", "rr1---sn-hp57yne7.googlevideo.com.", "rr1---sn-hp57ynee.googlevideo.com.", "rr1---sn-hp57ynl6.googlevideo.com.", + "rr1---sn-hp57ynl6.gvt1.com.", "rr1---sn-hp57ynlr.googlevideo.com.", + "rr1---sn-hp57ynlr.gvt1.com.", "rr1---sn-hp57ynly.googlevideo.com.", + "rr1---sn-hp57yns6.googlevideo.com.", + "rr1---sn-hp57yns6.gvt1.com.", "rr1---sn-hp57yns7.googlevideo.com.", - "rr1---sn-hp57yns7.gvt1.com.", + "rr1---sn-hp57ynsd.googlevideo.com.", "rr1---sn-hp57ynse.googlevideo.com.", "rr1---sn-hp57ynsl.googlevideo.com.", - "rr1---sn-hp57ynsl.gvt1.com.", "rr1---sn-hp57ynss.googlevideo.com.", "rr1---sn-hpqfxnu-oaxe.googlevideo.com.", "rr1---sn-hpqfxnu-oaxl.googlevideo.com.", @@ -3498,6 +3324,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-i3belney.googlevideo.com.", "rr1---sn-i3belnl6.googlevideo.com.", "rr1---sn-i3belnl7.googlevideo.com.", + "rr1---sn-i3belnll.googlevideo.com.", "rr1---sn-i3belnls.googlevideo.com.", "rr1---sn-i3bssn7e.googlevideo.com.", "rr1---sn-jn2pgx4pcxg-w5o6.googlevideo.com.", @@ -3509,9 +3336,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-jxopj-nh4e.googlevideo.com.", "rr1---sn-jxopj-nh4e.gvt1.com.", "rr1---sn-n2uxaxjvh-j5xl.googlevideo.com.", - "rr1---sn-n2uxaxjvh-j5xl.gvt1.com.", "rr1---sn-n2uxaxjvh-j5xs.googlevideo.com.", - "rr1---sn-n2uxaxjvh-j5xs.gvt1.com.", "rr1---sn-n4v7snee.googlevideo.com.", "rr1---sn-n4v7sney.googlevideo.com.", "rr1---sn-n4v7snl7.googlevideo.com.", @@ -3530,6 +3355,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-npoe7ne7.googlevideo.com.", "rr1---sn-npoe7ned.googlevideo.com.", "rr1---sn-npoe7nek.googlevideo.com.", + "rr1---sn-npoe7ner.googlevideo.com.", "rr1---sn-npoe7nes.googlevideo.com.", "rr1---sn-npoe7ney.googlevideo.com.", "rr1---sn-npoe7nez.googlevideo.com.", @@ -3540,24 +3366,26 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-npoe7ns7.gvt1.com.", "rr1---sn-npoe7nsd.googlevideo.com.", "rr1---sn-npoe7nsk.googlevideo.com.", - "rr1---sn-npoe7nsk.gvt1.com.", "rr1---sn-npoe7nsl.googlevideo.com.", "rr1---sn-npoe7nsr.googlevideo.com.", - "rr1---sn-npoe7nsr.gvt1.com.", "rr1---sn-npoe7nsy.googlevideo.com.", "rr1---sn-npoe7nz7.googlevideo.com.", + "rr1---sn-npoe7nz7.gvt1.com.", "rr1---sn-npoeene6.googlevideo.com.", "rr1---sn-npoeened.googlevideo.com.", "rr1---sn-npoeenee.googlevideo.com.", "rr1---sn-npoeenek.googlevideo.com.", + "rr1---sn-npoeenek.gvt1.com.", "rr1---sn-npoeener.googlevideo.com.", "rr1---sn-npoeeney.googlevideo.com.", "rr1---sn-npoeenez.googlevideo.com.", + "rr1---sn-npoeenl7.googlevideo.com.", "rr1---sn-npoeenle.googlevideo.com.", "rr1---sn-npoeenlk.googlevideo.com.", + "rr1---sn-npoeenlk.gvt1.com.", "rr1---sn-npoeenll.googlevideo.com.", - "rr1---sn-npoeenly.googlevideo.com.", "rr1---sn-npoeens7.googlevideo.com.", + "rr1---sn-npoeens7.gvt1.com.", "rr1---sn-npoldn76.googlevideo.com.", "rr1---sn-npoldn7d.googlevideo.com.", "rr1---sn-npoldn7d.gvt1.com.", @@ -3565,14 +3393,15 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-npoldn7l.googlevideo.com.", "rr1---sn-npoldn7l.gvt1.com.", "rr1---sn-npoldn7y.googlevideo.com.", - "rr1---sn-npoldn7y.gvt1.com.", "rr1---sn-npoldn7z.googlevideo.com.", + "rr1---sn-npoldn7z.gvt1.com.", "rr1---sn-npoldne7.googlevideo.com.", "rr1---sn-nv0uixgo-5ual.googlevideo.com.", "rr1---sn-nx57ynlk.googlevideo.com.", "rr1---sn-nx57ynsd.googlevideo.com.", "rr1---sn-nx57ynse.googlevideo.com.", "rr1---sn-nx57ynsk.googlevideo.com.", + "rr1---sn-nx57ynsk.gvt1.com.", "rr1---sn-nx57ynsl.googlevideo.com.", "rr1---sn-nx57ynsr.googlevideo.com.", "rr1---sn-nx57ynss.googlevideo.com.", @@ -3585,6 +3414,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-o097znsk.googlevideo.com.", "rr1---sn-o097znsl.googlevideo.com.", "rr1---sn-o097znsr.googlevideo.com.", + "rr1---sn-o097znsr.gvt1.com.", "rr1---sn-o097znss.googlevideo.com.", "rr1---sn-o097znsz.googlevideo.com.", "rr1---sn-o097znz7.googlevideo.com.", @@ -3624,12 +3454,11 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-paapovpnjxou0gt-nual.googlevideo.com.", "rr1---sn-paapovpnjxou0gt-nuas.googlevideo.com.", "rr1---sn-paapovpnjxou0gt-nuaz.googlevideo.com.", - "rr1---sn-pjnpu-5hfe.googlevideo.com.", - "rr1---sn-pjnpu-5hfl.googlevideo.com.", "rr1---sn-pobpb-poql.googlevideo.com.", "rr1---sn-q4fl6n66.googlevideo.com.", "rr1---sn-q4fl6n66.gvt1.com.", "rr1---sn-q4fl6n6d.googlevideo.com.", + "rr1---sn-q4fl6n6d.gvt1.com.", "rr1---sn-q4fl6n6r.googlevideo.com.", "rr1---sn-q4fl6n6r.gvt1.com.", "rr1---sn-q4fl6n6s.googlevideo.com.", @@ -3638,17 +3467,13 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-q4fl6n6y.gvt1.com.", "rr1---sn-q4fl6n6z.googlevideo.com.", "rr1---sn-q4fl6n6z.gvt1.com.", - "rr1---sn-q4fl6nd6.googlevideo.com.", "rr1---sn-q4fl6nd7.googlevideo.com.", "rr1---sn-q4fl6nd7.gvt1.com.", "rr1---sn-q4fl6nde.googlevideo.com.", "rr1---sn-q4fl6nde.gvt1.com.", "rr1---sn-q4fl6ndl.googlevideo.com.", - "rr1---sn-q4fl6ndl.gvt1.com.", "rr1---sn-q4fl6nds.googlevideo.com.", - "rr1---sn-q4fl6nds.gvt1.com.", "rr1---sn-q4fl6ndz.googlevideo.com.", - "rr1---sn-q4fl6ndz.gvt1.com.", "rr1---sn-q4fl6nlz.googlevideo.com.", "rr1---sn-q4fl6ns6.googlevideo.com.", "rr1---sn-q4fl6ns7.googlevideo.com.", @@ -3656,15 +3481,15 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-q4fl6nsk.googlevideo.com.", "rr1---sn-q4fl6nsl.googlevideo.com.", "rr1---sn-q4fl6nsr.googlevideo.com.", + "rr1---sn-q4fl6nsr.gvt1.com.", "rr1---sn-q4fl6nss.googlevideo.com.", "rr1---sn-q4fl6nss.gvt1.com.", "rr1---sn-q4fl6nsy.googlevideo.com.", "rr1---sn-q4fl6nsy.gvt1.com.", "rr1---sn-q4fl6nz6.googlevideo.com.", - "rr1---sn-q4fl6nz6.gvt1.com.", "rr1---sn-q4fl6nz7.googlevideo.com.", + "rr1---sn-q4fl6nz7.gvt1.com.", "rr1---sn-q4fl6nzy.googlevideo.com.", - "rr1---sn-q4fl6nzy.gvt1.com.", "rr1---sn-q4flrn7k.googlevideo.com.", "rr1---sn-q4flrn7r.googlevideo.com.", "rr1---sn-q4flrn7y.googlevideo.com.", @@ -3678,6 +3503,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-q4flrner.googlevideo.com.", "rr1---sn-q4flrner.gvt1.com.", "rr1---sn-q4flrnes.googlevideo.com.", + "rr1---sn-q4flrnes.gvt1.com.", "rr1---sn-q4flrney.googlevideo.com.", "rr1---sn-q4flrnez.googlevideo.com.", "rr1---sn-q4flrnl6.googlevideo.com.", @@ -3686,9 +3512,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-q4flrnld.gvt1.com.", "rr1---sn-q4flrnle.googlevideo.com.", "rr1---sn-q4flrnlz.googlevideo.com.", - "rr1---sn-q4flrnsd.googlevideo.com.", - "rr1---sn-q4flrnsd.gvt1.com.", - "rr1---sn-q4flrnsk.googlevideo.com.", + "rr1---sn-q4flrnlz.gvt1.com.", "rr1---sn-q4flrnss.googlevideo.com.", "rr1---sn-q4fzen7e.googlevideo.com.", "rr1---sn-q4fzen7e.gvt1.com.", @@ -3716,8 +3540,10 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-u1hp55-5c.gvt1.com.", "rr1---sn-v5goxu-jhi6.googlevideo.com.", "rr1---sn-v5goxu-jhid.googlevideo.com.", + "rr1---sn-v5goxu-jhid.gvt1.com.", "rr1---sn-v5goxu-jhil.googlevideo.com.", "rr1---sn-v5goxu-jhiz.googlevideo.com.", + "rr1---sn-v5goxu-jhiz.gvt1.com.", "rr1---sn-vgqskn66.googlevideo.com.", "rr1---sn-vgqskn67.googlevideo.com.", "rr1---sn-vgqskn6d.googlevideo.com.", @@ -3732,6 +3558,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-vgqsknlk.googlevideo.com.", "rr1---sn-vgqsknll.googlevideo.com.", "rr1---sn-vgqsknlr.googlevideo.com.", + "rr1---sn-vgqsknlr.gvt1.com.", "rr1---sn-vgqsknls.googlevideo.com.", "rr1---sn-vgqsknlz.googlevideo.com.", "rr1---sn-vgqskns7.googlevideo.com.", @@ -3744,16 +3571,19 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-vgqsknzk.googlevideo.com.", "rr1---sn-vgqsknzl.googlevideo.com.", "rr1---sn-vgqsknzr.googlevideo.com.", + "rr1---sn-vgqsknzr.gvt1.com.", "rr1---sn-vgqsknzs.googlevideo.com.", + "rr1---sn-vgqsknzs.gvt1.com.", "rr1---sn-vgqsknzy.googlevideo.com.", "rr1---sn-vgqsknzz.googlevideo.com.", "rr1---sn-vgqsrn66.googlevideo.com.", + "rr1---sn-vgqsrn66.gvt1.com.", "rr1---sn-vgqsrn67.googlevideo.com.", "rr1---sn-vgqsrn6e.googlevideo.com.", "rr1---sn-vgqsrn6l.googlevideo.com.", "rr1---sn-vgqsrn6z.googlevideo.com.", - "rr1---sn-vgqsrn6z.gvt1.com.", "rr1---sn-vgqsrne6.googlevideo.com.", + "rr1---sn-vgqsrne6.gvt1.com.", "rr1---sn-vgqsrned.googlevideo.com.", "rr1---sn-vgqsrnek.googlevideo.com.", "rr1---sn-vgqsrnes.googlevideo.com.", @@ -3763,9 +3593,11 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-vgqsrnlk.googlevideo.com.", "rr1---sn-vgqsrnll.googlevideo.com.", "rr1---sn-vgqsrnls.googlevideo.com.", + "rr1---sn-vgqsrnls.gvt1.com.", "rr1---sn-vgqsrnlz.googlevideo.com.", "rr1---sn-vgqsrns6.googlevideo.com.", "rr1---sn-vgqsrnsd.googlevideo.com.", + "rr1---sn-vgqsrnsd.gvt1.com.", "rr1---sn-vgqsrnsr.googlevideo.com.", "rr1---sn-vgqsrnsy.googlevideo.com.", "rr1---sn-vgqsrnz7.googlevideo.com.", @@ -3777,36 +3609,55 @@ var FakeECSFQDNs = container.NewMapSet( "rr1---sn-vgqsrnzz.googlevideo.com.", "rr1---sn-voxoxu-v3jl.googlevideo.com.", "rr1---sn-voxoxu-v3js.googlevideo.com.", - "rr1.sn-5hne6nsz.googlevideo.com.", - "rr1.sn-5hneknek.googlevideo.com.", + "rr1.sn-a5m7lnl6.googlevideo.com.", + "rr1.sn-a5m7lnld.googlevideo.com.", + "rr1.sn-a5mekn6d.googlevideo.com.", + "rr1.sn-a5mekn6k.googlevideo.com.", + "rr1.sn-a5mekn6l.googlevideo.com.", + "rr1.sn-a5mekn6r.googlevideo.com.", + "rr1.sn-a5mekn6s.googlevideo.com.", + "rr1.sn-a5mekn6z.googlevideo.com.", + "rr1.sn-a5meknde.googlevideo.com.", + "rr1.sn-a5mekndl.googlevideo.com.", + "rr1.sn-a5meknds.googlevideo.com.", + "rr1.sn-a5mekndz.googlevideo.com.", + "rr1.sn-a5meknzk.googlevideo.com.", + "rr1.sn-a5meknzr.googlevideo.com.", + "rr1.sn-a5mlrnl6.googlevideo.com.", + "rr1.sn-a5mlrnll.googlevideo.com.", + "rr1.sn-a5mlrnls.googlevideo.com.", + "rr1.sn-a5mlrnlz.googlevideo.com.", + "rr1.sn-a5msenek.googlevideo.com.", + "rr1.sn-a5msener.googlevideo.com.", + "rr1.sn-a5msenes.googlevideo.com.", + "rr1.sn-a5msenl7.googlevideo.com.", + "rr1.sn-a5msenle.googlevideo.com.", "rr1.sn-hp57kn6r.googlevideo.com.", "rr1.sn-hp57kn6y.googlevideo.com.", "rr1.sn-hp57knd6.googlevideo.com.", "rr1.sn-hp57kndd.googlevideo.com.", - "rr1.sn-hp57kndk.googlevideo.com.", "rr1.sn-hp57kndr.googlevideo.com.", "rr1.sn-hp57knds.googlevideo.com.", "rr1.sn-hp57kndy.googlevideo.com.", - "rr1.sn-hp57kndz.googlevideo.com.", - "rr1.sn-hp57knk7.googlevideo.com.", + "rr1.sn-hp57knks.googlevideo.com.", "rr1.sn-hp57ynl6.googlevideo.com.", "rr1.sn-hp57ynlr.googlevideo.com.", "rr1.sn-hp57ynly.googlevideo.com.", - "rr1.sn-hp57yns7.googlevideo.com.", - "rr1.sn-hp57ynse.googlevideo.com.", - "rr1.sn-hp57ynsl.googlevideo.com.", + "rr1.sn-hp57ynsd.googlevideo.com.", "rr1.sn-hp57ynss.googlevideo.com.", "rr1.sn-nx57ynsk.googlevideo.com.", - "rr1.sn-q4fl6n6d.googlevideo.com.", - "rr1.sn-q4fl6n6r.googlevideo.com.", - "rr1.sn-q4fl6nd6.googlevideo.com.", - "rr1.sn-q4fl6nsl.googlevideo.com.", - "rr1.sn-q4flrn7k.googlevideo.com.", - "rr1.sn-q4flrnes.googlevideo.com.", + "rr1.sn-q4fl6nde.googlevideo.com.", + "rr1.sn-q4fl6nsy.googlevideo.com.", + "rr1.sn-q4fl6nz7.googlevideo.com.", + "rr1.sn-q4flrne7.googlevideo.com.", "rr1.sn-q4fzen7l.googlevideo.com.", + "rr1.sn-qja5mc-5h.googlevideo.com.", "rr1.sn-u1hp55-5c.googlevideo.com.", + "rr1.sn-vgqskn6z.googlevideo.com.", + "rr1.sn-vgqsknzr.googlevideo.com.", + "rr1.sn-vgqsrn6z.googlevideo.com.", + "rr1.sn-vgqsrnzd.googlevideo.com.", "rr1.sn-vgqsrnzz.googlevideo.com.", - "rr10---sn-8qj-i5ozd.googlevideo.com.", "rr10---sn-8xgp1vo-ab56.googlevideo.com.", "rr10---sn-8xgp1vo-ab5d.googlevideo.com.", "rr10---sn-8xgp1vo-p5qee.googlevideo.com.", @@ -3825,10 +3676,13 @@ var FakeECSFQDNs = container.NewMapSet( "rr10---sn-bvvbaxivnuxqjvhj5nu-vgqs.googlevideo.com.", "rr10---sn-bvvbaxivnuxqjvhj5nu-vgqz.googlevideo.com.", "rr10---sn-bvvbaxivnuxqjvm-2ime.googlevideo.com.", + "rr10---sn-bvvbaxivnuxqjvm-2iml.googlevideo.com.", "rr10---sn-bvvbaxivnuxqjvm-2ims.googlevideo.com.", + "rr10---sn-bvvbaxivnuxqjvm-2imz.googlevideo.com.", "rr10---sn-bvvbaxivnuxqjvm-q4fe.googlevideo.com.", "rr10---sn-bvvbaxivnuxqjvm-q4fl.googlevideo.com.", "rr10---sn-bvvbaxivnuxqjvm-q4fl.gvt1.com.", + "rr11---sn-42u-nboze.googlevideo.com.", "rr11---sn-8xgp1vo-ab56.googlevideo.com.", "rr11---sn-8xgp1vo-ab5d.googlevideo.com.", "rr11---sn-8xgp1vo-p5qee.googlevideo.com.", @@ -3840,7 +3694,6 @@ var FakeECSFQDNs = container.NewMapSet( "rr11---sn-bvvbaxivnuxq5uu-vgql.googlevideo.com.", "rr11---sn-bvvbaxivnuxq5uu-vgqs.googlevideo.com.", "rr11---sn-bvvbaxivnuxq5uu-vgqz.googlevideo.com.", - "rr11---sn-bvvbaxivnuxqjvhj5nu-n4vl.googlevideo.com.", "rr11---sn-bvvbaxivnuxqjvhj5nu-vgq6.googlevideo.com.", "rr11---sn-bvvbaxivnuxqjvhj5nu-vgqd.googlevideo.com.", "rr11---sn-bvvbaxivnuxqjvhj5nu-vgqe.googlevideo.com.", @@ -3848,12 +3701,12 @@ var FakeECSFQDNs = container.NewMapSet( "rr11---sn-bvvbaxivnuxqjvhj5nu-vgqs.googlevideo.com.", "rr11---sn-bvvbaxivnuxqjvhj5nu-vgqz.googlevideo.com.", "rr11---sn-bvvbaxivnuxqjvm-2ime.googlevideo.com.", + "rr11---sn-bvvbaxivnuxqjvm-2iml.googlevideo.com.", "rr11---sn-bvvbaxivnuxqjvm-2ims.googlevideo.com.", "rr11---sn-bvvbaxivnuxqjvm-q4fe.googlevideo.com.", "rr11---sn-bvvbaxivnuxqjvm-q4fe.gvt1.com.", "rr11---sn-bvvbaxivnuxqjvm-q4fl.googlevideo.com.", "rr11---sn-bvvbaxivnuxqjvm-q4fl.gvt1.com.", - "rr12---sn-42u-nbozs.googlevideo.com.", "rr12---sn-8xgp1vo-p5qel.googlevideo.com.", "rr12---sn-bvvbaxivnuxq5uu-q4f6.googlevideo.com.", "rr12---sn-bvvbaxivnuxq5uu-q4fs.googlevideo.com.", @@ -3868,13 +3721,15 @@ var FakeECSFQDNs = container.NewMapSet( "rr12---sn-bvvbaxivnuxqjvhj5nu-vgql.googlevideo.com.", "rr12---sn-bvvbaxivnuxqjvhj5nu-vgqs.googlevideo.com.", "rr12---sn-bvvbaxivnuxqjvm-2ime.googlevideo.com.", + "rr12---sn-bvvbaxivnuxqjvm-2iml.googlevideo.com.", "rr12---sn-bvvbaxivnuxqjvm-2ims.googlevideo.com.", + "rr12---sn-bvvbaxivnuxqjvm-2imz.googlevideo.com.", "rr12---sn-bvvbaxivnuxqjvm-q4fe.googlevideo.com.", + "rr12---sn-bvvbaxivnuxqjvm-q4fe.gvt1.com.", "rr12---sn-bvvbaxivnuxqjvm-q4fl.googlevideo.com.", - "rr13---sn-42u-nbozs.googlevideo.com.", + "rr12---sn-bvvbaxivnuxqjvm-q4fl.gvt1.com.", "rr13---sn-8xgp1vo-p5qel.googlevideo.com.", "rr13---sn-bvvbaxivnuxq5uu-q4f6.googlevideo.com.", - "rr13---sn-bvvbaxivnuxq5uu-q4fs.googlevideo.com.", "rr13---sn-bvvbaxivnuxq5uu-q4fz.googlevideo.com.", "rr13---sn-bvvbaxivnuxq5uu-vgqe.googlevideo.com.", "rr13---sn-bvvbaxivnuxq5uu-vgql.googlevideo.com.", @@ -3889,18 +3744,21 @@ var FakeECSFQDNs = container.NewMapSet( "rr13---sn-bvvbaxivnuxqjvm-q4fe.googlevideo.com.", "rr13---sn-bvvbaxivnuxqjvm-q4fe.gvt1.com.", "rr13---sn-bvvbaxivnuxqjvm-q4fl.googlevideo.com.", - "rr14---sn-bvvbaxivnuxqjvhj5nu-n4vl.googlevideo.com.", - "rr15---sn-bvvbaxivnuxqjvhj5nu-n4v6.googlevideo.com.", "rr2---sn-0nnpbo5a-bggl.googlevideo.com.", + "rr2---sn-2aqu-hoalk.googlevideo.com.", "rr2---sn-2aqu-hoaly.googlevideo.com.", "rr2---sn-2aqu-hoas7.googlevideo.com.", + "rr2---sn-2aqu-hoasz.googlevideo.com.", "rr2---sn-2imern76.googlevideo.com.", + "rr2---sn-2imern76.gvt1.com.", "rr2---sn-2imern7d.googlevideo.com.", "rr2---sn-2imern7d.gvt1.com.", "rr2---sn-2imern7r.googlevideo.com.", "rr2---sn-2imern7r.gvt1.com.", "rr2---sn-2imeyn7k.googlevideo.com.", + "rr2---sn-2imeyn7k.gvt1.com.", "rr2---sn-2o5ua5-53.googlevideo.com.", + "rr2---sn-2o5ua5-53.gvt1.com.", "rr2---sn-2oaig5-55.googlevideo.com.", "rr2---sn-2op5q5-58.googlevideo.com.", "rr2---sn-2oq4f5-c4.googlevideo.com.", @@ -3912,6 +3770,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-30a7yner.googlevideo.com.", "rr2---sn-30a7yney.googlevideo.com.", "rr2---sn-30a7ynl7.googlevideo.com.", + "rr2---sn-42u-nbozl.googlevideo.com.", "rr2---sn-42u-nbozz.googlevideo.com.", "rr2---sn-4g5e6ns6.googlevideo.com.", "rr2---sn-4g5e6ns7.googlevideo.com.", @@ -3923,6 +3782,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-4g5e6nz7.googlevideo.com.", "rr2---sn-4g5e6nze.googlevideo.com.", "rr2---sn-4g5e6nzl.googlevideo.com.", + "rr2---sn-4g5e6nzs.googlevideo.com.", "rr2---sn-4g5e6nzz.googlevideo.com.", "rr2---sn-4g5edn6k.googlevideo.com.", "rr2---sn-4g5edn6r.googlevideo.com.", @@ -3949,7 +3809,6 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-4g5ednsy.googlevideo.com.", "rr2---sn-4g5ednsz.googlevideo.com.", "rr2---sn-4g5ednz7.googlevideo.com.", - "rr2---sn-4g5lzne6.googlevideo.com.", "rr2---sn-4g5lzned.googlevideo.com.", "rr2---sn-4g5lznek.googlevideo.com.", "rr2---sn-4g5lzner.googlevideo.com.", @@ -3960,13 +3819,14 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-4g5lznle.googlevideo.com.", "rr2---sn-4g5lznls.googlevideo.com.", "rr2---sn-4g5lznlz.googlevideo.com.", - "rr2---sn-5abxgpxuxaxjvh-9n4s.googlevideo.com.", "rr2---sn-5abxgpxuxaxjvh-9n4z.googlevideo.com.", + "rr2---sn-5go7yner.googlevideo.com.", "rr2---sn-5go7ynl6.googlevideo.com.", "rr2---sn-5goeenes.googlevideo.com.", "rr2---sn-5gxo-in8l.googlevideo.com.", "rr2---sn-5gxo-in8s.googlevideo.com.", "rr2---sn-5hne6n6e.googlevideo.com.", + "rr2---sn-5hne6n6e.gvt1.com.", "rr2---sn-5hne6n6l.googlevideo.com.", "rr2---sn-5hne6ns6.googlevideo.com.", "rr2---sn-5hne6nsd.googlevideo.com.", @@ -3976,28 +3836,34 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-5hne6nsz.googlevideo.com.", "rr2---sn-5hne6nz6.googlevideo.com.", "rr2---sn-5hne6nzd.googlevideo.com.", - "rr2---sn-5hne6nzd.gvt1.com.", "rr2---sn-5hne6nzk.googlevideo.com.", "rr2---sn-5hne6nzk.gvt1.com.", + "rr2---sn-5hne6nzs.googlevideo.com.", "rr2---sn-5hne6nzy.googlevideo.com.", + "rr2---sn-5hne6nzy.gvt1.com.", "rr2---sn-5hnednss.googlevideo.com.", "rr2---sn-5hnednsz.googlevideo.com.", - "rr2---sn-5hnednsz.gvt1.com.", "rr2---sn-5hnekn76.googlevideo.com.", + "rr2---sn-5hnekn76.gvt1.com.", "rr2---sn-5hnekn7d.googlevideo.com.", "rr2---sn-5hnekn7l.googlevideo.com.", "rr2---sn-5hnekn7s.googlevideo.com.", "rr2---sn-5hnekn7z.googlevideo.com.", "rr2---sn-5hneknee.googlevideo.com.", "rr2---sn-5hneknek.googlevideo.com.", + "rr2---sn-5hneknek.gvt1.com.", "rr2---sn-5hneknes.googlevideo.com.", "rr2---sn-5hneknes.gvt1.com.", "rr2---sn-5pgnugx5h-hn26.googlevideo.com.", "rr2---sn-5pgnugx5h-hn2d.googlevideo.com.", - "rr2---sn-5pgnugx5h-hn2k.googlevideo.com.", + "rr2---sn-5uaezn67.googlevideo.com.", + "rr2---sn-5uaezn6l.googlevideo.com.", + "rr2---sn-5uaezn6s.googlevideo.com.", + "rr2---sn-5uaezn6z.googlevideo.com.", "rr2---sn-5uaezndd.googlevideo.com.", "rr2---sn-5uaezne6.googlevideo.com.", "rr2---sn-5uaezned.googlevideo.com.", + "rr2---sn-5uaezned.gvt1.com.", "rr2---sn-5uaeznel.googlevideo.com.", "rr2---sn-5uaezner.googlevideo.com.", "rr2---sn-5uaezner.gvt1.com.", @@ -4006,9 +3872,9 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-5uaeznl6.googlevideo.com.", "rr2---sn-5uaeznld.googlevideo.com.", "rr2---sn-5uaeznls.googlevideo.com.", + "rr2---sn-5uaeznls.gvt1.com.", "rr2---sn-5uaeznly.googlevideo.com.", "rr2---sn-5uaeznlz.googlevideo.com.", - "rr2---sn-5uaeznlz.gvt1.com.", "rr2---sn-5uaeznse.googlevideo.com.", "rr2---sn-5uaeznsl.googlevideo.com.", "rr2---sn-5uaeznss.googlevideo.com.", @@ -4019,9 +3885,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-5ualdnll.googlevideo.com.", "rr2---sn-5ualdnlr.googlevideo.com.", "rr2---sn-5ualdnls.googlevideo.com.", - "rr2---sn-5ualdns6.googlevideo.com.", "rr2---sn-5ualdns7.googlevideo.com.", - "rr2---sn-5ualdns7.gvt1.com.", "rr2---sn-5ualdnsd.googlevideo.com.", "rr2---sn-5ualdnse.googlevideo.com.", "rr2---sn-5ualdnsk.googlevideo.com.", @@ -4029,49 +3893,70 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-5ualdnsr.googlevideo.com.", "rr2---sn-5ualdnss.googlevideo.com.", "rr2---sn-5ualdnsy.googlevideo.com.", + "rr2---sn-5ualdnsy.gvt1.com.", "rr2---sn-5ualdnsz.googlevideo.com.", + "rr2---sn-5ualdnz6.googlevideo.com.", "rr2---sn-5ualdnz7.googlevideo.com.", "rr2---sn-5ualdnze.googlevideo.com.", + "rr2---sn-5ualdnzz.googlevideo.com.", + "rr2---sn-8qj-i2ies.googlevideo.com.", "rr2---sn-8qj-i5o6k.googlevideo.com.", + "rr2---sn-8qj-i5ode.googlevideo.com.", + "rr2---sn-8qj-i5ody.googlevideo.com.", "rr2---sn-8qj-i5okl.googlevideo.com.", + "rr2---sn-8qj-i5oks.googlevideo.com.", + "rr2---sn-8qj-i5oly.googlevideo.com.", + "rr2---sn-8qj-i5oze.googlevideo.com.", "rr2---sn-8qj-nbo66.googlevideo.com.", + "rr2---sn-8qj-nbo67.googlevideo.com.", + "rr2---sn-8qj-nbo6r.googlevideo.com.", "rr2---sn-8qj-nbo6y.googlevideo.com.", "rr2---sn-8qj-nbod6.googlevideo.com.", + "rr2---sn-8qj-nbod7.googlevideo.com.", "rr2---sn-8qj-nbosd.googlevideo.com.", + "rr2---sn-8qj-qap6.googlevideo.com.", + "rr2---sn-8xgp1vo-a5ml.googlevideo.com.", "rr2---sn-8xgp1vo-ab56.googlevideo.com.", "rr2---sn-8xgp1vo-ab5d.googlevideo.com.", "rr2---sn-8xgp1vo-ab5e.googlevideo.com.", "rr2---sn-8xgp1vo-ab5l.googlevideo.com.", "rr2---sn-8xgp1vo-ab5s.googlevideo.com.", "rr2---sn-8xgp1vo-ab5z.googlevideo.com.", + "rr2---sn-8xgp1vo-nh4l.googlevideo.com.", "rr2---sn-8xgp1vo-p5il.googlevideo.com.", "rr2---sn-8xgp1vo-p5qee.googlevideo.com.", - "rr2---sn-8xgp1vo-p5qel.googlevideo.com.", "rr2---sn-8xgp1vo-p5qes.googlevideo.com.", + "rr2---sn-8xgp1vo-poql.googlevideo.com.", "rr2---sn-8xgp1vo-vgqe.googlevideo.com.", "rr2---sn-8xgp1vo-xfge.googlevideo.com.", "rr2---sn-8xgp1vo-xfgl.googlevideo.com.", "rr2---sn-8xgp1vo-xfgs.googlevideo.com.", "rr2---sn-9gv76n7s.googlevideo.com.", "rr2---sn-9gv76n7z.googlevideo.com.", - "rr2---sn-9gv7ened.googlevideo.com.", - "rr2---sn-9gv7zn76.googlevideo.com.", - "rr2---sn-9gv7zn7e.googlevideo.com.", "rr2---sn-9gv7zn7y.googlevideo.com.", "rr2---sn-a5m7lnl6.googlevideo.com.", + "rr2---sn-a5m7lnl6.gvt1.com.", "rr2---sn-a5m7lnld.googlevideo.com.", "rr2---sn-a5mekn6d.googlevideo.com.", + "rr2---sn-a5mekn6d.gvt1.com.", "rr2---sn-a5mekn6k.googlevideo.com.", + "rr2---sn-a5mekn6k.gvt1.com.", "rr2---sn-a5mekn6l.googlevideo.com.", "rr2---sn-a5mekn6r.googlevideo.com.", "rr2---sn-a5mekn6s.googlevideo.com.", + "rr2---sn-a5mekn6s.gvt1.com.", "rr2---sn-a5mekn6z.googlevideo.com.", + "rr2---sn-a5mekn6z.gvt1.com.", "rr2---sn-a5meknd6.googlevideo.com.", + "rr2---sn-a5mekndd.googlevideo.com.", "rr2---sn-a5meknde.googlevideo.com.", + "rr2---sn-a5mekndk.googlevideo.com.", "rr2---sn-a5mekndl.googlevideo.com.", "rr2---sn-a5meknds.googlevideo.com.", + "rr2---sn-a5meknds.gvt1.com.", "rr2---sn-a5mekndz.googlevideo.com.", "rr2---sn-a5meknsd.googlevideo.com.", + "rr2---sn-a5meknsd.gvt1.com.", "rr2---sn-a5meknsy.googlevideo.com.", "rr2---sn-a5meknzk.googlevideo.com.", "rr2---sn-a5meknzl.googlevideo.com.", @@ -4079,25 +3964,33 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-a5meknzs.googlevideo.com.", "rr2---sn-a5mlrnek.googlevideo.com.", "rr2---sn-a5mlrnl6.googlevideo.com.", + "rr2---sn-a5mlrnl6.gvt1.com.", "rr2---sn-a5mlrnll.googlevideo.com.", + "rr2---sn-a5mlrnll.gvt1.com.", "rr2---sn-a5mlrnls.googlevideo.com.", + "rr2---sn-a5mlrnls.gvt1.com.", "rr2---sn-a5mlrnlz.googlevideo.com.", "rr2---sn-a5msen76.googlevideo.com.", "rr2---sn-a5msen7l.googlevideo.com.", "rr2---sn-a5msen7s.googlevideo.com.", "rr2---sn-a5msen7z.googlevideo.com.", + "rr2---sn-a5msen7z.gvt1.com.", "rr2---sn-a5msenek.googlevideo.com.", "rr2---sn-a5msener.googlevideo.com.", "rr2---sn-a5msenes.googlevideo.com.", + "rr2---sn-a5msenes.gvt1.com.", "rr2---sn-a5msenl7.googlevideo.com.", "rr2---sn-a5msenle.googlevideo.com.", + "rr2---sn-a5msenle.gvt1.com.", "rr2---sn-ab5l6ndr.googlevideo.com.", "rr2---sn-ab5l6ndy.googlevideo.com.", "rr2---sn-ab5l6nk6.googlevideo.com.", "rr2---sn-ab5l6nkd.googlevideo.com.", + "rr2---sn-ab5l6nr6.googlevideo.com.", "rr2---sn-ab5l6nrd.googlevideo.com.", "rr2---sn-ab5l6nrk.googlevideo.com.", "rr2---sn-ab5l6nrl.googlevideo.com.", + "rr2---sn-ab5l6nrl.gvt1.com.", "rr2---sn-ab5l6nrr.googlevideo.com.", "rr2---sn-ab5l6nrs.googlevideo.com.", "rr2---sn-ab5l6nrz.googlevideo.com.", @@ -4111,6 +4004,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-ab5sznzr.googlevideo.com.", "rr2---sn-ab5sznzs.googlevideo.com.", "rr2---sn-ab5sznzy.googlevideo.com.", + "rr2---sn-ab5sznzy.gvt1.com.", "rr2---sn-ab5sznzz.googlevideo.com.", "rr2---sn-aigl6n6s.googlevideo.com.", "rr2---sn-aigl6ned.googlevideo.com.", @@ -4123,8 +4017,11 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-aigl6nsk.googlevideo.com.", "rr2---sn-aigl6nsr.googlevideo.com.", "rr2---sn-aigl6nz7.googlevideo.com.", + "rr2---sn-aigl6nz7.gvt1.com.", "rr2---sn-aigl6nze.googlevideo.com.", + "rr2---sn-aigl6nze.gvt1.com.", "rr2---sn-aigl6nzk.googlevideo.com.", + "rr2---sn-aigl6nzk.gvt1.com.", "rr2---sn-aigl6nzl.googlevideo.com.", "rr2---sn-aigl6nzr.googlevideo.com.", "rr2---sn-aigl6nzs.googlevideo.com.", @@ -4136,12 +4033,10 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-aigzrn7s.googlevideo.com.", "rr2---sn-aigzrn7z.googlevideo.com.", "rr2---sn-aigzrnld.googlevideo.com.", - "rr2---sn-aigzrnse.googlevideo.com.", "rr2---sn-aigzrnsl.googlevideo.com.", "rr2---sn-aigzrnsr.googlevideo.com.", "rr2---sn-aigzrnss.googlevideo.com.", "rr2---sn-aigzrnsz.googlevideo.com.", - "rr2---sn-aigzrnz7.googlevideo.com.", "rr2---sn-aigzrnze.googlevideo.com.", "rr2---sn-aj4g55-5v.googlevideo.com.", "rr2---sn-aj5ua5-5c.googlevideo.com.", @@ -4162,14 +4057,19 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-bvvbaxivnuxqjvhj5nu-vgqs.googlevideo.com.", "rr2---sn-bvvbaxivnuxqjvhj5nu-vgqz.googlevideo.com.", "rr2---sn-bvvbaxivnuxqjvm-2ime.googlevideo.com.", + "rr2---sn-bvvbaxivnuxqjvm-2iml.googlevideo.com.", "rr2---sn-bvvbaxivnuxqjvm-2ims.googlevideo.com.", + "rr2---sn-bvvbaxivnuxqjvm-2imz.googlevideo.com.", "rr2---sn-bvvbaxivnuxqjvm-q4fe.googlevideo.com.", "rr2---sn-cvb7lne7.googlevideo.com.", "rr2---sn-cvb7lnee.googlevideo.com.", - "rr2---sn-cvb7lnlz.googlevideo.com.", + "rr2---sn-cvb7lnl7.googlevideo.com.", + "rr2---sn-cvb7lnls.googlevideo.com.", "rr2---sn-cvb7sn7k.googlevideo.com.", "rr2---sn-cvb7sn7r.googlevideo.com.", - "rr2---sn-gxuo03g-ig3l.googlevideo.com.", + "rr2---sn-fpnjoxu-hnos.googlevideo.com.", + "rr2---sn-gpuuxg-hxhz.googlevideo.com.", + "rr2---sn-hgn7rn7y.googlevideo.com.", "rr2---sn-hjoj-gq0l.googlevideo.com.", "rr2---sn-hjoj-poul.googlevideo.com.", "rr2---sn-hjoj-pous.googlevideo.com.", @@ -4180,8 +4080,8 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-hoa7rn7z.googlevideo.com.", "rr2---sn-hoa7rn7z.gvt1.com.", "rr2---sn-hp57kn6r.googlevideo.com.", - "rr2---sn-hp57kn6r.gvt1.com.", "rr2---sn-hp57kn6y.googlevideo.com.", + "rr2---sn-hp57kn6y.gvt1.com.", "rr2---sn-hp57knd6.googlevideo.com.", "rr2---sn-hp57knd6.gvt1.com.", "rr2---sn-hp57kndd.googlevideo.com.", @@ -4189,20 +4089,33 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-hp57kndr.googlevideo.com.", "rr2---sn-hp57kndr.gvt1.com.", "rr2---sn-hp57knds.googlevideo.com.", + "rr2---sn-hp57knds.gvt1.com.", "rr2---sn-hp57kndy.googlevideo.com.", + "rr2---sn-hp57kndy.gvt1.com.", "rr2---sn-hp57kndz.googlevideo.com.", - "rr2---sn-hp57kndz.gvt1.com.", "rr2---sn-hp57knk7.googlevideo.com.", "rr2---sn-hp57knk7.gvt1.com.", + "rr2---sn-hp57knkl.googlevideo.com.", + "rr2---sn-hp57knks.googlevideo.com.", + "rr2---sn-hp57knks.gvt1.com.", "rr2---sn-hp57yn7r.googlevideo.com.", + "rr2---sn-hp57yn7r.gvt1.com.", "rr2---sn-hp57yn7y.googlevideo.com.", "rr2---sn-hp57yne7.googlevideo.com.", "rr2---sn-hp57ynee.googlevideo.com.", + "rr2---sn-hp57ynl6.googlevideo.com.", + "rr2---sn-hp57ynl6.gvt1.com.", "rr2---sn-hp57ynlr.googlevideo.com.", + "rr2---sn-hp57ynlr.gvt1.com.", "rr2---sn-hp57ynly.googlevideo.com.", + "rr2---sn-hp57yns6.googlevideo.com.", + "rr2---sn-hp57yns6.gvt1.com.", "rr2---sn-hp57yns7.googlevideo.com.", "rr2---sn-hp57yns7.gvt1.com.", + "rr2---sn-hp57ynsd.googlevideo.com.", + "rr2---sn-hp57ynsd.gvt1.com.", "rr2---sn-hp57ynse.googlevideo.com.", + "rr2---sn-hp57ynse.gvt1.com.", "rr2---sn-hp57ynsl.googlevideo.com.", "rr2---sn-hp57ynsl.gvt1.com.", "rr2---sn-hpqfxnu-oaxe.googlevideo.com.", @@ -4232,10 +4145,9 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-jxopj-n5oe.googlevideo.com.", "rr2---sn-jxopj-nh4e.googlevideo.com.", "rr2---sn-jxopj-nh4e.gvt1.com.", + "rr2---sn-n0qqxoapo3-4abl.gvt1.com.", "rr2---sn-n2uxaxjvh-j5xl.googlevideo.com.", - "rr2---sn-n2uxaxjvh-j5xl.gvt1.com.", "rr2---sn-n2uxaxjvh-j5xs.googlevideo.com.", - "rr2---sn-n2uxaxjvh-j5xs.gvt1.com.", "rr2---sn-n4v7snee.googlevideo.com.", "rr2---sn-n4v7sney.googlevideo.com.", "rr2---sn-n4v7snl7.googlevideo.com.", @@ -4245,12 +4157,12 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-n4v7snly.googlevideo.com.", "rr2---sn-n4v7sns7.googlevideo.com.", "rr2---sn-n4v7snse.googlevideo.com.", + "rr2---sn-n4v7snse.gvt1.com.", "rr2---sn-nh5gujvh-h4xe.googlevideo.com.", "rr2---sn-nh5gujvh-h4xe.gvt1.com.", "rr2---sn-nh5gujvh-h4xl.googlevideo.com.", "rr2---sn-nh5gujvh-h4xl.gvt1.com.", "rr2---sn-npoe7ndl.googlevideo.com.", - "rr2---sn-npoe7ndl.gvt1.com.", "rr2---sn-npoe7ne6.googlevideo.com.", "rr2---sn-npoe7ne7.googlevideo.com.", "rr2---sn-npoe7ned.googlevideo.com.", @@ -4262,7 +4174,6 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-npoe7nl6.googlevideo.com.", "rr2---sn-npoe7nlz.googlevideo.com.", "rr2---sn-npoe7ns6.googlevideo.com.", - "rr2---sn-npoe7ns6.gvt1.com.", "rr2---sn-npoe7ns7.googlevideo.com.", "rr2---sn-npoe7ns7.gvt1.com.", "rr2---sn-npoe7nsd.googlevideo.com.", @@ -4270,6 +4181,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-npoe7nsr.googlevideo.com.", "rr2---sn-npoe7nsr.gvt1.com.", "rr2---sn-npoe7nsy.googlevideo.com.", + "rr2---sn-npoe7nsy.gvt1.com.", "rr2---sn-npoe7nz7.googlevideo.com.", "rr2---sn-npoeene6.googlevideo.com.", "rr2---sn-npoeened.googlevideo.com.", @@ -4278,10 +4190,10 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-npoeener.googlevideo.com.", "rr2---sn-npoeeney.googlevideo.com.", "rr2---sn-npoeenez.googlevideo.com.", - "rr2---sn-npoeenl7.googlevideo.com.", - "rr2---sn-npoeenle.googlevideo.com.", "rr2---sn-npoeenlk.googlevideo.com.", + "rr2---sn-npoeenlk.gvt1.com.", "rr2---sn-npoeenll.googlevideo.com.", + "rr2---sn-npoeenll.gvt1.com.", "rr2---sn-npoeenly.googlevideo.com.", "rr2---sn-npoeens7.googlevideo.com.", "rr2---sn-npoeens7.gvt1.com.", @@ -4289,12 +4201,15 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-npoldn7d.googlevideo.com.", "rr2---sn-npoldn7d.gvt1.com.", "rr2---sn-npoldn7e.googlevideo.com.", + "rr2---sn-npoldn7e.gvt1.com.", "rr2---sn-npoldn7l.googlevideo.com.", "rr2---sn-npoldn7y.googlevideo.com.", "rr2---sn-npoldn7z.googlevideo.com.", + "rr2---sn-npoldn7z.gvt1.com.", "rr2---sn-npoldne7.googlevideo.com.", - "rr2---sn-ntq7yned.googlevideo.com.", + "rr2---sn-ntqe6n76.googlevideo.com.", "rr2---sn-nv0uixgo-5ual.googlevideo.com.", + "rr2---sn-nv0uixgoapbiu-hntz.googlevideo.com.", "rr2---sn-nx57ynlk.googlevideo.com.", "rr2---sn-nx57ynsd.googlevideo.com.", "rr2---sn-nx57ynse.googlevideo.com.", @@ -4310,15 +4225,16 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-o097znsk.googlevideo.com.", "rr2---sn-o097znsl.googlevideo.com.", "rr2---sn-o097znsr.googlevideo.com.", + "rr2---sn-o097znsr.gvt1.com.", "rr2---sn-o097znss.googlevideo.com.", "rr2---sn-o097znsz.googlevideo.com.", "rr2---sn-o097znz7.googlevideo.com.", - "rr2---sn-o097znze.googlevideo.com.", "rr2---sn-o097znzk.googlevideo.com.", "rr2---sn-o097znzr.googlevideo.com.", "rr2---sn-oj5hn5-55.googlevideo.com.", "rr2---sn-oji3bc-5j.googlevideo.com.", "rr2---sn-ojnpo5-58.googlevideo.com.", + "rr2---sn-ojnpo5-5o.googlevideo.com.", "rr2---sn-p5qddn76.googlevideo.com.", "rr2---sn-p5qddn7d.googlevideo.com.", "rr2---sn-p5qddn7k.googlevideo.com.", @@ -4332,7 +4248,6 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-p5qlsn7l.googlevideo.com.", "rr2---sn-p5qlsn7s.googlevideo.com.", "rr2---sn-p5qlsnd6.googlevideo.com.", - "rr2---sn-p5qlsndk.googlevideo.com.", "rr2---sn-p5qlsndr.googlevideo.com.", "rr2---sn-p5qlsndz.googlevideo.com.", "rr2---sn-p5qlsnrl.googlevideo.com.", @@ -4348,8 +4263,6 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-paapovpnjxou0gt-nual.googlevideo.com.", "rr2---sn-paapovpnjxou0gt-nuas.googlevideo.com.", "rr2---sn-paapovpnjxou0gt-nuaz.googlevideo.com.", - "rr2---sn-pjnpu-5hfe.googlevideo.com.", - "rr2---sn-pjnpu-5hfl.googlevideo.com.", "rr2---sn-pobpb-poql.googlevideo.com.", "rr2---sn-q4fl6n66.googlevideo.com.", "rr2---sn-q4fl6n66.gvt1.com.", @@ -4361,9 +4274,13 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-q4fl6n6y.gvt1.com.", "rr2---sn-q4fl6n6z.googlevideo.com.", "rr2---sn-q4fl6n6z.gvt1.com.", + "rr2---sn-q4fl6nd6.googlevideo.com.", "rr2---sn-q4fl6nd7.googlevideo.com.", + "rr2---sn-q4fl6nd7.gvt1.com.", "rr2---sn-q4fl6nde.googlevideo.com.", + "rr2---sn-q4fl6nde.gvt1.com.", "rr2---sn-q4fl6ndl.googlevideo.com.", + "rr2---sn-q4fl6ndl.gvt1.com.", "rr2---sn-q4fl6nds.googlevideo.com.", "rr2---sn-q4fl6ndz.googlevideo.com.", "rr2---sn-q4fl6ndz.gvt1.com.", @@ -4372,6 +4289,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-q4fl6ns7.googlevideo.com.", "rr2---sn-q4fl6nsd.googlevideo.com.", "rr2---sn-q4fl6nsk.googlevideo.com.", + "rr2---sn-q4fl6nsk.gvt1.com.", "rr2---sn-q4fl6nsl.googlevideo.com.", "rr2---sn-q4fl6nsr.googlevideo.com.", "rr2---sn-q4fl6nss.googlevideo.com.", @@ -4385,21 +4303,19 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-q4flrn7r.gvt1.com.", "rr2---sn-q4flrn7y.googlevideo.com.", "rr2---sn-q4flrne6.googlevideo.com.", + "rr2---sn-q4flrne6.gvt1.com.", "rr2---sn-q4flrne7.googlevideo.com.", - "rr2---sn-q4flrne7.gvt1.com.", "rr2---sn-q4flrnee.googlevideo.com.", "rr2---sn-q4flrnee.gvt1.com.", "rr2---sn-q4flrnek.googlevideo.com.", + "rr2---sn-q4flrnek.gvt1.com.", "rr2---sn-q4flrnel.googlevideo.com.", - "rr2---sn-q4flrnel.gvt1.com.", "rr2---sn-q4flrner.googlevideo.com.", "rr2---sn-q4flrnes.googlevideo.com.", - "rr2---sn-q4flrnes.gvt1.com.", "rr2---sn-q4flrney.googlevideo.com.", "rr2---sn-q4flrney.gvt1.com.", "rr2---sn-q4flrnez.googlevideo.com.", "rr2---sn-q4flrnl6.googlevideo.com.", - "rr2---sn-q4flrnl6.gvt1.com.", "rr2---sn-q4flrnl7.googlevideo.com.", "rr2---sn-q4flrnl7.gvt1.com.", "rr2---sn-q4flrnle.googlevideo.com.", @@ -4413,8 +4329,8 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-q4fzen7l.googlevideo.com.", "rr2---sn-q4fzen7l.gvt1.com.", "rr2---sn-q4fzen7s.googlevideo.com.", - "rr2---sn-q4fzen7s.gvt1.com.", "rr2---sn-q4fzen7y.googlevideo.com.", + "rr2---sn-q4fzen7y.gvt1.com.", "rr2---sn-q4fzene7.googlevideo.com.", "rr2---sn-q4fzene7.gvt1.com.", "rr2---sn-q4fzenee.googlevideo.com.", @@ -4429,6 +4345,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-qxuxa-5xme.googlevideo.com.", "rr2---sn-v5goxu-jhi6.googlevideo.com.", "rr2---sn-v5goxu-jhid.googlevideo.com.", + "rr2---sn-v5goxu-jhid.gvt1.com.", "rr2---sn-v5goxu-jhil.googlevideo.com.", "rr2---sn-v5goxu-jhiz.googlevideo.com.", "rr2---sn-vgqskn66.googlevideo.com.", @@ -4443,6 +4360,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-vgqsknez.googlevideo.com.", "rr2---sn-vgqsknld.googlevideo.com.", "rr2---sn-vgqsknlk.googlevideo.com.", + "rr2---sn-vgqsknlk.gvt1.com.", "rr2---sn-vgqsknll.googlevideo.com.", "rr2---sn-vgqsknlr.googlevideo.com.", "rr2---sn-vgqsknls.googlevideo.com.", @@ -4453,13 +4371,14 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-vgqsknz6.googlevideo.com.", "rr2---sn-vgqsknz7.googlevideo.com.", "rr2---sn-vgqsknzd.googlevideo.com.", - "rr2---sn-vgqsknze.googlevideo.com.", + "rr2---sn-vgqsknzd.gvt1.com.", "rr2---sn-vgqsknzk.googlevideo.com.", "rr2---sn-vgqsknzl.googlevideo.com.", "rr2---sn-vgqsknzr.googlevideo.com.", "rr2---sn-vgqsknzs.googlevideo.com.", "rr2---sn-vgqsknzy.googlevideo.com.", "rr2---sn-vgqsknzz.googlevideo.com.", + "rr2---sn-vgqsknzz.gvt1.com.", "rr2---sn-vgqsrn66.googlevideo.com.", "rr2---sn-vgqsrn67.googlevideo.com.", "rr2---sn-vgqsrn6e.googlevideo.com.", @@ -4483,39 +4402,62 @@ var FakeECSFQDNs = container.NewMapSet( "rr2---sn-vgqsrnz7.googlevideo.com.", "rr2---sn-vgqsrnzk.googlevideo.com.", "rr2---sn-vgqsrnzr.googlevideo.com.", - "rr2---sn-vgqsrnzs.googlevideo.com.", "rr2---sn-vgqsrnzy.googlevideo.com.", "rr2---sn-vgqsrnzz.googlevideo.com.", "rr2---sn-voxoxu-v3jl.googlevideo.com.", "rr2---sn-voxoxu-v3js.googlevideo.com.", - "rr2.sn-5hnekn76.googlevideo.com.", - "rr2.sn-hp57kn6r.googlevideo.com.", - "rr2.sn-hp57kn6y.googlevideo.com.", - "rr2.sn-hp57knd6.googlevideo.com.", - "rr2.sn-hp57kndd.googlevideo.com.", + "rr2.sn-5hnekn7d.googlevideo.com.", + "rr2.sn-a5m7lnl6.googlevideo.com.", + "rr2.sn-a5m7lnld.googlevideo.com.", + "rr2.sn-a5mekn6d.googlevideo.com.", + "rr2.sn-a5mekn6k.googlevideo.com.", + "rr2.sn-a5mekn6l.googlevideo.com.", + "rr2.sn-a5mekn6r.googlevideo.com.", + "rr2.sn-a5mekn6s.googlevideo.com.", + "rr2.sn-a5mekn6z.googlevideo.com.", + "rr2.sn-a5meknd6.googlevideo.com.", + "rr2.sn-a5meknde.googlevideo.com.", + "rr2.sn-a5mekndl.googlevideo.com.", + "rr2.sn-a5meknds.googlevideo.com.", + "rr2.sn-a5mekndz.googlevideo.com.", + "rr2.sn-a5meknzk.googlevideo.com.", + "rr2.sn-a5meknzr.googlevideo.com.", + "rr2.sn-a5mlrnl6.googlevideo.com.", + "rr2.sn-a5mlrnll.googlevideo.com.", + "rr2.sn-a5mlrnls.googlevideo.com.", + "rr2.sn-a5mlrnlz.googlevideo.com.", + "rr2.sn-a5msenek.googlevideo.com.", + "rr2.sn-a5msener.googlevideo.com.", + "rr2.sn-a5msenes.googlevideo.com.", + "rr2.sn-a5msenl7.googlevideo.com.", + "rr2.sn-a5msenle.googlevideo.com.", + "rr2.sn-aigl6nzl.googlevideo.com.", + "rr2.sn-hgn7rn7y.googlevideo.com.", "rr2.sn-hp57kndk.googlevideo.com.", "rr2.sn-hp57kndr.googlevideo.com.", "rr2.sn-hp57knds.googlevideo.com.", - "rr2.sn-hp57kndy.googlevideo.com.", - "rr2.sn-hp57kndz.googlevideo.com.", - "rr2.sn-hp57knk7.googlevideo.com.", - "rr2.sn-hp57yn7y.googlevideo.com.", + "rr2.sn-hp57ynl6.googlevideo.com.", "rr2.sn-hp57ynlr.googlevideo.com.", - "rr2.sn-hp57ynly.googlevideo.com.", + "rr2.sn-hp57yns6.googlevideo.com.", "rr2.sn-hp57yns7.googlevideo.com.", - "rr2.sn-hp57ynse.googlevideo.com.", + "rr2.sn-hp57ynsd.googlevideo.com.", "rr2.sn-hp57ynsl.googlevideo.com.", + "rr2.sn-ntqe6n76.googlevideo.com.", "rr2.sn-nx57ynsk.googlevideo.com.", - "rr2.sn-q4fl6n6y.googlevideo.com.", - "rr2.sn-q4fl6ns7.googlevideo.com.", - "rr2.sn-q4flrnee.googlevideo.com.", - "rr2.sn-q4flrnez.googlevideo.com.", + "rr2.sn-q4fl6n6s.googlevideo.com.", + "rr2.sn-q4fl6nsr.googlevideo.com.", + "rr2.sn-q4fl6nss.googlevideo.com.", "rr2.sn-q4fzen7l.googlevideo.com.", + "rr2.sn-q4fzene7.googlevideo.com.", + "rr2.sn-vgqsknzk.googlevideo.com.", + "rr2.sn-vgqsknzl.googlevideo.com.", + "rr2.sn-vgqsknzy.googlevideo.com.", "rr2.sn-vgqsrnzz.googlevideo.com.", "rr3---sn-0nnpbo5a-bggl.googlevideo.com.", "rr3---sn-2aqu-hoas7.googlevideo.com.", "rr3---sn-2aqu-hoasz.googlevideo.com.", "rr3---sn-2imern76.googlevideo.com.", + "rr3---sn-2imern76.gvt1.com.", "rr3---sn-2imern7d.googlevideo.com.", "rr3---sn-2imern7d.gvt1.com.", "rr3---sn-2imern7r.googlevideo.com.", @@ -4526,6 +4468,8 @@ var FakeECSFQDNs = container.NewMapSet( "rr3---sn-2op5q5-58.googlevideo.com.", "rr3---sn-2oq4f5-c4.googlevideo.com.", "rr3---sn-2oq4f5-c4.gvt1.com.", + "rr3---sn-2ovgq5-cw.googlevideo.com.", + "rr3---sn-2ovgq5-cw.gvt1.com.", "rr3---sn-30a7rned.googlevideo.com.", "rr3---sn-30a7rnek.googlevideo.com.", "rr3---sn-30a7ynek.googlevideo.com.", @@ -4581,14 +4525,18 @@ var FakeECSFQDNs = container.NewMapSet( "rr3---sn-4g5lznls.googlevideo.com.", "rr3---sn-4g5lznlz.googlevideo.com.", "rr3---sn-5abxgpxuxaxjvh-9n4z.googlevideo.com.", + "rr3---sn-5go7yner.googlevideo.com.", "rr3---sn-5go7ynl6.googlevideo.com.", "rr3---sn-5goeenes.googlevideo.com.", "rr3---sn-5goeenez.googlevideo.com.", "rr3---sn-5hne6n6e.googlevideo.com.", + "rr3---sn-5hne6n6e.gvt1.com.", "rr3---sn-5hne6n6l.googlevideo.com.", + "rr3---sn-5hne6n6l.gvt1.com.", "rr3---sn-5hne6ns6.googlevideo.com.", "rr3---sn-5hne6nsd.googlevideo.com.", "rr3---sn-5hne6nsk.googlevideo.com.", + "rr3---sn-5hne6nsk.gvt1.com.", "rr3---sn-5hne6nsr.googlevideo.com.", "rr3---sn-5hne6nsy.googlevideo.com.", "rr3---sn-5hne6nsz.googlevideo.com.", @@ -4596,7 +4544,9 @@ var FakeECSFQDNs = container.NewMapSet( "rr3---sn-5hne6nzd.googlevideo.com.", "rr3---sn-5hne6nzk.googlevideo.com.", "rr3---sn-5hne6nzs.googlevideo.com.", + "rr3---sn-5hne6nzs.gvt1.com.", "rr3---sn-5hne6nzy.googlevideo.com.", + "rr3---sn-5hne6nzy.gvt1.com.", "rr3---sn-5hnednss.googlevideo.com.", "rr3---sn-5hnednsz.googlevideo.com.", "rr3---sn-5hnekn76.googlevideo.com.", @@ -4605,8 +4555,14 @@ var FakeECSFQDNs = container.NewMapSet( "rr3---sn-5hnekn7s.googlevideo.com.", "rr3---sn-5hnekn7z.googlevideo.com.", "rr3---sn-5hneknee.googlevideo.com.", + "rr3---sn-5hneknee.gvt1.com.", "rr3---sn-5hneknek.googlevideo.com.", "rr3---sn-5hneknes.googlevideo.com.", + "rr3---sn-5hneknes.gvt1.com.", + "rr3---sn-5uaezn67.googlevideo.com.", + "rr3---sn-5uaezn6l.googlevideo.com.", + "rr3---sn-5uaezn6s.googlevideo.com.", + "rr3---sn-5uaezn6z.googlevideo.com.", "rr3---sn-5uaezndd.googlevideo.com.", "rr3---sn-5uaezndd.gvt1.com.", "rr3---sn-5uaezne6.googlevideo.com.", @@ -4615,31 +4571,50 @@ var FakeECSFQDNs = container.NewMapSet( "rr3---sn-5uaeznes.googlevideo.com.", "rr3---sn-5uaeznez.googlevideo.com.", "rr3---sn-5uaeznl6.googlevideo.com.", + "rr3---sn-5uaeznld.googlevideo.com.", "rr3---sn-5uaeznls.googlevideo.com.", + "rr3---sn-5uaeznls.gvt1.com.", "rr3---sn-5uaeznly.googlevideo.com.", "rr3---sn-5uaeznse.googlevideo.com.", "rr3---sn-5uaeznsl.googlevideo.com.", + "rr3---sn-5uaeznsl.gvt1.com.", "rr3---sn-5uaeznss.googlevideo.com.", + "rr3---sn-5uaeznss.gvt1.com.", "rr3---sn-5uaezny6.googlevideo.com.", "rr3---sn-5uaeznyz.googlevideo.com.", "rr3---sn-5uaeznze.googlevideo.com.", + "rr3---sn-5uaeznze.gvt1.com.", "rr3---sn-5ualdnle.googlevideo.com.", "rr3---sn-5ualdnll.googlevideo.com.", "rr3---sn-5ualdnlr.googlevideo.com.", "rr3---sn-5ualdnls.googlevideo.com.", "rr3---sn-5ualdns6.googlevideo.com.", "rr3---sn-5ualdns7.googlevideo.com.", + "rr3---sn-5ualdns7.gvt1.com.", "rr3---sn-5ualdnsd.googlevideo.com.", "rr3---sn-5ualdnse.googlevideo.com.", "rr3---sn-5ualdnsk.googlevideo.com.", "rr3---sn-5ualdnsl.googlevideo.com.", "rr3---sn-5ualdnsr.googlevideo.com.", + "rr3---sn-5ualdnss.googlevideo.com.", "rr3---sn-5ualdnsy.googlevideo.com.", - "rr3---sn-5ualdnsy.gvt1.com.", "rr3---sn-5ualdnsz.googlevideo.com.", + "rr3---sn-5ualdnz6.googlevideo.com.", "rr3---sn-5ualdnz7.googlevideo.com.", "rr3---sn-5ualdnze.googlevideo.com.", + "rr3---sn-5ualdnzz.googlevideo.com.", + "rr3---sn-8qj-i2ies.googlevideo.com.", + "rr3---sn-8qj-i2iez.googlevideo.com.", + "rr3---sn-8qj-i5o6k.googlevideo.com.", + "rr3---sn-8qj-i5ode.googlevideo.com.", + "rr3---sn-8qj-i5ody.googlevideo.com.", + "rr3---sn-8qj-i5oks.googlevideo.com.", + "rr3---sn-8qj-i5oly.googlevideo.com.", + "rr3---sn-8qj-i5oze.googlevideo.com.", + "rr3---sn-8qj-i5ozr.googlevideo.com.", "rr3---sn-8qj-nbo66.googlevideo.com.", + "rr3---sn-8qj-nbo67.googlevideo.com.", + "rr3---sn-8qj-nbo6r.googlevideo.com.", "rr3---sn-8qj-nbod6.googlevideo.com.", "rr3---sn-8qj-nbosd.googlevideo.com.", "rr3---sn-8xgp1vo-a5ml.googlevideo.com.", @@ -4652,6 +4627,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr3---sn-8xgp1vo-p5qee.googlevideo.com.", "rr3---sn-8xgp1vo-p5qel.googlevideo.com.", "rr3---sn-8xgp1vo-p5qes.googlevideo.com.", + "rr3---sn-8xgp1vo-poql.googlevideo.com.", "rr3---sn-8xgp1vo-vgqe.googlevideo.com.", "rr3---sn-8xgp1vo-xfge.googlevideo.com.", "rr3---sn-8xgp1vo-xfgl.googlevideo.com.", @@ -4659,7 +4635,6 @@ var FakeECSFQDNs = container.NewMapSet( "rr3---sn-9gv76n7s.googlevideo.com.", "rr3---sn-9gv76n7z.googlevideo.com.", "rr3---sn-9gv7zn76.googlevideo.com.", - "rr3---sn-9gv7zn7e.googlevideo.com.", "rr3---sn-9gv7zn7y.googlevideo.com.", "rr3---sn-a5m7lnl6.googlevideo.com.", "rr3---sn-a5m7lnld.googlevideo.com.", @@ -4667,38 +4642,50 @@ var FakeECSFQDNs = container.NewMapSet( "rr3---sn-a5mekn6k.googlevideo.com.", "rr3---sn-a5mekn6k.gvt1.com.", "rr3---sn-a5mekn6l.googlevideo.com.", + "rr3---sn-a5mekn6l.gvt1.com.", "rr3---sn-a5mekn6r.googlevideo.com.", + "rr3---sn-a5mekn6r.gvt1.com.", "rr3---sn-a5mekn6s.googlevideo.com.", + "rr3---sn-a5mekn6s.gvt1.com.", "rr3---sn-a5mekn6z.googlevideo.com.", "rr3---sn-a5meknd6.googlevideo.com.", + "rr3---sn-a5meknd6.gvt1.com.", + "rr3---sn-a5mekndd.googlevideo.com.", + "rr3---sn-a5mekndk.googlevideo.com.", + "rr3---sn-a5mekndk.gvt1.com.", "rr3---sn-a5mekndl.googlevideo.com.", "rr3---sn-a5mekndl.gvt1.com.", "rr3---sn-a5meknds.googlevideo.com.", + "rr3---sn-a5meknds.gvt1.com.", "rr3---sn-a5mekndz.googlevideo.com.", "rr3---sn-a5meknsd.googlevideo.com.", "rr3---sn-a5meknsy.googlevideo.com.", "rr3---sn-a5meknzk.googlevideo.com.", "rr3---sn-a5meknzl.googlevideo.com.", "rr3---sn-a5meknzr.googlevideo.com.", + "rr3---sn-a5meknzr.gvt1.com.", "rr3---sn-a5meknzs.googlevideo.com.", "rr3---sn-a5mlrnek.googlevideo.com.", "rr3---sn-a5mlrnl6.googlevideo.com.", "rr3---sn-a5mlrnll.googlevideo.com.", + "rr3---sn-a5mlrnll.gvt1.com.", "rr3---sn-a5mlrnls.googlevideo.com.", + "rr3---sn-a5mlrnls.gvt1.com.", "rr3---sn-a5mlrnlz.googlevideo.com.", "rr3---sn-a5msen76.googlevideo.com.", "rr3---sn-a5msen7l.googlevideo.com.", "rr3---sn-a5msen7s.googlevideo.com.", "rr3---sn-a5msen7z.googlevideo.com.", "rr3---sn-a5msenek.googlevideo.com.", + "rr3---sn-a5msenek.gvt1.com.", "rr3---sn-a5msener.googlevideo.com.", - "rr3---sn-a5msenes.googlevideo.com.", + "rr3---sn-a5msener.gvt1.com.", "rr3---sn-a5msenl7.googlevideo.com.", "rr3---sn-a5msenle.googlevideo.com.", "rr3---sn-ab5l6ndr.googlevideo.com.", "rr3---sn-ab5l6ndy.googlevideo.com.", - "rr3---sn-ab5l6nk6.googlevideo.com.", "rr3---sn-ab5l6nkd.googlevideo.com.", + "rr3---sn-ab5l6nkd.gvt1.com.", "rr3---sn-ab5l6nr6.googlevideo.com.", "rr3---sn-ab5l6nrd.googlevideo.com.", "rr3---sn-ab5l6nrk.googlevideo.com.", @@ -4724,6 +4711,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr3---sn-aigl6ney.googlevideo.com.", "rr3---sn-aigl6nl7.googlevideo.com.", "rr3---sn-aigl6ns6.googlevideo.com.", + "rr3---sn-aigl6ns6.gvt1.com.", "rr3---sn-aigl6nsd.googlevideo.com.", "rr3---sn-aigl6nsk.googlevideo.com.", "rr3---sn-aigl6nsr.googlevideo.com.", @@ -4759,23 +4747,23 @@ var FakeECSFQDNs = container.NewMapSet( "rr3---sn-bvvbaxivnuxq5uu-vgql.googlevideo.com.", "rr3---sn-bvvbaxivnuxq5uu-vgqs.googlevideo.com.", "rr3---sn-bvvbaxivnuxq5uu-vgqz.googlevideo.com.", - "rr3---sn-bvvbaxivnuxqjvhj5nu-n4vl.googlevideo.com.", "rr3---sn-bvvbaxivnuxqjvhj5nu-vgq6.googlevideo.com.", "rr3---sn-bvvbaxivnuxqjvhj5nu-vgqd.googlevideo.com.", "rr3---sn-bvvbaxivnuxqjvhj5nu-vgqe.googlevideo.com.", "rr3---sn-bvvbaxivnuxqjvhj5nu-vgql.googlevideo.com.", "rr3---sn-bvvbaxivnuxqjvhj5nu-vgqs.googlevideo.com.", "rr3---sn-bvvbaxivnuxqjvhj5nu-vgqz.googlevideo.com.", + "rr3---sn-bvvbaxivnuxqjvm-2iml.googlevideo.com.", "rr3---sn-bvvbaxivnuxqjvm-2ims.googlevideo.com.", + "rr3---sn-bvvbaxivnuxqjvm-2imz.googlevideo.com.", "rr3---sn-bvvbaxivnuxqjvm-q4fl.googlevideo.com.", "rr3---sn-cvb7lne7.googlevideo.com.", "rr3---sn-cvb7lnee.googlevideo.com.", + "rr3---sn-cvb7lnls.googlevideo.com.", "rr3---sn-cvb7lnlz.googlevideo.com.", "rr3---sn-cvb7sn7k.googlevideo.com.", "rr3---sn-cvb7sn7r.googlevideo.com.", - "rr3---sn-gxuo03g-ig3l.googlevideo.com.", - "rr3---sn-hgn7rn7k.googlevideo.com.", - "rr3---sn-hgn7rnls.googlevideo.com.", + "rr3---sn-hgn7rnee.googlevideo.com.", "rr3---sn-hjoj-gq0l.googlevideo.com.", "rr3---sn-hjoj-poul.googlevideo.com.", "rr3---sn-hoa7kn76.googlevideo.com.", @@ -4787,35 +4775,43 @@ var FakeECSFQDNs = container.NewMapSet( "rr3---sn-hoa7rn7z.googlevideo.com.", "rr3---sn-hoa7rn7z.gvt1.com.", "rr3---sn-hp57kn6r.googlevideo.com.", - "rr3---sn-hp57kn6r.gvt1.com.", "rr3---sn-hp57kn6y.googlevideo.com.", - "rr3---sn-hp57kn6y.gvt1.com.", "rr3---sn-hp57knd6.googlevideo.com.", "rr3---sn-hp57knd6.gvt1.com.", "rr3---sn-hp57kndd.googlevideo.com.", - "rr3---sn-hp57kndd.gvt1.com.", "rr3---sn-hp57kndk.googlevideo.com.", + "rr3---sn-hp57kndk.gvt1.com.", "rr3---sn-hp57kndr.googlevideo.com.", - "rr3---sn-hp57kndr.gvt1.com.", "rr3---sn-hp57knds.googlevideo.com.", + "rr3---sn-hp57knds.gvt1.com.", "rr3---sn-hp57kndy.googlevideo.com.", "rr3---sn-hp57kndy.gvt1.com.", "rr3---sn-hp57kndz.googlevideo.com.", + "rr3---sn-hp57kndz.gvt1.com.", "rr3---sn-hp57knk7.googlevideo.com.", + "rr3---sn-hp57knk7.gvt1.com.", + "rr3---sn-hp57knkl.googlevideo.com.", + "rr3---sn-hp57knks.googlevideo.com.", "rr3---sn-hp57yn7y.googlevideo.com.", "rr3---sn-hp57yne7.googlevideo.com.", "rr3---sn-hp57ynee.googlevideo.com.", "rr3---sn-hp57ynl6.googlevideo.com.", + "rr3---sn-hp57ynl6.gvt1.com.", "rr3---sn-hp57ynlr.googlevideo.com.", "rr3---sn-hp57ynlr.gvt1.com.", "rr3---sn-hp57ynly.googlevideo.com.", + "rr3---sn-hp57ynly.gvt1.com.", + "rr3---sn-hp57yns6.googlevideo.com.", "rr3---sn-hp57yns7.googlevideo.com.", + "rr3---sn-hp57ynsd.googlevideo.com.", + "rr3---sn-hp57ynsd.gvt1.com.", "rr3---sn-hp57ynse.googlevideo.com.", - "rr3---sn-hp57ynse.gvt1.com.", "rr3---sn-hp57ynsl.googlevideo.com.", + "rr3---sn-hp57ynsl.gvt1.com.", "rr3---sn-hp57ynss.googlevideo.com.", "rr3---sn-hp57ynss.gvt1.com.", "rr3---sn-i3b7kn6s.googlevideo.com.", + "rr3---sn-i3b7knld.googlevideo.com.", "rr3---sn-i3b7knlk.googlevideo.com.", "rr3---sn-i3b7kns6.googlevideo.com.", "rr3---sn-i3b7knsd.googlevideo.com.", @@ -4824,6 +4820,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr3---sn-i3b7knzl.googlevideo.com.", "rr3---sn-i3b7knzs.googlevideo.com.", "rr3---sn-i3belne6.googlevideo.com.", + "rr3---sn-i3belney.googlevideo.com.", "rr3---sn-i3belnl7.googlevideo.com.", "rr3---sn-i3belnll.googlevideo.com.", "rr3---sn-i3belnls.googlevideo.com.", @@ -4839,6 +4836,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr3---sn-n4v7snl7.googlevideo.com.", "rr3---sn-n4v7snll.googlevideo.com.", "rr3---sn-n4v7snlr.googlevideo.com.", + "rr3---sn-n4v7snlr.gvt1.com.", "rr3---sn-n4v7snls.googlevideo.com.", "rr3---sn-n4v7snly.googlevideo.com.", "rr3---sn-n4v7sns7.googlevideo.com.", @@ -4848,6 +4846,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr3---sn-npoe7ne7.googlevideo.com.", "rr3---sn-npoe7ned.googlevideo.com.", "rr3---sn-npoe7nek.googlevideo.com.", + "rr3---sn-npoe7nek.gvt1.com.", "rr3---sn-npoe7ner.googlevideo.com.", "rr3---sn-npoe7nes.googlevideo.com.", "rr3---sn-npoe7ney.googlevideo.com.", @@ -4855,18 +4854,18 @@ var FakeECSFQDNs = container.NewMapSet( "rr3---sn-npoe7nl6.googlevideo.com.", "rr3---sn-npoe7nlz.googlevideo.com.", "rr3---sn-npoe7ns6.googlevideo.com.", - "rr3---sn-npoe7ns6.gvt1.com.", "rr3---sn-npoe7ns7.googlevideo.com.", "rr3---sn-npoe7ns7.gvt1.com.", - "rr3---sn-npoe7nsd.googlevideo.com.", "rr3---sn-npoe7nsk.googlevideo.com.", "rr3---sn-npoe7nsk.gvt1.com.", "rr3---sn-npoe7nsl.googlevideo.com.", "rr3---sn-npoe7nsr.googlevideo.com.", + "rr3---sn-npoe7nsr.gvt1.com.", "rr3---sn-npoe7nsy.googlevideo.com.", "rr3---sn-npoe7nz7.googlevideo.com.", - "rr3---sn-npoeene6.googlevideo.com.", + "rr3---sn-npoe7nz7.gvt1.com.", "rr3---sn-npoeened.googlevideo.com.", + "rr3---sn-npoeened.gvt1.com.", "rr3---sn-npoeenee.googlevideo.com.", "rr3---sn-npoeenek.googlevideo.com.", "rr3---sn-npoeener.googlevideo.com.", @@ -4874,25 +4873,27 @@ var FakeECSFQDNs = container.NewMapSet( "rr3---sn-npoeenez.googlevideo.com.", "rr3---sn-npoeenl7.googlevideo.com.", "rr3---sn-npoeenle.googlevideo.com.", + "rr3---sn-npoeenle.gvt1.com.", "rr3---sn-npoeenlk.googlevideo.com.", "rr3---sn-npoeenll.googlevideo.com.", "rr3---sn-npoeenly.googlevideo.com.", "rr3---sn-npoeens7.googlevideo.com.", + "rr3---sn-npoeens7.gvt1.com.", "rr3---sn-npoldn76.googlevideo.com.", - "rr3---sn-npoldn76.gvt1.com.", "rr3---sn-npoldn7d.googlevideo.com.", "rr3---sn-npoldn7d.gvt1.com.", "rr3---sn-npoldn7e.googlevideo.com.", - "rr3---sn-npoldn7e.gvt1.com.", "rr3---sn-npoldn7l.googlevideo.com.", + "rr3---sn-npoldn7l.gvt1.com.", "rr3---sn-npoldn7y.googlevideo.com.", "rr3---sn-npoldn7z.googlevideo.com.", + "rr3---sn-npoldn7z.gvt1.com.", "rr3---sn-npoldne7.googlevideo.com.", - "rr3---sn-npoldne7.gvt1.com.", "rr3---sn-nx57ynlk.googlevideo.com.", "rr3---sn-nx57ynsd.googlevideo.com.", "rr3---sn-nx57ynse.googlevideo.com.", "rr3---sn-nx57ynsk.googlevideo.com.", + "rr3---sn-nx57ynsk.gvt1.com.", "rr3---sn-nx57ynsr.googlevideo.com.", "rr3---sn-nx57ynss.googlevideo.com.", "rr3---sn-nx57ynsy.googlevideo.com.", @@ -4903,14 +4904,19 @@ var FakeECSFQDNs = container.NewMapSet( "rr3---sn-o097znse.googlevideo.com.", "rr3---sn-o097znsk.googlevideo.com.", "rr3---sn-o097znsl.googlevideo.com.", + "rr3---sn-o097znsl.gvt1.com.", "rr3---sn-o097znsr.googlevideo.com.", "rr3---sn-o097znss.googlevideo.com.", "rr3---sn-o097znsz.googlevideo.com.", "rr3---sn-o097znz7.googlevideo.com.", "rr3---sn-o097znze.googlevideo.com.", + "rr3---sn-o097znze.gvt1.com.", + "rr3---sn-o097znzk.googlevideo.com.", "rr3---sn-o097znzr.googlevideo.com.", "rr3---sn-oj5hn5-55.googlevideo.com.", + "rr3---sn-oji3bc-5j.googlevideo.com.", "rr3---sn-ojnpo5-58.googlevideo.com.", + "rr3---sn-ojnpo5-5o.googlevideo.com.", "rr3---sn-p5qddn76.googlevideo.com.", "rr3---sn-p5qddn7d.googlevideo.com.", "rr3---sn-p5qddn7k.googlevideo.com.", @@ -4954,52 +4960,52 @@ var FakeECSFQDNs = container.NewMapSet( "rr3---sn-q4fl6nlz.googlevideo.com.", "rr3---sn-q4fl6ns6.googlevideo.com.", "rr3---sn-q4fl6ns7.googlevideo.com.", - "rr3---sn-q4fl6nsd.googlevideo.com.", "rr3---sn-q4fl6nsk.googlevideo.com.", "rr3---sn-q4fl6nsk.gvt1.com.", "rr3---sn-q4fl6nsl.googlevideo.com.", "rr3---sn-q4fl6nsl.gvt1.com.", "rr3---sn-q4fl6nsr.googlevideo.com.", "rr3---sn-q4fl6nss.googlevideo.com.", + "rr3---sn-q4fl6nss.gvt1.com.", "rr3---sn-q4fl6nsy.googlevideo.com.", "rr3---sn-q4fl6nz6.googlevideo.com.", "rr3---sn-q4fl6nz6.gvt1.com.", "rr3---sn-q4fl6nz7.googlevideo.com.", "rr3---sn-q4fl6nz7.gvt1.com.", - "rr3---sn-q4fl6nzy.googlevideo.com.", "rr3---sn-q4flrn7k.googlevideo.com.", "rr3---sn-q4flrn7r.googlevideo.com.", - "rr3---sn-q4flrn7y.googlevideo.com.", + "rr3---sn-q4flrn7r.gvt1.com.", "rr3---sn-q4flrne6.googlevideo.com.", "rr3---sn-q4flrne6.gvt1.com.", "rr3---sn-q4flrne7.googlevideo.com.", "rr3---sn-q4flrne7.gvt1.com.", "rr3---sn-q4flrnee.googlevideo.com.", - "rr3---sn-q4flrnee.gvt1.com.", "rr3---sn-q4flrnek.googlevideo.com.", "rr3---sn-q4flrnek.gvt1.com.", "rr3---sn-q4flrnel.googlevideo.com.", "rr3---sn-q4flrner.googlevideo.com.", "rr3---sn-q4flrnes.googlevideo.com.", "rr3---sn-q4flrney.googlevideo.com.", + "rr3---sn-q4flrney.gvt1.com.", "rr3---sn-q4flrnez.googlevideo.com.", "rr3---sn-q4flrnl6.googlevideo.com.", "rr3---sn-q4flrnl6.gvt1.com.", "rr3---sn-q4flrnl7.googlevideo.com.", "rr3---sn-q4flrnld.googlevideo.com.", + "rr3---sn-q4flrnld.gvt1.com.", "rr3---sn-q4flrnle.googlevideo.com.", - "rr3---sn-q4flrnlz.googlevideo.com.", - "rr3---sn-q4flrnlz.gvt1.com.", "rr3---sn-q4flrnsk.googlevideo.com.", - "rr3---sn-q4flrnsk.gvt1.com.", "rr3---sn-q4flrnss.googlevideo.com.", + "rr3---sn-q4flrnss.gvt1.com.", "rr3---sn-q4fzen7e.googlevideo.com.", "rr3---sn-q4fzen7e.gvt1.com.", "rr3---sn-q4fzen7l.googlevideo.com.", "rr3---sn-q4fzen7l.gvt1.com.", "rr3---sn-q4fzen7s.googlevideo.com.", "rr3---sn-q4fzen7y.googlevideo.com.", + "rr3---sn-q4fzen7y.gvt1.com.", "rr3---sn-q4fzene7.googlevideo.com.", + "rr3---sn-q4fzene7.gvt1.com.", "rr3---sn-q4fzenee.googlevideo.com.", "rr3---sn-q4fzenee.gvt1.com.", "rr3---sn-qja5mc-5h.googlevideo.com.", @@ -5009,11 +5015,9 @@ var FakeECSFQDNs = container.NewMapSet( "rr3---sn-qxo7rnee.googlevideo.com.", "rr3---sn-qxoedn7k.googlevideo.com.", "rr3---sn-qxoedne7.googlevideo.com.", - "rr3---sn-qxoednee.googlevideo.com.", "rr3---sn-qxoednel.googlevideo.com.", "rr3---sn-qxoednes.googlevideo.com.", "rr3---sn-u1hp55-5c.googlevideo.com.", - "rr3---sn-u1hp55-5c.gvt1.com.", "rr3---sn-v5goxu-jhil.googlevideo.com.", "rr3---sn-vgqskn66.googlevideo.com.", "rr3---sn-vgqskn67.googlevideo.com.", @@ -5035,8 +5039,10 @@ var FakeECSFQDNs = container.NewMapSet( "rr3---sn-vgqsknsk.googlevideo.com.", "rr3---sn-vgqsknz6.googlevideo.com.", "rr3---sn-vgqsknz7.googlevideo.com.", + "rr3---sn-vgqsknz7.gvt1.com.", "rr3---sn-vgqsknzd.googlevideo.com.", "rr3---sn-vgqsknze.googlevideo.com.", + "rr3---sn-vgqsknzk.googlevideo.com.", "rr3---sn-vgqsknzl.googlevideo.com.", "rr3---sn-vgqsknzr.googlevideo.com.", "rr3---sn-vgqsknzs.googlevideo.com.", @@ -5047,13 +5053,16 @@ var FakeECSFQDNs = container.NewMapSet( "rr3---sn-vgqsrn6e.googlevideo.com.", "rr3---sn-vgqsrn6l.googlevideo.com.", "rr3---sn-vgqsrn6z.googlevideo.com.", + "rr3---sn-vgqsrn6z.gvt1.com.", "rr3---sn-vgqsrne6.googlevideo.com.", "rr3---sn-vgqsrned.googlevideo.com.", "rr3---sn-vgqsrnek.googlevideo.com.", "rr3---sn-vgqsrnes.googlevideo.com.", "rr3---sn-vgqsrnez.googlevideo.com.", "rr3---sn-vgqsrnl6.googlevideo.com.", + "rr3---sn-vgqsrnl6.gvt1.com.", "rr3---sn-vgqsrnld.googlevideo.com.", + "rr3---sn-vgqsrnld.gvt1.com.", "rr3---sn-vgqsrnlk.googlevideo.com.", "rr3---sn-vgqsrnll.googlevideo.com.", "rr3---sn-vgqsrnlz.googlevideo.com.", @@ -5066,13 +5075,35 @@ var FakeECSFQDNs = container.NewMapSet( "rr3---sn-vgqsrnzk.googlevideo.com.", "rr3---sn-vgqsrnzr.googlevideo.com.", "rr3---sn-vgqsrnzs.googlevideo.com.", + "rr3---sn-vgqsrnzs.gvt1.com.", "rr3---sn-vgqsrnzy.googlevideo.com.", "rr3---sn-vgqsrnzz.googlevideo.com.", - "rr3.sn-hgn7rn7k.googlevideo.com.", + "rr3---sn-vgqsrnzz.gvt1.com.", + "rr3.sn-5hne6nzd.googlevideo.com.", + "rr3.sn-a5m7lnl6.googlevideo.com.", + "rr3.sn-a5m7lnld.googlevideo.com.", + "rr3.sn-a5mekn6d.googlevideo.com.", + "rr3.sn-a5mekn6k.googlevideo.com.", + "rr3.sn-a5mekn6l.googlevideo.com.", + "rr3.sn-a5mekn6r.googlevideo.com.", + "rr3.sn-a5mekn6s.googlevideo.com.", + "rr3.sn-a5mekn6z.googlevideo.com.", + "rr3.sn-a5meknd6.googlevideo.com.", + "rr3.sn-a5mekndl.googlevideo.com.", + "rr3.sn-a5meknds.googlevideo.com.", + "rr3.sn-a5mekndz.googlevideo.com.", + "rr3.sn-a5meknzk.googlevideo.com.", + "rr3.sn-a5meknzr.googlevideo.com.", + "rr3.sn-a5mlrnl6.googlevideo.com.", + "rr3.sn-a5mlrnll.googlevideo.com.", + "rr3.sn-a5mlrnls.googlevideo.com.", + "rr3.sn-a5mlrnlz.googlevideo.com.", + "rr3.sn-a5msenek.googlevideo.com.", + "rr3.sn-a5msener.googlevideo.com.", + "rr3.sn-a5msenl7.googlevideo.com.", + "rr3.sn-a5msenle.googlevideo.com.", "rr3.sn-hp57kn6r.googlevideo.com.", "rr3.sn-hp57kn6y.googlevideo.com.", - "rr3.sn-hp57knd6.googlevideo.com.", - "rr3.sn-hp57kndd.googlevideo.com.", "rr3.sn-hp57kndk.googlevideo.com.", "rr3.sn-hp57kndr.googlevideo.com.", "rr3.sn-hp57knds.googlevideo.com.", @@ -5080,19 +5111,24 @@ var FakeECSFQDNs = container.NewMapSet( "rr3.sn-hp57kndz.googlevideo.com.", "rr3.sn-hp57knk7.googlevideo.com.", "rr3.sn-hp57ynl6.googlevideo.com.", - "rr3.sn-hp57ynlr.googlevideo.com.", "rr3.sn-hp57ynly.googlevideo.com.", + "rr3.sn-hp57yns6.googlevideo.com.", "rr3.sn-hp57yns7.googlevideo.com.", - "rr3.sn-hp57ynse.googlevideo.com.", + "rr3.sn-hp57ynsd.googlevideo.com.", "rr3.sn-hp57ynsl.googlevideo.com.", - "rr3.sn-hp57ynss.googlevideo.com.", "rr3.sn-nx57ynsk.googlevideo.com.", + "rr3.sn-q4fl6nds.googlevideo.com.", + "rr3.sn-q4fl6nsk.googlevideo.com.", "rr3.sn-q4flrnl6.googlevideo.com.", "rr3.sn-q4fzen7l.googlevideo.com.", + "rr3.sn-qja5mc-5h.googlevideo.com.", "rr3.sn-u1hp55-5c.googlevideo.com.", + "rr3.sn-vgqsknlk.googlevideo.com.", + "rr3.sn-vgqsrnld.googlevideo.com.", "rr3.sn-vgqsrnzz.googlevideo.com.", "rr4---sn-0nnpbo5a-bggl.googlevideo.com.", "rr4---sn-2aqu-hoas7.googlevideo.com.", + "rr4---sn-2aqu-hoasz.googlevideo.com.", "rr4---sn-2imern76.googlevideo.com.", "rr4---sn-2imern76.gvt1.com.", "rr4---sn-2imern7d.googlevideo.com.", @@ -5111,8 +5147,10 @@ var FakeECSFQDNs = container.NewMapSet( "rr4---sn-30a7ynek.googlevideo.com.", "rr4---sn-30a7yney.googlevideo.com.", "rr4---sn-30a7ynl7.googlevideo.com.", + "rr4---sn-42u-nbozl.googlevideo.com.", "rr4---sn-4g5e6ns6.googlevideo.com.", "rr4---sn-4g5e6ns7.googlevideo.com.", + "rr4---sn-4g5e6nsd.googlevideo.com.", "rr4---sn-4g5e6nsk.googlevideo.com.", "rr4---sn-4g5e6nss.googlevideo.com.", "rr4---sn-4g5e6nsy.googlevideo.com.", @@ -5140,7 +5178,6 @@ var FakeECSFQDNs = container.NewMapSet( "rr4---sn-4g5ednsd.googlevideo.com.", "rr4---sn-4g5ednse.googlevideo.com.", "rr4---sn-4g5ednsk.googlevideo.com.", - "rr4---sn-4g5ednsl.googlevideo.com.", "rr4---sn-4g5ednsr.googlevideo.com.", "rr4---sn-4g5ednss.googlevideo.com.", "rr4---sn-4g5ednsy.googlevideo.com.", @@ -5159,39 +5196,53 @@ var FakeECSFQDNs = container.NewMapSet( "rr4---sn-4g5lznls.googlevideo.com.", "rr4---sn-4g5lznlz.googlevideo.com.", "rr4---sn-5abxgpxuxaxjvh-9n4z.googlevideo.com.", + "rr4---sn-5go7yner.googlevideo.com.", "rr4---sn-5go7ynl6.googlevideo.com.", "rr4---sn-5goeenes.googlevideo.com.", "rr4---sn-5goeenez.googlevideo.com.", "rr4---sn-5hne6n6e.googlevideo.com.", + "rr4---sn-5hne6n6e.gvt1.com.", "rr4---sn-5hne6n6l.googlevideo.com.", + "rr4---sn-5hne6n6l.gvt1.com.", "rr4---sn-5hne6ns6.googlevideo.com.", "rr4---sn-5hne6nsd.googlevideo.com.", "rr4---sn-5hne6nsk.googlevideo.com.", "rr4---sn-5hne6nsr.googlevideo.com.", "rr4---sn-5hne6nsy.googlevideo.com.", "rr4---sn-5hne6nsz.googlevideo.com.", + "rr4---sn-5hne6nsz.gvt1.com.", "rr4---sn-5hne6nz6.googlevideo.com.", "rr4---sn-5hne6nzd.googlevideo.com.", "rr4---sn-5hne6nzk.googlevideo.com.", + "rr4---sn-5hne6nzk.gvt1.com.", "rr4---sn-5hne6nzy.googlevideo.com.", "rr4---sn-5hnednss.googlevideo.com.", + "rr4---sn-5hnednss.gvt1.com.", "rr4---sn-5hnednsz.googlevideo.com.", + "rr4---sn-5hnednsz.gvt1.com.", "rr4---sn-5hnekn76.googlevideo.com.", "rr4---sn-5hnekn7d.googlevideo.com.", + "rr4---sn-5hnekn7d.gvt1.com.", "rr4---sn-5hnekn7l.googlevideo.com.", + "rr4---sn-5hnekn7l.gvt1.com.", "rr4---sn-5hnekn7s.googlevideo.com.", + "rr4---sn-5hnekn7z.googlevideo.com.", "rr4---sn-5hneknee.googlevideo.com.", "rr4---sn-5hneknek.googlevideo.com.", "rr4---sn-5hneknes.googlevideo.com.", + "rr4---sn-5uaezn67.googlevideo.com.", + "rr4---sn-5uaezn67.gvt1.com.", + "rr4---sn-5uaezn6l.googlevideo.com.", + "rr4---sn-5uaezn6s.googlevideo.com.", + "rr4---sn-5uaezn6z.googlevideo.com.", "rr4---sn-5uaezndd.googlevideo.com.", "rr4---sn-5uaezne6.googlevideo.com.", "rr4---sn-5uaezned.googlevideo.com.", "rr4---sn-5uaeznel.googlevideo.com.", "rr4---sn-5uaeznes.googlevideo.com.", "rr4---sn-5uaeznez.googlevideo.com.", - "rr4---sn-5uaeznl6.googlevideo.com.", - "rr4---sn-5uaeznl6.gvt1.com.", "rr4---sn-5uaeznld.googlevideo.com.", + "rr4---sn-5uaeznld.gvt1.com.", "rr4---sn-5uaeznls.googlevideo.com.", "rr4---sn-5uaeznly.googlevideo.com.", "rr4---sn-5uaeznse.googlevideo.com.", @@ -5200,7 +5251,9 @@ var FakeECSFQDNs = container.NewMapSet( "rr4---sn-5uaezny6.googlevideo.com.", "rr4---sn-5uaeznyz.googlevideo.com.", "rr4---sn-5uaeznze.googlevideo.com.", + "rr4---sn-5uaeznze.gvt1.com.", "rr4---sn-5ualdnle.googlevideo.com.", + "rr4---sn-5ualdnle.gvt1.com.", "rr4---sn-5ualdnll.googlevideo.com.", "rr4---sn-5ualdnlr.googlevideo.com.", "rr4---sn-5ualdnls.googlevideo.com.", @@ -5211,64 +5264,84 @@ var FakeECSFQDNs = container.NewMapSet( "rr4---sn-5ualdnsk.googlevideo.com.", "rr4---sn-5ualdnsr.googlevideo.com.", "rr4---sn-5ualdnss.googlevideo.com.", - "rr4---sn-5ualdnss.gvt1.com.", "rr4---sn-5ualdnsy.googlevideo.com.", "rr4---sn-5ualdnsz.googlevideo.com.", + "rr4---sn-5ualdnz6.googlevideo.com.", "rr4---sn-5ualdnz7.googlevideo.com.", "rr4---sn-5ualdnze.googlevideo.com.", + "rr4---sn-5ualdnzz.googlevideo.com.", + "rr4---sn-8qj-i2ies.googlevideo.com.", + "rr4---sn-8qj-i2iez.googlevideo.com.", "rr4---sn-8qj-i5o6k.googlevideo.com.", + "rr4---sn-8qj-i5ode.googlevideo.com.", + "rr4---sn-8qj-i5ody.googlevideo.com.", + "rr4---sn-8qj-i5oks.googlevideo.com.", + "rr4---sn-8qj-i5oly.googlevideo.com.", + "rr4---sn-8qj-i5oze.googlevideo.com.", "rr4---sn-8qj-nbo66.googlevideo.com.", + "rr4---sn-8qj-nbo67.googlevideo.com.", + "rr4---sn-8qj-nbo6r.googlevideo.com.", + "rr4---sn-8qj-nbodl.googlevideo.com.", "rr4---sn-8qj-nbosd.googlevideo.com.", + "rr4---sn-8xgp1vo-a5ml.googlevideo.com.", "rr4---sn-8xgp1vo-ab56.googlevideo.com.", "rr4---sn-8xgp1vo-ab5d.googlevideo.com.", "rr4---sn-8xgp1vo-ab5e.googlevideo.com.", "rr4---sn-8xgp1vo-ab5l.googlevideo.com.", "rr4---sn-8xgp1vo-ab5s.googlevideo.com.", "rr4---sn-8xgp1vo-ab5z.googlevideo.com.", - "rr4---sn-8xgp1vo-p5qe.googlevideo.com.", - "rr4---sn-8xgp1vo-p5qe7.googlevideo.com.", "rr4---sn-8xgp1vo-p5qee.googlevideo.com.", "rr4---sn-8xgp1vo-p5qel.googlevideo.com.", + "rr4---sn-8xgp1vo-p5qs.googlevideo.com.", "rr4---sn-8xgp1vo-poql.googlevideo.com.", "rr4---sn-8xgp1vo-vgqe.googlevideo.com.", "rr4---sn-8xgp1vo-xfge.googlevideo.com.", "rr4---sn-8xgp1vo-xfgl.googlevideo.com.", - "rr4---sn-8xgp1vo-xfgs.googlevideo.com.", "rr4---sn-9gv76n7s.googlevideo.com.", "rr4---sn-9gv76n7z.googlevideo.com.", "rr4---sn-9gv7zn76.googlevideo.com.", - "rr4---sn-9gv7zn7e.googlevideo.com.", "rr4---sn-a5m7lnl6.googlevideo.com.", + "rr4---sn-a5m7lnl6.gvt1.com.", "rr4---sn-a5m7lnld.googlevideo.com.", + "rr4---sn-a5m7lnld.gvt1.com.", "rr4---sn-a5mekn6d.googlevideo.com.", + "rr4---sn-a5mekn6d.gvt1.com.", "rr4---sn-a5mekn6k.googlevideo.com.", "rr4---sn-a5mekn6l.googlevideo.com.", "rr4---sn-a5mekn6r.googlevideo.com.", + "rr4---sn-a5mekn6r.gvt1.com.", "rr4---sn-a5mekn6s.googlevideo.com.", "rr4---sn-a5mekn6z.googlevideo.com.", "rr4---sn-a5meknd6.googlevideo.com.", + "rr4---sn-a5mekndd.googlevideo.com.", + "rr4---sn-a5mekndd.gvt1.com.", "rr4---sn-a5meknde.googlevideo.com.", + "rr4---sn-a5mekndk.googlevideo.com.", "rr4---sn-a5mekndl.googlevideo.com.", + "rr4---sn-a5mekndl.gvt1.com.", "rr4---sn-a5meknds.googlevideo.com.", "rr4---sn-a5meknsd.googlevideo.com.", "rr4---sn-a5meknsy.googlevideo.com.", "rr4---sn-a5meknzk.googlevideo.com.", + "rr4---sn-a5meknzk.gvt1.com.", "rr4---sn-a5meknzl.googlevideo.com.", "rr4---sn-a5meknzr.googlevideo.com.", + "rr4---sn-a5meknzr.gvt1.com.", "rr4---sn-a5meknzs.googlevideo.com.", "rr4---sn-a5mlrnek.googlevideo.com.", "rr4---sn-a5mlrnl6.googlevideo.com.", "rr4---sn-a5mlrnll.googlevideo.com.", "rr4---sn-a5mlrnls.googlevideo.com.", + "rr4---sn-a5mlrnls.gvt1.com.", "rr4---sn-a5mlrnlz.googlevideo.com.", "rr4---sn-a5msen76.googlevideo.com.", "rr4---sn-a5msen7l.googlevideo.com.", - "rr4---sn-a5msen7s.googlevideo.com.", "rr4---sn-a5msen7z.googlevideo.com.", "rr4---sn-a5msenek.googlevideo.com.", "rr4---sn-a5msener.googlevideo.com.", "rr4---sn-a5msenes.googlevideo.com.", "rr4---sn-a5msenl7.googlevideo.com.", + "rr4---sn-a5msenl7.gvt1.com.", "rr4---sn-a5msenle.googlevideo.com.", "rr4---sn-ab5l6ndr.googlevideo.com.", "rr4---sn-ab5l6ndy.googlevideo.com.", @@ -5299,13 +5372,18 @@ var FakeECSFQDNs = container.NewMapSet( "rr4---sn-aigl6ney.googlevideo.com.", "rr4---sn-aigl6nl7.googlevideo.com.", "rr4---sn-aigl6ns6.googlevideo.com.", + "rr4---sn-aigl6ns6.gvt1.com.", "rr4---sn-aigl6nsd.googlevideo.com.", + "rr4---sn-aigl6nsd.gvt1.com.", "rr4---sn-aigl6nsk.googlevideo.com.", + "rr4---sn-aigl6nsk.gvt1.com.", "rr4---sn-aigl6nsr.googlevideo.com.", "rr4---sn-aigl6nz7.googlevideo.com.", "rr4---sn-aigl6nze.googlevideo.com.", + "rr4---sn-aigl6nze.gvt1.com.", "rr4---sn-aigl6nzk.googlevideo.com.", "rr4---sn-aigl6nzl.googlevideo.com.", + "rr4---sn-aigl6nzl.gvt1.com.", "rr4---sn-aigl6nzr.googlevideo.com.", "rr4---sn-aigl6nzs.googlevideo.com.", "rr4---sn-aigzrn76.googlevideo.com.", @@ -5341,14 +5419,22 @@ var FakeECSFQDNs = container.NewMapSet( "rr4---sn-bvvbaxivnuxqjvhj5nu-vgqs.googlevideo.com.", "rr4---sn-bvvbaxivnuxqjvhj5nu-vgqz.googlevideo.com.", "rr4---sn-bvvbaxivnuxqjvm-2ime.googlevideo.com.", + "rr4---sn-bvvbaxivnuxqjvm-2iml.googlevideo.com.", "rr4---sn-bvvbaxivnuxqjvm-2ims.googlevideo.com.", + "rr4---sn-bvvbaxivnuxqjvm-2imz.googlevideo.com.", "rr4---sn-bvvbaxivnuxqjvm-q4fe.googlevideo.com.", "rr4---sn-bvvbaxivnuxqjvm-q4fl.googlevideo.com.", + "rr4---sn-c0q7lnz7.googlevideo.com.", "rr4---sn-cvb7lne7.googlevideo.com.", "rr4---sn-cvb7lnee.googlevideo.com.", + "rr4---sn-cvb7lnl7.googlevideo.com.", + "rr4---sn-cvb7lnls.googlevideo.com.", "rr4---sn-cvb7lnlz.googlevideo.com.", "rr4---sn-cvb7sn7k.googlevideo.com.", "rr4---sn-cvb7sn7r.googlevideo.com.", + "rr4---sn-hgn7rn7y.googlevideo.com.", + "rr4---sn-hoa7kn76.googlevideo.com.", + "rr4---sn-hoa7kn76.gvt1.com.", "rr4---sn-hoa7kn7z.googlevideo.com.", "rr4---sn-hoa7kn7z.gvt1.com.", "rr4---sn-hoa7rn76.googlevideo.com.", @@ -5356,7 +5442,6 @@ var FakeECSFQDNs = container.NewMapSet( "rr4---sn-hoa7rn7z.googlevideo.com.", "rr4---sn-hoa7rn7z.gvt1.com.", "rr4---sn-hp57kn6r.googlevideo.com.", - "rr4---sn-hp57kn6r.gvt1.com.", "rr4---sn-hp57kn6y.googlevideo.com.", "rr4---sn-hp57kn6y.gvt1.com.", "rr4---sn-hp57knd6.googlevideo.com.", @@ -5365,9 +5450,13 @@ var FakeECSFQDNs = container.NewMapSet( "rr4---sn-hp57kndr.googlevideo.com.", "rr4---sn-hp57knds.googlevideo.com.", "rr4---sn-hp57kndy.googlevideo.com.", + "rr4---sn-hp57kndy.gvt1.com.", "rr4---sn-hp57kndz.googlevideo.com.", "rr4---sn-hp57knk7.googlevideo.com.", - "rr4---sn-hp57knk7.gvt1.com.", + "rr4---sn-hp57knkl.googlevideo.com.", + "rr4---sn-hp57knkl.gvt1.com.", + "rr4---sn-hp57knks.googlevideo.com.", + "rr4---sn-hp57knks.gvt1.com.", "rr4---sn-hp57yn7r.googlevideo.com.", "rr4---sn-hp57yn7y.googlevideo.com.", "rr4---sn-hp57yne7.googlevideo.com.", @@ -5376,9 +5465,13 @@ var FakeECSFQDNs = container.NewMapSet( "rr4---sn-hp57ynl6.gvt1.com.", "rr4---sn-hp57ynlr.googlevideo.com.", "rr4---sn-hp57ynly.googlevideo.com.", + "rr4---sn-hp57ynly.gvt1.com.", + "rr4---sn-hp57yns6.googlevideo.com.", "rr4---sn-hp57yns7.googlevideo.com.", "rr4---sn-hp57yns7.gvt1.com.", + "rr4---sn-hp57ynsd.googlevideo.com.", "rr4---sn-hp57ynse.googlevideo.com.", + "rr4---sn-hp57ynse.gvt1.com.", "rr4---sn-hp57ynsl.googlevideo.com.", "rr4---sn-hp57ynsl.gvt1.com.", "rr4---sn-hp57ynss.googlevideo.com.", @@ -5398,6 +5491,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr4---sn-i3belnll.googlevideo.com.", "rr4---sn-i3belnls.googlevideo.com.", "rr4---sn-i3bssn7e.googlevideo.com.", + "rr4---sn-i3bssn7e.gvt1.com.", "rr4---sn-jn2pgx4pcxg-w5o6.googlevideo.com.", "rr4---sn-jn2pgx4pcxg-w5os.googlevideo.com.", "rr4---sn-jxopj-n5oe.googlevideo.com.", @@ -5409,6 +5503,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr4---sn-n4v7snll.googlevideo.com.", "rr4---sn-n4v7snls.googlevideo.com.", "rr4---sn-n4v7snly.googlevideo.com.", + "rr4---sn-n4v7snly.gvt1.com.", "rr4---sn-n4v7sns7.googlevideo.com.", "rr4---sn-n4v7snse.googlevideo.com.", "rr4---sn-npoe7ndl.googlevideo.com.", @@ -5422,23 +5517,31 @@ var FakeECSFQDNs = container.NewMapSet( "rr4---sn-npoe7nez.googlevideo.com.", "rr4---sn-npoe7nl6.googlevideo.com.", "rr4---sn-npoe7nlz.googlevideo.com.", + "rr4---sn-npoe7nlz.gvt1.com.", "rr4---sn-npoe7ns6.googlevideo.com.", "rr4---sn-npoe7ns7.googlevideo.com.", "rr4---sn-npoe7ns7.gvt1.com.", "rr4---sn-npoe7nsd.googlevideo.com.", "rr4---sn-npoe7nsk.googlevideo.com.", + "rr4---sn-npoe7nsk.gvt1.com.", "rr4---sn-npoe7nsl.googlevideo.com.", "rr4---sn-npoe7nsr.googlevideo.com.", + "rr4---sn-npoe7nsr.gvt1.com.", "rr4---sn-npoe7nsy.googlevideo.com.", + "rr4---sn-npoe7nsy.gvt1.com.", "rr4---sn-npoe7nz7.googlevideo.com.", + "rr4---sn-npoe7nz7.gvt1.com.", "rr4---sn-npoeene6.googlevideo.com.", "rr4---sn-npoeened.googlevideo.com.", "rr4---sn-npoeenee.googlevideo.com.", + "rr4---sn-npoeenee.gvt1.com.", "rr4---sn-npoeenek.googlevideo.com.", "rr4---sn-npoeener.googlevideo.com.", "rr4---sn-npoeeney.googlevideo.com.", "rr4---sn-npoeenez.googlevideo.com.", + "rr4---sn-npoeenez.gvt1.com.", "rr4---sn-npoeenl7.googlevideo.com.", + "rr4---sn-npoeenl7.gvt1.com.", "rr4---sn-npoeenle.googlevideo.com.", "rr4---sn-npoeenlk.googlevideo.com.", "rr4---sn-npoeenlk.gvt1.com.", @@ -5446,26 +5549,33 @@ var FakeECSFQDNs = container.NewMapSet( "rr4---sn-npoeenll.gvt1.com.", "rr4---sn-npoeenly.googlevideo.com.", "rr4---sn-npoeens7.googlevideo.com.", + "rr4---sn-npoeens7.gvt1.com.", "rr4---sn-npoldn76.googlevideo.com.", "rr4---sn-npoldn7d.googlevideo.com.", + "rr4---sn-npoldn7d.gvt1.com.", "rr4---sn-npoldn7e.googlevideo.com.", "rr4---sn-npoldn7l.googlevideo.com.", "rr4---sn-npoldn7l.gvt1.com.", "rr4---sn-npoldn7y.googlevideo.com.", + "rr4---sn-npoldn7y.gvt1.com.", "rr4---sn-npoldn7z.googlevideo.com.", - "rr4---sn-ntq7yned.googlevideo.com.", + "rr4---sn-npoldn7z.gvt1.com.", + "rr4---sn-npoldne7.googlevideo.com.", + "rr4---sn-ntq7yns7.googlevideo.com.", "rr4---sn-nx57ynsd.googlevideo.com.", "rr4---sn-nx57ynse.googlevideo.com.", "rr4---sn-nx57ynsk.googlevideo.com.", + "rr4---sn-nx57ynsk.gvt1.com.", "rr4---sn-nx57ynsl.googlevideo.com.", + "rr4---sn-nx57ynsl.gvt1.com.", "rr4---sn-nx57ynsr.googlevideo.com.", "rr4---sn-nx57ynsy.googlevideo.com.", - "rr4---sn-nx57ynsz.googlevideo.com.", "rr4---sn-nx57ynz7.googlevideo.com.", "rr4---sn-nx57ynze.googlevideo.com.", "rr4---sn-o097znsd.googlevideo.com.", "rr4---sn-o097znse.googlevideo.com.", "rr4---sn-o097znsk.googlevideo.com.", + "rr4---sn-o097znsk.gvt1.com.", "rr4---sn-o097znsl.googlevideo.com.", "rr4---sn-o097znsr.googlevideo.com.", "rr4---sn-o097znss.googlevideo.com.", @@ -5473,8 +5583,8 @@ var FakeECSFQDNs = container.NewMapSet( "rr4---sn-o097znz7.googlevideo.com.", "rr4---sn-o097znzd.googlevideo.com.", "rr4---sn-o097znze.googlevideo.com.", + "rr4---sn-o097znzk.googlevideo.com.", "rr4---sn-o097znzr.googlevideo.com.", - "rr4---sn-oj5hn5-55.googlevideo.com.", "rr4---sn-oji3bc-5j.googlevideo.com.", "rr4---sn-p5qddn76.googlevideo.com.", "rr4---sn-p5qddn7d.googlevideo.com.", @@ -5484,17 +5594,18 @@ var FakeECSFQDNs = container.NewMapSet( "rr4---sn-p5qlsn6l.googlevideo.com.", "rr4---sn-p5qlsn6s.googlevideo.com.", "rr4---sn-p5qlsn6z.googlevideo.com.", - "rr4---sn-p5qlsn76.googlevideo.com.", "rr4---sn-p5qlsn7d.googlevideo.com.", "rr4---sn-p5qlsn7l.googlevideo.com.", "rr4---sn-p5qlsn7s.googlevideo.com.", "rr4---sn-p5qlsnd6.googlevideo.com.", "rr4---sn-p5qlsndk.googlevideo.com.", "rr4---sn-p5qlsndr.googlevideo.com.", + "rr4---sn-p5qlsndz.googlevideo.com.", "rr4---sn-p5qlsnrl.googlevideo.com.", "rr4---sn-p5qlsnrr.googlevideo.com.", "rr4---sn-p5qlsny6.googlevideo.com.", "rr4---sn-p5qs7n6d.googlevideo.com.", + "rr4---sn-p5qs7n6y.googlevideo.com.", "rr4---sn-p5qs7nd7.googlevideo.com.", "rr4---sn-p5qs7nsk.googlevideo.com.", "rr4---sn-p5qs7nzk.googlevideo.com.", @@ -5506,10 +5617,13 @@ var FakeECSFQDNs = container.NewMapSet( "rr4---sn-q4fl6n6y.googlevideo.com.", "rr4---sn-q4fl6n6y.gvt1.com.", "rr4---sn-q4fl6n6z.googlevideo.com.", + "rr4---sn-q4fl6nd6.googlevideo.com.", "rr4---sn-q4fl6nd7.googlevideo.com.", + "rr4---sn-q4fl6nd7.gvt1.com.", "rr4---sn-q4fl6nde.googlevideo.com.", "rr4---sn-q4fl6nde.gvt1.com.", "rr4---sn-q4fl6ndl.googlevideo.com.", + "rr4---sn-q4fl6ndl.gvt1.com.", "rr4---sn-q4fl6nds.googlevideo.com.", "rr4---sn-q4fl6ndz.googlevideo.com.", "rr4---sn-q4fl6nlz.googlevideo.com.", @@ -5519,13 +5633,13 @@ var FakeECSFQDNs = container.NewMapSet( "rr4---sn-q4fl6nsd.googlevideo.com.", "rr4---sn-q4fl6nsd.gvt1.com.", "rr4---sn-q4fl6nsk.googlevideo.com.", + "rr4---sn-q4fl6nsk.gvt1.com.", "rr4---sn-q4fl6nsl.googlevideo.com.", "rr4---sn-q4fl6nsr.googlevideo.com.", + "rr4---sn-q4fl6nsr.gvt1.com.", "rr4---sn-q4fl6nss.googlevideo.com.", "rr4---sn-q4fl6nsy.googlevideo.com.", - "rr4---sn-q4fl6nsy.gvt1.com.", "rr4---sn-q4fl6nz6.googlevideo.com.", - "rr4---sn-q4fl6nz6.gvt1.com.", "rr4---sn-q4fl6nz7.googlevideo.com.", "rr4---sn-q4fl6nz7.gvt1.com.", "rr4---sn-q4fl6nzy.googlevideo.com.", @@ -5538,20 +5652,22 @@ var FakeECSFQDNs = container.NewMapSet( "rr4---sn-q4flrne6.googlevideo.com.", "rr4---sn-q4flrne7.googlevideo.com.", "rr4---sn-q4flrnee.googlevideo.com.", + "rr4---sn-q4flrnee.gvt1.com.", "rr4---sn-q4flrnek.googlevideo.com.", "rr4---sn-q4flrnel.googlevideo.com.", "rr4---sn-q4flrner.googlevideo.com.", "rr4---sn-q4flrnes.googlevideo.com.", + "rr4---sn-q4flrnes.gvt1.com.", "rr4---sn-q4flrney.googlevideo.com.", "rr4---sn-q4flrnez.googlevideo.com.", "rr4---sn-q4flrnl6.googlevideo.com.", "rr4---sn-q4flrnl7.googlevideo.com.", - "rr4---sn-q4flrnl7.gvt1.com.", "rr4---sn-q4flrnld.googlevideo.com.", + "rr4---sn-q4flrnld.gvt1.com.", "rr4---sn-q4flrnle.googlevideo.com.", "rr4---sn-q4flrnlz.googlevideo.com.", + "rr4---sn-q4flrnlz.gvt1.com.", "rr4---sn-q4flrnsd.googlevideo.com.", - "rr4---sn-q4flrnsd.gvt1.com.", "rr4---sn-q4flrnsl.googlevideo.com.", "rr4---sn-q4flrnsl.gvt1.com.", "rr4---sn-q4flrnss.googlevideo.com.", @@ -5561,12 +5677,13 @@ var FakeECSFQDNs = container.NewMapSet( "rr4---sn-q4fzen7s.googlevideo.com.", "rr4---sn-q4fzen7s.gvt1.com.", "rr4---sn-q4fzen7y.googlevideo.com.", + "rr4---sn-q4fzen7y.gvt1.com.", "rr4---sn-q4fzene7.googlevideo.com.", "rr4---sn-q4fzene7.gvt1.com.", "rr4---sn-q4fzenee.googlevideo.com.", "rr4---sn-qja5mc-5h.googlevideo.com.", + "rr4---sn-qja5mc-5h.gvt1.com.", "rr4---sn-qjp5q5-55.googlevideo.com.", - "rr4---sn-qxo7rn7k.googlevideo.com.", "rr4---sn-qxo7rne7.googlevideo.com.", "rr4---sn-qxo7rnee.googlevideo.com.", "rr4---sn-qxoedn7k.googlevideo.com.", @@ -5580,7 +5697,9 @@ var FakeECSFQDNs = container.NewMapSet( "rr4---sn-vgqskn67.googlevideo.com.", "rr4---sn-vgqskn6d.googlevideo.com.", "rr4---sn-vgqskn6s.googlevideo.com.", + "rr4---sn-vgqskn6s.gvt1.com.", "rr4---sn-vgqskn6z.googlevideo.com.", + "rr4---sn-vgqskne6.googlevideo.com.", "rr4---sn-vgqskned.googlevideo.com.", "rr4---sn-vgqsknek.googlevideo.com.", "rr4---sn-vgqsknes.googlevideo.com.", @@ -5601,11 +5720,14 @@ var FakeECSFQDNs = container.NewMapSet( "rr4---sn-vgqsknzk.googlevideo.com.", "rr4---sn-vgqsknzl.googlevideo.com.", "rr4---sn-vgqsknzr.googlevideo.com.", + "rr4---sn-vgqsknzr.gvt1.com.", "rr4---sn-vgqsknzs.googlevideo.com.", + "rr4---sn-vgqsknzs.gvt1.com.", "rr4---sn-vgqsknzy.googlevideo.com.", "rr4---sn-vgqsknzz.googlevideo.com.", "rr4---sn-vgqsrn66.googlevideo.com.", "rr4---sn-vgqsrn67.googlevideo.com.", + "rr4---sn-vgqsrn67.gvt1.com.", "rr4---sn-vgqsrn6e.googlevideo.com.", "rr4---sn-vgqsrn6l.googlevideo.com.", "rr4---sn-vgqsrn6z.googlevideo.com.", @@ -5621,48 +5743,80 @@ var FakeECSFQDNs = container.NewMapSet( "rr4---sn-vgqsrnls.googlevideo.com.", "rr4---sn-vgqsrnlz.googlevideo.com.", "rr4---sn-vgqsrns6.googlevideo.com.", + "rr4---sn-vgqsrns6.gvt1.com.", "rr4---sn-vgqsrnsd.googlevideo.com.", "rr4---sn-vgqsrnsr.googlevideo.com.", "rr4---sn-vgqsrnsy.googlevideo.com.", "rr4---sn-vgqsrnz6.googlevideo.com.", + "rr4---sn-vgqsrnz6.gvt1.com.", "rr4---sn-vgqsrnz7.googlevideo.com.", "rr4---sn-vgqsrnzd.googlevideo.com.", - "rr4---sn-vgqsrnzk.googlevideo.com.", + "rr4---sn-vgqsrnzd.gvt1.com.", "rr4---sn-vgqsrnzr.googlevideo.com.", "rr4---sn-vgqsrnzs.googlevideo.com.", "rr4---sn-vgqsrnzy.googlevideo.com.", - "rr4---sn-vgqsrnzy.gvt1.com.", "rr4---sn-vgqsrnzz.googlevideo.com.", - "rr4---sn-vgqsrnzz.gvt1.com.", + "rr4.sn-5hneknee.googlevideo.com.", + "rr4.sn-a5m7lnl6.googlevideo.com.", + "rr4.sn-a5m7lnld.googlevideo.com.", + "rr4.sn-a5mekn6d.googlevideo.com.", + "rr4.sn-a5mekn6k.googlevideo.com.", + "rr4.sn-a5mekn6l.googlevideo.com.", + "rr4.sn-a5mekn6r.googlevideo.com.", + "rr4.sn-a5mekn6s.googlevideo.com.", + "rr4.sn-a5mekn6z.googlevideo.com.", + "rr4.sn-a5meknd6.googlevideo.com.", + "rr4.sn-a5meknde.googlevideo.com.", + "rr4.sn-a5mekndl.googlevideo.com.", + "rr4.sn-a5meknds.googlevideo.com.", + "rr4.sn-a5meknzk.googlevideo.com.", + "rr4.sn-a5meknzr.googlevideo.com.", + "rr4.sn-a5mlrnl6.googlevideo.com.", + "rr4.sn-a5mlrnll.googlevideo.com.", + "rr4.sn-a5mlrnls.googlevideo.com.", + "rr4.sn-a5mlrnlz.googlevideo.com.", + "rr4.sn-a5msenek.googlevideo.com.", + "rr4.sn-a5msener.googlevideo.com.", + "rr4.sn-a5msenes.googlevideo.com.", + "rr4.sn-a5msenl7.googlevideo.com.", + "rr4.sn-a5msenle.googlevideo.com.", + "rr4.sn-hgn7rn7y.googlevideo.com.", "rr4.sn-hp57kn6r.googlevideo.com.", "rr4.sn-hp57kn6y.googlevideo.com.", - "rr4.sn-hp57knd6.googlevideo.com.", "rr4.sn-hp57kndd.googlevideo.com.", "rr4.sn-hp57kndk.googlevideo.com.", - "rr4.sn-hp57kndr.googlevideo.com.", "rr4.sn-hp57knds.googlevideo.com.", "rr4.sn-hp57kndy.googlevideo.com.", - "rr4.sn-hp57kndz.googlevideo.com.", - "rr4.sn-hp57knk7.googlevideo.com.", + "rr4.sn-hp57knks.googlevideo.com.", "rr4.sn-hp57ynl6.googlevideo.com.", - "rr4.sn-hp57ynlr.googlevideo.com.", "rr4.sn-hp57ynly.googlevideo.com.", "rr4.sn-hp57yns7.googlevideo.com.", - "rr4.sn-hp57ynse.googlevideo.com.", + "rr4.sn-hp57ynsd.googlevideo.com.", "rr4.sn-hp57ynsl.googlevideo.com.", - "rr4.sn-hp57ynss.googlevideo.com.", + "rr4.sn-ntq7yns7.googlevideo.com.", "rr4.sn-nx57ynsk.googlevideo.com.", - "rr4.sn-q4fl6ndl.googlevideo.com.", + "rr4.sn-q4fl6nd6.googlevideo.com.", + "rr4.sn-q4fl6nds.googlevideo.com.", + "rr4.sn-q4fl6nsk.googlevideo.com.", + "rr4.sn-q4fl6nss.googlevideo.com.", + "rr4.sn-q4fl6nz7.googlevideo.com.", + "rr4.sn-q4fl6nzy.googlevideo.com.", + "rr4.sn-q4flrnes.googlevideo.com.", "rr4.sn-q4flrney.googlevideo.com.", - "rr4.sn-q4flrnl7.googlevideo.com.", "rr4.sn-q4fzen7l.googlevideo.com.", + "rr4.sn-q4fzen7y.googlevideo.com.", + "rr4.sn-qja5mc-5h.googlevideo.com.", "rr4.sn-u1hp55-5c.googlevideo.com.", + "rr4.sn-vgqsknzk.googlevideo.com.", + "rr4.sn-vgqsknzs.googlevideo.com.", "rr4.sn-vgqsrnzz.googlevideo.com.", "rr5---sn-0nnpbo5a-bggl.googlevideo.com.", "rr5---sn-2aqu-hoas7.googlevideo.com.", + "rr5---sn-2aqu-hoasz.googlevideo.com.", "rr5---sn-2imern76.googlevideo.com.", "rr5---sn-2imern76.gvt1.com.", "rr5---sn-2imern7d.googlevideo.com.", + "rr5---sn-2imern7d.gvt1.com.", "rr5---sn-2imern7r.googlevideo.com.", "rr5---sn-2imeyn7k.googlevideo.com.", "rr5---sn-2imeyn7k.gvt1.com.", @@ -5677,7 +5831,6 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-30a7yner.googlevideo.com.", "rr5---sn-30a7yney.googlevideo.com.", "rr5---sn-30a7ynl7.googlevideo.com.", - "rr5---sn-42u-nboze.googlevideo.com.", "rr5---sn-4g5e6ns6.googlevideo.com.", "rr5---sn-4g5e6ns7.googlevideo.com.", "rr5---sn-4g5e6nsd.googlevideo.com.", @@ -5693,6 +5846,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-4g5edn6k.googlevideo.com.", "rr5---sn-4g5edn6r.googlevideo.com.", "rr5---sn-4g5edn6y.googlevideo.com.", + "rr5---sn-4g5edn6y.gvt1.com.", "rr5---sn-4g5ednd7.googlevideo.com.", "rr5---sn-4g5edndd.googlevideo.com.", "rr5---sn-4g5ednde.googlevideo.com.", @@ -5705,7 +5859,6 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-4g5ednld.googlevideo.com.", "rr5---sn-4g5ednly.googlevideo.com.", "rr5---sn-4g5edns6.googlevideo.com.", - "rr5---sn-4g5edns7.googlevideo.com.", "rr5---sn-4g5ednsd.googlevideo.com.", "rr5---sn-4g5ednse.googlevideo.com.", "rr5---sn-4g5ednsk.googlevideo.com.", @@ -5718,6 +5871,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-4g5lzne6.googlevideo.com.", "rr5---sn-4g5lzned.googlevideo.com.", "rr5---sn-4g5lznek.googlevideo.com.", + "rr5---sn-4g5lznek.gvt1.com.", "rr5---sn-4g5lzner.googlevideo.com.", "rr5---sn-4g5lznes.googlevideo.com.", "rr5---sn-4g5lzney.googlevideo.com.", @@ -5727,54 +5881,68 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-4g5lznle.googlevideo.com.", "rr5---sn-4g5lznls.googlevideo.com.", "rr5---sn-4g5lznlz.googlevideo.com.", + "rr5---sn-5go7yner.googlevideo.com.", "rr5---sn-5go7ynl6.googlevideo.com.", - "rr5---sn-5hne6n6e.googlevideo.com.", + "rr5---sn-5goeenes.googlevideo.com.", + "rr5---sn-5goeenez.googlevideo.com.", "rr5---sn-5hne6n6l.googlevideo.com.", "rr5---sn-5hne6n6l.gvt1.com.", "rr5---sn-5hne6ns6.googlevideo.com.", "rr5---sn-5hne6nsd.googlevideo.com.", - "rr5---sn-5hne6nsk.googlevideo.com.", + "rr5---sn-5hne6nsd.gvt1.com.", "rr5---sn-5hne6nsr.googlevideo.com.", "rr5---sn-5hne6nsy.googlevideo.com.", "rr5---sn-5hne6nsz.googlevideo.com.", "rr5---sn-5hne6nz6.googlevideo.com.", "rr5---sn-5hne6nzd.googlevideo.com.", "rr5---sn-5hne6nzk.googlevideo.com.", - "rr5---sn-5hne6nzs.googlevideo.com.", + "rr5---sn-5hne6nzk.gvt1.com.", "rr5---sn-5hne6nzy.googlevideo.com.", + "rr5---sn-5hne6nzy.gvt1.com.", "rr5---sn-5hnednss.googlevideo.com.", "rr5---sn-5hnednsz.googlevideo.com.", + "rr5---sn-5hnednsz.gvt1.com.", "rr5---sn-5hnekn76.googlevideo.com.", "rr5---sn-5hnekn7d.googlevideo.com.", "rr5---sn-5hnekn7l.googlevideo.com.", "rr5---sn-5hnekn7s.googlevideo.com.", - "rr5---sn-5hnekn7z.googlevideo.com.", + "rr5---sn-5hnekn7s.gvt1.com.", "rr5---sn-5hneknee.googlevideo.com.", "rr5---sn-5hneknek.googlevideo.com.", "rr5---sn-5hneknes.googlevideo.com.", + "rr5---sn-5uaezn67.googlevideo.com.", + "rr5---sn-5uaezn6l.googlevideo.com.", + "rr5---sn-5uaezn6s.googlevideo.com.", + "rr5---sn-5uaezn6z.googlevideo.com.", "rr5---sn-5uaezndd.googlevideo.com.", "rr5---sn-5uaezne6.googlevideo.com.", "rr5---sn-5uaezned.googlevideo.com.", + "rr5---sn-5uaezned.gvt1.com.", "rr5---sn-5uaeznel.googlevideo.com.", + "rr5---sn-5uaeznel.gvt1.com.", "rr5---sn-5uaezner.googlevideo.com.", "rr5---sn-5uaeznes.googlevideo.com.", "rr5---sn-5uaeznez.googlevideo.com.", "rr5---sn-5uaeznl6.googlevideo.com.", "rr5---sn-5uaeznld.googlevideo.com.", + "rr5---sn-5uaeznld.gvt1.com.", + "rr5---sn-5uaeznls.googlevideo.com.", + "rr5---sn-5uaeznls.gvt1.com.", "rr5---sn-5uaeznly.googlevideo.com.", + "rr5---sn-5uaeznly.gvt1.com.", "rr5---sn-5uaeznlz.googlevideo.com.", "rr5---sn-5uaeznse.googlevideo.com.", "rr5---sn-5uaeznsl.googlevideo.com.", "rr5---sn-5uaeznss.googlevideo.com.", "rr5---sn-5uaezny6.googlevideo.com.", "rr5---sn-5uaeznyz.googlevideo.com.", - "rr5---sn-5uaeznze.googlevideo.com.", "rr5---sn-5ualdnle.googlevideo.com.", "rr5---sn-5ualdnll.googlevideo.com.", "rr5---sn-5ualdnlr.googlevideo.com.", "rr5---sn-5ualdnls.googlevideo.com.", "rr5---sn-5ualdns6.googlevideo.com.", "rr5---sn-5ualdns7.googlevideo.com.", + "rr5---sn-5ualdns7.gvt1.com.", "rr5---sn-5ualdnsd.googlevideo.com.", "rr5---sn-5ualdnse.googlevideo.com.", "rr5---sn-5ualdnsl.googlevideo.com.", @@ -5782,9 +5950,13 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-5ualdnss.googlevideo.com.", "rr5---sn-5ualdnsy.googlevideo.com.", "rr5---sn-5ualdnsz.googlevideo.com.", + "rr5---sn-5ualdnz6.googlevideo.com.", "rr5---sn-5ualdnz7.googlevideo.com.", "rr5---sn-5ualdnze.googlevideo.com.", + "rr5---sn-5ualdnzz.googlevideo.com.", + "rr5---sn-8qj-i5ody.googlevideo.com.", "rr5---sn-8qj-nbo66.googlevideo.com.", + "rr5---sn-8qj-nbo67.googlevideo.com.", "rr5---sn-8xgp1vo-a5ml.googlevideo.com.", "rr5---sn-8xgp1vo-ab56.googlevideo.com.", "rr5---sn-8xgp1vo-ab5d.googlevideo.com.", @@ -5792,43 +5964,57 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-8xgp1vo-ab5l.googlevideo.com.", "rr5---sn-8xgp1vo-ab5s.googlevideo.com.", "rr5---sn-8xgp1vo-ab5z.googlevideo.com.", + "rr5---sn-8xgp1vo-p5qe.googlevideo.com.", "rr5---sn-8xgp1vo-p5qee.googlevideo.com.", "rr5---sn-8xgp1vo-p5qel.googlevideo.com.", "rr5---sn-8xgp1vo-vgqe.googlevideo.com.", "rr5---sn-8xgp1vo-xfge.googlevideo.com.", + "rr5---sn-8xgp1vo-xfgl.googlevideo.com.", "rr5---sn-8xgp1vo-xfgs.googlevideo.com.", - "rr5---sn-9gv76n7s.googlevideo.com.", "rr5---sn-9gv7zn76.googlevideo.com.", - "rr5---sn-9gv7zn7e.googlevideo.com.", "rr5---sn-9gv7zn7y.googlevideo.com.", "rr5---sn-a5m7lnl6.googlevideo.com.", + "rr5---sn-a5m7lnl6.gvt1.com.", "rr5---sn-a5m7lnld.googlevideo.com.", + "rr5---sn-a5m7lnld.gvt1.com.", "rr5---sn-a5mekn6d.googlevideo.com.", + "rr5---sn-a5mekn6d.gvt1.com.", "rr5---sn-a5mekn6k.googlevideo.com.", "rr5---sn-a5mekn6l.googlevideo.com.", + "rr5---sn-a5mekn6l.gvt1.com.", "rr5---sn-a5mekn6r.googlevideo.com.", + "rr5---sn-a5mekn6r.gvt1.com.", "rr5---sn-a5mekn6s.googlevideo.com.", "rr5---sn-a5mekn6z.googlevideo.com.", "rr5---sn-a5meknd6.googlevideo.com.", + "rr5---sn-a5mekndd.googlevideo.com.", "rr5---sn-a5meknde.googlevideo.com.", + "rr5---sn-a5meknde.gvt1.com.", + "rr5---sn-a5mekndk.googlevideo.com.", + "rr5---sn-a5mekndk.gvt1.com.", "rr5---sn-a5mekndl.googlevideo.com.", + "rr5---sn-a5mekndl.gvt1.com.", "rr5---sn-a5meknds.googlevideo.com.", "rr5---sn-a5mekndz.googlevideo.com.", "rr5---sn-a5meknsd.googlevideo.com.", + "rr5---sn-a5meknsd.gvt1.com.", "rr5---sn-a5meknsy.googlevideo.com.", - "rr5---sn-a5meknzk.googlevideo.com.", "rr5---sn-a5meknzl.googlevideo.com.", "rr5---sn-a5meknzr.googlevideo.com.", "rr5---sn-a5meknzs.googlevideo.com.", "rr5---sn-a5mlrnek.googlevideo.com.", "rr5---sn-a5mlrnl6.googlevideo.com.", "rr5---sn-a5mlrnll.googlevideo.com.", + "rr5---sn-a5mlrnll.gvt1.com.", "rr5---sn-a5mlrnls.googlevideo.com.", "rr5---sn-a5mlrnlz.googlevideo.com.", + "rr5---sn-a5mlrnlz.gvt1.com.", "rr5---sn-a5msen76.googlevideo.com.", "rr5---sn-a5msen7l.googlevideo.com.", "rr5---sn-a5msen7s.googlevideo.com.", + "rr5---sn-a5msen7s.gvt1.com.", "rr5---sn-a5msen7z.googlevideo.com.", + "rr5---sn-a5msen7z.gvt1.com.", "rr5---sn-a5msenek.googlevideo.com.", "rr5---sn-a5msener.googlevideo.com.", "rr5---sn-a5msenes.googlevideo.com.", @@ -5843,6 +6029,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-ab5l6nrk.googlevideo.com.", "rr5---sn-ab5l6nrl.googlevideo.com.", "rr5---sn-ab5l6nrr.googlevideo.com.", + "rr5---sn-ab5l6nrs.googlevideo.com.", "rr5---sn-ab5l6nrz.googlevideo.com.", "rr5---sn-ab5sznld.googlevideo.com.", "rr5---sn-ab5sznly.googlevideo.com.", @@ -5859,10 +6046,11 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-aigl6ned.googlevideo.com.", "rr5---sn-aigl6nek.googlevideo.com.", "rr5---sn-aigl6ner.googlevideo.com.", + "rr5---sn-aigl6ner.gvt1.com.", "rr5---sn-aigl6ney.googlevideo.com.", "rr5---sn-aigl6nl7.googlevideo.com.", + "rr5---sn-aigl6nl7.gvt1.com.", "rr5---sn-aigl6ns6.googlevideo.com.", - "rr5---sn-aigl6nsd.googlevideo.com.", "rr5---sn-aigl6nsk.googlevideo.com.", "rr5---sn-aigl6nsr.googlevideo.com.", "rr5---sn-aigl6nz7.googlevideo.com.", @@ -5871,6 +6059,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-aigl6nzl.googlevideo.com.", "rr5---sn-aigl6nzr.googlevideo.com.", "rr5---sn-aigl6nzs.googlevideo.com.", + "rr5---sn-aigl6nzs.gvt1.com.", "rr5---sn-aigzrn76.googlevideo.com.", "rr5---sn-aigzrn7d.googlevideo.com.", "rr5---sn-aigzrn7e.googlevideo.com.", @@ -5883,11 +6072,11 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-aigzrnsl.googlevideo.com.", "rr5---sn-aigzrnsr.googlevideo.com.", "rr5---sn-aigzrnss.googlevideo.com.", - "rr5---sn-aigzrnsz.googlevideo.com.", "rr5---sn-aigzrnz7.googlevideo.com.", "rr5---sn-aigzrnze.googlevideo.com.", "rr5---sn-aj4g55-5v.googlevideo.com.", "rr5---sn-aj5ua5-5c.googlevideo.com.", + "rr5---sn-ajab55-55.googlevideo.com.", "rr5---sn-bvvbaxivnuxq5uu-q4f6.googlevideo.com.", "rr5---sn-bvvbaxivnuxq5uu-q4fe.googlevideo.com.", "rr5---sn-bvvbaxivnuxq5uu-q4fl.googlevideo.com.", @@ -5903,35 +6092,44 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-bvvbaxivnuxqjvhj5nu-vgqs.googlevideo.com.", "rr5---sn-bvvbaxivnuxqjvhj5nu-vgqz.googlevideo.com.", "rr5---sn-bvvbaxivnuxqjvm-2ime.googlevideo.com.", + "rr5---sn-bvvbaxivnuxqjvm-2iml.googlevideo.com.", "rr5---sn-bvvbaxivnuxqjvm-2ims.googlevideo.com.", - "rr5---sn-bvvbaxivnuxqjvm-2ims.gvt1.com.", + "rr5---sn-bvvbaxivnuxqjvm-2imz.googlevideo.com.", "rr5---sn-bvvbaxivnuxqjvm-q4fe.googlevideo.com.", + "rr5---sn-bvvbaxivnuxqjvm-q4fe.gvt1.com.", "rr5---sn-bvvbaxivnuxqjvm-q4fl.googlevideo.com.", "rr5---sn-cvb7lne7.googlevideo.com.", "rr5---sn-cvb7lnee.googlevideo.com.", + "rr5---sn-cvb7lnls.googlevideo.com.", "rr5---sn-cvb7lnlz.googlevideo.com.", "rr5---sn-cvb7sn7k.googlevideo.com.", "rr5---sn-cvb7sn7r.googlevideo.com.", "rr5---sn-hoa7kn76.googlevideo.com.", "rr5---sn-hoa7kn76.gvt1.com.", + "rr5---sn-hoa7kn7z.googlevideo.com.", + "rr5---sn-hoa7kn7z.gvt1.com.", "rr5---sn-hoa7rn76.googlevideo.com.", "rr5---sn-hoa7rn76.gvt1.com.", "rr5---sn-hoa7rn7z.googlevideo.com.", "rr5---sn-hoa7rn7z.gvt1.com.", "rr5---sn-hp57kn6r.googlevideo.com.", "rr5---sn-hp57kn6r.gvt1.com.", - "rr5---sn-hp57kn6y.googlevideo.com.", "rr5---sn-hp57knd6.googlevideo.com.", "rr5---sn-hp57kndd.googlevideo.com.", "rr5---sn-hp57kndk.googlevideo.com.", "rr5---sn-hp57kndr.googlevideo.com.", - "rr5---sn-hp57kndr.gvt1.com.", "rr5---sn-hp57knds.googlevideo.com.", "rr5---sn-hp57knds.gvt1.com.", "rr5---sn-hp57kndy.googlevideo.com.", "rr5---sn-hp57kndy.gvt1.com.", "rr5---sn-hp57kndz.googlevideo.com.", + "rr5---sn-hp57kndz.gvt1.com.", "rr5---sn-hp57knk7.googlevideo.com.", + "rr5---sn-hp57knk7.gvt1.com.", + "rr5---sn-hp57knkl.googlevideo.com.", + "rr5---sn-hp57knkl.gvt1.com.", + "rr5---sn-hp57knks.googlevideo.com.", + "rr5---sn-hp57knks.gvt1.com.", "rr5---sn-hp57yn7r.googlevideo.com.", "rr5---sn-hp57yn7y.googlevideo.com.", "rr5---sn-hp57yne7.googlevideo.com.", @@ -5941,9 +6139,13 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-hp57ynlr.googlevideo.com.", "rr5---sn-hp57ynly.googlevideo.com.", "rr5---sn-hp57ynly.gvt1.com.", + "rr5---sn-hp57yns6.googlevideo.com.", "rr5---sn-hp57yns7.googlevideo.com.", "rr5---sn-hp57yns7.gvt1.com.", + "rr5---sn-hp57ynsd.googlevideo.com.", + "rr5---sn-hp57ynsd.gvt1.com.", "rr5---sn-hp57ynse.googlevideo.com.", + "rr5---sn-hp57ynse.gvt1.com.", "rr5---sn-hp57ynsl.googlevideo.com.", "rr5---sn-hp57ynsl.gvt1.com.", "rr5---sn-hp57ynss.googlevideo.com.", @@ -5971,12 +6173,14 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-n4v7sney.googlevideo.com.", "rr5---sn-n4v7snl7.googlevideo.com.", "rr5---sn-n4v7snll.googlevideo.com.", + "rr5---sn-n4v7snll.gvt1.com.", "rr5---sn-n4v7snlr.googlevideo.com.", - "rr5---sn-n4v7snls.googlevideo.com.", "rr5---sn-n4v7snly.googlevideo.com.", "rr5---sn-n4v7sns7.googlevideo.com.", "rr5---sn-n4v7snse.googlevideo.com.", + "rr5---sn-n4v7snse.gvt1.com.", "rr5---sn-npoe7ndl.googlevideo.com.", + "rr5---sn-npoe7ndl.gvt1.com.", "rr5---sn-npoe7ne6.googlevideo.com.", "rr5---sn-npoe7ne7.googlevideo.com.", "rr5---sn-npoe7ned.googlevideo.com.", @@ -5987,16 +6191,20 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-npoe7nez.googlevideo.com.", "rr5---sn-npoe7nl6.googlevideo.com.", "rr5---sn-npoe7nlz.googlevideo.com.", + "rr5---sn-npoe7ns6.googlevideo.com.", "rr5---sn-npoe7ns7.googlevideo.com.", "rr5---sn-npoe7ns7.gvt1.com.", "rr5---sn-npoe7nsd.googlevideo.com.", "rr5---sn-npoe7nsk.googlevideo.com.", + "rr5---sn-npoe7nsk.gvt1.com.", "rr5---sn-npoe7nsl.googlevideo.com.", "rr5---sn-npoe7nsr.googlevideo.com.", "rr5---sn-npoe7nsy.googlevideo.com.", "rr5---sn-npoe7nz7.googlevideo.com.", + "rr5---sn-npoe7nz7.gvt1.com.", "rr5---sn-npoeene6.googlevideo.com.", "rr5---sn-npoeened.googlevideo.com.", + "rr5---sn-npoeened.gvt1.com.", "rr5---sn-npoeenee.googlevideo.com.", "rr5---sn-npoeenek.googlevideo.com.", "rr5---sn-npoeener.googlevideo.com.", @@ -6004,28 +6212,31 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-npoeenez.googlevideo.com.", "rr5---sn-npoeenl7.googlevideo.com.", "rr5---sn-npoeenle.googlevideo.com.", - "rr5---sn-npoeenlk.googlevideo.com.", "rr5---sn-npoeenll.googlevideo.com.", + "rr5---sn-npoeenll.gvt1.com.", "rr5---sn-npoeens7.googlevideo.com.", + "rr5---sn-npoeens7.gvt1.com.", "rr5---sn-npoldn76.googlevideo.com.", "rr5---sn-npoldn7d.googlevideo.com.", + "rr5---sn-npoldn7d.gvt1.com.", "rr5---sn-npoldn7e.googlevideo.com.", + "rr5---sn-npoldn7e.gvt1.com.", "rr5---sn-npoldn7l.googlevideo.com.", "rr5---sn-npoldn7l.gvt1.com.", "rr5---sn-npoldn7y.googlevideo.com.", + "rr5---sn-npoldn7y.gvt1.com.", "rr5---sn-npoldn7z.googlevideo.com.", "rr5---sn-npoldn7z.gvt1.com.", "rr5---sn-npoldne7.googlevideo.com.", - "rr5---sn-npoldne7.gvt1.com.", - "rr5---sn-ntq7yns7.googlevideo.com.", + "rr5---sn-ntqe6n76.googlevideo.com.", "rr5---sn-nx57ynlk.googlevideo.com.", "rr5---sn-nx57ynsd.googlevideo.com.", "rr5---sn-nx57ynsk.googlevideo.com.", + "rr5---sn-nx57ynsk.gvt1.com.", "rr5---sn-nx57ynsl.googlevideo.com.", "rr5---sn-nx57ynsr.googlevideo.com.", "rr5---sn-nx57ynss.googlevideo.com.", "rr5---sn-nx57ynsy.googlevideo.com.", - "rr5---sn-nx57ynsz.googlevideo.com.", "rr5---sn-nx57ynz7.googlevideo.com.", "rr5---sn-nx57ynze.googlevideo.com.", "rr5---sn-o097znsd.googlevideo.com.", @@ -6038,11 +6249,12 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-o097znz7.googlevideo.com.", "rr5---sn-o097znzd.googlevideo.com.", "rr5---sn-o097znzk.googlevideo.com.", + "rr5---sn-o097znzk.gvt1.com.", "rr5---sn-o097znzr.googlevideo.com.", "rr5---sn-oj5hn5-55.googlevideo.com.", "rr5---sn-oji3bc-5j.googlevideo.com.", "rr5---sn-ojnpo5-58.googlevideo.com.", - "rr5---sn-ojnpo5-58.gvt1.com.", + "rr5---sn-ojnpo5-5o.googlevideo.com.", "rr5---sn-p5qddn76.googlevideo.com.", "rr5---sn-p5qddn7d.googlevideo.com.", "rr5---sn-p5qddn7k.googlevideo.com.", @@ -6067,8 +6279,8 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-p5qs7nsk.googlevideo.com.", "rr5---sn-p5qs7nzk.googlevideo.com.", "rr5---sn-p5qs7nzr.googlevideo.com.", - "rr5---sn-p5qs7nzy.googlevideo.com.", "rr5---sn-q4fl6n66.googlevideo.com.", + "rr5---sn-q4fl6n66.gvt1.com.", "rr5---sn-q4fl6n6d.googlevideo.com.", "rr5---sn-q4fl6n6d.gvt1.com.", "rr5---sn-q4fl6n6r.googlevideo.com.", @@ -6076,10 +6288,10 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-q4fl6n6s.googlevideo.com.", "rr5---sn-q4fl6n6s.gvt1.com.", "rr5---sn-q4fl6n6y.googlevideo.com.", - "rr5---sn-q4fl6n6y.gvt1.com.", "rr5---sn-q4fl6n6z.googlevideo.com.", "rr5---sn-q4fl6n6z.gvt1.com.", "rr5---sn-q4fl6nd7.googlevideo.com.", + "rr5---sn-q4fl6nd7.gvt1.com.", "rr5---sn-q4fl6nde.googlevideo.com.", "rr5---sn-q4fl6ndl.googlevideo.com.", "rr5---sn-q4fl6nds.googlevideo.com.", @@ -6092,11 +6304,11 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-q4fl6nsd.googlevideo.com.", "rr5---sn-q4fl6nsd.gvt1.com.", "rr5---sn-q4fl6nsk.googlevideo.com.", + "rr5---sn-q4fl6nsk.gvt1.com.", "rr5---sn-q4fl6nsl.googlevideo.com.", "rr5---sn-q4fl6nsr.googlevideo.com.", "rr5---sn-q4fl6nsr.gvt1.com.", "rr5---sn-q4fl6nss.googlevideo.com.", - "rr5---sn-q4fl6nss.gvt1.com.", "rr5---sn-q4fl6nsy.googlevideo.com.", "rr5---sn-q4fl6nsy.gvt1.com.", "rr5---sn-q4fl6nz6.googlevideo.com.", @@ -6106,7 +6318,6 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-q4fl6nzy.gvt1.com.", "rr5---sn-q4flrn7k.googlevideo.com.", "rr5---sn-q4flrn7r.googlevideo.com.", - "rr5---sn-q4flrn7y.googlevideo.com.", "rr5---sn-q4flrne6.googlevideo.com.", "rr5---sn-q4flrne7.googlevideo.com.", "rr5---sn-q4flrne7.gvt1.com.", @@ -6119,6 +6330,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-q4flrney.googlevideo.com.", "rr5---sn-q4flrnez.googlevideo.com.", "rr5---sn-q4flrnl6.googlevideo.com.", + "rr5---sn-q4flrnl6.gvt1.com.", "rr5---sn-q4flrnl7.googlevideo.com.", "rr5---sn-q4flrnld.googlevideo.com.", "rr5---sn-q4flrnle.googlevideo.com.", @@ -6131,6 +6343,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-q4flrnsl.googlevideo.com.", "rr5---sn-q4flrnsl.gvt1.com.", "rr5---sn-q4flrnss.googlevideo.com.", + "rr5---sn-q4flrnss.gvt1.com.", "rr5---sn-q4fzen7e.googlevideo.com.", "rr5---sn-q4fzen7e.gvt1.com.", "rr5---sn-q4fzen7l.googlevideo.com.", @@ -6140,9 +6353,10 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-q4fzen7y.gvt1.com.", "rr5---sn-q4fzene7.googlevideo.com.", "rr5---sn-q4fzenee.googlevideo.com.", + "rr5---sn-q4fzenee.gvt1.com.", "rr5---sn-qja5mc-5h.googlevideo.com.", + "rr5---sn-qja5mc-5h.gvt1.com.", "rr5---sn-qjp5q5-55.googlevideo.com.", - "rr5---sn-qxo7rn7k.googlevideo.com.", "rr5---sn-qxo7rne7.googlevideo.com.", "rr5---sn-qxo7rnee.googlevideo.com.", "rr5---sn-qxoedn7k.googlevideo.com.", @@ -6150,6 +6364,8 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-qxoednee.googlevideo.com.", "rr5---sn-qxoednel.googlevideo.com.", "rr5---sn-qxoednes.googlevideo.com.", + "rr5---sn-u1hp55-5c.googlevideo.com.", + "rr5---sn-u1hp55-5c.gvt1.com.", "rr5---sn-vgqskn66.googlevideo.com.", "rr5---sn-vgqskn67.googlevideo.com.", "rr5---sn-vgqskn6d.googlevideo.com.", @@ -6161,20 +6377,24 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-vgqsknes.googlevideo.com.", "rr5---sn-vgqsknez.googlevideo.com.", "rr5---sn-vgqsknld.googlevideo.com.", + "rr5---sn-vgqsknld.gvt1.com.", "rr5---sn-vgqsknlk.googlevideo.com.", "rr5---sn-vgqsknll.googlevideo.com.", - "rr5---sn-vgqsknlr.googlevideo.com.", "rr5---sn-vgqsknls.googlevideo.com.", + "rr5---sn-vgqsknls.gvt1.com.", "rr5---sn-vgqsknlz.googlevideo.com.", "rr5---sn-vgqskns7.googlevideo.com.", "rr5---sn-vgqsknse.googlevideo.com.", "rr5---sn-vgqsknsk.googlevideo.com.", + "rr5---sn-vgqsknsk.gvt1.com.", "rr5---sn-vgqsknz6.googlevideo.com.", + "rr5---sn-vgqsknz6.gvt1.com.", "rr5---sn-vgqsknzd.googlevideo.com.", "rr5---sn-vgqsknzk.googlevideo.com.", "rr5---sn-vgqsknzl.googlevideo.com.", "rr5---sn-vgqsknzr.googlevideo.com.", "rr5---sn-vgqsknzs.googlevideo.com.", + "rr5---sn-vgqsknzs.gvt1.com.", "rr5---sn-vgqsknzy.googlevideo.com.", "rr5---sn-vgqsknzz.googlevideo.com.", "rr5---sn-vgqsrn66.googlevideo.com.", @@ -6193,47 +6413,67 @@ var FakeECSFQDNs = container.NewMapSet( "rr5---sn-vgqsrnll.googlevideo.com.", "rr5---sn-vgqsrnls.googlevideo.com.", "rr5---sn-vgqsrnlz.googlevideo.com.", - "rr5---sn-vgqsrnsd.googlevideo.com.", "rr5---sn-vgqsrnsy.googlevideo.com.", "rr5---sn-vgqsrnz6.googlevideo.com.", "rr5---sn-vgqsrnz7.googlevideo.com.", "rr5---sn-vgqsrnzd.googlevideo.com.", + "rr5---sn-vgqsrnzd.gvt1.com.", "rr5---sn-vgqsrnzk.googlevideo.com.", - "rr5---sn-vgqsrnzr.googlevideo.com.", "rr5---sn-vgqsrnzs.googlevideo.com.", "rr5---sn-vgqsrnzy.googlevideo.com.", "rr5---sn-vgqsrnzz.googlevideo.com.", - "rr5.sn-aigl6nsd.googlevideo.com.", + "rr5---sn-vgqsrnzz.gvt1.com.", + "rr5.sn-a5m7lnl6.googlevideo.com.", + "rr5.sn-a5m7lnld.googlevideo.com.", + "rr5.sn-a5mekn6d.googlevideo.com.", + "rr5.sn-a5mekn6k.googlevideo.com.", + "rr5.sn-a5mekn6l.googlevideo.com.", + "rr5.sn-a5mekn6r.googlevideo.com.", + "rr5.sn-a5mekn6s.googlevideo.com.", + "rr5.sn-a5mekn6z.googlevideo.com.", + "rr5.sn-a5meknd6.googlevideo.com.", + "rr5.sn-a5meknde.googlevideo.com.", + "rr5.sn-a5mekndl.googlevideo.com.", + "rr5.sn-a5meknds.googlevideo.com.", + "rr5.sn-a5mekndz.googlevideo.com.", + "rr5.sn-a5meknzr.googlevideo.com.", + "rr5.sn-a5mlrnl6.googlevideo.com.", + "rr5.sn-a5mlrnll.googlevideo.com.", + "rr5.sn-a5mlrnls.googlevideo.com.", + "rr5.sn-a5mlrnlz.googlevideo.com.", + "rr5.sn-a5msenek.googlevideo.com.", + "rr5.sn-a5msener.googlevideo.com.", + "rr5.sn-a5msenes.googlevideo.com.", + "rr5.sn-a5msenl7.googlevideo.com.", + "rr5.sn-a5msenle.googlevideo.com.", + "rr5.sn-aigl6nzk.googlevideo.com.", "rr5.sn-hp57kn6r.googlevideo.com.", - "rr5.sn-hp57kn6y.googlevideo.com.", - "rr5.sn-hp57knd6.googlevideo.com.", "rr5.sn-hp57kndd.googlevideo.com.", "rr5.sn-hp57kndk.googlevideo.com.", "rr5.sn-hp57kndr.googlevideo.com.", "rr5.sn-hp57knds.googlevideo.com.", - "rr5.sn-hp57kndy.googlevideo.com.", - "rr5.sn-hp57kndz.googlevideo.com.", "rr5.sn-hp57knk7.googlevideo.com.", - "rr5.sn-hp57ynl6.googlevideo.com.", + "rr5.sn-hp57knkl.googlevideo.com.", "rr5.sn-hp57ynlr.googlevideo.com.", - "rr5.sn-hp57ynly.googlevideo.com.", - "rr5.sn-hp57yns7.googlevideo.com.", - "rr5.sn-hp57ynse.googlevideo.com.", - "rr5.sn-hp57ynsl.googlevideo.com.", + "rr5.sn-hp57yns6.googlevideo.com.", "rr5.sn-hp57ynss.googlevideo.com.", - "rr5.sn-ntq7yns7.googlevideo.com.", + "rr5.sn-ntqe6n76.googlevideo.com.", "rr5.sn-nx57ynsk.googlevideo.com.", "rr5.sn-q4fl6n6s.googlevideo.com.", - "rr5.sn-q4fl6nd7.googlevideo.com.", - "rr5.sn-q4fl6ndl.googlevideo.com.", - "rr5.sn-q4flrnl7.googlevideo.com.", - "rr5.sn-q4flrnss.googlevideo.com.", + "rr5.sn-q4fl6nlz.googlevideo.com.", "rr5.sn-q4fzen7l.googlevideo.com.", - "rr5.sn-q4fzen7y.googlevideo.com.", + "rr5.sn-qja5mc-5h.googlevideo.com.", + "rr5.sn-u1hp55-5c.googlevideo.com.", + "rr5.sn-vgqskns7.googlevideo.com.", + "rr5.sn-vgqsrnls.googlevideo.com.", "rr5.sn-vgqsrnzz.googlevideo.com.", "rr6---sn-2aqu-hoas7.googlevideo.com.", - "rr6---sn-42u-nboze.googlevideo.com.", + "rr6---sn-2aqu-hoasz.googlevideo.com.", + "rr6---sn-8qj-i5o6k.googlevideo.com.", + "rr6---sn-8qj-i5ody.googlevideo.com.", + "rr6---sn-8qj-i5ozr.googlevideo.com.", "rr6---sn-8qj-nbo66.googlevideo.com.", + "rr6---sn-8qj-nbo67.googlevideo.com.", "rr6---sn-8xgp1vo-ab56.googlevideo.com.", "rr6---sn-8xgp1vo-ab5d.googlevideo.com.", "rr6---sn-8xgp1vo-ab5e.googlevideo.com.", @@ -6253,7 +6493,6 @@ var FakeECSFQDNs = container.NewMapSet( "rr6---sn-bvvbaxivnuxq5uu-vgql.googlevideo.com.", "rr6---sn-bvvbaxivnuxq5uu-vgqs.googlevideo.com.", "rr6---sn-bvvbaxivnuxq5uu-vgqz.googlevideo.com.", - "rr6---sn-bvvbaxivnuxqjvhj5nu-n4v6.googlevideo.com.", "rr6---sn-bvvbaxivnuxqjvhj5nu-vgq6.googlevideo.com.", "rr6---sn-bvvbaxivnuxqjvhj5nu-vgqd.googlevideo.com.", "rr6---sn-bvvbaxivnuxqjvhj5nu-vgqe.googlevideo.com.", @@ -6261,8 +6500,10 @@ var FakeECSFQDNs = container.NewMapSet( "rr6---sn-bvvbaxivnuxqjvhj5nu-vgqs.googlevideo.com.", "rr6---sn-bvvbaxivnuxqjvhj5nu-vgqz.googlevideo.com.", "rr6---sn-bvvbaxivnuxqjvm-2ime.googlevideo.com.", + "rr6---sn-bvvbaxivnuxqjvm-2iml.googlevideo.com.", "rr6---sn-bvvbaxivnuxqjvm-2ims.googlevideo.com.", "rr6---sn-bvvbaxivnuxqjvm-2ims.gvt1.com.", + "rr6---sn-bvvbaxivnuxqjvm-2imz.googlevideo.com.", "rr6---sn-bvvbaxivnuxqjvm-q4fe.googlevideo.com.", "rr6---sn-bvvbaxivnuxqjvm-q4fe.gvt1.com.", "rr6---sn-bvvbaxivnuxqjvm-q4fl.googlevideo.com.", @@ -6273,12 +6514,14 @@ var FakeECSFQDNs = container.NewMapSet( "rr6---sn-jxopj-nh4e.gvt1.com.", "rr7---sn-2aqu-hoas7.googlevideo.com.", "rr7---sn-2aqu-hoasz.googlevideo.com.", - "rr7---sn-8qj-i5ozd.googlevideo.com.", + "rr7---sn-8qj-i5o6k.googlevideo.com.", + "rr7---sn-8qj-i5ody.googlevideo.com.", "rr7---sn-8qj-nbo66.googlevideo.com.", "rr7---sn-8xgp1vo-ab56.googlevideo.com.", "rr7---sn-8xgp1vo-ab5d.googlevideo.com.", "rr7---sn-8xgp1vo-ab5e.googlevideo.com.", "rr7---sn-8xgp1vo-ab5l.googlevideo.com.", + "rr7---sn-8xgp1vo-ab5s.googlevideo.com.", "rr7---sn-8xgp1vo-p5qee.googlevideo.com.", "rr7---sn-8xgp1vo-p5qel.googlevideo.com.", "rr7---sn-8xgp1vo-vgqe.googlevideo.com.", @@ -6297,14 +6540,19 @@ var FakeECSFQDNs = container.NewMapSet( "rr7---sn-bvvbaxivnuxqjvhj5nu-vgqs.googlevideo.com.", "rr7---sn-bvvbaxivnuxqjvhj5nu-vgqz.googlevideo.com.", "rr7---sn-bvvbaxivnuxqjvm-2ime.googlevideo.com.", + "rr7---sn-bvvbaxivnuxqjvm-2iml.googlevideo.com.", "rr7---sn-bvvbaxivnuxqjvm-2ims.googlevideo.com.", + "rr7---sn-bvvbaxivnuxqjvm-2imz.googlevideo.com.", "rr7---sn-bvvbaxivnuxqjvm-q4fe.googlevideo.com.", "rr7---sn-bvvbaxivnuxqjvm-q4fe.gvt1.com.", "rr7---sn-bvvbaxivnuxqjvm-q4fl.googlevideo.com.", "rr7---sn-jxopj-n5oe.googlevideo.com.", "rr8---sn-2aqu-hoas7.googlevideo.com.", + "rr8---sn-2aqu-hoasz.googlevideo.com.", + "rr8---sn-42u-nboze.googlevideo.com.", "rr8---sn-42u-nbozl.googlevideo.com.", - "rr8---sn-8qj-i5ozd.googlevideo.com.", + "rr8---sn-8qj-i5o6k.googlevideo.com.", + "rr8---sn-8qj-i5ody.googlevideo.com.", "rr8---sn-8xgp1vo-ab56.googlevideo.com.", "rr8---sn-8xgp1vo-ab5d.googlevideo.com.", "rr8---sn-8xgp1vo-ab5e.googlevideo.com.", @@ -6327,9 +6575,13 @@ var FakeECSFQDNs = container.NewMapSet( "rr8---sn-bvvbaxivnuxqjvhj5nu-vgqe.googlevideo.com.", "rr8---sn-bvvbaxivnuxqjvhj5nu-vgql.googlevideo.com.", "rr8---sn-bvvbaxivnuxqjvhj5nu-vgqs.googlevideo.com.", + "rr8---sn-bvvbaxivnuxqjvhj5nu-vgqz.googlevideo.com.", "rr8---sn-bvvbaxivnuxqjvm-2ime.googlevideo.com.", + "rr8---sn-bvvbaxivnuxqjvm-2iml.googlevideo.com.", "rr8---sn-bvvbaxivnuxqjvm-2ims.googlevideo.com.", + "rr8---sn-bvvbaxivnuxqjvm-2imz.googlevideo.com.", "rr8---sn-bvvbaxivnuxqjvm-q4fe.googlevideo.com.", + "rr8---sn-bvvbaxivnuxqjvm-q4fe.gvt1.com.", "rr8---sn-bvvbaxivnuxqjvm-q4fl.googlevideo.com.", "rr9---sn-8xgp1vo-ab56.googlevideo.com.", "rr9---sn-8xgp1vo-ab5d.googlevideo.com.", @@ -6339,6 +6591,7 @@ var FakeECSFQDNs = container.NewMapSet( "rr9---sn-bvvbaxivnuxq5uu-q4fs.googlevideo.com.", "rr9---sn-bvvbaxivnuxq5uu-q4fz.googlevideo.com.", "rr9---sn-bvvbaxivnuxq5uu-vgqe.googlevideo.com.", + "rr9---sn-bvvbaxivnuxq5uu-vgql.googlevideo.com.", "rr9---sn-bvvbaxivnuxq5uu-vgqs.googlevideo.com.", "rr9---sn-bvvbaxivnuxq5uu-vgqz.googlevideo.com.", "rr9---sn-bvvbaxivnuxqjvhj5nu-vgqd.googlevideo.com.", @@ -6347,7 +6600,9 @@ var FakeECSFQDNs = container.NewMapSet( "rr9---sn-bvvbaxivnuxqjvhj5nu-vgqs.googlevideo.com.", "rr9---sn-bvvbaxivnuxqjvhj5nu-vgqz.googlevideo.com.", "rr9---sn-bvvbaxivnuxqjvm-2ime.googlevideo.com.", + "rr9---sn-bvvbaxivnuxqjvm-2iml.googlevideo.com.", "rr9---sn-bvvbaxivnuxqjvm-2ims.googlevideo.com.", + "rr9---sn-bvvbaxivnuxqjvm-2imz.googlevideo.com.", "rr9---sn-bvvbaxivnuxqjvm-q4fe.googlevideo.com.", "rr9---sn-bvvbaxivnuxqjvm-q4fe.gvt1.com.", "rr9---sn-bvvbaxivnuxqjvm-q4fl.googlevideo.com.", @@ -6355,14 +6610,16 @@ var FakeECSFQDNs = container.NewMapSet( "rsapi.haokan.mobi.", "rsx.afterpay.com.", "rt.teramind.co.", + "rtb-eu-v4.rnkclkres.com.", + "rtb-stellormedia.com.", "rtb-use.hellogenie.com.", "rtb-use.mfadsrvr.com.", "rtb-useast.creativedot.net.", "rtb-usw.mfadsrvr.com.", "rtb-uswest.creativedot.net.", - "rtbasia.com.", "rtbmax.com.", "rtbwave.com.", + "rtgio.co.", "rttf.citrix.com.", "ru-comonrt-stsdk.vivoglobal.com.", "ru-comort-stsdk.vivoglobal.com.", @@ -6384,18 +6641,18 @@ var FakeECSFQDNs = container.NewMapSet( "rus-configuration.transsion-os.com.", "rus-mqtt-cluster02.transsion-os.com.", "rus-mqtt.transsion-os.com.", + "rus-svr-terminal.transsion-message.com.", "rus-trancare.transsion-os.com.", "rutubelist.ru.", "s-cdn.anthropic.com.", "s-cs.send.microad.jp.", - "s-pinimg-com.gslb.pinterest.com.", "s.seedtag.com.", + "s.wayfair.com.cdn.cloudflare.net.", "s1.kqxs.tube.", - "s1002-f107.mp.lura.live.", + "s1.listrakbi.com.cdn.cloudflare.net.", "s2-a.time.mci1.us.rozint.net.", "s2-b.time.mci1.us.rozint.net.", "s2.kqxs.tube.", - "s3-us01.didiglobal.com.", "s3.kqxs.tube.", "s5.kqxs.tube.", "s6.kqxs.tube.", @@ -6416,10 +6673,9 @@ var FakeECSFQDNs = container.NewMapSet( "santiago.remotepc.com.", "saopaulo.remotepc.com.", "saopaulo1.remotepc.com.", - "satellite-cdn.salesloft.com.", + "sasoffice365.sharepoint.com.", "sb.adtidy.org.", "scanservice1.qg3.apps.qualys.com.", - "scapi.vmware.com.", "schneidercorp.com.", "sciener.cn.", "scm.haplat.net.", @@ -6434,6 +6690,7 @@ var FakeECSFQDNs = container.NewMapSet( "scontent-atl3-2.xx.fbcdn.net.", "scontent-atl3-3.cdninstagram.com.", "scontent-atl3-3.xx.fbcdn.net.", + "scontent-ber1-1.cdninstagram.com.", "scontent-bkk1-1.xx.fbcdn.net.", "scontent-bkk1-2.xx.fbcdn.net.", "scontent-bog2-1.cdninstagram.com.", @@ -6480,6 +6737,7 @@ var FakeECSFQDNs = container.NewMapSet( "scontent-fra5-2.cdninstagram.com.", "scontent-fra5-2.xx.fbcdn.net.", "scontent-ham3-1.cdninstagram.com.", + "scontent-ham3-1.xx.fbcdn.net.", "scontent-hel3-1.cdninstagram.com.", "scontent-hkg1-1.cdninstagram.com.", "scontent-hkg1-1.xx.fbcdn.net.", @@ -6531,6 +6789,7 @@ var FakeECSFQDNs = container.NewMapSet( "scontent-mnl1-1.xx.fbcdn.net.", "scontent-mnl1-2.cdninstagram.com.", "scontent-mnl1-2.xx.fbcdn.net.", + "scontent-mnl3-1.cdninstagram.com.", "scontent-mnl3-1.xx.fbcdn.net.", "scontent-mnl3-2.xx.fbcdn.net.", "scontent-msp1-1.cdninstagram.com.", @@ -6575,6 +6834,7 @@ var FakeECSFQDNs = container.NewMapSet( "scontent-sjc3-1.xx.fbcdn.net.", "scontent-sjc6-1.cdninstagram.com.", "scontent-sjc6-1.xx.fbcdn.net.", + "scontent-tpe1-1.xx.fbcdn.net.", "scontent-vie1-1.cdninstagram.com.", "scontent-vie1-1.xx.fbcdn.net.", "scontent-waw2-2.cdninstagram.com.", @@ -6582,29 +6842,28 @@ var FakeECSFQDNs = container.NewMapSet( "scontent-yyz1-1.xx.fbcdn.net.", "scraper2.onlineradiobox.com.", "scservices.genetec.com.", - "sdaonuo.com.", + "sdk-api-proxy.postscript.io.cdn.cloudflare.net.", "sdk.beizi.biz.", "sdk.cqsjd.xyz.", + "sdk.iad-01.braze.com.", + "sdk.ocmthood.com.", "sdkgate.pushv3.easebar.com.", "sdks.shopifycdn.com.", "sdktmp.hubcloud.com.cn.", - "seabroadnet.com.", "seagullscientific.com.", "seal-blue.bbb.org.", "seal-goldengate.bbb.org.", "sealsubscriptions.com.", + "search.coolsearches.com.", "search.dnssearch.org.", "search.namequery.com.", "search.us.namequery.com.", - "search22-normal-c-alisg.tiktokv.com.", "searchserverapi.com.", "searchserverapi1.com.", "seattle.remotepc.com.", "secure-signals.permutive.app.", "secure.accurint.com.", - "secure.stratanetwork.com.", "secure.syndetics.com.", - "secureacceptance.cybersource.com.", "securetheorem.com.", "security-reports.shopifysvc.com.", "securityapi.d3-pr-tm.com.", @@ -6620,16 +6879,12 @@ var FakeECSFQDNs = container.NewMapSet( "sentry.cloudlinux.com.", "sentry.wmt.dev.", "seoul.remotepc.com.", - "serraview.com.", - "serve.mongobrain.app.", "server-v4.shop.app.", "server.shop.app.", "service2.ultipro.com.", - "servicebus1041.myconnectsecure.com.", - "servicebus1042.myconnectsecure.com.", - "servicebus1043.myconnectsecure.com.", - "servicebus1044.myconnectsecure.com.", + "services-ext.payback.de.", "services.adaptiva.cloud.", + "services.cloudimanage.com.", "services.lego.com.", "servicetitan.com.", "servs.modoro360.com.", @@ -6640,7 +6895,6 @@ var FakeECSFQDNs = container.NewMapSet( "settings.luckyorange.com.", "sevenrooms.com.", "sewjn80htn-3.algolianet.com.", - "sfont.zalopay.com.vn.", "sfu.voip.signal.org.", "sg-o-s3.smartcloudcon.com.", "sg.api.translator.voice.gcloudsdk.com.", @@ -6650,6 +6904,7 @@ var FakeECSFQDNs = container.NewMapSet( "sgtm.stevemadden.com.", "share.fcgame.net.", "sharpschool.com.", + "shishitao.com.", "shop.app.", "shopcircle.co.", "shopify-assets.shopifycdn.com.", @@ -6657,10 +6912,11 @@ var FakeECSFQDNs = container.NewMapSet( "shopify.com.", "shopifynetwork.com.", "shortpixel.ai.", - "show-creative1.com.", "shp.ee.", "shrinetheme.com.", + "shulex-voc.com.", "shuzilm.cn.", + "sigma-qdata-h72.proxima.nie.netease.com.", "signin.ultipro.com.", "simplemdm.com.", "simpplr.com.", @@ -6674,16 +6930,14 @@ var FakeECSFQDNs = container.NewMapSet( "sip121-1121.ringcentral.com.", "sip121-1131.ringcentral.com.", "sip121-1141.ringcentral.com.", + "sip121-1211.ringcentral.com.", "sip121-1221.ringcentral.com.", - "sip121-1231.ringcentral.com.", "sip121-1241.ringcentral.com.", "sip123-1111.ringcentral.com.", "sip123-1121.ringcentral.com.", "sip123-1131.ringcentral.com.", "sip123-1141.ringcentral.com.", - "sip123-1211.ringcentral.com.", "sip123-1221.ringcentral.com.", - "sip123-1231.ringcentral.com.", "sip123-1241.ringcentral.com.", "sip131-1111.ringcentral.com.", "sip131-1121.ringcentral.com.", @@ -6697,15 +6951,14 @@ var FakeECSFQDNs = container.NewMapSet( "sip132-1131.ringcentral.com.", "sip132-1141.ringcentral.com.", "sip132-1211.ringcentral.com.", - "sip132-1221.ringcentral.com.", "sip132-1231.ringcentral.com.", "sip132-1241.ringcentral.com.", "sip421-121.ringcentral.biz.", "sirsi.net.", - "site-assets.fontawesome.com.", "site-config.com.", "sixpence.ai.", "sjc.zoom.us.", + "sjfzxm.com.", "skeepers.io.", "skims.com.", "skyapi.policies.live.net.", @@ -6713,7 +6966,6 @@ var FakeECSFQDNs = container.NewMapSet( "skyward-ocprod.iscorp.com.", "skyward.iscorp.com.", "sm-tc.cn.", - "sm.cn.", "smartcloudcon.com.", "smartcommunications.cloud.", "smarthome.ctdevice.ott4china.com.", @@ -6752,11 +7004,13 @@ var FakeECSFQDNs = container.NewMapSet( "sobot.com.", "socialchain.app.", "sofia.remotepc.com.", + "sofiapulse.com.", "sogoucdn.com.", "sohu.com.", "solid.preyproject.com.", "sonar-akl1-1.xx.fbcdn.net.", "sonar-amd1-1.xx.fbcdn.net.", + "sonar-amd1-2.xx.fbcdn.net.", "sonar-ams2-1.xx.fbcdn.net.", "sonar-ams4-1.xx.fbcdn.net.", "sonar-arn2-1.xx.fbcdn.net.", @@ -6772,8 +7026,6 @@ var FakeECSFQDNs = container.NewMapSet( "sonar-bog2-1.xx.fbcdn.net.", "sonar-bog2-2.xx.fbcdn.net.", "sonar-bom1-1.xx.fbcdn.net.", - "sonar-bom2-2.xx.fbcdn.net.", - "sonar-bom2-3.xx.fbcdn.net.", "sonar-bos5-1.xx.fbcdn.net.", "sonar-bru2-1.xx.fbcdn.net.", "sonar-bsb1-1.xx.fbcdn.net.", @@ -6911,18 +7163,18 @@ var FakeECSFQDNs = container.NewMapSet( "sonar-yyz1-1.xx.fbcdn.net.", "sonar-zrh1-1.xx.fbcdn.net.", "sonar.viously.com.", + "songswave.net.", "southafricanorth.api.cognitive.microsoft.com.", "southcarolina.remotepc.com.", "southeastasia.api.cognitive.microsoft.com.", "southindia.api.cognitive.microsoft.com.", - "southwest.quantummetric.com.", "spadsync.com.", "sparteo.com.", "speedtest.cn.", - "spiceworks.com.cdn.cloudflare.net.", "spiny.ai.", "spion.savvy.security.", "splunk.atlassian.net.", + "src-video.cloud.", "src.ebay-us.com.", "srv.datacygnal.io.", "srv00.com.", @@ -6933,23 +7185,23 @@ var FakeECSFQDNs = container.NewMapSet( "ssp.hybrid.ai.", "st-ok-pts.cdn-vk.ru.", "st-ok.cdn-vk.ru.", - "st-premium-v3-univ-srs-win-3744-g3.api.splashtop.com.", + "st-sysupgrade.vivo.com.cn.", + "st50.rcrtv.net.", "stable.dl2.discordapp.net.", - "stape.ai.", - "stappupgrade.vivo.com.cn.", "stardustgod.com.", "starrydyn.com.", "startssl.com.", - "stat.lianmeng.360.cn.", + "stat2.okko.tv.", "statad.ru.", "static-atl3-1.xx.fbcdn.net.", "static-atl3-2.xx.fbcdn.net.", "static-atl3-3.xx.fbcdn.net.", + "static-cse.canva.com.", + "static-den2-1.xx.fbcdn.net.", "static-det1-1.xx.fbcdn.net.", "static-dfw5-1.xx.fbcdn.net.", "static-dfw5-2.xx.fbcdn.net.", "static-dfw5-3.xx.fbcdn.net.", - "static-forms.clink-lists.com.", "static-hou1-1.xx.fbcdn.net.", "static-iad3-1.xx.fbcdn.net.", "static-iad3-2.xx.fbcdn.net.", @@ -6958,6 +7210,7 @@ var FakeECSFQDNs = container.NewMapSet( "static-lga3-1.xx.fbcdn.net.", "static-lga3-2.xx.fbcdn.net.", "static-lga3-3.xx.fbcdn.net.", + "static-lhr6-1.xx.fbcdn.net.", "static-lhr8-1.xx.fbcdn.net.", "static-lhr8-2.xx.fbcdn.net.", "static-mia3-3.xx.fbcdn.net.", @@ -6966,32 +7219,28 @@ var FakeECSFQDNs = container.NewMapSet( "static-ord5-1.xx.fbcdn.net.", "static-ord5-2.xx.fbcdn.net.", "static-ord5-3.xx.fbcdn.net.", + "static-phx1-1.xx.fbcdn.net.", "static-sea1-1.xx.fbcdn.net.", "static-sea5-1.xx.fbcdn.net.", "static-sjc3-1.xx.fbcdn.net.", "static-sjc6-1.xx.fbcdn.net.", "static.avito.ru.", - "static.galaksion.com.", "static.linkr.com.", "static.rustore.ru.", - "stats.norton.com.trafficmanager.net.", + "stats.senty.com.au.", "stats.transitapp.com.", - "stats.vidalytics.com.", "statsig.anthropic.com.", - "stemchristie.rome2rio.com.", "stevemadden.com.", "stg-data-in.ads.heytapmobile.com.", "stg-data.ads.heytapmobi.com.", "stockholm.remotepc.com.", "stocks-analytics-events.apple.com.", + "storage.mbidstorage.com.", "store-cfg-ru.heytapmobile.com.", - "store.vsco.co.", - "stp-live.inside-graph.com.", "str-vcode-tracker-fenghuang-prd-bj.vivo.com.cn.", "streamhub.tech.", "streaming.forexpros.com.", "streetviewpixels-pa.googleapis.com.", - "stripst.com.", "sts.eccmp.com.", "stse02.ultipro.com.", "stsew02.ultipro.com.", @@ -7012,12 +7261,10 @@ var FakeECSFQDNs = container.NewMapSet( "sunmi.com.", "supabase.com.", "superacme.com.", - "superantispyware.com.", "supl.qxwz.com.", "support.powerschool.com.", "sv8.cyberhaven.io.", "sve.cc.", - "svk-native.ru.", "svlive.serraview.com.", "swedencentral.api.cognitive.microsoft.com.", "switch.babybus.com.", @@ -7032,14 +7279,12 @@ var FakeECSFQDNs = container.NewMapSet( "sync.videowalldirect.com.", "syndetics.com.", "systemreportservices.genetec.com.", - "szmyccm.com.", "t-odx.geo2.op-mobile.opera.com.", "t-odx.op-mobile.opera.com.", "t.marketingcloudfx.com.", "t.mookie1.com.", "t.nit.ro.", "t.poki.io.", - "t.rtbwave.com.", "t1.nhentai.net.", "t1.tacdn.com.", "t2.nhentai.net.", @@ -7052,15 +7297,17 @@ var FakeECSFQDNs = container.NewMapSet( "t9674.adipolo.live.", "t99193.adipolo.live.", "tag.winister.app.", + "tagcommander.com.", "tags.natwest.com.", "taipei.remotepc.com.", - "tako22-normal-useast1a.tiktokv.com.", "talkingpts.org.", "tamosplayer.com.", "tampa.remotepc.com.", "tanjingpaas.com.", "tantanapp.com.", "tanx.com.", + "taodocs.com.", + "tapcart.com.cdn.cloudflare.net.", "tapsell.ir.", "tasks.office.com.", "tasks.zoom.us.", @@ -7072,31 +7319,37 @@ var FakeECSFQDNs = container.NewMapSet( "tccprod03.honeywell.com.", "tccprod03.resideo.com.", "tcdnlive.com.", + "tclai.top.", "tclclouds.com.", "tdcservices.tandemdiabetes.com.", "tdm.qq.com.", "teamviewer.com.", "techcrunch.com.", + "technicianapi-westus.classroom.cloud.", "teddymobile.cn.", + "telemetry.canva.com.", "telemetry.savvy.security.", "teleparty.com.", "telephony.goog.", + "tenant-data.apm.appfolio-analytics.com.", "tencent-cloud.com.", "tencent-cloud.net.", "tencentcos.cn.", "tencentmusic.com.", "tenda.com.cn.", - "test.resolver.perfops.net.", + "tendef.com.", + "teo-rum.com.", + "tflexplm.com.", "tgdms.filewave.net.", "tgp.qq.com.", "tgpa.qq.com.", - "themes.shopify.com.", - "thenew.money.", "theoks.net.", "thetvapp.to.", "thinkific.com.", "thm.visa.com.", "thm12.visa.com.", + "thor-graphql.dictionary.com.", + "thumb-v7.xhcdn.com.", "tianwenca.com.", "time-a-b.nist.gov.", "time-a-g.nist.gov.", @@ -7120,7 +7373,6 @@ var FakeECSFQDNs = container.NewMapSet( "time3.aliyun.com.", "time3.google.com.", "time4.google.com.", - "timejs.game.easebar.com.", "timi-esports.qq.com.", "tk.mosspf.com.", "tk.mosspf.net.", @@ -7142,7 +7394,6 @@ var FakeECSFQDNs = container.NewMapSet( "tmx.esfp.c1.vanguard.com.", "tmx.tdbank.com.", "tmx.uptodate.com.", - "tngdigital.com.my.", "tokyo.remotepc.com.", "tongdun.net.", "toronto.remotepc.com.", @@ -7156,14 +7407,17 @@ var FakeECSFQDNs = container.NewMapSet( "trace.qq.com.", "track-eu1.hubspot.com.", "track.mindtos.com.", + "track.rtb-sm.com.", "track.sendlane.com.", "trackedlink.net.", + "trackedweb.net.", + "tracker-b.marketplace-anzu.io.", "tracker-udp.gbitt.info.", + "tracker.dsp.os.medproad.com.", "tracker.filemail.com.", "tracker.grepler.com.", "tracker.hownetwork.xyz.", "tracker.linvk.com.", - "tracker.newtvcdn.com.", "tracker.srv00.com.", "tracker.theoks.net.", "tracker1.bt.moack.co.kr.", @@ -7175,12 +7429,13 @@ var FakeECSFQDNs = container.NewMapSet( "transaccional.saludtotal.com.co.", "translate.brave.com.", "transmitdrs.schwab.com.", + "travelers-api.getyourguide.com.", "traversal.syncromsp.com.", "treas.gov.", "treasury.gov.", "tri.media.", "tribalfusion.com.", - "trk-keingent.com.", + "trilogyhs-my.sharepoint.com.", "trk.bid-algorix.com.", "trpcdn.net.", "truemed.com.", @@ -7189,32 +7444,33 @@ var FakeECSFQDNs = container.NewMapSet( "tsms-dre.security.dbankcloud.com.", "tt.browser.360.cn.", "ttcache.com.", - "ttk2.nbaonlineservice.com.", "ttuhscep.cyberhaven.io.", "tubecup.net.", + "tuhsdk12azus-my.sharepoint.com.", + "tunein.com.cdn.cloudflare.net.", "tunnel.googlezip.net.", "turn.cloudflare.com.", - "tusd1.sharepoint.com.", + "tutubh.com.", "tw.ntp.org.cn.", "tx-cfg-u1.ubixioe.com.", "tydevice.com.", "u-ams.4dex.io.", "u-las.4dex.io.", + "u-web-assets.mercdn.net.", "u.4dex.io.", "uaenorth.api.cognitive.microsoft.com.", "uapi.mp.360.cn.", - "uc.asusappnw.com.", "uc.cn.", "ucloud.com.cn.", "ucweb.com.", "udemycdn.com.", - "udms.zoom.us.", "uhabo.com.", "uk-api.asm.skype.com.", "uk-prod.asyncgw.teams.microsoft.com.", - "ukc-excel-collab.officeapps.live.com.", + "uk.pinterest.com.", "ulikecam.com.", "ulinq.asia.", + "ulta.quantummetric.com.", "ultipro.com.", "ultiprotime.com.", "ultiproworkplace.com.", @@ -7231,8 +7487,8 @@ var FakeECSFQDNs = container.NewMapSet( "updateapp.av380.net.", "updatechannel.sharegate.com.", "updaterservices.genetec.com.", + "updates.sunbeltsoftware.com.", "updatesnl.macrium.com.", - "uphealth.sharepoint.com.", "upravel.com.", "upremium.asia.", "urekamedia.com.", @@ -7247,8 +7503,6 @@ var FakeECSFQDNs = container.NewMapSet( "us-central1-addshoppers-data-production.cloudfunctions.net.", "us-central1-amp-error-reporting.cloudfunctions.net.", "us-central1-bps-oi-production.cloudfunctions.net.", - "us-central1-darden-main.cloudfunctions.net.", - "us-central1-digitalproducts-gabbo.cloudfunctions.net.", "us-central1-ds-specials-dev.cloudfunctions.net.", "us-central1-faro-cloud-proxy-production.cloudfunctions.net.", "us-central1-fsgenergy-shared.cloudfunctions.net.", @@ -7262,32 +7516,27 @@ var FakeECSFQDNs = container.NewMapSet( "us-central1-speechifymobile.cloudfunctions.net.", "us-central1-tranquil-petal-272922.cloudfunctions.net.", "us-central1-wise-arch-107501.cloudfunctions.net.", - "us-chi-anx-r002.router.teamviewer.com.", "us-dal-anx-r001.router.teamviewer.com.", - "us-dal-anx-r002.router.teamviewer.com.", - "us-den-anx-r002.router.teamviewer.com.", - "us-den-anx-r010.router.teamviewer.com.", + "us-dal-anx-r004.router.teamviewer.com.", + "us-dal-gcp-r005.router.teamviewer.com.", + "us-den-anx-r001.router.teamviewer.com.", + "us-den-anx-r004.router.teamviewer.com.", + "us-den-anx-r006.router.teamviewer.com.", + "us-den-anx-r009.router.teamviewer.com.", "us-device-scheduler.ymcs.yealink.com.", "us-device.ymcs.yealink.com.", "us-east4-chkp-gcp-rnd-threat-hunt-box.cloudfunctions.net.", - "us-hnl-anx-r001.router.teamviewer.com.", "us-hnl-anx-r002.router.teamviewer.com.", - "us-mia-anx-r003.router.teamviewer.com.", - "us-mia-anx-r014.router.teamviewer.com.", - "us-njc-anx-r003.router.teamviewer.com.", - "us-njc-anx-r004.router.teamviewer.com.", - "us-njc-anx-r007.router.teamviewer.com.", - "us-njc-anx-r010.router.teamviewer.com.", - "us-njc-anx-r015.router.teamviewer.com.", - "us-njc-anx-r017.router.teamviewer.com.", - "us-njc-anx-r018.router.teamviewer.com.", - "us-njc-anx-r019.router.teamviewer.com.", - "us-pdx-gcp-r001.router.teamviewer.com.", + "us-mia-anx-r012.router.teamviewer.com.", + "us-njc-anx-r012.router.teamviewer.com.", + "us-njc-anx-r014.router.teamviewer.com.", "us-prod.asyncgw.teams.microsoft.com.", "us-spectrum.rcs.telephony.goog.", + "us-was-anx-r012.router.teamviewer.com.", "us-was-anx-r016.router.teamviewer.com.", - "us.a.iteleserve.com.", + "us-was-anx-r019.router.teamviewer.com.", "us.a.qwadro.com.", + "us.dell.com.", "us.galleryapi.micloud.xiaomi.net.", "us.inspi-dsp.com.", "us.keyapi.micloud.xiaomi.net.", @@ -7301,7 +7550,6 @@ var FakeECSFQDNs = container.NewMapSet( "us02nws-platform.zoom.us.", "us02nws.zoom.us.", "us02polling.zoom.us.", - "us02st1.zoom.us.", "us02tasks.zoom.us.", "us02web.zoom.us.", "us02www3.zoom.us.", @@ -7322,13 +7570,11 @@ var FakeECSFQDNs = container.NewMapSet( "us06tasks.zoom.us.", "us06web.zoom.us.", "us06www3.zoom.us.", - "us3-cdn.inside-graph.com.", - "us4-cloud.acronis.com.", "usbank.quantummetric.com.", - "usc-collabrtc-geo.rtc.trafficmanager.net.", "usc.edu.", "usc1.s.seedtag.com.", "use4.s.seedtag.com.", + "useparagon.com.", "user-profile.api.speechify.com.", "usercentrics.eu.", "userstat.net.", @@ -7336,9 +7582,9 @@ var FakeECSFQDNs = container.NewMapSet( "usgs.gov.", "ussav.cynet.com.", "usslb.cynet.com.", - "usv.stape.io.", "usw-aiwit-file-push.oss-us-west-1.aliyuncs.com.", "usw.stape.io.", + "usw1-a.amxrtb.com.", "usw2.s.seedtag.com.", "ut.hzshudian.com.", "ute-tech.com.cn.", @@ -7347,17 +7593,23 @@ var FakeECSFQDNs = container.NewMapSet( "v-key.com.", "v.shopify.com.", "v.vivintsky.com.", + "v19-novel.melolostatic.com.", "v39-ca.tiktokcdn.com.", - "v4.ai.ingka.ikea.net.", + "v5-ali-colda.douyinvod.com.", "v58pq.mpvflv.com.", "v6-gdvod.kwaicdn.com.", "va9265.ci.managedwhitelisting.com.", + "vantive-my.sharepoint.com.", "varify.io.", + "vclient-api-us.smoothwall.com.", + "vclient-api.smoothwall.com.", "vcmdiawe.com.", "vdo.ai.", "velaw.cyberhaven.io.", "venafi.com.", + "ver1.sptvp.com.", "verification.fda.gov.ph.", + "verify.authorize.net.", "verizon.quantummetric.com.", "verticals.wix.com.", "vfa.hpplay.cn.", @@ -7368,7 +7620,9 @@ var FakeECSFQDNs = container.NewMapSet( "vibe.co.", "vibeaconstr.onezapp.com.", "vicoo.tech.", - "vidctf--assets.ro.co.", + "vid.elements.video.", + "video-ams2-1.xx.fbcdn.net.", + "video-ams4-1.xx.fbcdn.net.", "video-atl3-1.xx.fbcdn.net.", "video-atl3-2.xx.fbcdn.net.", "video-atl3-3.xx.fbcdn.net.", @@ -7405,28 +7659,26 @@ var FakeECSFQDNs = container.NewMapSet( "video-sjc3-1.xx.fbcdn.net.", "video-sjc6-1.xx.fbcdn.net.", "video.rainberrytv.com.", - "video.turncdn.com.", - "video.twimg.com.cdn.cloudflare.net.", "videocontent-dra.himovie.dbankcloud.com.", - "videos.typing.com.", "vidmate.net.", "vieon.vn.", - "viircypg.com.", "vik-ca.moonactive.net.", "viki.com.", "viously.com.", "vip.qq.com.", "virgul.com.", "visaforchina.cn.", + "visio.officeapps.live.com.", "visitor.fiftyt.com.", "visitors.live.", "visualwebsiteoptimizer.com.", + "vitality.io.", "vivoglobal.com.", "vlscppe.microsoft.com.", "vmaas.abacusgroupllc.com.", - "vnet-report-7.21cn.com.", "vnt.a-m-p.xyz.", "vnt.woxh.world.", + "vntsnotificationservice.visa.com.cdn.cloudflare.net.", "vod-pro.com.", "vod.newtvcdn.com.", "vod.ngb.haplat.net.", @@ -7440,19 +7692,18 @@ var FakeECSFQDNs = container.NewMapSet( "voice.telephony.goog.", "voya.com.", "vpn1.ocso.com.", - "vpushort-stsdk.vivo.com.cn.", "vsco.co.", + "vssl.com.", "vx9dle.n0qq3z.com.", "vzuu.com.", "w-lb.deepl.com.", "w.deepl.com.", + "w26.cf.2ksports.com.", "w3.mp.lura.live.", "wallet-order-service.shopifyapps.com.", "wangyiyun-js.oss-cn-shanghai.aliyuncs.com.", - "waophoto.com.", "warsaw.remotepc.com.", "washoenv.infinitecampus.org.", - "wayfair-us.attn.tv.", "wayfinding-hub-gateway-atl.ultipro.com.", "wayfinding-hub-gateway-plas1.ultipro.com.", "wc.shopify.com.", @@ -7461,121 +7712,100 @@ var FakeECSFQDNs = container.NewMapSet( "weather-server.allawntech.com.", "weather-widget-events.apple.com.", "weathercn.com.", + "weatherextension.com.", "weatherlive.world.", + "web-assets.stylitics.com.cdn.cloudflare.net.", "web-static.mindbox.ru.", "web.voice.telephony.goog.", "web1.remotepc.com.", "webapi.teamviewer.com.", - "webapi.tresorit.com.", + "webcast-frontier22-normal-alisg.tiktokv.com.", "webmd.com.", - "webserver.chatcora.natwest.com.", "websocket-sp-v6.stripchat.com.", "websocket.app.pdq.com.", - "websocket.org.", "wechatos.net.", "weibocdn.com.", "welcome.ultipro.com.", "wemuslim.com.", "wendys.com.", - "wenke99.com.", "westcentralus.api.cognitive.microsoft.com.", "westeurope.api.cognitive.microsoft.com.", "westus.api.cognitive.microsoft.com.", "westus2.api.cognitive.microsoft.com.", "westus3.api.cognitive.microsoft.com.", "whirlpool.com.", - "whitingturner.sharepoint.com.", - "whizzco.com.", - "whoop-status-worker-prod.whoop.workers.dev.", + "whitehouse.gov.", + "whoami.royadata.io.", + "whoami02.royadata.io.", + "whoami03.royadata.io.", "widget-api.uxfeedback.ru.", + "widgets.guidestar.org.", "windows.policies.live.net.", "windstream.net.", "winscp.net.", "wireless-social.com.", "wkhpe.com.", - "wl.hpyrdr.com.", "wmt.dev.", "wondershare.com.", + "word-edit-geo.wac.trafficmanager.net.", "wordreference.com.", - "workable.com.", "workdaycdn.com.cn.", + "workspaceoneaccess.com.", "worldnic.com.", "worldtimeserver.com.", "wosign.com.", "woxh.world.", "wpk-auth.ucweb.com.", "wpk-sdkv-intl.effirst.com.", + "wpmudev.com.", "wr.moyoung.com.", - "wr.pvp.net.", - "ws-acc-hwp.gamedistribution.com.", "ws-prod-1.optisigns.com.", "ws-prod-2.optisigns.com.", "ws-prod-3.optisigns.com.", "ws.gleap.io.", - "ws.sixpence.ai.", "ws.smartpass.app.", "ws.thales.monumetric.com.", "ws.tildacdn.com.", "wsms.haplat.net.", "wsod.com.", "wsoversea.com.", - "ww2.justanswer.com.", - "www.1024sj.com.", "www.artfut.com.", "www.atlassian.com.", - "www.audio-digest.org.", "www.automizely-analytics.com.", - "www.bistro-la-nature.com.", "www.breitbart.com.", - "www.canva.com.", + "www.catholiccompany.com.", "www.cdn-tinkoff.ru.", "www.chrome.com.", - "www.claudeusercontent.com.", "www.cmpassport.com.", - "www.cnhtcsales.com.", "www.ctmail.com.", - "www.czhuaqiang.com.", - "www.fourth.com.", + "www.dpsdq.com.", + "www.essence.com.", "www.geoplugin.net.", "www.google.org.", - "www.husunward.com.", - "www.ibegin.com.", - "www.indiamart.com.", "www.jimmyjohns.com.", - "www.johnmuirhealth.com.", "www.jrustonapps.net.", - "www.nagumosan.com.", - "www.newegg.com.", - "www.nmpa.gov.cn.", - "www.notion.so.", - "www.opposhop.cn.", - "www.orchidworld.jp.", - "www.otsu-jva.com.", + "www.jsnflowmeter.com.", + "www.myshopify.com.", "www.overleaf.com.", - "www.oxsquare.net.", "www.pingler.com.", - "www.quyou8.com.", + "www.politico.com.cdn.cloudflare.net.", "www.regions.com.", - "www.samsungsds.com.", - "www.sdaonuo.com.", "www.sevenrooms.com.", - "www.static-src.com.", - "www.stdlibrary.com.", + "www.shuaa.om.", + "www.sogou.com.", "www.stevemadden.com.", - "www.thenew.money.", - "www.time.gov.", + "www.studocu.com.", + "www.thesaurus.com.", + "www.thewrap.com.", + "www.tutubh.com.", "www.ute-tech.com.cn.", "www.visaforchina.cn.", - "www.wenke99.com.", "www.whitehouse.gov.", "www.wix.com.", "www.worldtimeserver.com.", "www.yext-pixel.com.", - "www.ymtech-sh.com.", - "www.zmtzlt.com.", "www.zoom.com.", "www.zoom.us.", - "www.ztautoparts.com.", "www1.remotepc.com.", "www19.pointclickcare.com.", "www2-lb.deepl.com.", @@ -7596,45 +7826,35 @@ var FakeECSFQDNs = container.NewMapSet( "xftg.msgny.xyz.", "xhpingcdn.com.", "xhscdn.com.cdn.dnsv1.com.", + "xiaopang.sto.ipidea.online.", "xiaoyi.com.", "xingyouc.com.", "xinqiucc.com.", "xintaicz.cn.", "xmcsrv.net.", "xml.ezmob.com.", - "xml.kunvertads.com.", - "xmpp.displaynote.com.", "xmt.paze.com.", - "xn--pckh8d8a2c4a3j4c.com.", "xsystewideusync.com.", - "xtools.info.", "yalla.live.", "ydmob.com.", "yealink.com.", "ymmobi.com.", - "ymtech-sh.com.", "yomedia.vn.", "yomeno.xyz.", "yosmart.com.", "youlesp.com.", "yp.cdnstream1.com.", "yunxinfw.com.", + "yxfsz.com.", "z.cdn.adtarget.market.", - "z.cdn.ftd.agency.", - "z.cdn.trafficbass.com.", "zenno.services.", "zennolab.com.", - "zhaosw.com.", "zjcdn.com.yangyi19.com.", - "zmtzlt.com.", "zog.link.", - "zoho.uk.", "zoom.us.", - "ztautoparts.com.", "zui.com.", "zuiqiangyingyu.net.", "zurich.remotepc.com.", - "zvuk.com.", - "zxid-m.mobileservice.cn.", + "zybooks.com.", "zztfly.com.", ) diff --git a/internal/ecscache/ecsblocklist_generate.go b/internal/ecscache/ecsblocklist_generate.go index 5571240..576d55c 100644 --- a/internal/ecscache/ecsblocklist_generate.go +++ b/internal/ecscache/ecsblocklist_generate.go @@ -36,6 +36,8 @@ func main() { resp := errors.Must(c.Do(req)) defer slogutil.CloseAndLog(ctx, logger, resp.Body, slog.LevelError) + errors.Check(agdhttp.CheckStatus(resp, http.StatusOK)) + out := errors.Must(os.OpenFile("./ecsblocklist.go", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0o664)) defer slogutil.CloseAndLog(ctx, logger, out, slog.LevelError) @@ -48,8 +50,7 @@ func main() { tmpl := template.Must(template.New("main").Parse(tmplStr)) - err := tmpl.Execute(out, lines) - errors.Check(err) + errors.Check(tmpl.Execute(out, lines)) } // fakeECSBlocklistURL is the default URL from where to get ECS fake domains. diff --git a/internal/ecscache/ecscache.go b/internal/ecscache/ecscache.go index 3d8cef5..393ca4a 100644 --- a/internal/ecscache/ecscache.go +++ b/internal/ecscache/ecscache.go @@ -322,7 +322,7 @@ func (mh *mwHandler) ServeDNS( cr.subnet = netutil.ZeroPrefix(ecsFam) } else { loc := locFromReq(ri) - cr.subnet, err = mw.geoIP.SubnetByLocation(loc, ecsFam) + cr.subnet, err = mw.geoIP.SubnetByLocation(ctx, loc, ecsFam) if err != nil { return fmt.Errorf( "getting subnet for country %s (family: %d): %w", diff --git a/internal/ecscache/ecscache_test.go b/internal/ecscache/ecscache_test.go index d57f019..932ec53 100644 --- a/internal/ecscache/ecscache_test.go +++ b/internal/ecscache/ecscache_test.go @@ -670,6 +670,7 @@ func newWithCache( // TODO(a.garipov): Actually test ASNs once we have the data. geoIP.OnSubnetByLocation = func( + _ context.Context, l *geoip.Location, _ netutil.AddrFamily, ) (n netip.Prefix, err error) { diff --git a/internal/experiment/experiment.go b/internal/experiment/experiment.go index 0076910..9cd8224 100644 --- a/internal/experiment/experiment.go +++ b/internal/experiment/experiment.go @@ -25,7 +25,7 @@ import ( func Init(l *slog.Logger, reg prometheus.Registerer) (err error) { expStr := os.Getenv("EXPERIMENTS") if expStr == "" { - return + return nil } expIDs := stringutil.SplitTrimmed(expStr, ",") diff --git a/internal/filter/custom/custom_test.go b/internal/filter/custom/custom_test.go index 4903ce7..2f19125 100644 --- a/internal/filter/custom/custom_test.go +++ b/internal/filter/custom/custom_test.go @@ -71,7 +71,7 @@ func TestFilter(t *testing.T) { require.True(t, ok) require.NotNil(t, res.NetworkRule) - assert.Equal(t, tc.wantRuleStr, res.NetworkRule.RuleText) + assert.Equal(t, tc.wantRuleStr, res.NetworkRule.Text()) }) } } diff --git a/internal/filter/filterstorage/standardaccess.go b/internal/filter/filterstorage/standardaccess.go index 38e05c0..6f17b10 100644 --- a/internal/filter/filterstorage/standardaccess.go +++ b/internal/filter/filterstorage/standardaccess.go @@ -81,7 +81,10 @@ type StandardAccess struct { // NewStandardAccess creates a new properly initialized standard access. c must // be valid. It uses the latest cached settings if available, use the // [StandardAccess.Refresh] method to update them. -func NewStandardAccess(ctx context.Context, c *StandardAccessConfig) (s *StandardAccess, err error) { +func NewStandardAccess( + ctx context.Context, + c *StandardAccessConfig, +) (s *StandardAccess, err error) { cachePath := filepath.Join(c.CacheDir, indexFileNameStandardProfileAccess) refr, err := refreshable.New(&refreshable.Config{ diff --git a/internal/filter/hashprefix/storage.go b/internal/filter/hashprefix/storage.go index e6c03fa..8f67645 100644 --- a/internal/filter/hashprefix/storage.go +++ b/internal/filter/hashprefix/storage.go @@ -75,6 +75,8 @@ func (s *Storage) Hashes(prefs []Prefix) (hashes []string) { // // The fact that we iterate over the [s.hashSuffixes] map twice shouldn't // matter, since we assume that len(hps) will be below 5 most of the time. + // + // TODO(a.garipov): Reuse in pools. b := &strings.Builder{} b.Grow(l * hashEncLen) diff --git a/internal/filter/hashprefix/storage_test.go b/internal/filter/hashprefix/storage_test.go index 5dfc385..1f79be2 100644 --- a/internal/filter/hashprefix/storage_test.go +++ b/internal/filter/hashprefix/storage_test.go @@ -106,15 +106,14 @@ func BenchmarkStorage_Hashes(b *testing.B) { } // Most recent results: - // - // goos: darwin - // goarch: arm64 + // goos: linux + // goarch: amd64 // pkg: github.com/AdguardTeam/AdGuardDNS/internal/filter/hashprefix - // cpu: Apple M1 Pro - // BenchmarkStorage_Hashes/1-8 10519970 102.7 ns/op 80 B/op 2 allocs/op - // BenchmarkStorage_Hashes/2-8 10045784 118.1 ns/op 80 B/op 2 allocs/op - // BenchmarkStorage_Hashes/3-8 9088449 129.2 ns/op 80 B/op 2 allocs/op - // BenchmarkStorage_Hashes/4-8 8577764 139.4 ns/op 80 B/op 2 allocs/op + // cpu: AMD Ryzen 7 PRO 4750U with Radeon Graphics + // BenchmarkStorage_Hashes/1-16 6934150 174.6 ns/op 80 B/op 2 allocs/op + // BenchmarkStorage_Hashes/2-16 5912390 203.5 ns/op 80 B/op 2 allocs/op + // BenchmarkStorage_Hashes/3-16 5288085 225.6 ns/op 80 B/op 2 allocs/op + // BenchmarkStorage_Hashes/4-16 4613066 259.9 ns/op 80 B/op 2 allocs/op } func BenchmarkStorage_ResetHosts(b *testing.B) { @@ -137,10 +136,9 @@ func BenchmarkStorage_ResetHosts(b *testing.B) { require.NoError(b, err) // Most recent results: - // - // goos: darwin - // goarch: arm64 + // goos: linux + // goarch: amd64 // pkg: github.com/AdguardTeam/AdGuardDNS/internal/filter/hashprefix - // cpu: Apple M1 Pro - // BenchmarkStorage_ResetHosts-8 8610 128756 ns/op 118380 B/op 1009 allocs/op + // cpu: AMD Ryzen 7 PRO 4750U with Radeon Graphics + // BenchmarkStorage_ResetHosts-16 6469 186021 ns/op 118392 B/op 1009 allocs/op } diff --git a/internal/filter/internal/composite/composite_internal_test.go b/internal/filter/internal/composite/composite_internal_test.go index b17068d..91b3442 100644 --- a/internal/filter/internal/composite/composite_internal_test.go +++ b/internal/filter/internal/composite/composite_internal_test.go @@ -39,10 +39,9 @@ func BenchmarkFilter_FilterReqWithRuleLists(b *testing.B) { assert.NotNil(b, result) // Most recent results: - // // goos: linux // goarch: amd64 // pkg: github.com/AdguardTeam/AdGuardDNS/internal/filter/internal/composite // cpu: AMD Ryzen 7 PRO 4750U with Radeon Graphics - // BenchmarkFilter_FilterReqWithRuleLists-16 807964 1904 ns/op 469 B/op 8 allocs/op + // BenchmarkFilter_FilterReqWithRuleLists-16 748243 1394 ns/op 468 B/op 8 allocs/op } diff --git a/internal/filter/internal/composite/result.go b/internal/filter/internal/composite/result.go index 85bc697..57b7ae1 100644 --- a/internal/filter/internal/composite/result.go +++ b/internal/filter/internal/composite/result.go @@ -13,6 +13,8 @@ import ( // urlFilterResultCollector is an entity simplifying the collection and // compilation of urlfilter results. It contains per-pointer indexes of the IDs // of filters producing network and host rules. +// +// TODO(a.garipov): Reuse these structures. type urlFilterResultCollector struct { netRuleIDs map[*rules.NetworkRule]filter.ID hostRuleIDs map[*rules.HostRule]filter.ID @@ -109,7 +111,7 @@ func (c *urlFilterResultCollector) netRuleDataToResult(nr *rules.NetworkRule) (r rule = filter.RuleText(svcID) } else { - rule = filter.RuleText(nr.RuleText) + rule = filter.RuleText(nr.Text()) } if nr.Whitelist { @@ -174,7 +176,7 @@ func (c *urlFilterResultCollector) hostRuleDataToResult(hr *rules.HostRule) (res rule = filter.RuleText(svcID) } else { - rule = filter.RuleText(hr.RuleText) + rule = filter.RuleText(hr.Text()) } return &filter.ResultBlocked{ diff --git a/internal/filter/internal/rulelist/dnsrewrite.go b/internal/filter/internal/rulelist/dnsrewrite.go index bfc6bec..8e163e0 100644 --- a/internal/filter/internal/rulelist/dnsrewrite.go +++ b/internal/filter/internal/rulelist/dnsrewrite.go @@ -23,9 +23,14 @@ func ProcessDNSRewrites( return nil } - dnsRewriteResult := processDNSRewriteRules(dnsr) + // Use a value and not a pointer so that the dnsRewriteResult value stays on + // the stack and not produce an extra allocation. + dnsRwRes := dnsRewriteResult{ + Response: dnsRewriteResultResponse{}, + } + processDNSRewriteRules(dnsr, &dnsRwRes) - if resCanonName := dnsRewriteResult.CanonName; resCanonName != "" { + if resCanonName := dnsRwRes.CanonName; resCanonName != "" { // Rewrite the question name to a matched CNAME. if strings.EqualFold(resCanonName, req.Host) { // A rewrite of a host to itself. @@ -38,24 +43,24 @@ func ProcessDNSRewrites( return &filter.ResultModifiedRequest{ Msg: modReq, List: id, - Rule: dnsRewriteResult.ResRuleText, + Rule: dnsRwRes.ResRuleText, } } - if dnsRewriteResult.RCode != dns.RcodeSuccess { + if dnsRwRes.RCode != dns.RcodeSuccess { // #nosec G115 -- The value of dnsRewriteResult.RCode comes from the // urlfilter package, where it either parsed by [dns.StringToRcode] or // defined statically. - resp := req.Messages.NewBlockedRespRCode(req.DNS, dnsmsg.RCode(dnsRewriteResult.RCode)) + resp := req.Messages.NewBlockedRespRCode(req.DNS, dnsmsg.RCode(dnsRwRes.RCode)) return &filter.ResultModifiedResponse{ Msg: resp, List: id, - Rule: dnsRewriteResult.ResRuleText, + Rule: dnsRwRes.ResRuleText, } } - resp, err := filterDNSRewrite(req, dnsRewriteResult) + resp, err := filterDNSRewrite(req, &dnsRwRes) if err != nil { return nil } @@ -71,7 +76,6 @@ type dnsRewriteResult struct { Response dnsRewriteResultResponse CanonName string ResRuleText filter.RuleText - Rules []*rules.NetworkRule RCode rules.RCode } @@ -79,48 +83,39 @@ type dnsRewriteResult struct { // the server returns. type dnsRewriteResultResponse map[rules.RRType][]rules.RRValue -// processDNSRewriteRules processes DNS rewrite rules in dnsr. The result will -// have either CanonName or RCode or Response set. -// -// TODO(a.garipov): Reuse dnsRewriteResult structures. -func processDNSRewriteRules(dnsr []*rules.NetworkRule) (res *dnsRewriteResult) { - dnsrr := &dnsRewriteResult{ - Response: dnsRewriteResultResponse{}, - } - +// processDNSRewriteRules processes DNS rewrite rules in dnsr. res will have +// either CanonName or RCode or Response set. res and res.Response must not be +// nil. +func processDNSRewriteRules(dnsr []*rules.NetworkRule, res *dnsRewriteResult) { for _, rule := range dnsr { dr := rule.DNSRewrite if dr.NewCNAME != "" { // NewCNAME rules have a higher priority than other rules. - return &dnsRewriteResult{ - ResRuleText: filter.RuleText(rule.RuleText), - CanonName: dr.NewCNAME, - } + res.CanonName = dr.NewCNAME + res.ResRuleText = filter.RuleText(rule.Text()) + + return } - switch dr.RCode { - case dns.RcodeSuccess: - dnsrr.RCode = dr.RCode - dnsrr.Response[dr.RRType] = append(dnsrr.Response[dr.RRType], dr.Value) - dnsrr.Rules = append(dnsrr.Rules, rule) - default: - // RcodeRefused and other such codes have higher priority. Return - // immediately. - return &dnsRewriteResult{ - ResRuleText: filter.RuleText(rule.RuleText), - RCode: dr.RCode, - } + if dr.RCode != dns.RcodeSuccess { + // [dns.RcodeRefused] and other such codes have higher priority. + // Set and return immediately. + res.ResRuleText = filter.RuleText(rule.Text()) + res.RCode = dr.RCode + + return } + + res.Response[dr.RRType] = append(res.Response[dr.RRType], dr.Value) + res.RCode = dr.RCode } - - return dnsrr } // filterDNSRewrite handles dnsrewrite filters. It constructs a DNS response -// and returns it. dnsrr.RCode should be [dns.RcodeSuccess] and contain a -// non-empty dnsrr.Response. -func filterDNSRewrite(req *filter.Request, dnsrr *dnsRewriteResult) (resp *dns.Msg, err error) { - if dnsrr.Response == nil { +// and returns it. req and res must not be nil. res.RCode should be +// [dns.RcodeSuccess] and contain a non-empty Response. +func filterDNSRewrite(req *filter.Request, res *dnsRewriteResult) (resp *dns.Msg, err error) { + if res.Response == nil { return nil, errors.Error("no dns rewrite rule responses") } @@ -130,7 +125,7 @@ func filterDNSRewrite(req *filter.Request, dnsrr *dnsRewriteResult) (resp *dns.M resp = req.Messages.NewBlockedRespRCode(dnsReq, dns.RcodeSuccess) rr := dnsReq.Question[0].Qtype - values := dnsrr.Response[rr] + values := res.Response[rr] for i, v := range values { var ans dns.RR ans, err = filterDNSRewriteResponse(req, rr, v) diff --git a/internal/filter/internal/rulelist/refreshable_test.go b/internal/filter/internal/rulelist/refreshable_test.go index 219c772..1346aa6 100644 --- a/internal/filter/internal/rulelist/refreshable_test.go +++ b/internal/filter/internal/rulelist/refreshable_test.go @@ -132,7 +132,6 @@ func BenchmarkRefreshable_SetURLFilterResult(b *testing.B) { ) ctx := testutil.ContextWithTimeout(b, filtertest.Timeout) - res := &urlfilter.DNSResult{} b.Run("blocked", func(b *testing.B) { req := &urlfilter.DNSRequest{ @@ -141,7 +140,12 @@ func BenchmarkRefreshable_SetURLFilterResult(b *testing.B) { DNSType: dns.TypeA, } - var ok bool + res := &urlfilter.DNSResult{} + + // Warmup to fill the slices. + ok := rl.SetURLFilterResult(ctx, req, res) + require.True(b, ok) + b.ReportAllocs() for b.Loop() { res.Reset() @@ -158,7 +162,12 @@ func BenchmarkRefreshable_SetURLFilterResult(b *testing.B) { DNSType: dns.TypeA, } - var ok bool + res := &urlfilter.DNSResult{} + + // Warmup to fill the slices. + ok := rl.SetURLFilterResult(ctx, req, res) + require.False(b, ok) + b.ReportAllocs() for b.Loop() { res.Reset() @@ -169,11 +178,10 @@ func BenchmarkRefreshable_SetURLFilterResult(b *testing.B) { }) // Most recent results: - // // goos: linux // goarch: amd64 // pkg: github.com/AdguardTeam/AdGuardDNS/internal/filter/internal/rulelist // cpu: AMD Ryzen 7 PRO 4750U with Radeon Graphics - // BenchmarkRefreshable_SetURLFilterResult/blocked-16 1340384 918.6 ns/op 24 B/op 1 allocs/op - // BenchmarkRefreshable_SetURLFilterResult/other-16 2127038 589.3 ns/op 24 B/op 1 allocs/op + // BenchmarkRefreshable_SetURLFilterResult/blocked-16 1352236 887.3 ns/op 24 B/op 1 allocs/op + // BenchmarkRefreshable_SetURLFilterResult/other-16 2772519 432.6 ns/op 24 B/op 1 allocs/op } diff --git a/internal/filter/internal/rulelist/rulelist.go b/internal/filter/internal/rulelist/rulelist.go index d4740d3..81b8b6b 100644 --- a/internal/filter/internal/rulelist/rulelist.go +++ b/internal/filter/internal/rulelist/rulelist.go @@ -96,7 +96,7 @@ func (f *baseFilter) SetURLFilterResult( return false } - shallowCloneInto(res, cachedRes) + cachedRes.ShallowCloneInto(res) return true } @@ -111,7 +111,7 @@ func (f *baseFilter) SetURLFilterResult( if ok { cachedRes = &urlfilter.DNSResult{} - shallowCloneInto(cachedRes, res) + res.ShallowCloneInto(cachedRes) } f.cache.Set(cacheKey, cachedRes) @@ -119,17 +119,6 @@ func (f *baseFilter) SetURLFilterResult( return ok } -// shallowCloneInto sets properties in other, as if making a shallow clone. -// other must not be nil and should be empty or reset using [DNSResult.Reset]. -// -// TODO(a.garipov): Add to urlfilter. -func shallowCloneInto(other, res *urlfilter.DNSResult) { - other.NetworkRule = res.NetworkRule - other.HostRulesV4 = append(other.HostRulesV4, res.HostRulesV4...) - other.HostRulesV6 = append(other.HostRulesV6, res.HostRulesV6...) - other.NetworkRules = append(other.NetworkRules, res.NetworkRules...) -} - // ID returns the filter list ID of this rule list filter, as well as the ID of // the blocked service, if any. func (f *baseFilter) ID() (id filter.ID, svcID filter.BlockedServiceID) { diff --git a/internal/filter/internal/rulelist/rulelist_internal_test.go b/internal/filter/internal/rulelist/rulelist_internal_test.go index df5460b..db472ac 100644 --- a/internal/filter/internal/rulelist/rulelist_internal_test.go +++ b/internal/filter/internal/rulelist/rulelist_internal_test.go @@ -41,7 +41,6 @@ func BenchmarkBaseFilter_SetURLFilterResult(b *testing.B) { const qt = dns.TypeA ctx := context.Background() - res := &urlfilter.DNSResult{} b.Run("blocked", func(b *testing.B) { req := &urlfilter.DNSRequest{ @@ -50,7 +49,12 @@ func BenchmarkBaseFilter_SetURLFilterResult(b *testing.B) { DNSType: qt, } - var ok bool + res := &urlfilter.DNSResult{} + + // Warmup to fill the slices. + ok := f.SetURLFilterResult(ctx, req, res) + require.True(b, ok) + b.ReportAllocs() for b.Loop() { res.Reset() @@ -67,7 +71,12 @@ func BenchmarkBaseFilter_SetURLFilterResult(b *testing.B) { DNSType: qt, } - var ok bool + res := &urlfilter.DNSResult{} + + // Warmup to fill the slices. + ok := f.SetURLFilterResult(ctx, req, res) + require.False(b, ok) + b.ReportAllocs() for b.Loop() { res.Reset() @@ -78,11 +87,10 @@ func BenchmarkBaseFilter_SetURLFilterResult(b *testing.B) { }) // Most recent results: - // // goos: linux // goarch: amd64 // pkg: github.com/AdguardTeam/AdGuardDNS/internal/filter/internal/rulelist // cpu: AMD Ryzen 7 PRO 4750U with Radeon Graphics - // BenchmarkBaseFilter_SetURLFilterResult/blocked-16 906486 1372 ns/op 24 B/op 1 allocs/op - // BenchmarkBaseFilter_SetURLFilterResult/other-16 2203561 609.1 ns/op 24 B/op 1 allocs/op + // BenchmarkBaseFilter_SetURLFilterResult/blocked-16 911409 1315 ns/op 24 B/op 1 allocs/op + // BenchmarkBaseFilter_SetURLFilterResult/other-16 2824462 425.0 ns/op 24 B/op 1 allocs/op } diff --git a/internal/filter/internal/safesearch/safesearch_test.go b/internal/filter/internal/safesearch/safesearch_test.go index bcdb7bf..36d2ea8 100644 --- a/internal/filter/internal/safesearch/safesearch_test.go +++ b/internal/filter/internal/safesearch/safesearch_test.go @@ -146,9 +146,6 @@ func BenchmarkFilter_FilterRequestUF(b *testing.B) { f := newTestFilter(b) b.Run("no_match", func(b *testing.B) { - var res filter.Result - var err error - ctx := testutil.ContextWithTimeout(b, filtertest.Timeout) req := newRequest(b, testOther, qt) @@ -159,20 +156,22 @@ func BenchmarkFilter_FilterRequestUF(b *testing.B) { ufRes := &urlfilter.DNSResult{} + // Warmup to fill the slices. + res, err := f.FilterRequestUF(ctx, req, ufReq, ufRes) + require.NoError(b, err) + require.Nil(b, res) + b.ReportAllocs() for b.Loop() { ufRes.Reset() res, err = f.FilterRequestUF(ctx, req, ufReq, ufRes) } - assert.NoError(b, err) - assert.Nil(b, res) + require.NoError(b, err) + require.Nil(b, res) }) b.Run("ip", func(b *testing.B) { - var res filter.Result - var err error - ctx := testutil.ContextWithTimeout(b, filtertest.Timeout) req := newRequest(b, testEngineWithIP, qt) @@ -183,20 +182,22 @@ func BenchmarkFilter_FilterRequestUF(b *testing.B) { ufRes := &urlfilter.DNSResult{} + // Warmup to fill the slices. + res, err := f.FilterRequestUF(ctx, req, ufReq, ufRes) + require.NoError(b, err) + require.NotNil(b, res) + b.ReportAllocs() for b.Loop() { ufRes.Reset() res, err = f.FilterRequestUF(ctx, req, ufReq, ufRes) } - assert.NoError(b, err) - assert.NotNil(b, res) + require.NoError(b, err) + require.NotNil(b, res) }) b.Run("domain", func(b *testing.B) { - var res filter.Result - var err error - ctx := testutil.ContextWithTimeout(b, filtertest.Timeout) req := newRequest(b, testEngineWithDomain, qt) @@ -207,25 +208,29 @@ func BenchmarkFilter_FilterRequestUF(b *testing.B) { ufRes := &urlfilter.DNSResult{} + // Warmup to fill the slices. + res, err := f.FilterRequestUF(ctx, req, ufReq, ufRes) + require.NoError(b, err) + require.NotNil(b, res) + b.ReportAllocs() for b.Loop() { ufRes.Reset() res, err = f.FilterRequestUF(ctx, req, ufReq, ufRes) } - assert.NoError(b, err) - assert.NotNil(b, res) + require.NoError(b, err) + require.NotNil(b, res) }) // Most recent results: - // - // goos: darwin - // goarch: arm64 - // pkg: github.com/AdguardTeam/AdGuardDNS/internal/filter/internal/safesearch - // cpu: Apple M1 Pro - // BenchmarkFilter_FilterRequestUF/no_match-8 27804783 43.23 ns/op 0 B/op 0 allocs/op - // BenchmarkFilter_FilterRequestUF/ip-8 3136018 382.3 ns/op 672 B/op 11 allocs/op - // BenchmarkFilter_FilterRequestUF/domain-8 4929343 237.8 ns/op 400 B/op 7 allocs/op + // goos: linux + // goarch: amd64 + // pkg: github.com/AdguardTeam/AdGuardDNS/internal/filter/internal/safesearch + // cpu: AMD Ryzen 7 PRO 4750U with Radeon Graphics + // BenchmarkFilter_FilterRequestUF/no_match-16 18863545 62.65 ns/op 0 B/op 0 allocs/op + // BenchmarkFilter_FilterRequestUF/ip-16 1516423 784.0 ns/op 664 B/op 10 allocs/op + // BenchmarkFilter_FilterRequestUF/domain-16 2859573 424.6 ns/op 320 B/op 6 allocs/op } // newTestFilter creates a new [*safesearch.Filter] for testing, and refreshes diff --git a/internal/geoip/asntops_generate.go b/internal/geoip/asntops_generate.go index d1a70bc..1cdea8b 100644 --- a/internal/geoip/asntops_generate.go +++ b/internal/geoip/asntops_generate.go @@ -35,15 +35,13 @@ func main() { resp := errors.Must(c.Do(req)) defer slogutil.CloseAndLog(ctx, logger, resp.Body, slog.LevelError) - err := agdhttp.CheckStatus(resp, http.StatusOK) - errors.Check(err) + errors.Check(agdhttp.CheckStatus(resp, http.StatusOK)) out := errors.Must(os.OpenFile("./asntops.go", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0o664)) defer slogutil.CloseAndLog(ctx, logger, out, slog.LevelError) defaultCountryTopASNs := map[geoip.Country][]geoip.ASN{} - err = json.NewDecoder(resp.Body).Decode(&defaultCountryTopASNs) - errors.Check(err) + errors.Check(json.NewDecoder(resp.Body).Decode(&defaultCountryTopASNs)) // Don't use a *container.MapSet here, because the map is iterated over in // the template. @@ -67,9 +65,7 @@ func main() { } tmpl := template.Must(template.New("main").Parse(tmplStr)) - - err = tmpl.Execute(out, tmplData) - errors.Check(err) + errors.Check(tmpl.Execute(out, tmplData)) } // countriesASNURL is the default URL to get the per-country top ASN statistics diff --git a/internal/geoip/country_generate.go b/internal/geoip/country_generate.go index 3601699..441295f 100644 --- a/internal/geoip/country_generate.go +++ b/internal/geoip/country_generate.go @@ -36,6 +36,8 @@ func main() { resp := errors.Must(c.Do(req)) defer slogutil.CloseAndLog(ctx, logger, resp.Body, slog.LevelError) + errors.Check(agdhttp.CheckStatus(resp, http.StatusOK)) + out := errors.Must(os.OpenFile("./country.go", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0o664)) defer slogutil.CloseAndLog(ctx, logger, out, slog.LevelError) @@ -52,9 +54,7 @@ func main() { }) tmpl := template.Must(template.New("main").Parse(tmplStr)) - - err := tmpl.Execute(out, rows) - errors.Check(err) + errors.Check(tmpl.Execute(out, rows)) } // csvURL is the default URL of the information about country codes. diff --git a/internal/geoip/file.go b/internal/geoip/file.go index 1c47978..3a91990 100644 --- a/internal/geoip/file.go +++ b/internal/geoip/file.go @@ -206,7 +206,11 @@ var _ Interface = (*File)(nil) // subnet is returned. If the information about the most used ASNs is not // available, the first subnet from the country that is broad enough (see // resetCountrySubnets) is chosen. -func (f *File) SubnetByLocation(l *Location, fam netutil.AddrFamily) (n netip.Prefix, err error) { +func (f *File) SubnetByLocation( + _ context.Context, + l *Location, + fam netutil.AddrFamily, +) (n netip.Prefix, err error) { var ctrySubnets countrySubnets var locSubnets locationSubnets @@ -247,10 +251,7 @@ func (f *File) SubnetByLocation(l *Location, fam netutil.AddrFamily) (n netip.Pr // Data implements the Interface interface for *File. If ip is netip.Addr{}, // Data tries to lookup and return the data based on host, unless it's empty. -func (f *File) Data(host string, ip netip.Addr) (l *Location, err error) { - // TODO(e.burkov): Add context to the [Interface] methods. - ctx := context.TODO() - +func (f *File) Data(ctx context.Context, host string, ip netip.Addr) (l *Location, err error) { if ip == (netip.Addr{}) { return f.dataByHost(ctx, host), nil } else if ip.Is4In6() { @@ -425,14 +426,11 @@ func (f *File) resetSubnetMappings( asn *maxminddb.Reader, country *maxminddb.Reader, ) (err error) { - var wg sync.WaitGroup - wg.Add(2) + wg := &sync.WaitGroup{} var locErr, ctryErr error - go func() { - defer wg.Done() - + wg.Go(func() { var ipv4, ipv6 locationSubnets ipv4, ipv6, locErr = f.resetLocationSubnets(ctx, asn, country) @@ -448,11 +446,9 @@ func (f *File) resetSubnetMappings( defer f.mu.Unlock() f.ipv4LocationSubnets, f.ipv6LocationSubnets = ipv4, ipv6 - }() - - go func() { - defer wg.Done() + }) + wg.Go(func() { var ipv4, ipv6 countrySubnets ipv4, ipv6, ctryErr = resetCountrySubnets(ctx, f.logger, country) @@ -466,7 +462,7 @@ func (f *File) resetSubnetMappings( defer f.mu.Unlock() f.ipv4CountrySubnets, f.ipv6CountrySubnets = ipv4, ipv6 - }() + }) wg.Wait() diff --git a/internal/geoip/file_test.go b/internal/geoip/file_test.go index ec58d83..5ead3ca 100644 --- a/internal/geoip/file_test.go +++ b/internal/geoip/file_test.go @@ -43,13 +43,14 @@ func TestFile_Data_cityDB(t *testing.T) { } g := newFile(t, conf) + ctx := testutil.ContextWithTimeout(t, testTimeout) - d, err := g.Data(testHost, testIPWithASN) + d, err := g.Data(ctx, testHost, testIPWithASN) require.NoError(t, err) assert.Equal(t, testASN, d.ASN) - d, err = g.Data(testHost, testIPWithSubdiv) + d, err = g.Data(ctx, testHost, testIPWithSubdiv) require.NoError(t, err) assert.Equal(t, testCtry, d.Country) @@ -71,13 +72,14 @@ func TestFile_Data_countryDB(t *testing.T) { } g := newFile(t, conf) + ctx := testutil.ContextWithTimeout(t, testTimeout) - d, err := g.Data(testHost, testIPWithASN) + d, err := g.Data(ctx, testHost, testIPWithASN) require.NoError(t, err) assert.Equal(t, testASN, d.ASN) - d, err = g.Data(testHost, testIPWithSubdiv) + d, err = g.Data(ctx, testHost, testIPWithSubdiv) require.NoError(t, err) assert.Equal(t, testCtry, d.Country) @@ -100,17 +102,19 @@ func TestFile_Data_hostCache(t *testing.T) { g := newFile(t, conf) - d, err := g.Data(testHost, testIPWithASN) + ctx := testutil.ContextWithTimeout(t, testTimeout) + + d, err := g.Data(ctx, testHost, testIPWithASN) require.NoError(t, err) assert.Equal(t, testASN, d.ASN) - d, err = g.Data(testHost, netip.Addr{}) + d, err = g.Data(ctx, testHost, netip.Addr{}) require.NoError(t, err) assert.Equal(t, testASN, d.ASN) - d, err = g.Data(testOtherHost, netip.Addr{}) + d, err = g.Data(ctx, testOtherHost, netip.Addr{}) require.NoError(t, err) assert.Nil(t, d) @@ -177,12 +181,15 @@ func TestFile_SubnetByLocation(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - ctrySubnet, err := g.SubnetByLocation(&geoip.Location{ - Country: tc.country, - Continent: "", - TopSubdivision: tc.subdiv, - ASN: tc.asn, - }, tc.fam) + ctx := testutil.ContextWithTimeout(t, testTimeout) + ctrySubnet, err := g.SubnetByLocation( + ctx, + &geoip.Location{ + Country: tc.country, + Continent: "", + TopSubdivision: tc.subdiv, + ASN: tc.asn, + }, tc.fam) require.NoError(t, err) assert.Equal(t, tc.want, ctrySubnet) @@ -204,6 +211,7 @@ func BenchmarkFile_Data(b *testing.B) { } g := newFile(b, conf) + ctx := testutil.ContextWithTimeout(b, testTimeout) ipCountry1 := testIPWithCountry @@ -218,7 +226,7 @@ func BenchmarkFile_Data(b *testing.B) { b.Run("cache", func(b *testing.B) { b.ReportAllocs() for b.Loop() { - loc, err = g.Data(testHost, testIPWithASN) + loc, err = g.Data(ctx, testHost, testIPWithASN) } assert.Equal(b, testASN, loc.ASN) @@ -231,9 +239,9 @@ func BenchmarkFile_Data(b *testing.B) { for i := 0; b.Loop(); i++ { // Alternate between the two IPs to force cache misses. if i%2 == 0 { - loc, err = g.Data(testHost, ipCountry1) + loc, err = g.Data(ctx, testHost, ipCountry1) } else { - loc, err = g.Data(testHost, ipCountry2) + loc, err = g.Data(ctx, testHost, ipCountry2) } } diff --git a/internal/geoip/geoip.go b/internal/geoip/geoip.go index 5c76d34..8e8e167 100644 --- a/internal/geoip/geoip.go +++ b/internal/geoip/geoip.go @@ -2,6 +2,7 @@ package geoip import ( + "context" "net/netip" "github.com/AdguardTeam/golibs/netutil" @@ -13,9 +14,13 @@ type Interface interface { // SubnetByLocation returns the default subnet for location, if there is // one. If there isn't, n is an unspecified subnet. fam must be either // [netutil.AddrFamilyIPv4] or [netutil.AddrFamilyIPv6]. - SubnetByLocation(l *Location, fam netutil.AddrFamily) (n netip.Prefix, err error) + SubnetByLocation( + ctx context.Context, + l *Location, + fam netutil.AddrFamily, + ) (n netip.Prefix, err error) // Data returns the GeoIP data for ip. It may use host to get cached GeoIP // data if ip is netip.Addr{}. - Data(host string, ip netip.Addr) (l *Location, err error) + Data(ctx context.Context, host string, ip netip.Addr) (l *Location, err error) } diff --git a/internal/metrics/metrics.go b/internal/metrics/metrics.go index 6f0eab5..7c80780 100644 --- a/internal/metrics/metrics.go +++ b/internal/metrics/metrics.go @@ -124,7 +124,7 @@ func IncrementCond(cond bool, trueCounter, falseCounter prometheus.Counter) { // SetAdditionalInfo does nothing. reg must not be nil. func SetAdditionalInfo(reg prometheus.Registerer, info map[string]string) (err error) { if info == nil { - return + return nil } gauge := prometheus.NewGauge(prometheus.GaugeOpts{ diff --git a/internal/metrics/metrics_test.go b/internal/metrics/metrics_test.go index f728aa8..3640b4c 100644 --- a/internal/metrics/metrics_test.go +++ b/internal/metrics/metrics_test.go @@ -16,7 +16,6 @@ import ( "github.com/AdguardTeam/AdGuardDNS/internal/geoip" "github.com/AdguardTeam/AdGuardDNS/internal/metrics" "github.com/AdguardTeam/AdGuardDNS/internal/profiledb" - "github.com/AdguardTeam/AdGuardDNS/internal/querylog" "github.com/AdguardTeam/AdGuardDNS/internal/rulestat" "github.com/AdguardTeam/AdGuardDNS/internal/tlsconfig" "github.com/AdguardTeam/AdGuardDNS/internal/websvc" @@ -48,7 +47,6 @@ var ( _ geoip.Metrics = (*metrics.GeoIP)(nil) _ hashprefix.Metrics = (*metrics.HashPrefixFilter)(nil) _ profiledb.Metrics = (*metrics.ProfileDB)(nil) - _ querylog.Metrics = (*metrics.QueryLog)(nil) _ rulestat.Metrics = (*metrics.RuleStat)(nil) _ tlsconfig.CustomDomainDBMetrics = (*metrics.CustomDomainDB)(nil) _ tlsconfig.ManagerMetrics = (*metrics.TLSConfigManager)(nil) diff --git a/internal/metrics/querylog.go b/internal/metrics/querylog.go index deaf1ab..af8a466 100644 --- a/internal/metrics/querylog.go +++ b/internal/metrics/querylog.go @@ -5,6 +5,7 @@ import ( "fmt" "time" + "github.com/AdguardTeam/AdGuardDNS/internal/querylog" "github.com/AdguardTeam/golibs/container" "github.com/AdguardTeam/golibs/errors" "github.com/c2h5oh/datasize" @@ -82,19 +83,17 @@ func NewQueryLog(namespace string, reg prometheus.Registerer) (m *QueryLog, err return m, nil } -// IncrementItemsCount implements the [querylog.Metrics] interface for -// *QueryLog. -func (m *QueryLog) IncrementItemsCount(_ context.Context) { - m.itemsTotal.Inc() -} +// type check +var _ querylog.Metrics = (*QueryLog)(nil) // ObserveItemSize implements the [querylog.Metrics] interface for *QueryLog. func (m *QueryLog) ObserveItemSize(_ context.Context, size datasize.ByteSize) { m.itemSize.Observe(float64(size)) } -// ObserveWriteDuration implements the [querylog.Metrics] interface for +// ObserveWrite implements the [querylog.Metrics] interface for // *QueryLog. -func (m *QueryLog) ObserveWriteDuration(_ context.Context, dur time.Duration) { +func (m *QueryLog) ObserveWrite(_ context.Context, dur time.Duration) { + m.itemsTotal.Inc() m.writeDuration.Observe(dur.Seconds()) } diff --git a/internal/metrics/tlsconfig.go b/internal/metrics/tlsconfig.go index 60ef990..6858f84 100644 --- a/internal/metrics/tlsconfig.go +++ b/internal/metrics/tlsconfig.go @@ -284,16 +284,13 @@ func matchServerNames(sni string, devDomains []string, srvCerts []*tls.Certifica // matchDeviceDomains matches sni to device domains. func matchDeviceDomains(sni string, domains []string) (matchedDomain string) { - matchedDomain = "" for _, domain := range domains { if netutil.IsImmediateSubdomain(sni, domain) { - matchedDomain = domain - - break + return domain } } - return matchedDomain + return "" } // matchSrvCerts matches sni to DNSNames in srvCerts. diff --git a/internal/profiledb/default.go b/internal/profiledb/default.go index 43f137b..3c960d0 100644 --- a/internal/profiledb/default.go +++ b/internal/profiledb/default.go @@ -293,7 +293,7 @@ func (db *Default) setProfileCerts(ctx context.Context, p *agd.Profile) (err err if !cd.Enabled { // Assume that the expired pending paths are cleaned up either by // [db.IsValidWellKnownRequest] or in a full sync. - return + return nil } var errs []error diff --git a/internal/profiledb/internal/filecachepb/filecachepb.go b/internal/profiledb/internal/filecachepb/filecachepb.go index 189d8fa..5d7acb2 100644 --- a/internal/profiledb/internal/filecachepb/filecachepb.go +++ b/internal/profiledb/internal/filecachepb/filecachepb.go @@ -287,8 +287,9 @@ func (x *CustomDomainConfig) toInternal() (c *agd.CustomDomainConfig, err error) state = &agd.CustomDomainStateCurrent{ NotBefore: s.StateCurrent.NotBefore.AsTime(), NotAfter: s.StateCurrent.NotAfter.AsTime(), - CertName: s.StateCurrent.CertName, - Enabled: s.StateCurrent.Enabled, + // Consider certificate names to have been prevalidated. + CertName: agd.CertificateName(s.StateCurrent.CertName), + Enabled: s.StateCurrent.Enabled, } case *CustomDomainConfig_StatePending_: state = &agd.CustomDomainStatePending{ @@ -524,7 +525,7 @@ func customDomainConfigsToProtobuf( curr := &CustomDomainConfig_StateCurrent{ NotBefore: timestamppb.New(s.NotBefore), NotAfter: timestamppb.New(s.NotAfter), - CertName: s.CertName, + CertName: string(s.CertName), Enabled: s.Enabled, } diff --git a/internal/querylog/fs.go b/internal/querylog/fs.go index 79e6079..46a8d1d 100644 --- a/internal/querylog/fs.go +++ b/internal/querylog/fs.go @@ -22,7 +22,7 @@ import ( "github.com/c2h5oh/datasize" ) -// FileSystemConfig is the configuration of the file system query log. All +// FileSystemConfig is the configuration of the filesystem query log. All // fields must not be empty. type FileSystemConfig struct { // Logger is used for debug logging. It must not be nil. @@ -32,6 +32,11 @@ type FileSystemConfig struct { // not be nil. Metrics Metrics + // Semaphore is used to limit the number of simultaneous writes. This is + // important to prevent excessive thread creation arising from i/o latency + // issues. It must not be nil. + Semaphore syncutil.Semaphore + // Path is the path to the log file. It must not be empty. Path string @@ -46,27 +51,24 @@ type entryBuffer struct { buf *bytes.Buffer } -// FileSystem is the file system implementation of the AdGuard DNS query log. +// FileSystem is the filesystem implementation of the AdGuard DNS query log. type FileSystem struct { - // logger is used for debug logging. - logger *slog.Logger - // bufferPool is a pool with [*entryBuffer] instances used to avoid extra // allocations when serializing query log items to JSON and writing them. bufferPool *syncutil.Pool[entryBuffer] + logger *slog.Logger + // rng is used to generate random numbers for the "rn" property in the // resulting JSON. rng *rand.Rand - // metrics is used for the collection of the query log statistics. metrics Metrics - - // path is the path to the query log file. - path string + sema syncutil.Semaphore + path string } -// NewFileSystem creates a new file system query log. The log is safe for +// NewFileSystem creates a new filesystem query log. The log is safe for // concurrent use. c must not be nil. func NewFileSystem(c *FileSystemConfig) (l *FileSystem) { src := rand.NewChaCha8(c.RandSeed) @@ -83,6 +85,7 @@ func NewFileSystem(c *FileSystemConfig) (l *FileSystem) { }), rng: rng, metrics: c.Metrics, + sema: c.Semaphore, path: c.Path, } } @@ -104,10 +107,13 @@ func (l *FileSystem) Write(ctx context.Context, e *Entry) (err error) { }() startTime := time.Now() - defer func() { - l.metrics.ObserveWriteDuration(ctx, time.Since(startTime)) - l.metrics.IncrementItemsCount(ctx) - }() + defer func() { l.metrics.ObserveWrite(ctx, time.Since(startTime)) }() + + err = l.sema.Acquire(ctx) + if err != nil { + return fmt.Errorf("acquiring semaphore: %w", err) + } + defer l.sema.Release() entBuf := l.bufferPool.Get() defer l.bufferPool.Put(entBuf) @@ -141,8 +147,7 @@ func (l *FileSystem) Write(ctx context.Context, e *Entry) (err error) { RemoteIP: remoteIP, } - var f *os.File - f, err = os.OpenFile(l.path, agd.DefaultWOFlags, agd.DefaultPerm) + f, err := os.OpenFile(l.path, agd.DefaultWOFlags, agd.DefaultPerm) if err != nil { return fmt.Errorf("opening query log file: %w", err) } diff --git a/internal/querylog/fs_test.go b/internal/querylog/fs_test.go index 41b539a..7be47c1 100644 --- a/internal/querylog/fs_test.go +++ b/internal/querylog/fs_test.go @@ -10,6 +10,7 @@ import ( "github.com/AdguardTeam/AdGuardDNS/internal/geoip" "github.com/AdguardTeam/AdGuardDNS/internal/querylog" "github.com/AdguardTeam/golibs/logutil/slogutil" + "github.com/AdguardTeam/golibs/syncutil" "github.com/miekg/dns" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -20,10 +21,11 @@ func TestFileSystem_Write(t *testing.T) { require.NoError(t, err) l := querylog.NewFileSystem(&querylog.FileSystemConfig{ - Logger: slogutil.NewDiscardLogger(), - Metrics: querylog.EmptyMetrics{}, - Path: f.Name(), - RandSeed: [32]byte{}, + Logger: slogutil.NewDiscardLogger(), + Metrics: querylog.EmptyMetrics{}, + Semaphore: syncutil.EmptySemaphore{}, + Path: f.Name(), + RandSeed: [32]byte{}, }) ctx := context.Background() @@ -110,10 +112,11 @@ func BenchmarkFileSystem_Write_file(b *testing.B) { require.NoError(b, err) l := querylog.NewFileSystem(&querylog.FileSystemConfig{ - Logger: slogutil.NewDiscardLogger(), - Metrics: querylog.EmptyMetrics{}, - Path: f.Name(), - RandSeed: [32]byte{}, + Logger: slogutil.NewDiscardLogger(), + Metrics: querylog.EmptyMetrics{}, + Semaphore: syncutil.EmptySemaphore{}, + Path: f.Name(), + RandSeed: [32]byte{}, }) e := testEntry() diff --git a/internal/querylog/metrics.go b/internal/querylog/metrics.go index ced2031..043bfd5 100644 --- a/internal/querylog/metrics.go +++ b/internal/querylog/metrics.go @@ -10,15 +10,12 @@ import ( // Metrics is an interface that is used for the collection of the query log // statistics. type Metrics interface { - // IncrementItemsCount increments the total number of query log entries - // written. - IncrementItemsCount(ctx context.Context) - // ObserveItemSize stores the size of written query log entry. ObserveItemSize(ctx context.Context, size datasize.ByteSize) - // ObserveWriteDuration stores the duration of the write operation. - ObserveWriteDuration(ctx context.Context, dur time.Duration) + // ObserveWrite stores the duration of the write operation and increments + // the write counter. + ObserveWrite(ctx context.Context, dur time.Duration) } // EmptyMetrics is the implementation of the [Metrics] interface that does @@ -28,11 +25,8 @@ type EmptyMetrics struct{} // type check var _ Metrics = EmptyMetrics{} -// IncrementItemsCount implements the [Metrics] interface for EmptyMetrics. -func (EmptyMetrics) IncrementItemsCount(_ context.Context) {} - // ObserveItemSize implements the [Metrics] interface for EmptyMetrics. func (EmptyMetrics) ObserveItemSize(_ context.Context, _ datasize.ByteSize) {} -// ObserveWriteDuration implements the [Metrics] interface for EmptyMetrics. -func (EmptyMetrics) ObserveWriteDuration(_ context.Context, _ time.Duration) {} +// ObserveWrite implements the [Metrics] interface for EmptyMetrics. +func (EmptyMetrics) ObserveWrite(_ context.Context, _ time.Duration) {} diff --git a/internal/tlsconfig/certstorage.go b/internal/tlsconfig/certindex.go similarity index 76% rename from internal/tlsconfig/certstorage.go rename to internal/tlsconfig/certindex.go index 60d8921..483642a 100644 --- a/internal/tlsconfig/certstorage.go +++ b/internal/tlsconfig/certindex.go @@ -16,11 +16,11 @@ type certPaths struct { isCustom bool } -// certStorage holds TLS certificates and their associated file paths. Each -// entry in the slices corresponds to a certificate and its respective paths for -// the certificate and key files. Using this struct allows us to reduce +// certIndex holds TLS certificates and their associated file paths. Each entry +// in the slices corresponds to a certificate and its respective paths for the +// certificate and key files. Using this struct allows us to reduce // allocations. -type certStorage struct { +type certIndex struct { // certs contains the list of TLS certificates. All elements must not be // nil. certs []*tls.Certificate @@ -32,21 +32,21 @@ type certStorage struct { // add saves the TLS certificate and its paths. Certificate paths must only be // added once, see [certStorage.contains]. cert and cp must not be nil. -func (s *certStorage) add(cert *tls.Certificate, cp *certPaths) { +func (s *certIndex) add(cert *tls.Certificate, cp *certPaths) { s.certs = append(s.certs, cert) s.paths = append(s.paths, cp) } // contains returns true if the TLS certificate has already been added using the // provided file paths. cp must not be nil. -func (s *certStorage) contains(cp *certPaths) (ok bool) { +func (s *certIndex) contains(cp *certPaths) (ok bool) { return slices.ContainsFunc(s.paths, func(p *certPaths) (found bool) { return *cp == *p }) } // count returns the number of saved TLS certificates. -func (s *certStorage) count() (n int) { +func (s *certIndex) count() (n int) { return len(s.certs) } @@ -59,7 +59,7 @@ func (s *certStorage) count() (n int) { // // TODO(a.garipov): Explore the above situation and consider fixes to allow // custom IP-only certs. -func (s *certStorage) certFor(chi *tls.ClientHelloInfo) (cert *tls.Certificate, err error) { +func (s *certIndex) certFor(chi *tls.ClientHelloInfo) (cert *tls.Certificate, err error) { var errs []error for _, c := range s.certs { err = chi.SupportsCertificate(c) @@ -75,7 +75,7 @@ func (s *certStorage) certFor(chi *tls.ClientHelloInfo) (cert *tls.Certificate, // rangeFn calls fn for each stored TLS certificate and its paths. fn must not // be nil. Neither cert nor cp must be modified. -func (s *certStorage) rangeFn(fn func(cert *tls.Certificate, cp *certPaths) (cont bool)) { +func (s *certIndex) rangeFn(fn func(cert *tls.Certificate, cp *certPaths) (cont bool)) { for i, p := range s.paths { if !fn(s.certs[i], p) { return @@ -84,7 +84,7 @@ func (s *certStorage) rangeFn(fn func(cert *tls.Certificate, cp *certPaths) (con } // remove deletes the certificate from s. cp must not be nil. -func (s *certStorage) remove(cp *certPaths) { +func (s *certIndex) remove(cp *certPaths) { i := slices.IndexFunc(s.paths, func(p *certPaths) (found bool) { return *cp == *p }) @@ -97,7 +97,7 @@ func (s *certStorage) remove(cp *certPaths) { } // stored returns the list of saved TLS certificates. -func (s *certStorage) stored() (certs []*tls.Certificate) { +func (s *certIndex) stored() (certs []*tls.Certificate) { return s.certs } @@ -106,7 +106,7 @@ func (s *certStorage) stored() (certs []*tls.Certificate) { // // TODO(a.garipov): Think of a better way to do this that doesn't involve code // that looks like iterator invalidation. -func (s *certStorage) update(cp *certPaths, c *tls.Certificate) (ok bool) { +func (s *certIndex) update(cp *certPaths, c *tls.Certificate) (ok bool) { for i, p := range s.paths { if *cp == *p { s.certs[i] = c diff --git a/internal/tlsconfig/certstorage_internal_test.go b/internal/tlsconfig/certindex_internal_test.go similarity index 73% rename from internal/tlsconfig/certstorage_internal_test.go rename to internal/tlsconfig/certindex_internal_test.go index 8a0e3de..4799b7e 100644 --- a/internal/tlsconfig/certstorage_internal_test.go +++ b/internal/tlsconfig/certindex_internal_test.go @@ -9,7 +9,7 @@ import ( "github.com/stretchr/testify/require" ) -func TestCertStorage(t *testing.T) { +func TestCertIndex(t *testing.T) { const ( domainA = "a.com" domainB = "b.org" @@ -51,19 +51,19 @@ func TestCertStorage(t *testing.T) { paths: pathsDomainB, }} - s := &certStorage{} + idx := &certIndex{} for _, cp := range certWithPaths { - s.add(cp.cert, cp.paths) + idx.add(cp.cert, cp.paths) } - assert.True(t, s.contains(pathsDomainA)) + assert.True(t, idx.contains(pathsDomainA)) copyPathsDomainsB := *pathsDomainB - assert.True(t, s.contains(©PathsDomainsB)) - assert.False(t, s.contains(nonAddedPaths)) - assert.Equal(t, len(certWithPaths), s.count()) + assert.True(t, idx.contains(©PathsDomainsB)) + assert.False(t, idx.contains(nonAddedPaths)) + assert.Equal(t, len(certWithPaths), idx.count()) - got, err := s.certFor(&tls.ClientHelloInfo{ + got, err := idx.certFor(&tls.ClientHelloInfo{ ServerName: domainA, SupportedVersions: []uint16{tls.VersionTLS13}, }) @@ -71,17 +71,17 @@ func TestCertStorage(t *testing.T) { assert.Equal(t, certDomainA, got) - got, err = s.certFor(&tls.ClientHelloInfo{ + got, err = idx.certFor(&tls.ClientHelloInfo{ ServerName: domainB, SupportedVersions: []uint16{tls.VersionTLS13}, }) require.NoError(t, err) assert.Equal(t, certDomainB, got) - assert.Equal(t, []*tls.Certificate{certDomainA, certDomainB}, s.stored()) + assert.Equal(t, []*tls.Certificate{certDomainA, certDomainB}, idx.stored()) i := 0 - s.rangeFn(func(c *tls.Certificate, cp *certPaths) (cont bool) { + idx.rangeFn(func(c *tls.Certificate, cp *certPaths) (cont bool) { assert.Equal(t, certWithPaths[i].cert, c) assert.Equal(t, certWithPaths[i].paths, cp) diff --git a/internal/tlsconfig/customdomaindb.go b/internal/tlsconfig/customdomaindb.go index 5d090bf..5b59c8b 100644 --- a/internal/tlsconfig/customdomaindb.go +++ b/internal/tlsconfig/customdomaindb.go @@ -176,7 +176,7 @@ func (db *CustomDomainDB) AddCertificate( func (db *CustomDomainDB) removeCertData( ctx context.Context, l *slog.Logger, - certName string, + certName agd.CertificateName, profID agd.ProfileID, domains []string, reason string, @@ -228,9 +228,9 @@ const ( ) // cachePaths returns the cache paths for the given certificate name. -func (db *CustomDomainDB) cachePaths(certName string) (certPath, keyPath string) { - certPath = filepath.Join(db.cacheDir, certName+".crt.pem") - keyPath = filepath.Join(db.cacheDir, certName+".key.pem") +func (db *CustomDomainDB) cachePaths(certName agd.CertificateName) (certPath, keyPath string) { + certPath = filepath.Join(db.cacheDir, string(certName)+".crt.pem") + keyPath = filepath.Join(db.cacheDir, string(certName)+".key.pem") return certPath, keyPath } @@ -345,8 +345,8 @@ var _ service.Refresher = (*CustomDomainDB)(nil) // Refresh implements the [service.Refresher] interface for *CustomDomainDB. // Refresh will retry network and ratelimiting errors. func (db *CustomDomainDB) Refresh(ctx context.Context) (err error) { - var updatedCertNames []string - retries := map[string]*customDomainRetry{} + var updatedCertNames []agd.CertificateName + retries := map[agd.CertificateName]*customDomainRetry{} func() { db.customCertsMu.Lock() defer db.customCertsMu.Unlock() @@ -403,7 +403,7 @@ func (db *CustomDomainDB) Refresh(ctx context.Context) (err error) { // true, refreshCert should be retried later. func (db *CustomDomainDB) refreshCert( ctx context.Context, - certName string, + certName agd.CertificateName, ) (needsRetry bool, err error) { l := db.logger.With("cert_name", certName) @@ -527,7 +527,7 @@ func (db *CustomDomainDB) certDataToPEM( // filesystem. Errors are logged and reported to Sentry. func (db *CustomDomainDB) needsRefresh( ctx context.Context, - certName string, + certName agd.CertificateName, certPath string, keyPath string, ) (ok bool) { @@ -567,8 +567,8 @@ func (db *CustomDomainDB) needsRefresh( // addRetry adds the certificate into the retry map. retries must not be nil. func (db *CustomDomainDB) addRetry( ctx context.Context, - retries map[string]*customDomainRetry, - certName string, + retries map[agd.CertificateName]*customDomainRetry, + certName agd.CertificateName, now time.Time, ) { db.logger.DebugContext(ctx, "retrying later", "cert_name", certName) @@ -590,7 +590,7 @@ func (db *CustomDomainDB) addRetry( // are reported to db.errColl and logged. func (db *CustomDomainDB) performRetries( ctx context.Context, - retries map[string]*customDomainRetry, + retries map[agd.CertificateName]*customDomainRetry, now time.Time, ) { var errs []error diff --git a/internal/tlsconfig/customdomaindb_test.go b/internal/tlsconfig/customdomaindb_test.go index 70c623b..0c9931d 100644 --- a/internal/tlsconfig/customdomaindb_test.go +++ b/internal/tlsconfig/customdomaindb_test.go @@ -27,7 +27,7 @@ import ( ) // testCertName is the common certificate name for tests. -const testCertName = "cert1234" +const testCertName agd.CertificateName = "cert1234" // testProfileID is the common profile ID for tests. const testProfileID agd.ProfileID = "prof1234" @@ -468,7 +468,10 @@ func TestCustomDomainDB_Match_futureCert(t *testing.T) { // testCustomDomainStorage is the [tlsconfig.CustomDomainStorage] for tests. type testCustomDomainStorage struct { - onCertificateData func(ctx context.Context, certName string) (cert, key []byte, err error) + onCertificateData func( + ctx context.Context, + certName agd.CertificateName, + ) (cert, key []byte, err error) } // type check @@ -478,7 +481,7 @@ var _ tlsconfig.CustomDomainStorage = (*testCustomDomainStorage)(nil) // *testCustomDomainStorage func (s *testCustomDomainStorage) CertificateData( ctx context.Context, - certName string, + certName agd.CertificateName, ) (cert, key []byte, err error) { return s.onCertificateData(ctx, certName) } @@ -573,7 +576,10 @@ func TestCustomDomainDB_Refresh(t *testing.T) { t.Parallel() strg := &testCustomDomainStorage{ - onCertificateData: func(ctx context.Context, certName string) (cert, key []byte, err error) { + onCertificateData: func( + ctx context.Context, + certName agd.CertificateName, + ) (cert, key []byte, err error) { assert.Equal(t, testCertName, certName) certDER, rsaKey := newCertAndKey(t, 1) @@ -662,8 +668,8 @@ func TestCustomDomainDB_Refresh(t *testing.T) { // newCertAndKeyPaths is a helper that returns paths for the certificate and // the key using the test's temporary directory. func newCertAndKeyPaths(cacheDir string) (certPath, keyPath string) { - return filepath.Join(cacheDir, testCertName+tlsconfig.CustomDomainCertExt), - filepath.Join(cacheDir, testCertName+tlsconfig.CustomDomainKeyExt) + return filepath.Join(cacheDir, string(testCertName)+tlsconfig.CustomDomainCertExt), + filepath.Join(cacheDir, string(testCertName)+tlsconfig.CustomDomainKeyExt) } func TestCustomDomainDB_Refresh_retry(t *testing.T) { @@ -693,7 +699,7 @@ func TestCustomDomainDB_Refresh_retry(t *testing.T) { strg := &testCustomDomainStorage{ onCertificateData: func( ctx context.Context, - certName string, + certName agd.CertificateName, ) (cert, key []byte, err error) { if !shouldCall { panic(testutil.UnexpectedCall(ctx, certName)) @@ -793,7 +799,7 @@ func TestCustomDomainDB_Refresh_present(t *testing.T) { Storage: &testCustomDomainStorage{ onCertificateData: func( ctx context.Context, - certName string, + certName agd.CertificateName, ) (cert, key []byte, err error) { assert.Equal(t, testCertName, certName) diff --git a/internal/tlsconfig/customdomainindex.go b/internal/tlsconfig/customdomainindex.go index abb087b..3126c82 100644 --- a/internal/tlsconfig/customdomainindex.go +++ b/internal/tlsconfig/customdomainindex.go @@ -16,10 +16,10 @@ import ( // customDomainIndex optimizes the search for custom-domain data. type customDomainIndex struct { // changed is the set of names of certificates that need updating. - changed *container.SortedSliceSet[string] + changed *container.SortedSliceSet[agd.CertificateName] // retries contains the data for retrying refreshes of custom-domain data. - retries map[string]*customDomainRetry + retries map[agd.CertificateName]*customDomainRetry // data is the mapping of custom domain or wildcard suffix to records that // relate to it. The key must be a valid domain name, not a wildcard. @@ -30,9 +30,9 @@ type customDomainIndex struct { // newCustomDomainIndex returns a new properly initialized *customDomainIndex. func newCustomDomainIndex() (idx *customDomainIndex) { return &customDomainIndex{ - changed: container.NewSortedSliceSet[string](), + changed: container.NewSortedSliceSet[agd.CertificateName](), + retries: map[agd.CertificateName]*customDomainRetry{}, data: map[string][]*customDomainIndexItem{}, - retries: map[string]*customDomainRetry{}, } } @@ -52,7 +52,7 @@ type customDomainIndexItem struct { // certName is the unique name for fetching the actual certificate data. It // must not be empty. - certName string + certName agd.CertificateName // domain is the original domain name or wildcard from which the domain // pattern has been derived. It must be a valid domain name or wildcard. @@ -205,7 +205,7 @@ func (idx *customDomainIndex) match( func (idx *customDomainIndex) remove( ctx context.Context, l *slog.Logger, - certName string, + certName agd.CertificateName, profID agd.ProfileID, domains []string, ) { diff --git a/internal/tlsconfig/customdomainstorage.go b/internal/tlsconfig/customdomainstorage.go index bbb5dd3..7f74fd3 100644 --- a/internal/tlsconfig/customdomainstorage.go +++ b/internal/tlsconfig/customdomainstorage.go @@ -3,6 +3,7 @@ package tlsconfig import ( "context" + "github.com/AdguardTeam/AdGuardDNS/internal/agd" "github.com/AdguardTeam/golibs/errors" ) @@ -12,7 +13,7 @@ type CustomDomainStorage interface { // CertificateData returns the certificate data for the name. If err is // nil, cert and key must not be nil. If the certificate could not be // found, err must contain [ErrCertificateNotFound]. - CertificateData(ctx context.Context, name string) (cert, key []byte, err error) + CertificateData(ctx context.Context, name agd.CertificateName) (cert, key []byte, err error) } // ErrCertificateNotFound is returned (optionally wrapped) by @@ -31,7 +32,7 @@ var _ CustomDomainStorage = EmptyCustomDomainStorage{} // EmptyCustomDomainStorage func (EmptyCustomDomainStorage) CertificateData( _ context.Context, - _ string, + _ agd.CertificateName, ) (_, _ []byte, _ error) { return nil, nil, nil } diff --git a/internal/tlsconfig/manager.go b/internal/tlsconfig/manager.go index 442d47c..311dedc 100644 --- a/internal/tlsconfig/manager.go +++ b/internal/tlsconfig/manager.go @@ -91,7 +91,7 @@ type DefaultManager struct { errColl errcoll.Interface metrics ManagerMetrics tickDB TicketDB - certStorage *certStorage + idx *certIndex original *tls.Config clones []*tls.Config clonesWithMetrics []*tls.Config @@ -110,12 +110,12 @@ func NewDefaultManager(c *DefaultManagerConfig) (m *DefaultManager, err error) { } m = &DefaultManager{ - mu: &sync.Mutex{}, - logger: c.Logger, - errColl: c.ErrColl, - metrics: c.Metrics, - tickDB: c.TicketDB, - certStorage: &certStorage{}, + mu: &sync.Mutex{}, + logger: c.Logger, + errColl: c.ErrColl, + metrics: c.Metrics, + tickDB: c.TicketDB, + idx: &certIndex{}, } m.original = &tls.Config{ @@ -147,7 +147,7 @@ func (m *DefaultManager) Add( m.mu.Lock() defer m.mu.Unlock() - if m.certStorage.contains(cp) { + if m.idx.contains(cp) { m.logger.InfoContext( ctx, "skipping already added certificate", @@ -164,7 +164,7 @@ func (m *DefaultManager) Add( return fmt.Errorf("adding certificate: %w", err) } - m.certStorage.add(cert, cp) + m.idx.add(cert, cp) m.logger.InfoContext( ctx, @@ -214,11 +214,11 @@ func (m *DefaultManager) getCertificate(chi *tls.ClientHelloInfo) (c *tls.Certif m.mu.Lock() defer m.mu.Unlock() - if m.certStorage.count() == 0 { + if m.idx.count() == 0 { return nil, errors.Error("no certificates") } - return m.certStorage.certFor(chi) + return m.idx.certFor(chi) } // CloneWithMetrics implements the [Manager] interface for *DefaultManager. @@ -240,7 +240,7 @@ func (m *DefaultManager) CloneWithMetrics( proto, srvName, deviceDomains, - m.certStorage.stored(), + m.idx.stored(), ) m.clonesWithMetrics = append(m.clonesWithMetrics, clone) @@ -266,7 +266,7 @@ func (m *DefaultManager) Refresh(ctx context.Context) (err error) { defer m.mu.Unlock() var errs []error - m.certStorage.rangeFn(func(_ *tls.Certificate, cp *certPaths) (cont bool) { + m.idx.rangeFn(func(_ *tls.Certificate, cp *certPaths) (cont bool) { cert, loadErr := m.load(ctx, cp) if err != nil { errs = append(errs, loadErr) @@ -275,7 +275,7 @@ func (m *DefaultManager) Refresh(ctx context.Context) (err error) { } msg, lvl := "refreshed certificate", slog.LevelInfo - if !m.certStorage.update(cp, cert) { + if !m.idx.update(cp, cert) { msg, lvl = "certificate did not refresh", slog.LevelWarn } @@ -289,7 +289,7 @@ func (m *DefaultManager) Refresh(ctx context.Context) (err error) { return fmt.Errorf("refreshing tls certificates: %w", err) } - m.logger.InfoContext(ctx, "refresh successful", "num_configs", m.certStorage.count()) + m.logger.InfoContext(ctx, "refresh successful", "num_configs", m.idx.count()) return nil } @@ -311,7 +311,7 @@ func (m *DefaultManager) Remove( m.mu.Lock() defer m.mu.Unlock() - m.certStorage.remove(cp) + m.idx.remove(cp) m.logger.InfoContext( ctx, @@ -372,7 +372,7 @@ func (m *DefaultManager) RotateTickets(ctx context.Context) (err error) { m.logger.InfoContext( ctx, "ticket rotation successful", - "num_configs", m.certStorage.count(), + "num_configs", m.idx.count(), "num_tickets", len(tickets), "num_clones", len(m.clones), "num_clones_with_metrics", len(m.clonesWithMetrics), diff --git a/internal/websvc/server.go b/internal/websvc/server.go index d3087b7..34a7bc0 100644 --- a/internal/websvc/server.go +++ b/internal/websvc/server.go @@ -118,6 +118,8 @@ func (s *server) localAddr() (addr net.Addr) { // // TODO(a.garipov): Improve error handling. func (s *server) serve(ctx context.Context, baseLogger *slog.Logger) { + defer slogutil.RecoverAndLog(ctx, s.logger) + tcpListener, err := net.ListenTCP("tcp", net.TCPAddrFromAddrPort(s.initialAddr)) if err != nil { s.logger.ErrorContext(ctx, "listening tcp", slogutil.KeyError, err) diff --git a/scripts/make/go-bench.sh b/scripts/make/go-bench.sh index 0921082..bd14b1e 100644 --- a/scripts/make/go-bench.sh +++ b/scripts/make/go-bench.sh @@ -49,4 +49,4 @@ readonly go count_flags shuffle_flags timeout_flags --benchmem \ --benchtime='1s' \ --run='^$' \ - ./... + work diff --git a/scripts/make/go-gen.sh b/scripts/make/go-gen.sh index 86b10d0..e601427 100644 --- a/scripts/make/go-gen.sh +++ b/scripts/make/go-gen.sh @@ -21,31 +21,7 @@ set -e -f -u go="${GO:-go}" readonly go -# TODO(a.garipov): Add the ability to generate things separately. -( - cd ./internal/geoip/ - "$go" run ./country_generate.go -) - -( - cd ./internal/geoip/ - "$go" run ./asntops_generate.go -) - -( - cd ./internal/ecscache/ - "$go" run ./ecsblocklist_generate.go - # Force format code, because it's not possible to make an accurate - # template for a long list of strings with different lengths. - gofumpt -l -w ./ecsblocklist.go -) - -( - cd ./internal/profiledb/internal/filecachepb/ - protoc --go_opt=paths=source_relative --go_out=. ./filecache.proto -) - -( +backendpb() ( cd ./internal/backendpb/ protoc \ --go-grpc_opt=Mdns.proto=./backendpb \ @@ -56,3 +32,56 @@ readonly go --go_out=. \ ./dns.proto ) + +ecscache() ( + cd ./internal/ecscache/ + "$go" run ./ecsblocklist_generate.go + # Force format code, because it's not possible to make an accurate + # template for a long list of strings with different lengths. + gofumpt -l -w ./ecsblocklist.go +) + +filecachepb() ( + cd ./internal/profiledb/internal/filecachepb/ + protoc --go_opt=paths=source_relative --go_out=. ./filecache.proto +) + +geoip_asntops() ( + cd ./internal/geoip/ + "$go" run ./asntops_generate.go +) + +geoip_country() ( + cd ./internal/geoip/ + "$go" run ./country_generate.go +) + +if [ -z "${ONLY:-}" ]; then + backendpb + ecscache + filecachepb + geoip_asntops + geoip_country +else + padded=" ${ONLY} " + + if [ "${padded##* backendpb *}" = '' ]; then + backendpb + fi + + if [ "${padded##* ecscache *}" = '' ]; then + ecscache + fi + + if [ "${padded##* filecachepb *}" = '' ]; then + filecachepb + fi + + if [ "${padded##* geoip_asntops *}" = '' ]; then + geoip_asntops + fi + + if [ "${padded##* geoip_country *}" = '' ]; then + geoip_country + fi +fi diff --git a/scripts/make/go-lint.sh b/scripts/make/go-lint.sh index 811e29d..9e5c783 100644 --- a/scripts/make/go-lint.sh +++ b/scripts/make/go-lint.sh @@ -158,10 +158,6 @@ underscores() { # Checks -# TODO(a.garipov): Remove the dnsserver stuff once it is separated. -dnssrvmod='github.com/AdguardTeam/AdGuardDNS/internal/dnsserver/...' -readonly dnssrvmod - run_linter -e blocklist_imports run_linter -e method_const @@ -170,9 +166,9 @@ run_linter -e underscores run_linter -e gofumpt --extra -e -l . -run_linter "${GO:-go}" vet ./... "$dnssrvmod" +run_linter "${GO:-go}" vet work -run_linter govulncheck ./... "$dnssrvmod" +run_linter govulncheck work # NOTE: For AdGuard DNS, ignore the generated protobuf files. run_linter gocyclo --ignore '\.pb\.go$' --over 10 . @@ -180,9 +176,9 @@ run_linter gocyclo --ignore '\.pb\.go$' --over 10 . # NOTE: For AdGuard DNS, ignore the generated protobuf files. run_linter gocognit --ignore '\.pb\.go$' --over 10 . -run_linter ineffassign ./... "$dnssrvmod" +run_linter ineffassign work -run_linter unparam ./... "$dnssrvmod" +run_linter unparam work find_with_ignore \ -type 'f' \ @@ -197,13 +193,13 @@ find_with_ignore \ ')' \ -exec 'misspell' '--error' '{}' '+' -run_linter nilness ./... "$dnssrvmod" +run_linter nilness work # TODO(a.garipov): Remove the grep crutch once golang/go#60509 is fixed. # # TODO(a.garipov): Add a filtering function to run_linter. fieldalignment_output="$( - fieldalignment ./... "$dnssrvmod" 2>&1 \ + fieldalignment work 2>&1 \ | grep -e '\.pb\.go' -v \ || : )" @@ -217,7 +213,7 @@ fi # TODO(a.garipov): Remove the grep crutch once golang/go#61574 is fixed. shadow_output="$( - shadow --strict ./... "$dnssrvmod" 2>&1 \ + shadow --strict work 2>&1 \ | grep -e '\.pb\.go' -v \ || : )" @@ -229,9 +225,9 @@ if [ "$shadow_output" != '' ]; then exit 1 fi -run_linter gosec --exclude-generated --quiet ./... "$dnssrvmod" +run_linter gosec --exclude-generated --quiet work -run_linter errcheck ./... "$dnssrvmod" +run_linter errcheck work staticcheck_matrix=' darwin: GOOS=darwin @@ -240,4 +236,4 @@ linux: GOOS=linux readonly staticcheck_matrix printf '%s' "$staticcheck_matrix" \ - | run_linter staticcheck --matrix ./... "$dnssrvmod" + | run_linter staticcheck --matrix work diff --git a/scripts/make/go-test.sh b/scripts/make/go-test.sh index a4e24c6..00a7947 100644 --- a/scripts/make/go-test.sh +++ b/scripts/make/go-test.sh @@ -45,7 +45,6 @@ timeout_flags="${TIMEOUT_FLAGS:---timeout=120s}" readonly count_flags cover_flags go shuffle_flags timeout_flags go_test() { - # TODO(a.garipov): Remove the dnsserver stuff once it is separated. "$go" test \ "$count_flags" \ "$cover_flags" \ @@ -54,8 +53,7 @@ go_test() { "$timeout_flags" \ "$v_flags" \ "$x_flags" \ - ./... \ - github.com/AdguardTeam/AdGuardDNS/internal/dnsserver/... \ + work \ ; } diff --git a/scripts/make/txt-lint.sh b/scripts/make/txt-lint.sh index 6f9129e..da5a0c1 100644 --- a/scripts/make/txt-lint.sh +++ b/scripts/make/txt-lint.sh @@ -3,7 +3,7 @@ # This comment is used to simplify checking local copies of the script. Bump # this number every time a significant change is made to this script. # -# AdGuard-Project-Version: 9 +# AdGuard-Project-Version: 10 verbose="${VERBOSE:-0}" readonly verbose @@ -74,6 +74,8 @@ trailing_whitespace() { done } +# TODO(a.garipov): Consider using jq for JSON validation. + run_linter -e trailing_newlines run_linter -e trailing_whitespace