From 929053f8ce55f1fafacd6dffa2b4b63bcd28777e Mon Sep 17 00:00:00 2001 From: Chris Portscheller Date: Wed, 11 Nov 2026 13:01:55 -0600 Subject: [PATCH] feat(bots): regenerate the agent registry (29 more agents) --- packages/webdecoy/src/bots/bots.test.ts | 2 +- .../src/bots/parity-vectors.generated.json | 384 ++++++++++++++++++ .../webdecoy/src/bots/registry.generated.ts | 35 +- .../webdecoy/src/clearance/gate.generated.js | 14 +- 4 files changed, 424 insertions(+), 11 deletions(-) diff --git a/packages/webdecoy/src/bots/bots.test.ts b/packages/webdecoy/src/bots/bots.test.ts index 9abf52b..0233430 100644 --- a/packages/webdecoy/src/bots/bots.test.ts +++ b/packages/webdecoy/src/bots/bots.test.ts @@ -81,7 +81,7 @@ describe('matchUserAgent', () => { describe('registry integrity', () => { it('carries the full generated table', () => { - expect(BOT_REGISTRY.length).toBe(192); + expect(BOT_REGISTRY.length).toBe(221); expect(BOT_CATEGORIES).toContain('training_crawler'); expect(BOT_CATEGORIES).toContain('search_crawler'); }); diff --git a/packages/webdecoy/src/bots/parity-vectors.generated.json b/packages/webdecoy/src/bots/parity-vectors.generated.json index 89a858f..b304192 100644 --- a/packages/webdecoy/src/bots/parity-vectors.generated.json +++ b/packages/webdecoy/src/bots/parity-vectors.generated.json @@ -23,6 +23,18 @@ "category": "security_scanner", "matched": true }, + { + "userAgent": "adsbot-google", + "id": "adsbot-google", + "category": "fetcher", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; adsbot-google/1.0; +http://example.com/bot)", + "id": "adsbot-google", + "category": "fetcher", + "matched": true + }, { "userAgent": "ahrefsbot", "id": "ahrefsbot", @@ -155,6 +167,30 @@ "category": "archiver", "matched": true }, + { + "userAgent": "awariobot", + "id": "awariobot", + "category": "seo_crawler", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; awariobot/1.0; +http://example.com/bot)", + "id": "awariobot", + "category": "seo_crawler", + "matched": true + }, + { + "userAgent": "awariosmartbot", + "id": "awariobot", + "category": "seo_crawler", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; awariosmartbot/1.0; +http://example.com/bot)", + "id": "awariobot", + "category": "seo_crawler", + "matched": true + }, { "userAgent": "axios/", "id": "axios", @@ -167,6 +203,18 @@ "category": "generic_scraper", "matched": true }, + { + "userAgent": "azureai-searchbot", + "id": "azureai-searchbot", + "category": "ai_search_crawler", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; azureai-searchbot/1.0; +http://example.com/bot)", + "id": "azureai-searchbot", + "category": "ai_search_crawler", + "matched": true + }, { "userAgent": "baiduspider", "id": "baiduspider", @@ -239,6 +287,18 @@ "category": "ai_search_crawler", "matched": true }, + { + "userAgent": "bravebot", + "id": "bravebot", + "category": "search_crawler", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; bravebot/1.0; +http://example.com/bot)", + "id": "bravebot", + "category": "search_crawler", + "matched": true + }, { "userAgent": "brightdata", "id": "bright-data", @@ -359,6 +419,18 @@ "category": "security_scanner", "matched": true }, + { + "userAgent": "chatglm-spider", + "id": "chatglm-spider", + "category": "training_crawler", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; chatglm-spider/1.0; +http://example.com/bot)", + "id": "chatglm-spider", + "category": "training_crawler", + "matched": true + }, { "userAgent": "chatgpt-user", "id": "chatgpt-user", @@ -419,6 +491,18 @@ "category": "training_crawler", "matched": true }, + { + "userAgent": "coccocbot", + "id": "coccocbot", + "category": "search_crawler", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; coccocbot/1.0; +http://example.com/bot)", + "id": "coccocbot", + "category": "search_crawler", + "matched": true + }, { "userAgent": "cohere-ai", "id": "cohere-ai", @@ -503,6 +587,18 @@ "category": "commercial_scraper", "matched": true }, + { + "userAgent": "dataforseobot", + "id": "dataforseobot", + "category": "seo_crawler", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; dataforseobot/1.0; +http://example.com/bot)", + "id": "dataforseobot", + "category": "seo_crawler", + "matched": true + }, { "userAgent": "datadog", "id": "datadog-synthetics", @@ -623,6 +719,30 @@ "category": "search_crawler", "matched": true }, + { + "userAgent": "elevenlabsbot", + "id": "elevenlabsbot", + "category": "ai_assistant", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; elevenlabsbot/1.0; +http://example.com/bot)", + "id": "elevenlabsbot", + "category": "ai_assistant", + "matched": true + }, + { + "userAgent": "elevenlabscrawler", + "id": "elevenlabscrawler", + "category": "training_crawler", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; elevenlabscrawler/1.0; +http://example.com/bot)", + "id": "elevenlabscrawler", + "category": "training_crawler", + "matched": true + }, { "userAgent": "embedly", "id": "embedly", @@ -887,6 +1007,30 @@ "category": "search_crawler", "matched": true }, + { + "userAgent": "google-read-aloud", + "id": "google-read-aloud", + "category": "fetcher", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; google-read-aloud/1.0; +http://example.com/bot)", + "id": "google-read-aloud", + "category": "fetcher", + "matched": true + }, + { + "userAgent": "google-safety", + "id": "google-safety", + "category": "fetcher", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; google-safety/1.0; +http://example.com/bot)", + "id": "google-safety", + "category": "fetcher", + "matched": true + }, { "userAgent": "googleagent-mariner", "id": "googleagent-mariner", @@ -935,6 +1079,18 @@ "category": "generic_scraper", "matched": true }, + { + "userAgent": "grokbot", + "id": "grokbot", + "category": "ai_search_crawler", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; grokbot/1.0; +http://example.com/bot)", + "id": "grokbot", + "category": "ai_search_crawler", + "matched": true + }, { "userAgent": "guzzlehttp", "id": "guzzlehttp", @@ -1007,6 +1163,18 @@ "category": "monitoring", "matched": true }, + { + "userAgent": "hubspot crawler", + "id": "hubspot-crawler", + "category": "seo_crawler", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; hubspot crawler/1.0; +http://example.com/bot)", + "id": "hubspot-crawler", + "category": "seo_crawler", + "matched": true + }, { "userAgent": "isscyberriskcrawler", "id": "isscyberriskcrawler", @@ -1031,6 +1199,18 @@ "category": "search_crawler", "matched": true }, + { + "userAgent": "ibou-search", + "id": "iboubot", + "category": "search_crawler", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; ibou-search/1.0; +http://example.com/bot)", + "id": "iboubot", + "category": "search_crawler", + "matched": true + }, { "userAgent": "iframely", "id": "iframely", @@ -1127,6 +1307,90 @@ "category": "ai_search_crawler", "matched": true }, + { + "userAgent": "kakaobot", + "id": "kakaobot", + "category": "fetcher", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; kakaobot/1.0; +http://example.com/bot)", + "id": "kakaobot", + "category": "fetcher", + "matched": true + }, + { + "userAgent": "keenable-user", + "id": "keenable-user", + "category": "ai_assistant", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; keenable-user/1.0; +http://example.com/bot)", + "id": "keenable-user", + "category": "ai_assistant", + "matched": true + }, + { + "userAgent": "keenablebot", + "id": "keenablebot", + "category": "ai_search_crawler", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; keenablebot/1.0; +http://example.com/bot)", + "id": "keenablebot", + "category": "ai_search_crawler", + "matched": true + }, + { + "userAgent": "kimi-searchbot", + "id": "kimi-searchbot", + "category": "ai_search_crawler", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; kimi-searchbot/1.0; +http://example.com/bot)", + "id": "kimi-searchbot", + "category": "ai_search_crawler", + "matched": true + }, + { + "userAgent": "kimi-user", + "id": "kimi-user", + "category": "ai_assistant", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; kimi-user/1.0; +http://example.com/bot)", + "id": "kimi-user", + "category": "ai_assistant", + "matched": true + }, + { + "userAgent": "kimibot", + "id": "kimibot", + "category": "training_crawler", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; kimibot/1.0; +http://example.com/bot)", + "id": "kimibot", + "category": "training_crawler", + "matched": true + }, + { + "userAgent": "klaviyoaibot", + "id": "klaviyoaibot", + "category": "ai_assistant", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; klaviyoaibot/1.0; +http://example.com/bot)", + "id": "klaviyoaibot", + "category": "ai_assistant", + "matched": true + }, { "userAgent": "lwp-", "id": "lwp", @@ -1343,6 +1607,18 @@ "category": "search_crawler", "matched": true }, + { + "userAgent": "moonshotbot", + "id": "moonshotbot", + "category": "training_crawler", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; moonshotbot/1.0; +http://example.com/bot)", + "id": "moonshotbot", + "category": "training_crawler", + "matched": true + }, { "userAgent": "multion", "id": "multion", @@ -1487,6 +1763,18 @@ "category": "security_scanner", "matched": true }, + { + "userAgent": "oai-adsbot", + "id": "oai-adsbot", + "category": "fetcher", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; oai-adsbot/1.0; +http://example.com/bot)", + "id": "oai-adsbot", + "category": "fetcher", + "matched": true + }, { "userAgent": "oai-searchbot", "id": "oai-searchbot", @@ -1547,6 +1835,18 @@ "category": "seo_crawler", "matched": true }, + { + "userAgent": "opencode-user", + "id": "opencode-user", + "category": "ai_agent", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; opencode-user/1.0; +http://example.com/bot)", + "id": "opencode-user", + "category": "ai_agent", + "matched": true + }, { "userAgent": "operator", "id": "operator", @@ -1751,6 +2051,18 @@ "category": "search_crawler", "matched": true }, + { + "userAgent": "qwantbot", + "id": "qwantify", + "category": "search_crawler", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; qwantbot/1.0; +http://example.com/bot)", + "id": "qwantify", + "category": "search_crawler", + "matched": true + }, { "userAgent": "qwen", "id": "qwen", @@ -1811,6 +2123,30 @@ "category": "generic_scraper", "matched": true }, + { + "userAgent": "seojuice-searchbot", + "id": "seojuice-searchbot", + "category": "seo_crawler", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; seojuice-searchbot/1.0; +http://example.com/bot)", + "id": "seojuice-searchbot", + "category": "seo_crawler", + "matched": true + }, + { + "userAgent": "serankingbacklinksbot", + "id": "serankingbacklinksbot", + "category": "seo_crawler", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; serankingbacklinksbot/1.0; +http://example.com/bot)", + "id": "serankingbacklinksbot", + "category": "seo_crawler", + "matched": true + }, { "userAgent": "sistrix", "id": "sistrix", @@ -2315,6 +2651,30 @@ "category": "search_crawler", "matched": true }, + { + "userAgent": "yepbot", + "id": "yepbot", + "category": "search_crawler", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; yepbot/1.0; +http://example.com/bot)", + "id": "yepbot", + "category": "search_crawler", + "matched": true + }, + { + "userAgent": "yisouspider", + "id": "yisouspider", + "category": "search_crawler", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; yisouspider/1.0; +http://example.com/bot)", + "id": "yisouspider", + "category": "search_crawler", + "matched": true + }, { "userAgent": "youbot", "id": "youbot", @@ -2399,6 +2759,18 @@ "category": "fetcher", "matched": true }, + { + "userAgent": "meta-externalads", + "id": "meta-externalads", + "category": "seo_crawler", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; meta-externalads/1.0; +http://example.com/bot)", + "id": "meta-externalads", + "category": "seo_crawler", + "matched": true + }, { "userAgent": "node-fetch", "id": "node-fetch", @@ -2411,6 +2783,18 @@ "category": "generic_scraper", "matched": true }, + { + "userAgent": "trendictionbot", + "id": "trendictionbot", + "category": "seo_crawler", + "matched": true + }, + { + "userAgent": "Mozilla/5.0 (compatible; trendictionbot/1.0; +http://example.com/bot)", + "id": "trendictionbot", + "category": "seo_crawler", + "matched": true + }, { "userAgent": "xai-searchbot", "id": "xai-searchbot", diff --git a/packages/webdecoy/src/bots/registry.generated.ts b/packages/webdecoy/src/bots/registry.generated.ts index ac978dd..9e039dd 100644 --- a/packages/webdecoy/src/bots/registry.generated.ts +++ b/packages/webdecoy/src/bots/registry.generated.ts @@ -11,7 +11,7 @@ * agents share User-Agent substrings, so sorting this array changes how real * traffic is classified. * - * 192 agents across 15 categories. + * 221 agents across 15 categories. */ /** @@ -102,6 +102,10 @@ export const BOT_REGISTRY: readonly BotAgent[] = [ { id: "velenpublicwebcrawler", name: "VelenPublicWebCrawler", category: "training_crawler", organization: "Velen", baseScore: 70, respectsRobots: false, uaPatterns: ["velenpublicwebcrawler"] }, { id: "isscyberriskcrawler", name: "ISSCyberRiskCrawler", category: "training_crawler", organization: "ISS", baseScore: 65, respectsRobots: false, uaPatterns: ["isscyberriskcrawler"] }, { id: "friendlycrawler", name: "FriendlyCrawler", category: "training_crawler", organization: "Unknown", baseScore: 65, respectsRobots: true, uaPatterns: ["friendlycrawler"] }, + { id: "elevenlabscrawler", name: "ElevenlabsCrawler", category: "training_crawler", organization: "ElevenLabs", baseScore: 80, respectsRobots: true, uaPatterns: ["elevenlabscrawler"] }, + { id: "kimibot", name: "KimiBot", category: "training_crawler", organization: "Moonshot AI", baseScore: 80, respectsRobots: true, uaPatterns: ["kimibot"] }, + { id: "moonshotbot", name: "MoonshotBot", category: "training_crawler", organization: "Moonshot AI", baseScore: 80, respectsRobots: false, uaPatterns: ["moonshotbot"] }, + { id: "chatglm-spider", name: "ChatGLM-Spider", category: "training_crawler", organization: "Zhipu AI", baseScore: 80, respectsRobots: false, uaPatterns: ["chatglm-spider"] }, { id: "duckassistbot", name: "DuckAssistBot", category: "ai_search_crawler", organization: "DuckDuckGo", baseScore: 65, respectsRobots: true, uaPatterns: ["duckassistbot"] }, { id: "sofyabot", name: "SofyaBot", category: "ai_search_crawler", organization: "Sofya", baseScore: 65, respectsRobots: true, uaPatterns: ["sofyabot"] }, { id: "xai-searchbot", name: "xAI-SearchBot", category: "ai_search_crawler", organization: "xAI", baseScore: 70, respectsRobots: true, uaPatterns: ["xai-searchbot"] }, @@ -119,6 +123,10 @@ export const BOT_REGISTRY: readonly BotAgent[] = [ { id: "tavily", name: "Tavily", category: "ai_search_crawler", organization: "Tavily", baseScore: 70, respectsRobots: true, uaPatterns: ["tavily"] }, { id: "brave-search", name: "BraveSearch", category: "ai_search_crawler", organization: "Brave", baseScore: 65, respectsRobots: true, uaPatterns: ["bravesearch"] }, { id: "neeva", name: "NeevaBot", category: "ai_search_crawler", organization: "Neeva", baseScore: 65, respectsRobots: true, uaPatterns: ["neevabot"] }, + { id: "kimi-searchbot", name: "Kimi-SearchBot", category: "ai_search_crawler", organization: "Moonshot AI", baseScore: 65, respectsRobots: true, uaPatterns: ["kimi-searchbot"] }, + { id: "keenablebot", name: "KeenableBot", category: "ai_search_crawler", organization: "Keenable", baseScore: 65, respectsRobots: true, uaPatterns: ["keenablebot"] }, + { id: "azureai-searchbot", name: "AzureAI-SearchBot", category: "ai_search_crawler", organization: "Microsoft", baseScore: 65, respectsRobots: false, uaPatterns: ["azureai-searchbot"] }, + { id: "grokbot", name: "GrokBot", category: "ai_search_crawler", organization: "xAI", baseScore: 70, respectsRobots: false, uaPatterns: ["grokbot"] }, { id: "operator", name: "Operator", category: "ai_agent", organization: "OpenAI", baseScore: 75, respectsRobots: true, uaPatterns: ["operator"] }, { id: "claude-user", name: "Claude-User", category: "ai_agent", organization: "Anthropic", baseScore: 75, respectsRobots: true, uaPatterns: ["claude-user"] }, { id: "gemini-user", name: "Gemini-User", category: "ai_agent", organization: "Google", baseScore: 75, respectsRobots: true, uaPatterns: ["gemini-user"] }, @@ -128,7 +136,8 @@ export const BOT_REGISTRY: readonly BotAgent[] = [ { id: "stagehand", name: "Stagehand", category: "ai_agent", organization: "Browserbase", baseScore: 70, respectsRobots: false, uaPatterns: ["stagehand"] }, { id: "manus-user", name: "Manus-User", category: "ai_agent", organization: "Manus", baseScore: 70, respectsRobots: false, uaPatterns: ["manus-user"] }, { id: "multion", name: "MultiOn", category: "ai_agent", organization: "MultiOn", baseScore: 70, respectsRobots: false, uaPatterns: ["multion"] }, - { id: "iboubot", name: "IbouBot", category: "search_crawler", organization: "Ibou", baseScore: 30, respectsRobots: true, uaPatterns: ["iboubot"] }, + { id: "opencode-user", name: "OpenCode-User", category: "ai_agent", organization: "OpenCode", baseScore: 75, respectsRobots: false, uaPatterns: ["opencode-user"] }, + { id: "iboubot", name: "IbouBot", category: "search_crawler", organization: "Ibou", baseScore: 30, respectsRobots: true, uaPatterns: ["iboubot", "ibou-search"] }, { id: "googlebot", name: "Googlebot", category: "search_crawler", organization: "Google", baseScore: 30, respectsRobots: true, uaPatterns: ["googlebot"] }, { id: "google-inspectiontool", name: "Google-InspectionTool", category: "search_crawler", organization: "Google", baseScore: 30, respectsRobots: true, uaPatterns: ["google-inspectiontool"] }, { id: "bingbot", name: "Bingbot", category: "search_crawler", organization: "Microsoft", baseScore: 30, respectsRobots: true, uaPatterns: ["bingbot"] }, @@ -139,12 +148,16 @@ export const BOT_REGISTRY: readonly BotAgent[] = [ { id: "duckduckbot", name: "DuckDuckBot", category: "search_crawler", organization: "DuckDuckGo", baseScore: 30, respectsRobots: true, uaPatterns: ["duckduckbot"] }, { id: "applebot", name: "Applebot", category: "search_crawler", organization: "Apple", baseScore: 30, respectsRobots: true, uaPatterns: ["applebot"] }, { id: "sogou", name: "Sogou Spider", category: "search_crawler", organization: "Sogou", baseScore: 40, respectsRobots: true, uaPatterns: ["sogou"] }, - { id: "qwantify", name: "Qwantify", category: "search_crawler", organization: "Qwant", baseScore: 35, respectsRobots: true, uaPatterns: ["qwantify"] }, + { id: "qwantify", name: "Qwantify", category: "search_crawler", organization: "Qwant", baseScore: 35, respectsRobots: true, uaPatterns: ["qwantify", "qwantbot"] }, { id: "naver", name: "Naver", category: "search_crawler", organization: "Naver", baseScore: 35, respectsRobots: true, uaPatterns: ["naver", "yeti"] }, { id: "seznam", name: "SeznamBot", category: "search_crawler", organization: "Seznam", baseScore: 35, respectsRobots: true, uaPatterns: ["seznambot"] }, { id: "ecosia", name: "Ecosia", category: "search_crawler", organization: "Ecosia", baseScore: 30, respectsRobots: true, uaPatterns: ["ecosia"] }, { id: "mojeek", name: "MojeekBot", category: "search_crawler", organization: "Mojeek", baseScore: 35, respectsRobots: true, uaPatterns: ["mojeekbot"] }, { id: "yahoo-slurp", name: "Yahoo! Slurp", category: "search_crawler", organization: "Yahoo", baseScore: 30, respectsRobots: true, uaPatterns: ["slurp"] }, + { id: "bravebot", name: "Bravebot", category: "search_crawler", organization: "Brave", baseScore: 30, respectsRobots: true, uaPatterns: ["bravebot"] }, + { id: "coccocbot", name: "Coc Coc", category: "search_crawler", organization: "Coc Coc", baseScore: 35, respectsRobots: true, uaPatterns: ["coccocbot"] }, + { id: "yisouspider", name: "YisouSpider", category: "search_crawler", organization: "Alibaba", baseScore: 40, respectsRobots: true, uaPatterns: ["yisouspider"] }, + { id: "yepbot", name: "YepBot", category: "search_crawler", organization: "Ahrefs", baseScore: 30, respectsRobots: true, uaPatterns: ["yepbot"] }, { id: "ahrefsbot", name: "AhrefsBot", category: "seo_crawler", organization: "Ahrefs", baseScore: 50, respectsRobots: true, uaPatterns: ["ahrefsbot", "ahrefs"] }, { id: "semrushbot", name: "SemrushBot", category: "seo_crawler", organization: "Semrush", baseScore: 50, respectsRobots: true, uaPatterns: ["semrushbot", "semrush"] }, { id: "mj12bot", name: "MJ12bot", category: "seo_crawler", organization: "Majestic", baseScore: 50, respectsRobots: true, uaPatterns: ["mj12bot"] }, @@ -159,6 +172,13 @@ export const BOT_REGISTRY: readonly BotAgent[] = [ { id: "sistrix", name: "SISTRIX", category: "seo_crawler", organization: "SISTRIX", baseScore: 50, respectsRobots: true, uaPatterns: ["sistrix"] }, { id: "serpstat", name: "Serpstat", category: "seo_crawler", organization: "Serpstat", baseScore: 50, respectsRobots: true, uaPatterns: ["serpstat"] }, { id: "spyfu", name: "SpyFu", category: "seo_crawler", organization: "SpyFu", baseScore: 50, respectsRobots: true, uaPatterns: ["spyfu"] }, + { id: "meta-externalads", name: "meta-externalads", category: "seo_crawler", organization: "Meta", baseScore: 40, respectsRobots: true, uaPatterns: ["meta-externalads"] }, + { id: "dataforseobot", name: "DataForSeoBot", category: "seo_crawler", organization: "DataForSEO", baseScore: 50, respectsRobots: true, uaPatterns: ["dataforseobot"] }, + { id: "serankingbacklinksbot", name: "SERankingBacklinksBot", category: "seo_crawler", organization: "SE Ranking", baseScore: 50, respectsRobots: true, uaPatterns: ["serankingbacklinksbot"] }, + { id: "awariobot", name: "AwarioBot", category: "seo_crawler", organization: "Awario", baseScore: 50, respectsRobots: true, uaPatterns: ["awariobot", "awariosmartbot"] }, + { id: "seojuice-searchbot", name: "SEOJuice-SearchBot", category: "seo_crawler", organization: "SEOJuice", baseScore: 50, respectsRobots: true, uaPatterns: ["seojuice-searchbot"] }, + { id: "trendictionbot", name: "trendictionbot", category: "seo_crawler", organization: "Talkwalker", baseScore: 50, respectsRobots: true, uaPatterns: ["trendictionbot"] }, + { id: "hubspot-crawler", name: "HubSpot Crawler", category: "seo_crawler", organization: "HubSpot", baseScore: 45, respectsRobots: true, uaPatterns: ["hubspot crawler"] }, { id: "nessus", name: "Nessus", category: "security_scanner", organization: "Tenable", baseScore: 70, respectsRobots: false, uaPatterns: ["nessus"] }, { id: "qualys", name: "Qualys", category: "security_scanner", organization: "Qualys", baseScore: 70, respectsRobots: false, uaPatterns: ["qualys"] }, { id: "shodan", name: "Shodan", category: "security_scanner", organization: "Shodan", baseScore: 75, respectsRobots: false, uaPatterns: ["shodan"] }, @@ -220,6 +240,11 @@ export const BOT_REGISTRY: readonly BotAgent[] = [ { id: "reddit", name: "Reddit", category: "fetcher", organization: "Reddit", baseScore: 30, respectsRobots: true, uaPatterns: ["reddit"] }, { id: "embedly", name: "Embedly", category: "fetcher", organization: "Medium", baseScore: 30, respectsRobots: true, uaPatterns: ["embedly"] }, { id: "iframely", name: "Iframely", category: "fetcher", organization: "Iframely", baseScore: 30, respectsRobots: true, uaPatterns: ["iframely"] }, + { id: "adsbot-google", name: "AdsBot-Google", category: "fetcher", organization: "Google", baseScore: 25, respectsRobots: true, uaPatterns: ["adsbot-google"] }, + { id: "google-read-aloud", name: "Google-Read-Aloud", category: "fetcher", organization: "Google", baseScore: 25, respectsRobots: false, uaPatterns: ["google-read-aloud"] }, + { id: "google-safety", name: "Google-Safety", category: "fetcher", organization: "Google", baseScore: 25, respectsRobots: false, uaPatterns: ["google-safety"] }, + { id: "oai-adsbot", name: "OAI-AdsBot", category: "fetcher", organization: "OpenAI", baseScore: 30, respectsRobots: true, uaPatterns: ["oai-adsbot"] }, + { id: "kakaobot", name: "KakaoBot", category: "fetcher", organization: "Kakao", baseScore: 25, respectsRobots: true, uaPatterns: ["kakaobot"] }, { id: "curl", name: "cURL", category: "fetcher", organization: "Open Source", baseScore: 45, respectsRobots: false, uaPatterns: ["curl/"] }, { id: "wget", name: "Wget", category: "fetcher", organization: "GNU", baseScore: 45, respectsRobots: false, uaPatterns: ["wget/"] }, { id: "libwww-perl", name: "libwww-perl", category: "fetcher", organization: "Perl", baseScore: 50, respectsRobots: false, uaPatterns: ["libwww-perl"] }, @@ -267,4 +292,8 @@ export const BOT_REGISTRY: readonly BotAgent[] = [ { id: "copilot", name: "Microsoft Copilot", category: "ai_assistant", organization: "Microsoft", baseScore: 65, respectsRobots: true, uaPatterns: ["copilot"] }, { id: "cortana", name: "Cortana", category: "ai_assistant", organization: "Microsoft", baseScore: 60, respectsRobots: true, uaPatterns: ["cortana"] }, { id: "siri", name: "Siri", category: "ai_assistant", organization: "Apple", baseScore: 60, respectsRobots: true, uaPatterns: ["siri"] }, + { id: "kimi-user", name: "Kimi-User", category: "ai_assistant", organization: "Moonshot AI", baseScore: 70, respectsRobots: true, uaPatterns: ["kimi-user"] }, + { id: "keenable-user", name: "Keenable-User", category: "ai_assistant", organization: "Keenable", baseScore: 70, respectsRobots: true, uaPatterns: ["keenable-user"] }, + { id: "elevenlabsbot", name: "ElevenlabsBot", category: "ai_assistant", organization: "ElevenLabs", baseScore: 70, respectsRobots: true, uaPatterns: ["elevenlabsbot"] }, + { id: "klaviyoaibot", name: "KlaviyoAIBot", category: "ai_assistant", organization: "Klaviyo", baseScore: 60, respectsRobots: true, uaPatterns: ["klaviyoaibot"] }, ]; diff --git a/packages/webdecoy/src/clearance/gate.generated.js b/packages/webdecoy/src/clearance/gate.generated.js index 409db9f..5ba7a4b 100644 --- a/packages/webdecoy/src/clearance/gate.generated.js +++ b/packages/webdecoy/src/clearance/gate.generated.js @@ -1,7 +1,7 @@ // GENERATED by WebDecoy edge/vercel-validator/scripts/bundle.mjs. DO NOT EDIT. -// Build vercel-158ba59289ce. Regenerate from the validator source; gate-bundle.test.ts fails on a hand edit. -var k={"chat.deepseek.com":"DeepSeek","chat.openai.com":"ChatGPT","chatgpt.com":"ChatGPT","claude.ai":"Claude","copilot.microsoft.com":"Copilot","deepseek.com":"DeepSeek","gemini.google.com":"Gemini","grok.com":"Grok","kagi.com":"Kagi","meta.ai":"Meta AI","perplexity.ai":"Perplexity","phind.com":"Phind","www.deepseek.com":"DeepSeek","www.grok.com":"Grok","www.kagi.com":"Kagi","www.meta.ai":"Meta AI","www.perplexity.ai":"Perplexity","www.phind.com":"Phind","www.you.com":"You.com","you.com":"You.com"};var rt=["utm_source","ref","utm_medium"],ae=500;function nt(e,t){let r=(e??"").trim();if(r)try{return k[new URL(r).hostname.toLowerCase()]??""}catch{return""}let n;try{n=new URL(t)}catch{return""}for(let o of rt)for(let a of n.searchParams.getAll(o)){let i=ot(a);if(i)return i}return""}var ie=e=>e.replace(/[ \-_.]/g,"");function ot(e){let t=e.trim().toLowerCase();if(!t)return"";try{let n=new URL(t).hostname;n&&(t=n.toLowerCase())}catch{}if(t=t.replace(/\.$/,""),k[t])return k[t];let r=ie(t);for(let[n,o]of Object.entries(k))if(r===ie(o.toLowerCase())||r===n.replace(/^www\./,"").replace(/\./g,""))return o;return""}function se(e,t){if(e.method!=="GET")return null;let r=e.headers;if(r.get("sec-fetch-mode")!=="navigate")return null;let n=r.get("sec-fetch-dest");if(n&&n!=="document")return null;let o=nt(r.get("referer")??"",t.toString());if(!o)return null;let a=t.pathname||"/";return a.length>ae&&(a=a.slice(0,ae)),{platform:o,path:a}}var at="web-bot-auth";async function ce(e,t){let r=e.headers.get("signature-input"),n=e.headers.get("signature");if(!r&&!n)return{status:"none"};if(!r||!n)return{status:"invalid"};if(!t||t.length===0)return{status:"unknown_key"};let o,a;try{o=gt(r),a=ft(n)}catch{return{status:"invalid"}}let i=!1,s=!1;for(let c of o){if(c.params.get("tag")!==at)continue;i=!0;let p=a.get(c.label);if(!p)continue;let l=c.params.get("keyid");if(typeof l!="string")continue;let h;try{h=it(e,c)}catch{s||=t.some(f=>f.keyid===l);continue}let d=t.find(f=>{if(f.keyid!==l)return!1;try{return le(f.directory)===h}catch{return!1}});if(!d)continue;s=!0;let w=Date.now()/1e3,b=c.params.get("created"),g=c.params.get("expires");if(typeof b!="number"||typeof g!="number"||w>=g+10||w+101440*60||!c.components.some(f=>f.name==="@authority"||f.name==="@target-uri"))continue;let A;try{A=st(e,c)}catch{continue}let u=!1;try{let f=await crypto.subtle.importKey("raw",de(d.public_key),{name:"Ed25519"},!1,["verify"]);u=await crypto.subtle.verify({name:"Ed25519"},f,p,new TextEncoder().encode(A))}catch{u=!1}if(u)return{status:"verified",name:d.name,category:d.category,keyid:l}}return s?{status:"invalid"}:i?{status:"unknown_key"}:{status:"none"}}function it(e,t){let r=e.headers.get("signature-agent");if(r===null)throw new Error("missing signature-agent");let n=t.components.find(i=>i.name.toLowerCase()==="signature-agent");if(!n)throw new Error("signature-agent is not covered");let o=r.trim(),a;if(o.startsWith('"')){if(n.keyParam!==void 0)throw new Error("legacy string cannot select a member");let i=new T(o);if(a=pe(i),i.skipSP(),!i.eof())throw new Error("trailing signature-agent data")}else{if(n.keyParam===void 0)throw new Error("dictionary member is not covered");let i=B(o).find(c=>c.key===n.keyParam),s=i?.items[0]?.value;if(!i||i.isList||i.items.length!==1||typeof s!="string")throw new Error("signature-agent member is not a string");a=s}return le(a)}function le(e){let t=new URL(e);if(t.protocol!=="https:"||!t.hostname||t.username||t.password)throw new Error("signature-agent must be an https URL");return`https://${H(t)}`}function st(e,t){let r=new URL(e.url),n=[];for(let o of t.components)n.push(`${ct(o)}: ${lt(e,r,o)}`);return n.push(`"@signature-params": ${t.raw.trim()}`),n.join(` -`)}function ct(e){let t=`"${e.name.toLowerCase()}"`;return e.keyParam!==void 0?`${t};key="${e.keyParam}"`:t}function lt(e,t,r){let n=r.name.toLowerCase();if(n==="@authority")return H(t);if(n==="@target-uri")return`${t.protocol}//${H(t)}${t.pathname}${t.search}`;if(n==="signature-agent"){let o=e.headers.get("signature-agent");if(o===null)throw new Error("signature-agent covered but absent");return r.keyParam!==void 0?ut(o,r.keyParam):o.trim().replace(/\s+/g," ")}throw new Error(`unsupported covered component ${n}`)}function H(e){let t=e.hostname.toLowerCase(),r=e.port;return!r||e.protocol==="https:"&&r==="443"||e.protocol==="http:"&&r==="80"?t:`${t}:${r}`}function ut(e,t){let n=B(e).find(o=>o.key===t);if(!n)throw new Error(`signature-agent has no member ${t}`);return n.raw}function gt(e){return B(e).map(r=>{if(!r.isList)throw new Error(`Signature-Input member ${r.key} is not an inner list`);let n=r.items.map(o=>{if(typeof o.value!="string")throw new Error("component identifier is not a string");let a=o.params.get("key");return{name:o.value,keyParam:typeof a=="string"?a:void 0}});return{label:r.key,components:n,params:r.params,raw:r.raw}})}function ft(e){let t=B(e),r=new Map;for(let n of t){if(n.isList||n.items.length!==1)throw new Error(`Signature member ${n.key} is not a byte sequence`);let o=n.items[0].bytes;if(!o)throw new Error(`Signature member ${n.key} is not a byte sequence`);r.set(n.key,o)}return r}var T=class{constructor(t,r=0){this.s=t;this.i=r}eof(){return this.i>=this.s.length}peek(){return this.s[this.i]}skipSP(){for(;!this.eof()&&(this.peek()===" "||this.peek()===" ");)this.i++}};function B(e){let t=new T(e),r=[];for(t.skipSP();!t.eof();){let o={key:ge(t),raw:"",isList:!1,items:[],params:new Map};if(!t.eof()&&t.peek()==="="){t.i++;let a=t.i;if(!t.eof()&&t.peek()==="(")o.isList=!0,pt(t,o);else{let{value:i,params:s,bytes:c}=ue(t);o.items.push({value:i,params:s,...c?{bytes:c}:{}})}o.raw=e.slice(a,t.i)}else o.params=V(t),o.items.push({value:!0,params:new Map});if(r.push(o),t.skipSP(),t.eof())break;if(t.peek()!==",")throw new Error(`expected ',' at ${t.i}`);if(t.i++,t.skipSP(),t.eof())throw new Error("trailing comma")}return r}function pt(e,t){for(e.i++;;){if(e.skipSP(),e.eof())throw new Error("unterminated inner list");if(e.peek()===")"){e.i++;break}let{value:r,params:n}=ue(e);if(t.items.push({value:r,params:n}),e.eof())throw new Error("unterminated inner list");let o=e.peek();if(o!==" "&&o!==")")throw new Error(`bad inner list at ${e.i}`)}t.params=V(e)}function ue(e){let{value:t,bytes:r}=fe(e),n=V(e);return{value:t,params:n,bytes:r}}function V(e){let t=new Map;for(;!e.eof()&&e.peek()===";";){e.i++,e.skipSP();let r=ge(e),n=!0;if(!e.eof()&&e.peek()==="="){e.i++;let o=fe(e);n=(typeof o.value=="boolean",o.value)}typeof n!="boolean"&&t.set(r,n)}return t}function ge(e){let t=e.peek();if(!t||!/[a-z*]/.test(t))throw new Error(`invalid key at ${e.i}`);let r=e.i;for(;!e.eof()&&/[a-z0-9_\-.*]/.test(e.peek());)e.i++;return e.s.slice(r,e.i)}function fe(e){let t=e.peek();if(t==='"')return{value:pe(e)};if(t===":")return{value:"",bytes:dt(e)};if(t==="?"){e.i++;let r=e.peek();if(e.i++,r==="1")return{value:!0};if(r==="0")return{value:!1};throw new Error("bad boolean")}if(t==="-"||/[0-9]/.test(t))return{value:ht(e)};if(/[a-zA-Z*]/.test(t))return{value:mt(e)};throw new Error(`invalid bare item at ${e.i}`)}function pe(e){e.i++;let t="";for(;!e.eof();){let r=e.s[e.i++];if(r==='"')return t;if(r==="\\"){let n=e.s[e.i++];if(n!=='"'&&n!=="\\")throw new Error("bad escape");t+=n}else{let n=r.charCodeAt(0);if(n<32||n>126)throw new Error("bad char in string");t+=r}}throw new Error("unterminated string")}function dt(e){e.i++;let t=e.i;for(;!e.eof()&&e.peek()!==":";)e.i++;if(e.eof())throw new Error("unterminated byte sequence");let r=e.s.slice(t,e.i);return e.i++,de(r)}function ht(e){let t=e.i;for(e.peek()==="-"&&e.i++;!e.eof()&&/[0-9]/.test(e.peek());)e.i++;if(!e.eof()&&e.peek()===".")for(e.i++;!e.eof()&&/[0-9]/.test(e.peek());)e.i++;return Number(e.s.slice(t,e.i))}function mt(e){let t=e.i;for(e.i++;!e.eof()&&/[a-zA-Z0-9!#$%&'*+\-.^_`|~:/]/.test(e.peek());)e.i++;return e.s.slice(t,e.i)}function de(e){let t=atob(e),r=new Uint8Array(new ArrayBuffer(t.length));for(let n=0;n0?Object.keys(W).find(t=>W[t]===e)??"":""}function me(e){return e=bt(e),e=vt(e),e.toLowerCase()}function bt(e){for(let t=0;t<4;t++){let r=yt(e);if(r===e)break;e=r}return e}function yt(e){if(!e.includes("%"))return e;let t="";for(let r=0;r=0&&o>=0){let a=n<<4|o;if(a<128){t+=String.fromCharCode(a),r+=2;continue}}}t+=e[r]}return t}function we(e){return e>=48&&e<=57?e-48:e>=97&&e<=102?e-97+10:e>=65&&e<=70?e-65+10:-1}function vt(e){if(e==="")return e;let t=e.length>1&&e[e.length-1]==="/",r=[];for(let o of e.split("/"))if(!(o===""||o===".")){if(o===".."){r.length>0&&r.pop();continue}r.push(o)}let n="/"+r.join("/");return t&&n!=="/"&&(n+="/"),n}function I(e,t){let r=me(e),n=me(t);if(n.endsWith("/*")){let o=n.slice(0,-2);return o===""?!0:r===o||r.startsWith(o+"/")}return r===n}function O(e){return e.endsWith("/*")?e.length-2:1<<20}function be(e,t,r){let n=new Map,o=new Set,a=[],i=[],s=new Map,c=(u,f)=>{let v=new Set(u);for(let C of f)for(let _ of s.get(C)??[])v.add(_);return v.size===0?void 0:[...v].sort()},p=(u,f,v)=>v?{pattern:u,required_trust:f,refused_behaviors:v}:{pattern:u,required_trust:f};for(let u of t){if(!I(e,u.pattern))continue;if((u.exceptions??[]).some(C=>I(e,C))){i.push(u.pattern);continue}let f=n.get(u.pattern);f===void 0&&a.push(u.pattern);let v=wt(u.min_trust);(f===void 0||v>f)&&n.set(u.pattern,v),u.mode!=="monitor"&&o.add(u.pattern);for(let C of u.refuse_behaviors??[])s.has(u.pattern)||s.set(u.pattern,new Set),s.get(u.pattern)?.add(C)}let l=[];if(a.length===0){let u="";for(let f of i)(u===""||O(f)>O(u))&&(u=f);return{covering:a,deciding_mode:"",attributed:"",required_trust:"",requirement_source:"",previews:l,excepted_by:u,refused_behaviors:[]}}a.sort((u,f)=>O(f)-O(u));let h=r==="monitor",d=a.filter(u=>o.has(u)),w=h?"monitor":"enforce";if(d.length===0){if(!h)for(let u of a)l.push(p(u,z(n.get(u)??0),c([],[u])));d=a,w="monitor"}let b=0,g="";for(let u of d){let f=n.get(u)??0;f>b&&(b=f,g=u)}let A=c([],d)??[];if(w==="enforce")for(let u of a)o.has(u)||l.push(p(u,z(Math.max(b,n.get(u)??0)),c(A,[u])));return{covering:a,deciding_mode:w,attributed:d[0],required_trust:z(b),requirement_source:g,previews:l,excepted_by:"",refused_behaviors:A}}var _t="other",xt={"search engine crawler":"search","ai search":"search","ai assistant":"agent","ai crawler":"training","page preview":"link_preview","feed fetcher":"feeds","monitoring & analytics":"monitoring","search engine optimization":"seo",security:"security_testing"};function D(e){let t=e.trim().toLowerCase();return t?xt[t]??_t:""}function F(e,t){let r=D(e);return r!==""&&t.includes(r)}var At={search_engines:["search engine crawler"],ai_crawlers:["ai assistant","ai crawler","ai search"],monitoring:["monitoring & analytics"]};function ye(e,t){let r=At[e];return r?r.every(n=>F(n,t)):!1}var Rt=I;function ve(e,t,r){return e?t?t.some(n=>Rt(r,n)):!0:!1}var Ct="x-wd-service-token",St="wd_clearance";function _e(e,t,r=[]){if(e.graded&&t&&!Ot(e.graded.trust,t))return{pass:!1,label:"insufficient-trust"};if(e.crawler&&r.length>0){if(e.crawler.behavior&&r.includes(e.crawler.behavior))return{pass:!1,label:"crawler-refused"};if(!e.crawler.behavior&&e.crawler.exempted)return{pass:!1,label:"missing"}}return{pass:e.pass,label:e.label}}async function Ce(e,t,r){let n=new URL(e.url).pathname,o=be(n,Tt(t),t.mode),a=o.deciding_mode||t.mode,i=await kt(e,t,r,o.covering.length>0,o.excepted_by!==""),s=i.behavior??"",c=_e(i,o.required_trust,o.refused_behaviors),p=c.label==="excepted"?o.excepted_by:c.label==="unscoped"?"":o.attributed,l=!c.pass&&a==="enforce",h=o.previews.map(d=>{let w=_e(i,d.required_trust,d.refused_behaviors??[]);return{pattern:d.pattern,refused:!w.pass&&!l?w.label:""}});return{pass:c.pass,label:c.label,pattern:p,mode:a,previews:h,behavior:c.pass?s:"",crawlerBehavior:i.crawler?.behavior??"",referral:se(e,new URL(e.url)),outsideReach:i.outsideReach??""}}async function kt(e,t,r,n,o){let a=await Et(e,t,r);if(a.grants)return{pass:!0,label:"machine"};let i=await Pt(e,t,r,n,o);return a.outsideReach?{...i,outsideReach:a.outsideReach}:i}async function Et(e,t,r){let n=e.headers.get(Ct);if(!n)return{grants:!1,outsideReach:""};let o=await ke(n,t.keys,r.siteKey);if(!o||o.typ!=="machine"||!o.sub)return{grants:!1,outsideReach:""};if(t.active_credentials.includes(o.sub))return{grants:!0,outsideReach:""};let a=(t.restricted_credentials??[]).find(s=>s&&s.id===o.sub);if(!a)return{grants:!1,outsideReach:""};let i=new URL(e.url).pathname;return ve(a.here,a.paths,i)?{grants:!0,outsideReach:""}:{grants:!1,outsideReach:o.sub}}async function Pt(e,t,r,n,o){let a=await r.verifiedBotCategory(e,n)||"",i=a?{behavior:D(a),exempted:!1}:void 0;if(a&&It(a,t)){let l=D(a);return{pass:!0,label:"verified-bot",behavior:l,crawler:{behavior:l,exempted:!0}}}let s=await ce(e,t.signed_agents);if(s.status==="verified"&&Dt(s.category,t))return{pass:!0,label:"signed-agent",behavior:Ae(s.category),crawler:{behavior:Ae(s.category),exempted:!0}};if(s.status==="invalid"&&n)return{pass:!1,label:"agent-impersonation",crawler:i};if(!n)return o?{pass:!0,label:"excepted",crawler:i}:{pass:!0,label:"unscoped",crawler:i};let c=q(e.headers.get("cookie")??"",St);if(!c)return{pass:!1,label:"missing",crawler:i};let p=await ke(c,t.keys,r.siteKey);return!p||(p.typ??"")!==""?{pass:!1,label:"invalid",crawler:i}:t.denied_fps&&t.denied_fps.includes(p.fp)?{pass:!1,label:"revoked",crawler:i}:{pass:!0,label:"valid",graded:{trust:p.trust},crawler:i}}function Tt(e){let t=new Set(e.routes),r=new Map;for(let o of e.route_exceptions??[])t.has(o.pattern)&&Array.isArray(o.except)&&r.set(o.pattern,o.except);let n=e.routes.map(o=>({pattern:o,exceptions:r.get(o)}));for(let o of e.route_min_trust??[])t.has(o.pattern)&&n.push({pattern:o.pattern,min_trust:o.min_trust,exceptions:r.get(o.pattern)});for(let o of e.monitor_routes??[])n.push({pattern:o.pattern,min_trust:o.min_trust,mode:"monitor",exceptions:o.except});for(let o of e.route_refusals??[])!Array.isArray(o.refuse_behaviors)||o.refuse_behaviors.length===0||(o.mode==="monitor"?n.push({pattern:o.pattern,mode:"monitor",refuse_behaviors:o.refuse_behaviors}):t.has(o.pattern)&&n.push({pattern:o.pattern,exceptions:r.get(o.pattern),refuse_behaviors:o.refuse_behaviors}));return n}var Bt={"attested-human":2,"human-likely":1,clean:0};function xe(e){return Bt[e??""]??0}function Ot(e,t){return xe(e)>=xe(t)}function It(e,t){let r=t.allow_behaviors;return r?F(e,r):Mt(e,t.allow)}function Dt(e,t){let r=t.allow_behaviors;return r?ye(e,r):he(e,t.allow)}function Ae(e){return e==="search_engines"?"search":e==="monitoring"?"monitoring":""}function Mt(e,t){let r=e.trim().toLowerCase();return!!(t.search_engines&&r.includes("search engine crawler")||t.ai_crawlers&&r.startsWith("ai ")||t.monitoring&&r.includes("monitoring"))}function j(e){return!e.pass&&e.mode==="enforce"&&(e.label==="missing"||e.label==="invalid")}function Se(e){return j(e)?{...e,pass:!0,label:"outage-pass"}:e}function q(e,t){for(let r of e.split(";")){let n=r.indexOf("=");if(!(n<0)&&r.slice(0,n).trim()===t)return r.slice(n+1).trim()||null}return null}async function ke(e,t,r){try{let n=e.indexOf(".");if(n<0)return null;let o=Re(e.slice(0,n)),a=Re(e.slice(n+1)),i=JSON.parse(new TextDecoder().decode(o)),s=t.find(l=>l.kid===i.kid);if(!s)return null;let c=await crypto.subtle.importKey("raw",Lt(s.public_key),{name:"Ed25519"},!1,["verify"]);return!await crypto.subtle.verify({name:"Ed25519"},c,a,o)||i.tenant!==r||Date.now()/1e3>=i.exp?null:i}catch{return null}}function Re(e){let t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4);return Ee(atob(t))}function Lt(e){return Ee(atob(e))}function Ee(e){let t=new Uint8Array(new ArrayBuffer(e.length));for(let r=0;r{let o=!1;try{let a=new AbortController,i=setTimeout(()=>a.abort(),3e3);try{let s=await n(e.replace(/\/+$/,"")+"/api/v1/clearance",{method:"POST",headers:{"content-type":"application/json","user-agent":"WebDecoy-OutageProbe/1"},body:JSON.stringify({aid:t,fp:"wd-outage-probe",scope:"",ua:"WebDecoy-OutageProbe/1"}),signal:a.signal});s.status===429?o=!0:s.status<300&&(o=typeof(await s.json())?.granted=="boolean")}finally{clearTimeout(i)}}catch{o=!1}return M={at:r,available:o},o})();try{return await E}finally{E=null}}function Pe(e){let t="";for(let r of new Uint8Array(e))t+=String.fromCharCode(r);return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function Te(e,t){let r=await crypto.subtle.importKey("raw",new TextEncoder().encode(e),{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return Pe(await crypto.subtle.sign("HMAC",r,new TextEncoder().encode(t)))}async function Be(e){return Pe(await crypto.subtle.digest("SHA-256",new TextEncoder().encode(e))).slice(0,16)}function Oe(e,t,r){return`${Ut}|${e}|${t}|${r}`}async function $t(e,t,r,n){let o=Math.floor(n/1e3)+300;return`${o}.${await Te(e,Oe(t,o,await Be(r)))}`}async function Ie(e,t,r,n,o){if(!t||!e)return!1;let a=e.indexOf(".");if(a<=0)return!1;let i=Number(e.slice(0,a));if(!Number.isInteger(i)||i<=Math.floor(o/1e3)||i>Math.floor(o/1e3)+300)return!1;let s=await Te(t,Oe(r,i,await Be(n))),c=e.slice(a+1);if(c.length!==s.length)return!1;let p=0;for(let l=0;lnew Response(JSON.stringify(s),{status:i,headers:{"content-type":"application/json","cache-control":"no-store",...c}});if(e.method!=="POST")return o(405,{pass:!1});if(!t.sensorKey)return o(503,{pass:!1,reason:"unsupported"});if(await Nt(t.apiBase,t.siteKey,r,n))return o(409,{pass:!1,reason:"mint_available"});let a=await $t(t.sensorKey,t.host,e.headers.get("user-agent")??"",r);return o(200,{pass:!0,expires_in:300},{"set-cookie":`${J}=${a}; Path=/; Secure; SameSite=Lax; HttpOnly; Max-Age=300`})}var Gt="wdfp1",Me=` +// Build vercel-5ee62f4b6deb. Regenerate from the validator source; gate-bundle.test.ts fails on a hand edit. +var C={"chat.deepseek.com":"DeepSeek","chat.openai.com":"ChatGPT","chatgpt.com":"ChatGPT","claude.ai":"Claude","copilot.microsoft.com":"Copilot","deepseek.com":"DeepSeek","gemini.google.com":"Gemini","grok.com":"Grok","kagi.com":"Kagi","meta.ai":"Meta AI","perplexity.ai":"Perplexity","phind.com":"Phind","www.deepseek.com":"DeepSeek","www.grok.com":"Grok","www.kagi.com":"Kagi","www.meta.ai":"Meta AI","www.perplexity.ai":"Perplexity","www.phind.com":"Phind","www.you.com":"You.com","you.com":"You.com"};var rt=["utm_source","ref","utm_medium"],ae=500;function nt(e,t){let r=(e??"").trim();if(r)try{return C[new URL(r).hostname.toLowerCase()]??""}catch{return""}let n;try{n=new URL(t)}catch{return""}for(let o of rt)for(let a of n.searchParams.getAll(o)){let i=ot(a);if(i)return i}return""}var ie=e=>e.replace(/[ \-_.]/g,"");function ot(e){let t=e.trim().toLowerCase();if(!t)return"";try{let n=new URL(t).hostname;n&&(t=n.toLowerCase())}catch{}if(t=t.replace(/\.$/,""),C[t])return C[t];let r=ie(t);for(let[n,o]of Object.entries(C))if(r===ie(o.toLowerCase())||r===n.replace(/^www\./,"").replace(/\./g,""))return o;return""}function se(e,t){if(e.method!=="GET")return null;let r=e.headers;if(r.get("sec-fetch-mode")!=="navigate")return null;let n=r.get("sec-fetch-dest");if(n&&n!=="document")return null;let o=nt(r.get("referer")??"",t.toString());if(!o)return null;let a=t.pathname||"/";return a.length>ae&&(a=a.slice(0,ae)),{platform:o,path:a}}var at="web-bot-auth";async function ce(e,t){let r=e.headers.get("signature-input"),n=e.headers.get("signature");if(!r&&!n)return{status:"none"};if(!r||!n)return{status:"invalid"};if(!t||t.length===0)return{status:"unknown_key"};let o,a;try{o=gt(r),a=ft(n)}catch{return{status:"invalid"}}let i=!1,s=!1;for(let c of o){if(c.params.get("tag")!==at)continue;i=!0;let p=a.get(c.label);if(!p)continue;let l=c.params.get("keyid");if(typeof l!="string")continue;let h;try{h=it(e,c)}catch{s||=t.some(f=>f.keyid===l);continue}let d=t.find(f=>{if(f.keyid!==l)return!1;try{return le(f.directory)===h}catch{return!1}});if(!d)continue;s=!0;let w=Date.now()/1e3,b=c.params.get("created"),g=c.params.get("expires");if(typeof b!="number"||typeof g!="number"||w>=g+10||w+101440*60||!c.components.some(f=>f.name==="@authority"||f.name==="@target-uri"))continue;let A;try{A=st(e,c)}catch{continue}let u=!1;try{let f=await crypto.subtle.importKey("raw",de(d.public_key),{name:"Ed25519"},!1,["verify"]);u=await crypto.subtle.verify({name:"Ed25519"},f,p,new TextEncoder().encode(A))}catch{u=!1}if(u)return{status:"verified",name:d.name,category:d.category,keyid:l}}return s?{status:"invalid"}:i?{status:"unknown_key"}:{status:"none"}}function it(e,t){let r=e.headers.get("signature-agent");if(r===null)throw new Error("missing signature-agent");let n=t.components.find(i=>i.name.toLowerCase()==="signature-agent");if(!n)throw new Error("signature-agent is not covered");let o=r.trim(),a;if(o.startsWith('"')){if(n.keyParam!==void 0)throw new Error("legacy string cannot select a member");let i=new T(o);if(a=pe(i),i.skipSP(),!i.eof())throw new Error("trailing signature-agent data")}else{if(n.keyParam===void 0)throw new Error("dictionary member is not covered");let i=B(o).find(c=>c.key===n.keyParam),s=i?.items[0]?.value;if(!i||i.isList||i.items.length!==1||typeof s!="string")throw new Error("signature-agent member is not a string");a=s}return le(a)}function le(e){let t=new URL(e);if(t.protocol!=="https:"||!t.hostname||t.username||t.password)throw new Error("signature-agent must be an https URL");return`https://${H(t)}`}function st(e,t){let r=new URL(e.url),n=[];for(let o of t.components)n.push(`${ct(o)}: ${lt(e,r,o)}`);return n.push(`"@signature-params": ${t.raw.trim()}`),n.join(` +`)}function ct(e){let t=`"${e.name.toLowerCase()}"`;return e.keyParam!==void 0?`${t};key="${e.keyParam}"`:t}function lt(e,t,r){let n=r.name.toLowerCase();if(n==="@authority")return H(t);if(n==="@target-uri")return`${t.protocol}//${H(t)}${t.pathname}${t.search}`;if(n==="signature-agent"){let o=e.headers.get("signature-agent");if(o===null)throw new Error("signature-agent covered but absent");return r.keyParam!==void 0?ut(o,r.keyParam):o.trim().replace(/\s+/g," ")}throw new Error(`unsupported covered component ${n}`)}function H(e){let t=e.hostname.toLowerCase(),r=e.port;return!r||e.protocol==="https:"&&r==="443"||e.protocol==="http:"&&r==="80"?t:`${t}:${r}`}function ut(e,t){let n=B(e).find(o=>o.key===t);if(!n)throw new Error(`signature-agent has no member ${t}`);return n.raw}function gt(e){return B(e).map(r=>{if(!r.isList)throw new Error(`Signature-Input member ${r.key} is not an inner list`);let n=r.items.map(o=>{if(typeof o.value!="string")throw new Error("component identifier is not a string");let a=o.params.get("key");return{name:o.value,keyParam:typeof a=="string"?a:void 0}});return{label:r.key,components:n,params:r.params,raw:r.raw}})}function ft(e){let t=B(e),r=new Map;for(let n of t){if(n.isList||n.items.length!==1)throw new Error(`Signature member ${n.key} is not a byte sequence`);let o=n.items[0].bytes;if(!o)throw new Error(`Signature member ${n.key} is not a byte sequence`);r.set(n.key,o)}return r}var T=class{constructor(t,r=0){this.s=t;this.i=r}eof(){return this.i>=this.s.length}peek(){return this.s[this.i]}skipSP(){for(;!this.eof()&&(this.peek()===" "||this.peek()===" ");)this.i++}};function B(e){let t=new T(e),r=[];for(t.skipSP();!t.eof();){let o={key:ge(t),raw:"",isList:!1,items:[],params:new Map};if(!t.eof()&&t.peek()==="="){t.i++;let a=t.i;if(!t.eof()&&t.peek()==="(")o.isList=!0,pt(t,o);else{let{value:i,params:s,bytes:c}=ue(t);o.items.push({value:i,params:s,...c?{bytes:c}:{}})}o.raw=e.slice(a,t.i)}else o.params=V(t),o.items.push({value:!0,params:new Map});if(r.push(o),t.skipSP(),t.eof())break;if(t.peek()!==",")throw new Error(`expected ',' at ${t.i}`);if(t.i++,t.skipSP(),t.eof())throw new Error("trailing comma")}return r}function pt(e,t){for(e.i++;;){if(e.skipSP(),e.eof())throw new Error("unterminated inner list");if(e.peek()===")"){e.i++;break}let{value:r,params:n}=ue(e);if(t.items.push({value:r,params:n}),e.eof())throw new Error("unterminated inner list");let o=e.peek();if(o!==" "&&o!==")")throw new Error(`bad inner list at ${e.i}`)}t.params=V(e)}function ue(e){let{value:t,bytes:r}=fe(e),n=V(e);return{value:t,params:n,bytes:r}}function V(e){let t=new Map;for(;!e.eof()&&e.peek()===";";){e.i++,e.skipSP();let r=ge(e),n=!0;if(!e.eof()&&e.peek()==="="){e.i++;let o=fe(e);n=(typeof o.value=="boolean",o.value)}typeof n!="boolean"&&t.set(r,n)}return t}function ge(e){let t=e.peek();if(!t||!/[a-z*]/.test(t))throw new Error(`invalid key at ${e.i}`);let r=e.i;for(;!e.eof()&&/[a-z0-9_\-.*]/.test(e.peek());)e.i++;return e.s.slice(r,e.i)}function fe(e){let t=e.peek();if(t==='"')return{value:pe(e)};if(t===":")return{value:"",bytes:dt(e)};if(t==="?"){e.i++;let r=e.peek();if(e.i++,r==="1")return{value:!0};if(r==="0")return{value:!1};throw new Error("bad boolean")}if(t==="-"||/[0-9]/.test(t))return{value:ht(e)};if(/[a-zA-Z*]/.test(t))return{value:mt(e)};throw new Error(`invalid bare item at ${e.i}`)}function pe(e){e.i++;let t="";for(;!e.eof();){let r=e.s[e.i++];if(r==='"')return t;if(r==="\\"){let n=e.s[e.i++];if(n!=='"'&&n!=="\\")throw new Error("bad escape");t+=n}else{let n=r.charCodeAt(0);if(n<32||n>126)throw new Error("bad char in string");t+=r}}throw new Error("unterminated string")}function dt(e){e.i++;let t=e.i;for(;!e.eof()&&e.peek()!==":";)e.i++;if(e.eof())throw new Error("unterminated byte sequence");let r=e.s.slice(t,e.i);return e.i++,de(r)}function ht(e){let t=e.i;for(e.peek()==="-"&&e.i++;!e.eof()&&/[0-9]/.test(e.peek());)e.i++;if(!e.eof()&&e.peek()===".")for(e.i++;!e.eof()&&/[0-9]/.test(e.peek());)e.i++;return Number(e.s.slice(t,e.i))}function mt(e){let t=e.i;for(e.i++;!e.eof()&&/[a-zA-Z0-9!#$%&'*+\-.^_`|~:/]/.test(e.peek());)e.i++;return e.s.slice(t,e.i)}function de(e){let t=atob(e),r=new Uint8Array(new ArrayBuffer(t.length));for(let n=0;n0?Object.keys(W).find(t=>W[t]===e)??"":""}function me(e){return e=bt(e),e=vt(e),e.toLowerCase()}function bt(e){for(let t=0;t<4;t++){let r=yt(e);if(r===e)break;e=r}return e}function yt(e){if(!e.includes("%"))return e;let t="";for(let r=0;r=0&&o>=0){let a=n<<4|o;if(a<128){t+=String.fromCharCode(a),r+=2;continue}}}t+=e[r]}return t}function we(e){return e>=48&&e<=57?e-48:e>=97&&e<=102?e-97+10:e>=65&&e<=70?e-65+10:-1}function vt(e){if(e==="")return e;let t=e.length>1&&e[e.length-1]==="/",r=[];for(let o of e.split("/"))if(!(o===""||o===".")){if(o===".."){r.length>0&&r.pop();continue}r.push(o)}let n="/"+r.join("/");return t&&n!=="/"&&(n+="/"),n}function I(e,t){let r=me(e),n=me(t);if(n.endsWith("/*")){let o=n.slice(0,-2);return o===""?!0:r===o||r.startsWith(o+"/")}return r===n}function O(e){return e.endsWith("/*")?e.length-2:1<<20}function be(e,t,r){let n=new Map,o=new Set,a=[],i=[],s=new Map,c=(u,f)=>{let v=new Set(u);for(let S of f)for(let _ of s.get(S)??[])v.add(_);return v.size===0?void 0:[...v].sort()},p=(u,f,v)=>v?{pattern:u,required_trust:f,refused_behaviors:v}:{pattern:u,required_trust:f};for(let u of t){if(!I(e,u.pattern))continue;if((u.exceptions??[]).some(S=>I(e,S))){i.push(u.pattern);continue}let f=n.get(u.pattern);f===void 0&&a.push(u.pattern);let v=wt(u.min_trust);(f===void 0||v>f)&&n.set(u.pattern,v),u.mode!=="monitor"&&o.add(u.pattern);for(let S of u.refuse_behaviors??[])s.has(u.pattern)||s.set(u.pattern,new Set),s.get(u.pattern)?.add(S)}let l=[];if(a.length===0){let u="";for(let f of i)(u===""||O(f)>O(u))&&(u=f);return{covering:a,deciding_mode:"",attributed:"",required_trust:"",requirement_source:"",previews:l,excepted_by:u,refused_behaviors:[]}}a.sort((u,f)=>O(f)-O(u));let h=r==="monitor",d=a.filter(u=>o.has(u)),w=h?"monitor":"enforce";if(d.length===0){if(!h)for(let u of a)l.push(p(u,z(n.get(u)??0),c([],[u])));d=a,w="monitor"}let b=0,g="";for(let u of d){let f=n.get(u)??0;f>b&&(b=f,g=u)}let A=c([],d)??[];if(w==="enforce")for(let u of a)o.has(u)||l.push(p(u,z(Math.max(b,n.get(u)??0)),c(A,[u])));return{covering:a,deciding_mode:w,attributed:d[0],required_trust:z(b),requirement_source:g,previews:l,excepted_by:"",refused_behaviors:A}}var _t="other",xt={"search engine crawler":"search","ai search":"search","ai assistant":"agent","ai crawler":"training","page preview":"link_preview","feed fetcher":"feeds","monitoring & analytics":"monitoring","search engine optimization":"seo",security:"security_testing"};function D(e){let t=e.trim().toLowerCase();return t?xt[t]??_t:""}function F(e,t){let r=D(e);return r!==""&&t.includes(r)}var At={search_engines:["search engine crawler"],ai_crawlers:["ai assistant","ai crawler","ai search"],monitoring:["monitoring & analytics"]};function ye(e,t){let r=At[e];return r?r.every(n=>F(n,t)):!1}var kt=I;function ve(e,t,r){return e?t?t.some(n=>kt(r,n)):!0:!1}var St="x-wd-service-token",Rt="wd_clearance";function _e(e,t,r=[]){if(e.graded&&t&&!Ot(e.graded.trust,t))return{pass:!1,label:"insufficient-trust"};if(e.crawler&&r.length>0){if(e.crawler.behavior&&r.includes(e.crawler.behavior))return{pass:!1,label:"crawler-refused"};if(!e.crawler.behavior&&e.crawler.exempted)return{pass:!1,label:"missing"}}return{pass:e.pass,label:e.label}}async function Se(e,t,r){let n=new URL(e.url).pathname,o=be(n,Tt(t),t.mode),a=o.deciding_mode||t.mode,i=await Ct(e,t,r,o.covering.length>0,o.excepted_by!==""),s=i.behavior??"",c=_e(i,o.required_trust,o.refused_behaviors),p=c.label==="excepted"?o.excepted_by:c.label==="unscoped"?"":o.attributed,l=!c.pass&&a==="enforce",h=o.previews.map(d=>{let w=_e(i,d.required_trust,d.refused_behaviors??[]);return{pattern:d.pattern,refused:!w.pass&&!l?w.label:""}});return{pass:c.pass,label:c.label,pattern:p,mode:a,previews:h,behavior:c.pass?s:"",crawlerBehavior:i.crawler?.behavior??"",referral:se(e,new URL(e.url)),outsideReach:i.outsideReach??""}}async function Ct(e,t,r,n,o){let a=await Et(e,t,r);if(a.grants)return{pass:!0,label:"machine"};let i=await Pt(e,t,r,n,o);return a.outsideReach?{...i,outsideReach:a.outsideReach}:i}async function Et(e,t,r){let n=e.headers.get(St);if(!n)return{grants:!1,outsideReach:""};let o=await Ce(n,t.keys,r.siteKey);if(!o||o.typ!=="machine"||!o.sub)return{grants:!1,outsideReach:""};if(t.active_credentials.includes(o.sub))return{grants:!0,outsideReach:""};let a=(t.restricted_credentials??[]).find(s=>s&&s.id===o.sub);if(!a)return{grants:!1,outsideReach:""};let i=new URL(e.url).pathname;return ve(a.here,a.paths,i)?{grants:!0,outsideReach:""}:{grants:!1,outsideReach:o.sub}}async function Pt(e,t,r,n,o){let a=await r.verifiedBotCategory(e,n)||"",i=a?{behavior:D(a),exempted:!1}:void 0;if(a&&It(a,t)){let l=D(a);return{pass:!0,label:"verified-bot",behavior:l,crawler:{behavior:l,exempted:!0}}}let s=await ce(e,t.signed_agents);if(s.status==="verified"&&Dt(s.category,t))return{pass:!0,label:"signed-agent",behavior:Ae(s.category),crawler:{behavior:Ae(s.category),exempted:!0}};if(s.status==="invalid"&&n)return{pass:!1,label:"agent-impersonation",crawler:i};if(!n)return o?{pass:!0,label:"excepted",crawler:i}:{pass:!0,label:"unscoped",crawler:i};let c=q(e.headers.get("cookie")??"",Rt);if(!c)return{pass:!1,label:"missing",crawler:i};let p=await Ce(c,t.keys,r.siteKey);return!p||(p.typ??"")!==""?{pass:!1,label:"invalid",crawler:i}:t.denied_fps&&t.denied_fps.includes(p.fp)?{pass:!1,label:"revoked",crawler:i}:{pass:!0,label:"valid",graded:{trust:p.trust},crawler:i}}function Tt(e){let t=new Set(e.routes),r=new Map;for(let o of e.route_exceptions??[])t.has(o.pattern)&&Array.isArray(o.except)&&r.set(o.pattern,o.except);let n=e.routes.map(o=>({pattern:o,exceptions:r.get(o)}));for(let o of e.route_min_trust??[])t.has(o.pattern)&&n.push({pattern:o.pattern,min_trust:o.min_trust,exceptions:r.get(o.pattern)});for(let o of e.monitor_routes??[])n.push({pattern:o.pattern,min_trust:o.min_trust,mode:"monitor",exceptions:o.except});for(let o of e.route_refusals??[])!Array.isArray(o.refuse_behaviors)||o.refuse_behaviors.length===0||(o.mode==="monitor"?n.push({pattern:o.pattern,mode:"monitor",refuse_behaviors:o.refuse_behaviors}):t.has(o.pattern)&&n.push({pattern:o.pattern,exceptions:r.get(o.pattern),refuse_behaviors:o.refuse_behaviors}));return n}var Bt={"attested-human":2,"human-likely":1,clean:0};function xe(e){return Bt[e??""]??0}function Ot(e,t){return xe(e)>=xe(t)}function It(e,t){let r=t.allow_behaviors;return r?F(e,r):Mt(e,t.allow)}function Dt(e,t){let r=t.allow_behaviors;return r?ye(e,r):he(e,t.allow)}function Ae(e){return e==="search_engines"?"search":e==="monitoring"?"monitoring":""}function Mt(e,t){let r=e.trim().toLowerCase();return!!(t.search_engines&&r.includes("search engine crawler")||t.ai_crawlers&&r.startsWith("ai ")||t.monitoring&&r.includes("monitoring"))}function j(e){return!e.pass&&e.mode==="enforce"&&(e.label==="missing"||e.label==="invalid")}function Re(e){return j(e)?{...e,pass:!0,label:"outage-pass"}:e}function q(e,t){for(let r of e.split(";")){let n=r.indexOf("=");if(!(n<0)&&r.slice(0,n).trim()===t)return r.slice(n+1).trim()||null}return null}async function Ce(e,t,r){try{let n=e.indexOf(".");if(n<0)return null;let o=ke(e.slice(0,n)),a=ke(e.slice(n+1)),i=JSON.parse(new TextDecoder().decode(o)),s=t.find(l=>l.kid===i.kid);if(!s)return null;let c=await crypto.subtle.importKey("raw",Lt(s.public_key),{name:"Ed25519"},!1,["verify"]);return!await crypto.subtle.verify({name:"Ed25519"},c,a,o)||i.tenant!==r||Date.now()/1e3>=i.exp?null:i}catch{return null}}function ke(e){let t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4);return Ee(atob(t))}function Lt(e){return Ee(atob(e))}function Ee(e){let t=new Uint8Array(new ArrayBuffer(e.length));for(let r=0;r{let o=!1;try{let a=new AbortController,i=setTimeout(()=>a.abort(),3e3);try{let s=await n(e.replace(/\/+$/,"")+"/api/v1/clearance",{method:"POST",headers:{"content-type":"application/json","user-agent":"WebDecoy-OutageProbe/1"},body:JSON.stringify({aid:t,fp:"wd-outage-probe",scope:"",ua:"WebDecoy-OutageProbe/1"}),signal:a.signal});s.status===429?o=!0:s.status<300&&(o=typeof(await s.json())?.granted=="boolean")}finally{clearTimeout(i)}}catch{o=!1}return M={at:r,available:o},o})();try{return await E}finally{E=null}}function Pe(e){let t="";for(let r of new Uint8Array(e))t+=String.fromCharCode(r);return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function Te(e,t){let r=await crypto.subtle.importKey("raw",new TextEncoder().encode(e),{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return Pe(await crypto.subtle.sign("HMAC",r,new TextEncoder().encode(t)))}async function Be(e){return Pe(await crypto.subtle.digest("SHA-256",new TextEncoder().encode(e))).slice(0,16)}function Oe(e,t,r){return`${Ut}|${e}|${t}|${r}`}async function Kt(e,t,r,n){let o=Math.floor(n/1e3)+300;return`${o}.${await Te(e,Oe(t,o,await Be(r)))}`}async function Ie(e,t,r,n,o){if(!t||!e)return!1;let a=e.indexOf(".");if(a<=0)return!1;let i=Number(e.slice(0,a));if(!Number.isInteger(i)||i<=Math.floor(o/1e3)||i>Math.floor(o/1e3)+300)return!1;let s=await Te(t,Oe(r,i,await Be(n))),c=e.slice(a+1);if(c.length!==s.length)return!1;let p=0;for(let l=0;lnew Response(JSON.stringify(s),{status:i,headers:{"content-type":"application/json","cache-control":"no-store",...c}});if(e.method!=="POST")return o(405,{pass:!1});if(!t.sensorKey)return o(503,{pass:!1,reason:"unsupported"});if(await Nt(t.apiBase,t.siteKey,r,n))return o(409,{pass:!1,reason:"mint_available"});let a=await Kt(t.sensorKey,t.host,e.headers.get("user-agent")??"",r);return o(200,{pass:!0,expires_in:300},{"set-cookie":`${J}=${a}; Path=/; Secure; SameSite=Lax; HttpOnly; Max-Age=300`})}var Gt="wdfp1",Me=` async function wdDeviceFP() { // Canvas: 32-bit rolling hash of the dataURL, matching // EnvironmentalCollector._getCanvasHash in @webdecoy/client. The drawing @@ -48,7 +48,7 @@ async function wdDeviceFP() { return { fp: fp, canvas32: canvas32, webgl: webgl }; } -`;function Y(e){let r=["missing","invalid","insufficient-trust","revoked","crawler-refused","agent-impersonation"].includes(e)?e:"denied";return{version:1,reason:r,recoverable:r==="missing"||r==="invalid"||r==="insufficient-trust"}}function Le(e){let t=Y(e);return{"cache-control":"no-store","x-wd-clearance":"challenged","x-wd-challenge":String(t.version),"x-wd-challenge-reason":t.reason,"x-wd-challenge-recoverable":String(t.recoverable)}}var Kt=6e4,U="x-wd-clearance",Ue="x-wd-class",Ne="__wd_clearance_check",Q="/.well-known/wd-clearance/pat",P=new Map,Ht=16,Vt=3e4,zt=3e5,Z=new Map,X=new Map,Wt=86400;function $e(e,t){return`https://wd-config.invalid/${encodeURIComponent(e)}/${encodeURIComponent(t)}`}function Ge(){try{return globalThis.caches?.default??null}catch{return null}}async function Ke(e,t){let r=Ge();if(!r)return null;try{let n=await r.match($e(e,t));return n?await n.json():null}catch{return null}}async function Ft(e,t,r){let n=Ge();if(n)try{await n.put($e(e,t),new Response(JSON.stringify(r),{headers:{"content-type":"application/json","cache-control":`max-age=${Wt}`}}))}catch{}}function jt(e){let t=e?.headers.get("retry-after"),r=t?Number(t):NaN;return Number.isFinite(r)&&r>0?Math.min(Math.max(r*1e3,5e3),zt):Vt}async function He(e,t){let r=Date.now(),n=t,o=P.get(n);if(o&&r-o.atHt){let c=P.keys().next();c.done||P.delete(c.value)}return await Ft(e.siteKey,t,s),s}}catch{}return Z.set(r,n+jt(a)),o??await Ke(e.siteKey,t)}function Ve(e,t,r,n){return new Response(JSON.stringify({wd_clearance:!0,nonce:e,mode:t,site_key:r,capabilities:n}),{status:200,headers:{"content-type":"application/json","cache-control":"no-store","access-control-allow-origin":"*"}})}var Jt=3e3;async function ze(e,t){let r=new URL(e.url).searchParams.get("fp")??"",n=`${t}/api/v1/clearance/pat?fp=${encodeURIComponent(r)}`,o=new Headers,a=e.headers.get("authorization");a&&o.set("authorization",a);let i;try{i=await fetch(n,{method:"GET",headers:o,redirect:"manual",signal:AbortSignal.timeout(Jt)})}catch{return new Response(JSON.stringify({attested:!1,reason:"unreachable"}),{status:200,headers:{"content-type":"application/json","cache-control":"no-store"}})}let s=new Headers({"content-type":"application/json","cache-control":"no-store"}),c=i.headers.get("www-authenticate");return c&&s.set("www-authenticate",c),new Response(i.body,{status:i.status,headers:s})}function We(e,t,r,n="denied"){let o=e.headers.get("accept")??"";if(e.method!=="GET"||!o.includes("text/html"))return new Response(JSON.stringify({error:"clearance required",challenge:Y(n)}),{status:403,headers:{"content-type":"application/json",...Le(n)}});let a=Xt(t,r);return new Response(a,{status:403,headers:{"content-type":"text/html; charset=utf-8","cache-control":"no-store",[U]:"challenged"}})}var Yt="https://cdn.webdecoy.com/wordpress/assets/icon-128x128.png";function Xt(e,t){return` +`;function Y(e){let r=["missing","invalid","insufficient-trust","revoked","crawler-refused","agent-impersonation"].includes(e)?e:"denied";return{version:1,reason:r,recoverable:r==="missing"||r==="invalid"||r==="insufficient-trust"}}function Le(e){let t=Y(e);return{"cache-control":"no-store","x-wd-clearance":"challenged","x-wd-challenge":String(t.version),"x-wd-challenge-reason":t.reason,"x-wd-challenge-recoverable":String(t.recoverable)}}var $t=6e4,U="x-wd-clearance",Ue="x-wd-class",Ne="__wd_clearance_check",Q="/.well-known/wd-clearance/pat",P=new Map,Ht=16,Vt=3e4,zt=3e5,Z=new Map,X=new Map,Wt=86400;function Ke(e,t){return`https://wd-config.invalid/${encodeURIComponent(e)}/${encodeURIComponent(t)}`}function Ge(){try{return globalThis.caches?.default??null}catch{return null}}async function $e(e,t){let r=Ge();if(!r)return null;try{let n=await r.match(Ke(e,t));return n?await n.json():null}catch{return null}}async function Ft(e,t,r){let n=Ge();if(n)try{await n.put(Ke(e,t),new Response(JSON.stringify(r),{headers:{"content-type":"application/json","cache-control":`max-age=${Wt}`}}))}catch{}}function jt(e){let t=e?.headers.get("retry-after"),r=t?Number(t):NaN;return Number.isFinite(r)&&r>0?Math.min(Math.max(r*1e3,5e3),zt):Vt}async function He(e,t){let r=Date.now(),n=t,o=P.get(n);if(o&&r-o.at<$t)return o.config;let a=Z.get(n);if(a!==void 0&&rHt){let c=P.keys().next();c.done||P.delete(c.value)}return await Ft(e.siteKey,t,s),s}}catch{}return Z.set(r,n+jt(a)),o??await $e(e.siteKey,t)}function Ve(e,t,r,n){return new Response(JSON.stringify({wd_clearance:!0,nonce:e,mode:t,site_key:r,capabilities:n}),{status:200,headers:{"content-type":"application/json","cache-control":"no-store","access-control-allow-origin":"*"}})}var Jt=3e3;async function ze(e,t){let r=new URL(e.url).searchParams.get("fp")??"",n=`${t}/api/v1/clearance/pat?fp=${encodeURIComponent(r)}`,o=new Headers,a=e.headers.get("authorization");a&&o.set("authorization",a);let i;try{i=await fetch(n,{method:"GET",headers:o,redirect:"manual",signal:AbortSignal.timeout(Jt)})}catch{return new Response(JSON.stringify({attested:!1,reason:"unreachable"}),{status:200,headers:{"content-type":"application/json","cache-control":"no-store"}})}let s=new Headers({"content-type":"application/json","cache-control":"no-store"}),c=i.headers.get("www-authenticate");return c&&s.set("www-authenticate",c),new Response(i.body,{status:i.status,headers:s})}function We(e,t,r,n="denied"){let o=e.headers.get("accept")??"";if(e.method!=="GET"||!o.includes("text/html"))return new Response(JSON.stringify({error:"clearance required",challenge:Y(n)}),{status:403,headers:{"content-type":"application/json",...Le(n)}});let a=Xt(t,r);return new Response(a,{status:403,headers:{"content-type":"text/html; charset=utf-8","cache-control":"no-store",[U]:"challenged"}})}var Yt="https://cdn.webdecoy.com/wordpress/assets/icon-128x128.png";function Xt(e,t){return` @@ -203,8 +203,8 @@ ${Me} })(); -`}function N(e){if(typeof e!="string")return"";let t=e.trim().toLowerCase().replace(/:\d+$/,"").replace(/\.$/,"");return t.length>0&&t.length<=253?t:""}var Fe=["route_min_trust","route_attribution","monitor_routes","route_exceptions","bot_behaviors","credential_reach","route_refusals","crawler_behavior","ai_referrals"];var ee=60,Zt=500,Qt=6e3,je=40,er=60,tr=16,R=new TextEncoder,rr=60,nr=24,or=3e3,ar=2e4,ir=1e4,sr=16,x=new Map;function cr(e,t,r){return`${e}|${t}|${r}`}function qe(e,t,r,n,o=Date.now()){try{let a=e?.label??"",i=e?.mode??"",s=e?.pattern??"",c=e?.previews??[],p=e?.behavior??"",l=e?.crawlerBehavior??"",h=e?.outsideReach??"";if(!a||!r||!r.siteKey||!r.apiBase)return;let d=N(t);if(!d)return;let w=Math.floor(o/1e3/ee)*ee,b=cr(w,i,d);for(let[m,y]of x)y.bucketStart!==w&&($(y,r,n),x.delete(m));let g=x.get(b);if(!g){if(x.size>=sr)for(let[m,y]of x)$(y,r,n),x.delete(m);g={bucketStart:w,mode:i,host:d,counts:new Map,routes:new Map,previews:new Map,credentials:new Map,referrals:new Map,refusals:[],routeBytes:0,total:0},x.set(b,g),lr(b,g,r,n,o)}g.counts.set(a,(g.counts.get(a)??0)+1);let A=typeof s=="string"?s:"",u=typeof p=="string"?p:"",f=typeof l=="string"?l:"",v=`${A} +`}function N(e){if(typeof e!="string")return"";let t=e.trim().toLowerCase().replace(/:\d+$/,"").replace(/\.$/,"");return t.length>0&&t.length<=253?t:""}var Fe=["route_min_trust","route_attribution","monitor_routes","route_exceptions","bot_behaviors","credential_reach","route_refusals","crawler_behavior","ai_referrals"];var ee=60,Zt=500,Qt=6e3,je=40,er=60,tr=16,k=new TextEncoder,rr=60,nr=24,or=3e3,ar=2e4,ir=1e4,sr=16,x=new Map;function cr(e,t,r){return`${e}|${t}|${r}`}function qe(e,t,r,n,o=Date.now()){try{let a=e?.label??"",i=e?.mode??"",s=e?.pattern??"",c=e?.previews??[],p=e?.behavior??"",l=e?.crawlerBehavior??"",h=e?.outsideReach??"";if(!a||!r||!r.siteKey||!r.apiBase)return;let d=N(t);if(!d)return;let w=Math.floor(o/1e3/ee)*ee,b=cr(w,i,d);for(let[m,y]of x)y.bucketStart!==w&&(K(y,r,n),x.delete(m));let g=x.get(b);if(!g){if(x.size>=sr)for(let[m,y]of x)K(y,r,n),x.delete(m);g={bucketStart:w,mode:i,host:d,counts:new Map,routes:new Map,previews:new Map,credentials:new Map,referrals:new Map,refusals:[],routeBytes:0,total:0},x.set(b,g),lr(b,g,r,n,o)}g.counts.set(a,(g.counts.get(a)??0)+1);let A=typeof s=="string"?s:"",u=typeof p=="string"?p:"",f=typeof l=="string"?l:"",v=`${A} ${a} ${u} -${f}`,C=g.routes.get(v);C?C.count++:(g.routes.set(v,{pattern:A,verdict:a,behavior:u,crawlerBehavior:f,count:1}),g.routeBytes+=R.encode(A).length+R.encode(a).length+R.encode(u).length+R.encode(f).length+je);for(let m of Array.isArray(c)?c:[]){if(!m||typeof m.pattern!="string"||!m.pattern)continue;let y=g.previews.get(m.pattern);y||(y={evaluated:0,refused:new Map},g.previews.set(m.pattern,y),g.routeBytes+=R.encode(m.pattern).length+er),y.evaluated++,typeof m.refused=="string"&&m.refused&&(y.refused.has(m.refused)||(g.routeBytes+=R.encode(m.refused).length+tr),y.refused.set(m.refused,(y.refused.get(m.refused)??0)+1))}typeof h=="string"&&h&&g.credentials.set(h,(g.credentials.get(h)??0)+1);let _=e?.referral;if(_&&typeof _.platform=="string"&&_.platform&&typeof _.path=="string"){let m=`${_.platform} -${_.path}`,y=g.referrals.get(m);y?y.count++:(g.referrals.set(m,{platform:_.platform,path:_.path,count:1}),g.routeBytes+=R.encode(_.platform).length+R.encode(_.path).length+je)}let S=e?.refusal;S&&typeof S.ip=="string"&&S.ip&&typeof S.path=="string"&&S.path.startsWith("/")&&(g.refusals.push({ip:S.ip,path:S.path,at:Math.floor(o/1e3),verdict:a}),g.routeBytes+=rr),g.total++,(g.total>=Zt||g.routeBytes>=Qt)&&($(g,r,n),x.delete(b))}catch{}}function lr(e,t,r,n,o){try{let a=(t.bucketStart+ee)*1e3,i=Math.floor(Math.random()*ir),s=Math.max(0,Math.min(a-o+i,ar));n.waitUntil(new Promise(c=>{setTimeout(()=>{try{x.get(e)===t&&($(t,r,n),x.delete(e))}catch{}c()},s)}))}catch{}}function $(e,t,r){try{if(e.total<=0||e.counts.size===0)return;let n={};for(let[l,h]of e.counts)n[l]=h;let o=[];for(let l of e.routes.values()){let h={pattern:l.pattern,verdict:l.verdict,count:l.count};l.behavior&&(h.behavior=l.behavior),l.crawlerBehavior&&(h.crawler_behavior=l.crawlerBehavior),o.push(h)}let a={organization_id:t.siteKey,bucket_start:e.bucketStart,mode:e.mode,counts:n,route_counts:o,report_id:crypto.randomUUID()};if(e.previews.size>0){let l=[];for(let[h,d]of e.previews){let w={};for(let[b,g]of d.refused)w[b]=g;l.push({pattern:h,evaluated:d.evaluated,additional_refusals:w})}a.previews=l}if(e.credentials.size>0){let l=[];for(let[h,d]of e.credentials)l.push({credential_id:h,outside_reach:d});a.credential_presentations=l}e.referrals.size>0&&(a.ai_referrals=[...e.referrals.values()].map(l=>({platform:l.platform,path:l.path,count:l.count}))),t.propertyId&&(a.property_id=t.propertyId),a.host=e.host,t.bundleVersion&&(a.reporter_version=t.bundleVersion);let i=!!(t.scannerId&&t.sensorKey);i&&(a.scanner_id=t.scannerId),a.capabilities=t.capabilities??Fe;let s=i?e.refusals:[],c=()=>fr(t.apiBase,JSON.stringify(a),i?t.sensorKey:void 0),p=s.length===0?c():gr(t.siteKey,s).then(l=>{a.refusals=l}).catch(()=>{}).then(c);r.waitUntil(p.then(()=>{},()=>{}))}catch{}}async function ur(e,t,r){let n=await crypto.subtle.digest("SHA-256",R.encode(`${e.toLowerCase()}|${t}|${r}`)),o="";for(let a of new Uint8Array(n))o+=a.toString(16).padStart(2,"0");return o.slice(0,nr)}async function gr(e,t){let r=[];for(let n of t)r.push({k:await ur(e,n.ip,n.path),t:n.at,v:n.verdict});return r}async function fr(e,t,r){let n=new AbortController,o=setTimeout(()=>n.abort(),or),a={"content-type":"application/json"};r&&(a["x-wd-sensor-key"]=r);try{await fetch(e.replace(/\/+$/,"")+"/api/v1/clearance/telemetry",{method:"POST",headers:a,body:t,signal:n.signal})}finally{clearTimeout(o)}}var G=["route_min_trust","route_attribution","monitor_routes","route_exceptions","bot_behaviors","credential_reach","bot_verification_rdns","crawler_behavior","ai_referrals"];var pr=[{category:"search_engines",suffixes:[".googlebot.com",".google.com",".search.msn.com",".crawl.yahoo.net",".applebot.apple.com",".yandex.com",".yandex.net",".yandex.ru",".crawl.baidu.com",".crawl.baidu.jp"]}];function dr(e,t){let r=e.toLowerCase().replace(/\.$/,"");for(let n of pr)if(t[n.category]){for(let o of n.suffixes)if(r.endsWith(o))return n.category}return null}var K=new Map,hr=36e5,mr=5e3;async function Je(e,t,r,n){let o=K.get(e);if(o&&n-o.at=mr&&K.clear(),K.set(e,{category:a,at:n}),a}async function wr(e,t,r){let n=e.replace(/\.$/,""),o=t.includes(":")?[r.resolve6(n)]:[r.resolve4(n)];try{return(await Promise.all(o)).flat().some(i=>i===t)}catch{return!1}}var Ye=[["reflectionbot","Reflectionbot","reflectionbot","crawler"],["gptbot","GPTBot","gptbot","crawler"],["claudebot","ClaudeBot","claudebot","crawler"],["anthropic-ai","Anthropic","anthropic","crawler"],["claude-web","Claude-Web","claude-web","crawler"],["ccbot","CCBot","ccbot","crawler"],["google-extended","Google-Extended","google-extended","crawler"],["bytespider","ByteSpider","bytespider","crawler"],["amazonbot","Amazonbot","amazonbot","crawler"],["facebookbot","FacebookBot","facebookbot","crawler"],["meta-externalagent","Meta-ExternalAgent","meta-externalagent","crawler"],["cohere-ai","Cohere","cohere-ai","crawler"],["cohere","Cohere","cohere-ai","crawler"],["applebot-extended","Applebot-Extended","applebot-extended","crawler"],["youbot","YouBot","youbot","crawler"],["mistralbot","MistralBot","mistral","crawler"],["gemini","Gemini","gemini","crawler"],["ai2bot","AI2Bot","ai2bot","crawler"],["deepseek","DeepSeek","deepseek","crawler"],["qwen","Qwen","qwen","crawler"],["webzio","Webz.io","webzio","crawler"],["sentibot","Sentibot","sentibot","crawler"],["omgili","Omgili","omgili","crawler"],["img2dataset","img2dataset","img2dataset","crawler"],["timpibot","Timpibot","timpibot","crawler"],["velenpublicwebcrawler","VelenPublicWebCrawler","velenpublicwebcrawler","crawler"],["isscyberriskcrawler","ISSCyberRiskCrawler","isscyberriskcrawler","crawler"],["friendlycrawler","FriendlyCrawler","friendlycrawler","crawler"],["duckassistbot","DuckAssistBot","duckassistbot","crawler"],["sofyabot","SofyaBot","sofyabot","crawler"],["xai-searchbot","xAI-SearchBot","xai-searchbot","crawler"],["linkupbot","LinkupBot","linkupbot","crawler"],["perplexitybot","PerplexityBot","perplexitybot","crawler"],["claude-searchbot","Claude-SearchBot","claude-searchbot","crawler"],["oai-searchbot","OAI-SearchBot","oai-searchbot","crawler"],["searchgpt","SearchGPT","searchgpt","crawler"],["phind","Phind","phind","crawler"],["kagi","Kagi","kagi","crawler"],["exasearchbot","Exa","exa","crawler"],["exabot","Exa","exa","crawler"],["shapbot","ShapBot","shapbot","crawler"],["meta-webindexer","Meta-WebIndexer","meta-webindexer","crawler"],["metaphor","Metaphor","metaphor","crawler"],["tavily","Tavily","tavily","crawler"],["bravesearch","BraveSearch","brave-search","crawler"],["neevabot","NeevaBot","neeva","crawler"],["operator","Operator","operator","crawler"],["claude-user","Claude-User","claude-user","crawler"],["gemini-user","Gemini-User","gemini-user","crawler"],["googleagent-mariner","GoogleAgent-Mariner","googleagent-mariner","crawler"],["mariner","GoogleAgent-Mariner","googleagent-mariner","crawler"],["amazonbuyforme","AmazonBuyForMe","amazon-buyforme","crawler"],["buyforme","AmazonBuyForMe","amazon-buyforme","crawler"],["browser-use","Browser-Use","browser-use","crawler"],["stagehand","Stagehand","stagehand","crawler"],["manus-user","Manus-User","manus-user","crawler"],["multion","MultiOn","multion","crawler"],["iboubot","IbouBot","iboubot","crawler"],["googlebot","Googlebot","googlebot","crawler"],["google-inspectiontool","Google-InspectionTool","google-inspectiontool","crawler"],["bingbot","Bingbot","bingbot","crawler"],["msnbot","MSNBot","msnbot","crawler"],["yandexbot","YandexBot","yandexbot","crawler"],["baiduspider","Baiduspider","baiduspider","crawler"],["petalbot","PetalBot","petalbot","crawler"],["duckduckbot","DuckDuckBot","duckduckbot","crawler"],["applebot","Applebot","applebot","crawler"],["sogou","Sogou Spider","sogou","crawler"],["qwantify","Qwantify","qwantify","crawler"],["naver","Naver","naver","crawler"],["yeti","Naver","naver","crawler"],["seznambot","SeznamBot","seznam","crawler"],["ecosia","Ecosia","ecosia","crawler"],["mojeekbot","MojeekBot","mojeek","crawler"],["slurp","Yahoo! Slurp","yahoo-slurp","crawler"],["ahrefsbot","AhrefsBot","ahrefsbot","crawler"],["ahrefs","AhrefsBot","ahrefsbot","crawler"],["semrushbot","SemrushBot","semrushbot","crawler"],["semrush","SemrushBot","semrushbot","crawler"],["mj12bot","MJ12bot","mj12bot","crawler"],["dotbot","DotBot","dotbot","crawler"],["rogerbot","Rogerbot","rogerbot","crawler"],["screaming frog","Screaming Frog","screaming-frog","crawler"],["sitebulb","Sitebulb","sitebulb","crawler"],["deepcrawl","DeepCrawl","deepcrawl","crawler"],["oncrawl","OnCrawl","oncrawl","crawler"],["botify","Botify","botify","crawler"],["contentking","ContentKing","contentking","crawler"],["sistrix","SISTRIX","sistrix","crawler"],["serpstat","Serpstat","serpstat","crawler"],["spyfu","SpyFu","spyfu","crawler"],["nessus","Nessus","nessus","crawler"],["qualys","Qualys","qualys","crawler"],["shodan","Shodan","shodan","crawler"],["censys","Censys","censys","crawler"],["nmap","Nmap","nmap","crawler"],["zap/","OWASP ZAP","zap","crawler"],["burp","Burp Suite","burp","crawler"],["nikto","Nikto","nikto","crawler"],["nuclei","Nuclei","nuclei","crawler"],["acunetix","Acunetix","acunetix","crawler"],["netsparker","Netsparker","netsparker","crawler"],["detectify","Detectify","detectify","crawler"],["intruder","Intruder","intruder","crawler"],["python-requests","Python-Requests","python-requests","tool"],["python-urllib","Python-urllib","python-urllib","tool"],["python/","Python","python","tool"],["scrapy","Scrapy","scrapy","tool"],["httpx","HTTPX","httpx","tool"],["aiohttp","aiohttp","aiohttp","tool"],["beautifulsoup","BeautifulSoup","beautifulsoup","tool"],["node-fetch","node-fetch","node-fetch","tool"],["axios/","Axios","axios","tool"],["got/","Got","got","tool"],["undici","Undici","undici","tool"],["go-http-client","Go-HTTP-Client","go-http-client","tool"],["colly","Colly","colly","tool"],["java/","Java","java","tool"],["okhttp","OkHttp","okhttp","tool"],["apache-httpclient","Apache-HttpClient","apache-httpclient","tool"],["jsoup","Jsoup","jsoup","tool"],["guzzlehttp","GuzzleHttp","guzzlehttp","tool"],["php/","PHP","php","tool"],["ruby","Ruby","ruby","tool"],["faraday","Faraday","faraday","tool"],["mechanize","Mechanize","mechanize","tool"],["headlesschrome","HeadlessChrome","headlesschrome","tool"],["puppeteer","Puppeteer","puppeteer","tool"],["playwright","Playwright","playwright","tool"],["selenium","Selenium","selenium","tool"],["phantomjs","PhantomJS","phantomjs","tool"],["splash","Splash","splash","tool"],["browserless","Browserless","browserless","tool"],["browserbase","Browserbase","browserbase","tool"],["ia_archiver","Internet Archive","ia-archiver","crawler"],["archive.org_bot","Archive.org","archive-org-bot","crawler"],["wayback","Wayback Machine","wayback","crawler"],["heritrix","Heritrix","heritrix","crawler"],["brozzler","Brozzler","brozzler","crawler"],["facebookexternalhit","Facebook","facebookexternalhit","crawler"],["facebot","Facebot","facebot","crawler"],["twitterbot","Twitterbot","twitterbot","crawler"],["linkedinbot","LinkedInBot","linkedinbot","crawler"],["slackbot","Slackbot","slackbot","crawler"],["telegrambot","TelegramBot","telegrambot","crawler"],["whatsapp","WhatsApp","whatsapp","crawler"],["discordbot","Discordbot","discordbot","crawler"],["pinterest","Pinterest","pinterestbot","crawler"],["tumblr","Tumblr","tumblr","crawler"],["reddit","Reddit","reddit","crawler"],["embedly","Embedly","embedly","crawler"],["iframely","Iframely","iframely","crawler"],["curl/","cURL","curl","tool"],["wget/","Wget","wget","tool"],["libwww-perl","libwww-perl","libwww-perl","tool"],["lwp-","LWP","lwp","tool"],["httrack","HTTrack","httrack","tool"],["webdecoybot","WebDecoyBot","webdecoybot","crawler"],["uptimerobot","UptimeRobot","uptimerobot","crawler"],["pingdom","Pingdom","pingdom","crawler"],["statuscake","StatusCake","statuscake","crawler"],["betteruptime","Better Uptime","better-uptime","crawler"],["datadog","Datadog Synthetics","datadog-synthetics","crawler"],["newrelic","New Relic","newrelic","crawler"],["site24x7","Site24x7","site24x7","crawler"],["freshping","Freshping","freshping","crawler"],["hetrixtools","HetrixTools","hetrixtools","crawler"],["nodeping","NodePing","nodeping","crawler"],["gtmetrix","GTmetrix","gtmetrix","crawler"],["chrome-lighthouse","Lighthouse","chrome-lighthouse","crawler"],["google page speed","Lighthouse","chrome-lighthouse","crawler"],["feedly","Feedly","feedly","crawler"],["feedfetcher","Feedfetcher-Google","feedfetcher-google","crawler"],["newsblur","NewsBlur","newsblur","crawler"],["inoreader","Inoreader","inoreader","crawler"],["theoldreader","The Old Reader","theoldreader","crawler"],["feedbin","Feedbin","feedbin","crawler"],["miniflux","Miniflux","miniflux","crawler"],["freshrss","FreshRSS","freshrss","crawler"],["commafeed","CommaFeed","commafeed","crawler"],["diffbot","Diffbot","diffbot","crawler"],["import.io","Import.io","import-io","crawler"],["brightdata","Bright Data","bright-data","crawler"],["luminati","Bright Data","bright-data","crawler"],["oxylabs","Oxylabs","oxylabs","crawler"],["scrapingbee","ScrapingBee","scrapingbee","crawler"],["scrapingant","ScrapingAnt","scrapingant","crawler"],["zyte","Zyte","zyte","crawler"],["scrapinghub","Zyte","zyte","crawler"],["apify","Apify","apify","crawler"],["crawlbase","Crawlbase","crawlbase","crawler"],["webscrapingapi","WebScrapingAPI","webscrapingapi","crawler"],["chatgpt-user","ChatGPT-User","chatgpt-user","crawler"],["perplexity-user","Perplexity-User","perplexity-user","crawler"],["mistralai-user","MistralAI-User","mistralai-user","crawler"],["exauser","ExaUser","exauser","crawler"],["shap-user","Shap-User","shap-user","crawler"],["meta-externalfetcher","Meta-ExternalFetcher","meta-externalfetcher","crawler"],["gemini-deep-research","Gemini-Deep-Research","gemini-deep-research","crawler"],["copilot","Microsoft Copilot","copilot","crawler"],["cortana","Cortana","cortana","crawler"],["siri","Siri","siri","crawler"]];function br(e){for(let[t,r,n,o]of Ye)if(e.includes(t))return{name:r,id:n,kind:o};return null}var yr=/(?:bot|crawler|spider)(?:[/\s);,]|$)/i;function Xe(e){let t=e.toLowerCase(),r=br(t);return r?.kind==="crawler"||!r&&yr.test(e)}var vr="Search Engine Crawler",te=1e3,_r={search_engines:!0,ai_crawlers:!0,monitoring:!0};function xr(e){if(!e.includes(":"))return e.split(".").reverse().join(".")+".in-addr.arpa";let[t,r=""]=e.split("::"),n=t?t.split(":"):[],o=r?r.split(":"):[],a=8-n.length-o.length;return a<0?"":[...n,...Array(Math.max(0,a)).fill("0"),...o].map(s=>s.padStart(4,"0")).join("").split("").reverse().join(".")+".ip6.arpa"}function re(e,t){return Promise.race([e,new Promise((r,n)=>setTimeout(()=>n(new Error("dns timeout")),t))])}function Ar(e){return{reverse:t=>re(e(xr(t),"PTR"),te),resolve4:t=>re(e(t,"A"),te),resolve6:t=>re(e(t,"AAAA"),te)}}function Ze(e,t,r,n=typeof Deno<"u"&&Deno&&typeof Deno.resolveDns=="function"?Deno.resolveDns.bind(Deno):void 0,o=Date.now()){return!r||!e||!n||!Xe(t)?Promise.resolve(""):Je(e,_r,Ar(n),o).then(a=>a==="search_engines"?vr:"").catch(()=>"")}var Rr="https://cloudflare-dns.com/dns-query",Cr=1e3,Sr={A:1,PTR:12,AAAA:28};function kr(e=fetch){return async(t,r)=>{let n=Sr[r];if(!n)throw new Error(`unsupported record type ${r}`);let o=`${Rr}?name=${encodeURIComponent(t)}&type=${r}`,a=await e(o,{headers:{accept:"application/dns-json"},signal:AbortSignal.timeout(Cr)});if(!a.ok)throw new Error(`doh ${a.status}`);let i=await a.json();if(i.Status!==0)throw new Error(`dns status ${i.Status}`);let s=(i.Answer??[]).filter(c=>c.type===n&&typeof c.data=="string").map(c=>c.data);if(s.length===0)throw new Error("no records");return s}}function Qe(e,t,r,n=fetch){return Ze(e,t,r,kr(n))}var ne="vercel-158ba59289ce";var et="https://in.webdecoy.com";function tt(e){let t=new Headers(e.headers);return t.delete(U),t.delete(Ue),t}function oe(e,t){let r=tt(e);return t&&r.set(U,t),{action:"continue",headers:r,verdict:t}}async function Er(e,t,r){try{let n=(r.ingest??"").trim().replace(/\/+$/,"")||et,o=new URL(e.url),a=o.searchParams.get(Ne),i=N(o.hostname),s=await He({apiBase:n,siteKey:r.siteKey},i);if(a!==null)return{action:"respond",response:Ve(a,s?s.mode:"unknown",r.siteKey,G)};if(o.pathname===Q)return{action:"respond",response:await ze(e,n)};if(o.pathname===L)return{action:"respond",response:await De(e,{apiBase:n,siteKey:r.siteKey,sensorKey:r.sensorKey,host:i})};if(!s)return oe(e,null);let c=await Ce(e,s,{siteKey:r.siteKey,verifiedBotCategory:(p,l)=>Qe(t.ip,p.headers.get("user-agent")??"",l,t.fetch??fetch)});if(j(c)){let p=q(e.headers.get("cookie")??"",J);p&&await Ie(p,r.sensorKey,i,e.headers.get("user-agent")??"",Date.now())&&(c=Se(c))}return qe({...c,refusal:c.pass?null:{ip:t.ip,path:o.pathname}},o.hostname,{siteKey:r.siteKey,apiBase:n,scannerId:r.scannerId,sensorKey:r.sensorKey,bundleVersion:ne,capabilities:G},{waitUntil:p=>t.waitUntil?.(p)},Date.now()),c.pass||c.mode!=="enforce"?oe(e,c.label):{action:"respond",response:We(e,n,r.siteKey,c.label)}}catch{try{return oe(e,null)}catch{return{action:"continue",headers:null,verdict:null}}}}export{ne as BUILD,et as DEFAULT_INGEST,G as VERCEL_VALIDATOR_CAPABILITIES,tt as cleanHeaders,Er as runGate}; +${f}`,S=g.routes.get(v);S?S.count++:(g.routes.set(v,{pattern:A,verdict:a,behavior:u,crawlerBehavior:f,count:1}),g.routeBytes+=k.encode(A).length+k.encode(a).length+k.encode(u).length+k.encode(f).length+je);for(let m of Array.isArray(c)?c:[]){if(!m||typeof m.pattern!="string"||!m.pattern)continue;let y=g.previews.get(m.pattern);y||(y={evaluated:0,refused:new Map},g.previews.set(m.pattern,y),g.routeBytes+=k.encode(m.pattern).length+er),y.evaluated++,typeof m.refused=="string"&&m.refused&&(y.refused.has(m.refused)||(g.routeBytes+=k.encode(m.refused).length+tr),y.refused.set(m.refused,(y.refused.get(m.refused)??0)+1))}typeof h=="string"&&h&&g.credentials.set(h,(g.credentials.get(h)??0)+1);let _=e?.referral;if(_&&typeof _.platform=="string"&&_.platform&&typeof _.path=="string"){let m=`${_.platform} +${_.path}`,y=g.referrals.get(m);y?y.count++:(g.referrals.set(m,{platform:_.platform,path:_.path,count:1}),g.routeBytes+=k.encode(_.platform).length+k.encode(_.path).length+je)}let R=e?.refusal;R&&typeof R.ip=="string"&&R.ip&&typeof R.path=="string"&&R.path.startsWith("/")&&(g.refusals.push({ip:R.ip,path:R.path,at:Math.floor(o/1e3),verdict:a}),g.routeBytes+=rr),g.total++,(g.total>=Zt||g.routeBytes>=Qt)&&(K(g,r,n),x.delete(b))}catch{}}function lr(e,t,r,n,o){try{let a=(t.bucketStart+ee)*1e3,i=Math.floor(Math.random()*ir),s=Math.max(0,Math.min(a-o+i,ar));n.waitUntil(new Promise(c=>{setTimeout(()=>{try{x.get(e)===t&&(K(t,r,n),x.delete(e))}catch{}c()},s)}))}catch{}}function K(e,t,r){try{if(e.total<=0||e.counts.size===0)return;let n={};for(let[l,h]of e.counts)n[l]=h;let o=[];for(let l of e.routes.values()){let h={pattern:l.pattern,verdict:l.verdict,count:l.count};l.behavior&&(h.behavior=l.behavior),l.crawlerBehavior&&(h.crawler_behavior=l.crawlerBehavior),o.push(h)}let a={organization_id:t.siteKey,bucket_start:e.bucketStart,mode:e.mode,counts:n,route_counts:o,report_id:crypto.randomUUID()};if(e.previews.size>0){let l=[];for(let[h,d]of e.previews){let w={};for(let[b,g]of d.refused)w[b]=g;l.push({pattern:h,evaluated:d.evaluated,additional_refusals:w})}a.previews=l}if(e.credentials.size>0){let l=[];for(let[h,d]of e.credentials)l.push({credential_id:h,outside_reach:d});a.credential_presentations=l}e.referrals.size>0&&(a.ai_referrals=[...e.referrals.values()].map(l=>({platform:l.platform,path:l.path,count:l.count}))),t.propertyId&&(a.property_id=t.propertyId),a.host=e.host,t.bundleVersion&&(a.reporter_version=t.bundleVersion);let i=!!(t.scannerId&&t.sensorKey);i&&(a.scanner_id=t.scannerId),a.capabilities=t.capabilities??Fe;let s=i?e.refusals:[],c=()=>fr(t.apiBase,JSON.stringify(a),i?t.sensorKey:void 0),p=s.length===0?c():gr(t.siteKey,s).then(l=>{a.refusals=l}).catch(()=>{}).then(c);r.waitUntil(p.then(()=>{},()=>{}))}catch{}}async function ur(e,t,r){let n=await crypto.subtle.digest("SHA-256",k.encode(`${e.toLowerCase()}|${t}|${r}`)),o="";for(let a of new Uint8Array(n))o+=a.toString(16).padStart(2,"0");return o.slice(0,nr)}async function gr(e,t){let r=[];for(let n of t)r.push({k:await ur(e,n.ip,n.path),t:n.at,v:n.verdict});return r}async function fr(e,t,r){let n=new AbortController,o=setTimeout(()=>n.abort(),or),a={"content-type":"application/json"};r&&(a["x-wd-sensor-key"]=r);try{await fetch(e.replace(/\/+$/,"")+"/api/v1/clearance/telemetry",{method:"POST",headers:a,body:t,signal:n.signal})}finally{clearTimeout(o)}}var G=["route_min_trust","route_attribution","monitor_routes","route_exceptions","bot_behaviors","credential_reach","bot_verification_rdns","crawler_behavior","ai_referrals"];var pr=[{category:"search_engines",suffixes:[".googlebot.com",".google.com",".search.msn.com",".crawl.yahoo.net",".applebot.apple.com",".yandex.com",".yandex.net",".yandex.ru",".crawl.baidu.com",".crawl.baidu.jp"]}];function dr(e,t){let r=e.toLowerCase().replace(/\.$/,"");for(let n of pr)if(t[n.category]){for(let o of n.suffixes)if(r.endsWith(o))return n.category}return null}var $=new Map,hr=36e5,mr=5e3;async function Je(e,t,r,n){let o=$.get(e);if(o&&n-o.at=mr&&$.clear(),$.set(e,{category:a,at:n}),a}async function wr(e,t,r){let n=e.replace(/\.$/,""),o=t.includes(":")?[r.resolve6(n)]:[r.resolve4(n)];try{return(await Promise.all(o)).flat().some(i=>i===t)}catch{return!1}}var Ye=[["reflectionbot","Reflectionbot","reflectionbot","crawler"],["gptbot","GPTBot","gptbot","crawler"],["claudebot","ClaudeBot","claudebot","crawler"],["anthropic-ai","Anthropic","anthropic","crawler"],["claude-web","Claude-Web","claude-web","crawler"],["ccbot","CCBot","ccbot","crawler"],["google-extended","Google-Extended","google-extended","crawler"],["bytespider","ByteSpider","bytespider","crawler"],["amazonbot","Amazonbot","amazonbot","crawler"],["facebookbot","FacebookBot","facebookbot","crawler"],["meta-externalagent","Meta-ExternalAgent","meta-externalagent","crawler"],["cohere-ai","Cohere","cohere-ai","crawler"],["cohere","Cohere","cohere-ai","crawler"],["applebot-extended","Applebot-Extended","applebot-extended","crawler"],["youbot","YouBot","youbot","crawler"],["mistralbot","MistralBot","mistral","crawler"],["gemini","Gemini","gemini","crawler"],["ai2bot","AI2Bot","ai2bot","crawler"],["deepseek","DeepSeek","deepseek","crawler"],["qwen","Qwen","qwen","crawler"],["webzio","Webz.io","webzio","crawler"],["sentibot","Sentibot","sentibot","crawler"],["omgili","Omgili","omgili","crawler"],["img2dataset","img2dataset","img2dataset","crawler"],["timpibot","Timpibot","timpibot","crawler"],["velenpublicwebcrawler","VelenPublicWebCrawler","velenpublicwebcrawler","crawler"],["isscyberriskcrawler","ISSCyberRiskCrawler","isscyberriskcrawler","crawler"],["friendlycrawler","FriendlyCrawler","friendlycrawler","crawler"],["elevenlabscrawler","ElevenlabsCrawler","elevenlabscrawler","crawler"],["kimibot","KimiBot","kimibot","crawler"],["moonshotbot","MoonshotBot","moonshotbot","crawler"],["chatglm-spider","ChatGLM-Spider","chatglm-spider","crawler"],["duckassistbot","DuckAssistBot","duckassistbot","crawler"],["sofyabot","SofyaBot","sofyabot","crawler"],["xai-searchbot","xAI-SearchBot","xai-searchbot","crawler"],["linkupbot","LinkupBot","linkupbot","crawler"],["perplexitybot","PerplexityBot","perplexitybot","crawler"],["claude-searchbot","Claude-SearchBot","claude-searchbot","crawler"],["oai-searchbot","OAI-SearchBot","oai-searchbot","crawler"],["searchgpt","SearchGPT","searchgpt","crawler"],["phind","Phind","phind","crawler"],["kagi","Kagi","kagi","crawler"],["exasearchbot","Exa","exa","crawler"],["exabot","Exa","exa","crawler"],["shapbot","ShapBot","shapbot","crawler"],["meta-webindexer","Meta-WebIndexer","meta-webindexer","crawler"],["metaphor","Metaphor","metaphor","crawler"],["tavily","Tavily","tavily","crawler"],["bravesearch","BraveSearch","brave-search","crawler"],["neevabot","NeevaBot","neeva","crawler"],["kimi-searchbot","Kimi-SearchBot","kimi-searchbot","crawler"],["keenablebot","KeenableBot","keenablebot","crawler"],["azureai-searchbot","AzureAI-SearchBot","azureai-searchbot","crawler"],["grokbot","GrokBot","grokbot","crawler"],["operator","Operator","operator","crawler"],["claude-user","Claude-User","claude-user","crawler"],["gemini-user","Gemini-User","gemini-user","crawler"],["googleagent-mariner","GoogleAgent-Mariner","googleagent-mariner","crawler"],["mariner","GoogleAgent-Mariner","googleagent-mariner","crawler"],["amazonbuyforme","AmazonBuyForMe","amazon-buyforme","crawler"],["buyforme","AmazonBuyForMe","amazon-buyforme","crawler"],["browser-use","Browser-Use","browser-use","crawler"],["stagehand","Stagehand","stagehand","crawler"],["manus-user","Manus-User","manus-user","crawler"],["multion","MultiOn","multion","crawler"],["opencode-user","OpenCode-User","opencode-user","crawler"],["iboubot","IbouBot","iboubot","crawler"],["ibou-search","IbouBot","iboubot","crawler"],["googlebot","Googlebot","googlebot","crawler"],["google-inspectiontool","Google-InspectionTool","google-inspectiontool","crawler"],["bingbot","Bingbot","bingbot","crawler"],["msnbot","MSNBot","msnbot","crawler"],["yandexbot","YandexBot","yandexbot","crawler"],["baiduspider","Baiduspider","baiduspider","crawler"],["petalbot","PetalBot","petalbot","crawler"],["duckduckbot","DuckDuckBot","duckduckbot","crawler"],["applebot","Applebot","applebot","crawler"],["sogou","Sogou Spider","sogou","crawler"],["qwantify","Qwantify","qwantify","crawler"],["qwantbot","Qwantify","qwantify","crawler"],["naver","Naver","naver","crawler"],["yeti","Naver","naver","crawler"],["seznambot","SeznamBot","seznam","crawler"],["ecosia","Ecosia","ecosia","crawler"],["mojeekbot","MojeekBot","mojeek","crawler"],["slurp","Yahoo! Slurp","yahoo-slurp","crawler"],["bravebot","Bravebot","bravebot","crawler"],["coccocbot","Coc Coc","coccocbot","crawler"],["yisouspider","YisouSpider","yisouspider","crawler"],["yepbot","YepBot","yepbot","crawler"],["ahrefsbot","AhrefsBot","ahrefsbot","crawler"],["ahrefs","AhrefsBot","ahrefsbot","crawler"],["semrushbot","SemrushBot","semrushbot","crawler"],["semrush","SemrushBot","semrushbot","crawler"],["mj12bot","MJ12bot","mj12bot","crawler"],["dotbot","DotBot","dotbot","crawler"],["rogerbot","Rogerbot","rogerbot","crawler"],["screaming frog","Screaming Frog","screaming-frog","crawler"],["sitebulb","Sitebulb","sitebulb","crawler"],["deepcrawl","DeepCrawl","deepcrawl","crawler"],["oncrawl","OnCrawl","oncrawl","crawler"],["botify","Botify","botify","crawler"],["contentking","ContentKing","contentking","crawler"],["sistrix","SISTRIX","sistrix","crawler"],["serpstat","Serpstat","serpstat","crawler"],["spyfu","SpyFu","spyfu","crawler"],["meta-externalads","meta-externalads","meta-externalads","crawler"],["dataforseobot","DataForSeoBot","dataforseobot","crawler"],["serankingbacklinksbot","SERankingBacklinksBot","serankingbacklinksbot","crawler"],["awariobot","AwarioBot","awariobot","crawler"],["awariosmartbot","AwarioBot","awariobot","crawler"],["seojuice-searchbot","SEOJuice-SearchBot","seojuice-searchbot","crawler"],["trendictionbot","trendictionbot","trendictionbot","crawler"],["hubspot crawler","HubSpot Crawler","hubspot-crawler","crawler"],["nessus","Nessus","nessus","crawler"],["qualys","Qualys","qualys","crawler"],["shodan","Shodan","shodan","crawler"],["censys","Censys","censys","crawler"],["nmap","Nmap","nmap","crawler"],["zap/","OWASP ZAP","zap","crawler"],["burp","Burp Suite","burp","crawler"],["nikto","Nikto","nikto","crawler"],["nuclei","Nuclei","nuclei","crawler"],["acunetix","Acunetix","acunetix","crawler"],["netsparker","Netsparker","netsparker","crawler"],["detectify","Detectify","detectify","crawler"],["intruder","Intruder","intruder","crawler"],["python-requests","Python-Requests","python-requests","tool"],["python-urllib","Python-urllib","python-urllib","tool"],["python/","Python","python","tool"],["scrapy","Scrapy","scrapy","tool"],["httpx","HTTPX","httpx","tool"],["aiohttp","aiohttp","aiohttp","tool"],["beautifulsoup","BeautifulSoup","beautifulsoup","tool"],["node-fetch","node-fetch","node-fetch","tool"],["axios/","Axios","axios","tool"],["got/","Got","got","tool"],["undici","Undici","undici","tool"],["go-http-client","Go-HTTP-Client","go-http-client","tool"],["colly","Colly","colly","tool"],["java/","Java","java","tool"],["okhttp","OkHttp","okhttp","tool"],["apache-httpclient","Apache-HttpClient","apache-httpclient","tool"],["jsoup","Jsoup","jsoup","tool"],["guzzlehttp","GuzzleHttp","guzzlehttp","tool"],["php/","PHP","php","tool"],["ruby","Ruby","ruby","tool"],["faraday","Faraday","faraday","tool"],["mechanize","Mechanize","mechanize","tool"],["headlesschrome","HeadlessChrome","headlesschrome","tool"],["puppeteer","Puppeteer","puppeteer","tool"],["playwright","Playwright","playwright","tool"],["selenium","Selenium","selenium","tool"],["phantomjs","PhantomJS","phantomjs","tool"],["splash","Splash","splash","tool"],["browserless","Browserless","browserless","tool"],["browserbase","Browserbase","browserbase","tool"],["ia_archiver","Internet Archive","ia-archiver","crawler"],["archive.org_bot","Archive.org","archive-org-bot","crawler"],["wayback","Wayback Machine","wayback","crawler"],["heritrix","Heritrix","heritrix","crawler"],["brozzler","Brozzler","brozzler","crawler"],["facebookexternalhit","Facebook","facebookexternalhit","crawler"],["facebot","Facebot","facebot","crawler"],["twitterbot","Twitterbot","twitterbot","crawler"],["linkedinbot","LinkedInBot","linkedinbot","crawler"],["slackbot","Slackbot","slackbot","crawler"],["telegrambot","TelegramBot","telegrambot","crawler"],["whatsapp","WhatsApp","whatsapp","crawler"],["discordbot","Discordbot","discordbot","crawler"],["pinterest","Pinterest","pinterestbot","crawler"],["tumblr","Tumblr","tumblr","crawler"],["reddit","Reddit","reddit","crawler"],["embedly","Embedly","embedly","crawler"],["iframely","Iframely","iframely","crawler"],["adsbot-google","AdsBot-Google","adsbot-google","crawler"],["google-read-aloud","Google-Read-Aloud","google-read-aloud","crawler"],["google-safety","Google-Safety","google-safety","crawler"],["oai-adsbot","OAI-AdsBot","oai-adsbot","crawler"],["kakaobot","KakaoBot","kakaobot","crawler"],["curl/","cURL","curl","tool"],["wget/","Wget","wget","tool"],["libwww-perl","libwww-perl","libwww-perl","tool"],["lwp-","LWP","lwp","tool"],["httrack","HTTrack","httrack","tool"],["webdecoybot","WebDecoyBot","webdecoybot","crawler"],["uptimerobot","UptimeRobot","uptimerobot","crawler"],["pingdom","Pingdom","pingdom","crawler"],["statuscake","StatusCake","statuscake","crawler"],["betteruptime","Better Uptime","better-uptime","crawler"],["datadog","Datadog Synthetics","datadog-synthetics","crawler"],["newrelic","New Relic","newrelic","crawler"],["site24x7","Site24x7","site24x7","crawler"],["freshping","Freshping","freshping","crawler"],["hetrixtools","HetrixTools","hetrixtools","crawler"],["nodeping","NodePing","nodeping","crawler"],["gtmetrix","GTmetrix","gtmetrix","crawler"],["chrome-lighthouse","Lighthouse","chrome-lighthouse","crawler"],["google page speed","Lighthouse","chrome-lighthouse","crawler"],["feedly","Feedly","feedly","crawler"],["feedfetcher","Feedfetcher-Google","feedfetcher-google","crawler"],["newsblur","NewsBlur","newsblur","crawler"],["inoreader","Inoreader","inoreader","crawler"],["theoldreader","The Old Reader","theoldreader","crawler"],["feedbin","Feedbin","feedbin","crawler"],["miniflux","Miniflux","miniflux","crawler"],["freshrss","FreshRSS","freshrss","crawler"],["commafeed","CommaFeed","commafeed","crawler"],["diffbot","Diffbot","diffbot","crawler"],["import.io","Import.io","import-io","crawler"],["brightdata","Bright Data","bright-data","crawler"],["luminati","Bright Data","bright-data","crawler"],["oxylabs","Oxylabs","oxylabs","crawler"],["scrapingbee","ScrapingBee","scrapingbee","crawler"],["scrapingant","ScrapingAnt","scrapingant","crawler"],["zyte","Zyte","zyte","crawler"],["scrapinghub","Zyte","zyte","crawler"],["apify","Apify","apify","crawler"],["crawlbase","Crawlbase","crawlbase","crawler"],["webscrapingapi","WebScrapingAPI","webscrapingapi","crawler"],["chatgpt-user","ChatGPT-User","chatgpt-user","crawler"],["perplexity-user","Perplexity-User","perplexity-user","crawler"],["mistralai-user","MistralAI-User","mistralai-user","crawler"],["exauser","ExaUser","exauser","crawler"],["shap-user","Shap-User","shap-user","crawler"],["meta-externalfetcher","Meta-ExternalFetcher","meta-externalfetcher","crawler"],["gemini-deep-research","Gemini-Deep-Research","gemini-deep-research","crawler"],["copilot","Microsoft Copilot","copilot","crawler"],["cortana","Cortana","cortana","crawler"],["siri","Siri","siri","crawler"],["kimi-user","Kimi-User","kimi-user","crawler"],["keenable-user","Keenable-User","keenable-user","crawler"],["elevenlabsbot","ElevenlabsBot","elevenlabsbot","crawler"],["klaviyoaibot","KlaviyoAIBot","klaviyoaibot","crawler"]];function br(e){for(let[t,r,n,o]of Ye)if(e.includes(t))return{name:r,id:n,kind:o};return null}var yr=/(?:bot|crawler|spider)(?:[/\s);,]|$)/i;function Xe(e){let t=e.toLowerCase(),r=br(t);return r?.kind==="crawler"||!r&&yr.test(e)}var vr="Search Engine Crawler",te=1e3,_r={search_engines:!0,ai_crawlers:!0,monitoring:!0};function xr(e){if(!e.includes(":"))return e.split(".").reverse().join(".")+".in-addr.arpa";let[t,r=""]=e.split("::"),n=t?t.split(":"):[],o=r?r.split(":"):[],a=8-n.length-o.length;return a<0?"":[...n,...Array(Math.max(0,a)).fill("0"),...o].map(s=>s.padStart(4,"0")).join("").split("").reverse().join(".")+".ip6.arpa"}function re(e,t){return Promise.race([e,new Promise((r,n)=>setTimeout(()=>n(new Error("dns timeout")),t))])}function Ar(e){return{reverse:t=>re(e(xr(t),"PTR"),te),resolve4:t=>re(e(t,"A"),te),resolve6:t=>re(e(t,"AAAA"),te)}}function Ze(e,t,r,n=typeof Deno<"u"&&Deno&&typeof Deno.resolveDns=="function"?Deno.resolveDns.bind(Deno):void 0,o=Date.now()){return!r||!e||!n||!Xe(t)?Promise.resolve(""):Je(e,_r,Ar(n),o).then(a=>a==="search_engines"?vr:"").catch(()=>"")}var kr="https://cloudflare-dns.com/dns-query",Sr=1e3,Rr={A:1,PTR:12,AAAA:28};function Cr(e=fetch){return async(t,r)=>{let n=Rr[r];if(!n)throw new Error(`unsupported record type ${r}`);let o=`${kr}?name=${encodeURIComponent(t)}&type=${r}`,a=await e(o,{headers:{accept:"application/dns-json"},signal:AbortSignal.timeout(Sr)});if(!a.ok)throw new Error(`doh ${a.status}`);let i=await a.json();if(i.Status!==0)throw new Error(`dns status ${i.Status}`);let s=(i.Answer??[]).filter(c=>c.type===n&&typeof c.data=="string").map(c=>c.data);if(s.length===0)throw new Error("no records");return s}}function Qe(e,t,r,n=fetch){return Ze(e,t,r,Cr(n))}var ne="vercel-5ee62f4b6deb";var et="https://in.webdecoy.com";function tt(e){let t=new Headers(e.headers);return t.delete(U),t.delete(Ue),t}function oe(e,t){let r=tt(e);return t&&r.set(U,t),{action:"continue",headers:r,verdict:t}}async function Er(e,t,r){try{let n=(r.ingest??"").trim().replace(/\/+$/,"")||et,o=new URL(e.url),a=o.searchParams.get(Ne),i=N(o.hostname),s=await He({apiBase:n,siteKey:r.siteKey},i);if(a!==null)return{action:"respond",response:Ve(a,s?s.mode:"unknown",r.siteKey,G)};if(o.pathname===Q)return{action:"respond",response:await ze(e,n)};if(o.pathname===L)return{action:"respond",response:await De(e,{apiBase:n,siteKey:r.siteKey,sensorKey:r.sensorKey,host:i})};if(!s)return oe(e,null);let c=await Se(e,s,{siteKey:r.siteKey,verifiedBotCategory:(p,l)=>Qe(t.ip,p.headers.get("user-agent")??"",l,t.fetch??fetch)});if(j(c)){let p=q(e.headers.get("cookie")??"",J);p&&await Ie(p,r.sensorKey,i,e.headers.get("user-agent")??"",Date.now())&&(c=Re(c))}return qe({...c,refusal:c.pass?null:{ip:t.ip,path:o.pathname}},o.hostname,{siteKey:r.siteKey,apiBase:n,scannerId:r.scannerId,sensorKey:r.sensorKey,bundleVersion:ne,capabilities:G},{waitUntil:p=>t.waitUntil?.(p)},Date.now()),c.pass||c.mode!=="enforce"?oe(e,c.label):{action:"respond",response:We(e,n,r.siteKey,c.label)}}catch{try{return oe(e,null)}catch{return{action:"continue",headers:null,verdict:null}}}}export{ne as BUILD,et as DEFAULT_INGEST,G as VERCEL_VALIDATOR_CAPABILITIES,tt as cleanHeaders,Er as runGate};