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