From 265c7865f00aa324ee971e4b30dd32a3840837cf Mon Sep 17 00:00:00 2001 From: MelnixDev Date: Sat, 29 Aug 2026 19:54:42 +0300 Subject: [PATCH 1/4] docs: add Ukrainian rule reference --- README.md | 3 +- docs/rules.md | 2 + docs/rules.uk.md | 257 +++++++++++++++++++++++++++++++++++++++++ packages/cli/README.md | 3 +- 4 files changed, 263 insertions(+), 2 deletions(-) create mode 100644 docs/rules.uk.md diff --git a/README.md b/README.md index aeab598..0ed22f8 100644 --- a/README.md +++ b/README.md @@ -276,7 +276,8 @@ Regression-only checks cover newly introduced indexing blocks, status changes, metadata removal or edits, redirect changes, robots changes, and sharp sitemap URL loss. -[Read the rule-by-rule documentation](docs/rules.md). +[Read the rule-by-rule documentation](docs/rules.md) · +[Українська версія довідника правил](docs/rules.uk.md). ## Snapshots, lifecycle, and checkpoints diff --git a/docs/rules.md b/docs/rules.md index 0805191..0a35103 100644 --- a/docs/rules.md +++ b/docs/rules.md @@ -1,5 +1,7 @@ # SEO Crawl Audit rules +**English** | [Українська](rules.uk.md) + Every finding has a stable rule ID, severity, owner, evidence, remediation, and fingerprint. Rules report concrete risks; the tool does not calculate a general SEO score. diff --git a/docs/rules.uk.md b/docs/rules.uk.md new file mode 100644 index 0000000..88eb1e7 --- /dev/null +++ b/docs/rules.uk.md @@ -0,0 +1,257 @@ +# Правила SEO Crawl Audit + +[English](rules.md) | **Українська** + +Кожна знайдена проблема має стабільний ID правила, рівень критичності, +відповідального, докази, рекомендацію з виправлення та fingerprint. Правила +повідомляють про конкретні ризики; інструмент не обчислює загальний SEO-бал. + +Рівні критичності: + +- `error` — проблема, яка, ймовірно, перешкоджає обходу, індексації або доступу + та блокує звичайну перевірку регресій; +- `warning` — важлива проблема SEO або якості контенту; +- `info` — корисна інформація, яку варто переглянути, але яка типово не блокує + перевірку. + +## Доступ, індексація та перенаправлення + +### page-unreachable + +Запит сторінки завершився невдало після обмеженої кількості повторних спроб. +Відповідальний: `developer`. Відновіть сторінку, виправте мережеву проблему або +приберіть посилання на URL, який свідомо виведено з експлуатації. + +### http-error + +Сторінка повернула HTTP 4xx або 5xx. Відповідальний: `developer`. Поверніть +успішну відповідь або налаштоване перенаправлення на чинну сторінку-заміну. + +### robots-blocked + +Сторінку заборонено відповідною групою правил у `robots.txt`. Відповідальний: +`developer`. Дозволяйте доступ лише тоді, коли пошукові роботи повинні обходити +цю сторінку. + +### noindex + +HTML містить meta-директиву `noindex`. Відповідальний: `seo`. В окремому аудиті +це інформаційне повідомлення, адже директива може бути навмисною. + +### x-robots-noindex + +HTTP-заголовок `X-Robots-Tag` містить `noindex`. Відповідальний: `developer`. +Переконайтеся, що заголовок додано навмисно; приберіть його, якщо сторінка має +індексуватися. + +### redirect-loop + +Ланцюжок перенаправлень повертається до вже відвіданого URL. Відповідальний: +`developer`. Розірвіть цикл і перенаправляйте одразу на кінцеву адресу. + +### long-redirect-chain + +Для переходу потрібно понад три перенаправлення. Відповідальний: `developer`. +Замініть проміжні переходи прямим перенаправленням. + +### http-on-https-site + +HTTPS-сайт містить внутрішній HTTP URL у результатах обходу або метаданих. +Відповідальний: `developer`. Послідовно використовуйте HTTPS. + +## Канонічні URL + +### missing-canonical + +Канонічне посилання не знайдено. Відповідальний: `seo`. Додайте його, якщо +можуть існувати варіанти URL або дубльовані шляхи. + +### invalid-canonical + +Значення canonical неможливо перетворити на HTTP(S) URL. Відповідальний: +`developer`. Використайте чинний абсолютний URL або коректне відносне посилання. + +### cross-domain-canonical + +Canonical веде на інший origin. Відповідальний: `seo`. Переконайтеся, що таке +об’єднання між сайтами є навмисним. + +### canonical-target-error + +Ціль canonical входить до сканування, але недоступна. Відповідальний: +`developer`. Вкажіть успішну кінцеву сторінку, яку можна індексувати. + +## Узгодженість sitemap + +### sitemap-unavailable + +Налаштований sitemap не вдалося завантажити або розібрати. Відповідальний: +`developer`. Відновіть доступний і коректний XML sitemap. + +### noindex-in-sitemap + +URL із sitemap позначено як `noindex`. Відповідальний: `seo`. Приберіть його із +sitemap або зробіть доступним для індексації. + +### redirect-in-sitemap + +URL із sitemap перенаправляє на іншу адресу. Відповідальний: `seo`. Додайте до +sitemap його кінцевий канонічний URL. + +### orphan-sitemap-page + +Сторінка із sitemap не має знайдених внутрішніх посилань. Відповідальний: `seo`. +Додайте корисну внутрішню навігацію або переконайтеся, що сторінку ізольовано +навмисно. + +### crawlable-not-in-sitemap + +Успішну доступну для обходу сторінку знайдено поза sitemap. Відповідальний: +`seo`. Додайте її до sitemap або свідомо виключіть. + +### sitemap-url-count-drop + +Порівняно з базою sitemap втратив щонайменше 20% і щонайменше п’ять URL. +Відповідальний: `seo`. Перевірте, чи немає випадкових виключень або помилок +генерування. + +## Заголовки, описи та структура + +### missing-title + +Сторінка не має непорожнього HTML title. Відповідальний: `content`. Додайте +унікальний інформативний заголовок. + +### duplicate-title + +Кілька просканованих сторінок мають однаковий title. Відповідальний: `content`. +Розрізняйте сторінки відповідно до їхнього призначення. + +### title-length + +Title коротший за 10 або довший за 60 символів. Відповідальний: `content`. +Сприймайте цей діапазон як сигнал для перевірки, а не гарантію відображення в +пошуку. + +### missing-description + +Сторінка не має meta description. Відповідальний: `content`. Додайте корисний +опис там, де важливий текст у результатах пошуку. + +### duplicate-description + +Кілька сторінок мають однаковий description. Відповідальний: `content`. +Напишіть опис, який відповідає конкретній сторінці. + +### description-length + +Description коротший за 50 або довший за 160 символів. Відповідальний: +`content`. Перевірте зрозумілість тексту та ймовірність обрізання. + +### missing-h1 + +Заголовок H1 відсутній. Відповідальний: `content`. Додайте чіткий основний +заголовок. + +### multiple-h1 + +На сторінці більше одного H1. Відповідальний: `content`. Це інформаційне +повідомлення: перевірте ієрархію документа, не змінюючи її механічно. + +## Посилання, мова, структуровані дані та контент + +### broken-internal-link + +Внутрішнє посилання веде на проскановану сторінку, яка недоступна або повернула +помилку. Відповідальний: `developer`. Відновіть, оновіть або приберіть +посилання. + +### invalid-hreflang + +Альтернативна версія має некоректний мовний тег BCP 47 або нерозпізнаний URL. +Відповідальний: `seo`. Виправте мову та цільову адресу. + +### invalid-language + +Значення мови в `html` не є коректним тегом BCP 47. Відповідальний: +`developer`. Правильно вкажіть мову документа. + +### malformed-json-ld + +Блок `application/ld+json` не є коректним JSON. Відповідальний: `developer`. +Виправте синтаксис JSON перед перевіркою словника. + +### duplicate-content + +Нормалізований видимий текст на кількох сторінках має однаковий SHA-256. +Відповідальний: `content`. Об’єднайте точні дублікати або суттєво розрізніть +їхній вміст. + +### image-missing-alt + +Зображення не має атрибута `alt`. Відповідальний: `content`. Додайте змістовний +альтернативний текст або порожній атрибут для декоративного зображення. + +### low-word-count + +Сторінка має менше ніж 200 видимих слів. Відповідальний: `content`. Це лише +сигнал для перевірки: лаконічна сторінка може бути цілком доречною. + +### missing-open-graph + +Відсутні Open Graph title, description або image. Відповідальний: `content`. +Додайте поля, якщо важливий вигляд посилання в соціальних мережах. + +### missing-twitter-metadata + +Відсутні Twitter card, title, description або image. Відповідальний: `content`. +Додайте поля, якщо важливий вигляд посилання на цій платформі. + +## Правила лише для регресій + +### robots-changed + +Змінився hash вмісту `robots.txt`. Перевірте конкретну зміну в розгортанні. + +### page-missing + +Сторінку з базового знімка не перевірено в поточному знімку. + +### status-regression + +Сторінка, яка раніше була доступною, тепер повертає помилковий HTTP-статус. + +### new-noindex + +Сторінка отримала директиву `noindex` у meta або `X-Robots-Tag`. Це рівень +`error`, оскільки випадкова втрата індексації є ризиком високої критичності. + +### title-removed + +Title, який раніше був присутній, тепер відсутній. + +### title-changed + +Title змінився. Перевірте, чи передбачена ця зміна контентом або розгортанням. + +### description-removed + +Description, який раніше був присутній, тепер відсутній. + +### canonical-removed + +Canonical, який раніше був присутній, тепер відсутній. + +### canonical-changed + +Ціль canonical змінилася. Нова ціль на іншому origin підвищує критичність +проблеми до `error`. + +### h1-removed + +Сторінка, яка мала H1, тепер його не має. + +### redirect-changed + +Кінцева адреса перенаправлення змінилася. Нова адреса на іншому origin підвищує +критичність проблеми до `error`. diff --git a/packages/cli/README.md b/packages/cli/README.md index aeab598..d4b3a51 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -276,7 +276,8 @@ Regression-only checks cover newly introduced indexing blocks, status changes, metadata removal or edits, redirect changes, robots changes, and sharp sitemap URL loss. -[Read the rule-by-rule documentation](docs/rules.md). +[Read the rule-by-rule documentation](https://github.com/MelnixDev/seo-crawl-audit/blob/main/docs/rules.md) · +[Українська версія довідника правил](https://github.com/MelnixDev/seo-crawl-audit/blob/main/docs/rules.uk.md). ## Snapshots, lifecycle, and checkpoints From 15a15898b2f79c28da9ddeaa325a8cacc79356bf Mon Sep 17 00:00:00 2001 From: MelnixDev Date: Sat, 29 Aug 2026 19:54:48 +0300 Subject: [PATCH 2/4] test: keep localized rule references in sync --- test/documentation.test.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 test/documentation.test.js diff --git a/test/documentation.test.js b/test/documentation.test.js new file mode 100644 index 0000000..defad17 --- /dev/null +++ b/test/documentation.test.js @@ -0,0 +1,23 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { readFile } from "node:fs/promises"; +import { getRuleDefinitions } from "../packages/core/dist/index.js"; + +function ruleHeadings(markdown) { + return [...markdown.matchAll(/^### ([a-z0-9-]+)$/gm)].map((match) => match[1]); +} + +test("English and Ukrainian rule references cover the same built-in rules", async () => { + const [english, ukrainian] = await Promise.all([ + readFile(new URL("../docs/rules.md", import.meta.url), "utf8"), + readFile(new URL("../docs/rules.uk.md", import.meta.url), "utf8"), + ]); + const expected = getRuleDefinitions().map((definition) => definition.id); + const englishRules = ruleHeadings(english); + const ukrainianRules = ruleHeadings(ukrainian); + + assert.deepEqual(ukrainianRules, englishRules); + assert.deepEqual(englishRules.toSorted(), expected.toSorted()); + assert.match(english, /\[Українська\]\(rules\.uk\.md\)/); + assert.match(ukrainian, /\[English\]\(rules\.md\)/); +}); From ee3fa435253db05ac7fcbc4e1ad9099f548f1121 Mon Sep 17 00:00:00 2001 From: MelnixDev Date: Sat, 29 Aug 2026 19:54:55 +0300 Subject: [PATCH 3/4] feat(report): localize rule documentation links --- packages/core/src/html-report.ts | 4 ++-- test/html-report.test.js | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/core/src/html-report.ts b/packages/core/src/html-report.ts index 5a7d34a..e43c208 100644 --- a/packages/core/src/html-report.ts +++ b/packages/core/src/html-report.ts @@ -24,7 +24,7 @@ function normalizeIssue(candidate: Partial, fallbackLifecycle = "current" evidence: candidate.evidence ?? { actual: candidate.after }, owner: candidate.owner ?? "seo", remediation: candidate.remediation ?? "Review the finding and confirm the intended behavior.", - documentationUrl: candidate.documentationUrl ?? "https://github.com/MelnixDev/seo-crawl-audit/tree/main/docs/rules", + documentationUrl: candidate.documentationUrl ?? "https://github.com/MelnixDev/seo-crawl-audit/blob/main/docs/rules.md", before: candidate.before, after: candidate.after, lifecycle: candidate.lifecycle ?? fallbackLifecycle, @@ -159,7 +159,7 @@ ${input.history && input.history.points.length > 0 ? `
{currentPage=1;render()};element.addEventListener("input",update);element.addEventListener("change",update)}for(const tab of document.querySelectorAll("[data-tab]")){tab.addEventListener("click",()=>{setActiveTab(tab.dataset.tab);currentPage=1;render()})}previous.addEventListener("click",()=>{currentPage-=1;render()});next.addEventListener("click",()=>{currentPage+=1;render()});clearFilters.addEventListener("click",()=>{search.value="";severity.value="";rule.value="";template.value="";owner.value="";setActiveTab("");currentPage=1;render()});language.addEventListener("change",()=>{locale=language.value;applyLocale()}); diff --git a/test/html-report.test.js b/test/html-report.test.js index 3dde874..74e54c8 100644 --- a/test/html-report.test.js +++ b/test/html-report.test.js @@ -45,6 +45,7 @@ test("renders a self-contained filterable report and escapes embedded data", () assert.match(html, /SEO-проблем не знайдено/); assert.match(html, /Статистика проблем/); assert.match(html, /language\.addEventListener\("change"/); + assert.match(html, /locale==="uk"\?issue\.documentationUrl\.replace\("\/docs\/rules\.md#","\/docs\/rules\.uk\.md#"\)/); assert.match(html, /seo-crawl-audit-"\+locale\+"\.csv/); assert.match(html, /SEO baseline audit/); assert.doesNotMatch( From 92b44a4d26900a7458818f5a760d6e9663f3b1b2 Mon Sep 17 00:00:00 2001 From: MelnixDev Date: Sat, 29 Aug 2026 19:55:06 +0300 Subject: [PATCH 4/4] chore: refresh bilingual documentation artifacts --- examples/quotes-toscrape-report.html | 2 +- packages/action/action-dist/index.cjs | 4 ++-- packages/cli/bundle/cli.js | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/quotes-toscrape-report.html b/examples/quotes-toscrape-report.html index f2f9d1b..18c88d6 100644 --- a/examples/quotes-toscrape-report.html +++ b/examples/quotes-toscrape-report.html @@ -76,7 +76,7 @@ } function render(){ const text=copy();const query=search.value.trim().toLowerCase();lastFiltered=report.issues.filter((issue)=>{if(activeTab&&issue.lifecycle!==activeTab)return false;if(severity.value&&issue.severity!==severity.value)return false;if(rule.value&&issue.rule!==rule.value)return false;if(template.value&&issue.template!==template.value)return false;if(owner.value&&issue.owner!==owner.value)return false;if(!query)return true;const localized=issueText(issue);return [issue.url,issue.template,issue.rule,issue.message,issue.remediation,localized.rule,localized.message,localized.remediation,issue.owner,valueText(issue.evidence),valueText(issue.before),valueText(issue.after)].join(" ").toLowerCase().includes(query)});const rowsPerPage=Number(pageSize.value);const pageCount=Math.max(1,Math.ceil(lastFiltered.length/rowsPerPage));currentPage=Math.min(currentPage,pageCount);const visible=lastFiltered.slice((currentPage-1)*rowsPerPage,currentPage*rowsPerPage);tbody.replaceChildren(); - for(const issue of visible){const localized=issueText(issue);const row=document.createElement("tr");const severityCell=document.createElement("td");const severityBadge=document.createElement("span");severityBadge.className="badge "+issue.severity;severityBadge.textContent=text.severities[issue.severity];severityCell.append(severityBadge);row.append(severityCell);const lifeCell=document.createElement("td");const lifeBadge=document.createElement("span");lifeBadge.className="badge "+issue.lifecycle;lifeBadge.textContent=text.lifecycle[issue.lifecycle]||issue.lifecycle;lifeCell.append(lifeBadge);row.append(lifeCell);cell(row,localized.rule+" · "+text.owners[issue.owner]);const pageCell=document.createElement("td");const link=document.createElement("a");link.href=issue.url;link.target="_blank";link.rel="noreferrer";link.textContent=issue.url;pageCell.append(link);row.append(pageCell);cell(row,localized.message);if(report.mode==="check"){const beforeCell=document.createElement("td");const code=document.createElement("code");code.textContent=valueText(issue.before);beforeCell.append(code);row.append(beforeCell)}const evidenceCell=document.createElement("td");const evidence=document.createElement("code");evidence.textContent=valueText(issue.after!==undefined?issue.after:issue.evidence);evidenceCell.append(evidence);row.append(evidenceCell);cell(row,localized.remediation,"remediation");const fingerprint=cell(row,issue.fingerprint,"fingerprint");const docs=document.createElement("a");docs.href=issue.documentationUrl;docs.target="_blank";docs.rel="noreferrer";docs.textContent=" "+text.docs;fingerprint.append(docs);tbody.append(row)} + for(const issue of visible){const localized=issueText(issue);const row=document.createElement("tr");const severityCell=document.createElement("td");const severityBadge=document.createElement("span");severityBadge.className="badge "+issue.severity;severityBadge.textContent=text.severities[issue.severity];severityCell.append(severityBadge);row.append(severityCell);const lifeCell=document.createElement("td");const lifeBadge=document.createElement("span");lifeBadge.className="badge "+issue.lifecycle;lifeBadge.textContent=text.lifecycle[issue.lifecycle]||issue.lifecycle;lifeCell.append(lifeBadge);row.append(lifeCell);cell(row,localized.rule+" · "+text.owners[issue.owner]);const pageCell=document.createElement("td");const link=document.createElement("a");link.href=issue.url;link.target="_blank";link.rel="noreferrer";link.textContent=issue.url;pageCell.append(link);row.append(pageCell);cell(row,localized.message);if(report.mode==="check"){const beforeCell=document.createElement("td");const code=document.createElement("code");code.textContent=valueText(issue.before);beforeCell.append(code);row.append(beforeCell)}const evidenceCell=document.createElement("td");const evidence=document.createElement("code");evidence.textContent=valueText(issue.after!==undefined?issue.after:issue.evidence);evidenceCell.append(evidence);row.append(evidenceCell);cell(row,localized.remediation,"remediation");const fingerprint=cell(row,issue.fingerprint,"fingerprint");const docs=document.createElement("a");docs.href=locale==="uk"?issue.documentationUrl.replace("/docs/rules.md#","/docs/rules.uk.md#"):issue.documentationUrl;docs.target="_blank";docs.rel="noreferrer";docs.textContent=" "+text.docs;fingerprint.append(docs);tbody.append(row)} const issueLabel=locale==="uk"?text.issues:report.issues.length===1?text.issue:text.issues;resultCount.textContent=number(lastFiltered.length)+" "+text.of+" "+number(report.issues.length)+" "+issueLabel;pageInfo.textContent=text.page+" "+number(currentPage)+" "+text.of+" "+number(pageCount);previous.disabled=currentPage===1;next.disabled=currentPage===pageCount;pagination.hidden=lastFiltered.length===0||pageCount===1;tableWrap.hidden=lastFiltered.length===0;empty.hidden=lastFiltered.length!==0;if(lastFiltered.length===0){const reportIsClean=report.issues.length===0;emptyTitle.textContent=reportIsClean?text.empty.cleanTitle:text.empty.filteredTitle;emptyMessage.textContent=reportIsClean?text.empty.cleanMessage:text.empty.filteredMessage;clearFilters.hidden=reportIsClean}syncChartButtons() } for(const element of [search,severity,rule,template,owner,pageSize]){const update=()=>{currentPage=1;render()};element.addEventListener("input",update);element.addEventListener("change",update)}for(const tab of document.querySelectorAll("[data-tab]")){tab.addEventListener("click",()=>{setActiveTab(tab.dataset.tab);currentPage=1;render()})}previous.addEventListener("click",()=>{currentPage-=1;render()});next.addEventListener("click",()=>{currentPage+=1;render()});clearFilters.addEventListener("click",()=>{search.value="";severity.value="";rule.value="";template.value="";owner.value="";setActiveTab("");currentPage=1;render()});language.addEventListener("change",()=>{locale=language.value;applyLocale()}); diff --git a/packages/action/action-dist/index.cjs b/packages/action/action-dist/index.cjs index dea7e6a..3094648 100644 --- a/packages/action/action-dist/index.cjs +++ b/packages/action/action-dist/index.cjs @@ -33,7 +33,7 @@ ${pluralizer.count} ${pluralizer.noun} ${pluralizer.is} pending: ${pendingInterceptorsFormatter.format(pending)} `.trim())}};module2.exports=MockAgent}});var require_global2=__commonJS({"../../node_modules/undici/lib/global.js"(exports2,module2){"use strict";var globalDispatcher=Symbol.for("undici.globalDispatcher.1");var{InvalidArgumentError}=require_errors();var Agent=require_agent();if(getGlobalDispatcher()===void 0){setGlobalDispatcher(new Agent)}function setGlobalDispatcher(agent){if(!agent||typeof agent.dispatch!=="function"){throw new InvalidArgumentError("Argument agent must implement Agent")}Object.defineProperty(globalThis,globalDispatcher,{value:agent,writable:true,enumerable:false,configurable:false})}function getGlobalDispatcher(){return globalThis[globalDispatcher]}module2.exports={setGlobalDispatcher,getGlobalDispatcher}}});var require_decorator_handler=__commonJS({"../../node_modules/undici/lib/handler/decorator-handler.js"(exports2,module2){"use strict";module2.exports=class DecoratorHandler{#handler;constructor(handler){if(typeof handler!=="object"||handler===null){throw new TypeError("handler must be an object")}this.#handler=handler}onConnect(...args){return this.#handler.onConnect?.(...args)}onError(...args){return this.#handler.onError?.(...args)}onUpgrade(...args){return this.#handler.onUpgrade?.(...args)}onResponseStarted(...args){return this.#handler.onResponseStarted?.(...args)}onHeaders(...args){return this.#handler.onHeaders?.(...args)}onData(...args){return this.#handler.onData?.(...args)}onComplete(...args){return this.#handler.onComplete?.(...args)}onBodySent(...args){return this.#handler.onBodySent?.(...args)}}}});var require_redirect=__commonJS({"../../node_modules/undici/lib/interceptor/redirect.js"(exports2,module2){"use strict";var RedirectHandler=require_redirect_handler();module2.exports=opts=>{const globalMaxRedirections=opts?.maxRedirections;return dispatch=>{return function redirectInterceptor(opts2,handler){const{maxRedirections=globalMaxRedirections,...baseOpts}=opts2;if(!maxRedirections){return dispatch(opts2,handler)}const redirectHandler=new RedirectHandler(dispatch,maxRedirections,opts2,handler);return dispatch(baseOpts,redirectHandler)}}}}});var require_retry=__commonJS({"../../node_modules/undici/lib/interceptor/retry.js"(exports2,module2){"use strict";var RetryHandler=require_retry_handler();module2.exports=globalOpts=>{return dispatch=>{return function retryInterceptor(opts,handler){return dispatch(opts,new RetryHandler({...opts,retryOptions:{...globalOpts,...opts.retryOptions}},{handler,dispatch}))}}}}});var require_dump=__commonJS({"../../node_modules/undici/lib/interceptor/dump.js"(exports2,module2){"use strict";var util=require_util();var{InvalidArgumentError,RequestAbortedError}=require_errors();var DecoratorHandler=require_decorator_handler();var DumpHandler=class extends DecoratorHandler{#maxSize=1024*1024;#abort=null;#dumped=false;#aborted=false;#size=0;#reason=null;#handler=null;constructor({maxSize},handler){super(handler);if(maxSize!=null&&(!Number.isFinite(maxSize)||maxSize<1)){throw new InvalidArgumentError("maxSize must be a number greater than 0")}this.#maxSize=maxSize??this.#maxSize;this.#handler=handler}onConnect(abort){this.#abort=abort;this.#handler.onConnect(this.#customAbort.bind(this))}#customAbort(reason){this.#aborted=true;this.#reason=reason}onHeaders(statusCode,rawHeaders,resume,statusMessage){const headers=util.parseHeaders(rawHeaders);const contentLength=headers["content-length"];if(contentLength!=null&&contentLength>this.#maxSize){throw new RequestAbortedError(`Response size (${contentLength}) larger than maxSize (${this.#maxSize})`)}if(this.#aborted){return true}return this.#handler.onHeaders(statusCode,rawHeaders,resume,statusMessage)}onError(err){if(this.#dumped){return}err=this.#reason??err;this.#handler.onError(err)}onData(chunk){this.#size=this.#size+chunk.length;if(this.#size>=this.#maxSize){this.#dumped=true;if(this.#aborted){this.#handler.onError(this.#reason)}else{this.#handler.onComplete([])}}return true}onComplete(trailers){if(this.#dumped){return}if(this.#aborted){this.#handler.onError(this.reason);return}this.#handler.onComplete(trailers)}};function createDumpInterceptor({maxSize:defaultMaxSize}={maxSize:1024*1024}){return dispatch=>{return function Intercept(opts,handler){const{dumpMaxSize=defaultMaxSize}=opts;const dumpHandler=new DumpHandler({maxSize:dumpMaxSize},handler);return dispatch(opts,dumpHandler)}}}module2.exports=createDumpInterceptor}});var require_dns=__commonJS({"../../node_modules/undici/lib/interceptor/dns.js"(exports2,module2){"use strict";var{isIP}=require("node:net");var{lookup}=require("node:dns");var DecoratorHandler=require_decorator_handler();var{InvalidArgumentError,InformationalError}=require_errors();var maxInt=Math.pow(2,31)-1;var DNSInstance=class{#maxTTL=0;#maxItems=0;#records=new Map;dualStack=true;affinity=null;lookup=null;pick=null;constructor(opts){this.#maxTTL=opts.maxTTL;this.#maxItems=opts.maxItems;this.dualStack=opts.dualStack;this.affinity=opts.affinity;this.lookup=opts.lookup??this.#defaultLookup;this.pick=opts.pick??this.#defaultPick}get full(){return this.#records.size===this.#maxItems}runLookup(origin,opts,cb){const ips=this.#records.get(origin.hostname);if(ips==null&&this.full){cb(null,origin.origin);return}const newOpts={affinity:this.affinity,dualStack:this.dualStack,lookup:this.lookup,pick:this.pick,...opts.dns,maxTTL:this.#maxTTL,maxItems:this.#maxItems};if(ips==null){this.lookup(origin,newOpts,(err,addresses)=>{if(err||addresses==null||addresses.length===0){cb(err??new InformationalError("No DNS entries found"));return}this.setRecords(origin,addresses);const records=this.#records.get(origin.hostname);const ip=this.pick(origin,records,newOpts.affinity);let port;if(typeof ip.port==="number"){port=`:${ip.port}`}else if(origin.port!==""){port=`:${origin.port}`}else{port=""}cb(null,`${origin.protocol}//${ip.family===6?`[${ip.address}]`:ip.address}${port}`)})}else{const ip=this.pick(origin,ips,newOpts.affinity);if(ip==null){this.#records.delete(origin.hostname);this.runLookup(origin,opts,cb);return}let port;if(typeof ip.port==="number"){port=`:${ip.port}`}else if(origin.port!==""){port=`:${origin.port}`}else{port=""}cb(null,`${origin.protocol}//${ip.family===6?`[${ip.address}]`:ip.address}${port}`)}}#defaultLookup(origin,opts,cb){lookup(origin.hostname,{all:true,family:this.dualStack===false?this.affinity:0,order:"ipv4first"},(err,addresses)=>{if(err){return cb(err)}const results=new Map;for(const addr of addresses){results.set(`${addr.address}:${addr.family}`,addr)}cb(null,results.values())})}#defaultPick(origin,hostnameRecords,affinity){let ip=null;const{records,offset}=hostnameRecords;let family;if(this.dualStack){if(affinity==null){if(offset==null||offset===maxInt){hostnameRecords.offset=0;affinity=4}else{hostnameRecords.offset++;affinity=(hostnameRecords.offset&1)===1?6:4}}if(records[affinity]!=null&&records[affinity].ips.length>0){family=records[affinity]}else{family=records[affinity===4?6:4]}}else{family=records[affinity]}if(family==null||family.ips.length===0){return ip}if(family.offset==null||family.offset===maxInt){family.offset=0}else{family.offset++}const position=family.offset%family.ips.length;ip=family.ips[position]??null;if(ip==null){return ip}if(Date.now()-ip.timestamp>ip.ttl){family.ips.splice(position,1);return this.pick(origin,hostnameRecords,affinity)}return ip}setRecords(origin,addresses){const timestamp=Date.now();const records={records:{4:null,6:null}};for(const record2 of addresses){record2.timestamp=timestamp;if(typeof record2.ttl==="number"){record2.ttl=Math.min(record2.ttl,this.#maxTTL)}else{record2.ttl=this.#maxTTL}const familyRecords=records.records[record2.family]??{ips:[]};familyRecords.ips.push(record2);records.records[record2.family]=familyRecords}this.#records.set(origin.hostname,records)}getHandler(meta,opts){return new DNSDispatchHandler(this,meta,opts)}};var DNSDispatchHandler=class extends DecoratorHandler{#state=null;#opts=null;#dispatch=null;#handler=null;#origin=null;constructor(state,{origin,handler,dispatch},opts){super(handler);this.#origin=origin;this.#handler=handler;this.#opts={...opts};this.#state=state;this.#dispatch=dispatch}onError(err){switch(err.code){case"ETIMEDOUT":case"ECONNREFUSED":{if(this.#state.dualStack){this.#state.runLookup(this.#origin,this.#opts,(err2,newOrigin)=>{if(err2){return this.#handler.onError(err2)}const dispatchOpts={...this.#opts,origin:newOrigin};this.#dispatch(dispatchOpts,this)});return}this.#handler.onError(err);return}case"ENOTFOUND":this.#state.deleteRecord(this.#origin);default:this.#handler.onError(err);break}}};module2.exports=interceptorOpts=>{if(interceptorOpts?.maxTTL!=null&&(typeof interceptorOpts?.maxTTL!=="number"||interceptorOpts?.maxTTL<0)){throw new InvalidArgumentError("Invalid maxTTL. Must be a positive number")}if(interceptorOpts?.maxItems!=null&&(typeof interceptorOpts?.maxItems!=="number"||interceptorOpts?.maxItems<1)){throw new InvalidArgumentError("Invalid maxItems. Must be a positive number and greater than zero")}if(interceptorOpts?.affinity!=null&&interceptorOpts?.affinity!==4&&interceptorOpts?.affinity!==6){throw new InvalidArgumentError("Invalid affinity. Must be either 4 or 6")}if(interceptorOpts?.dualStack!=null&&typeof interceptorOpts?.dualStack!=="boolean"){throw new InvalidArgumentError("Invalid dualStack. Must be a boolean")}if(interceptorOpts?.lookup!=null&&typeof interceptorOpts?.lookup!=="function"){throw new InvalidArgumentError("Invalid lookup. Must be a function")}if(interceptorOpts?.pick!=null&&typeof interceptorOpts?.pick!=="function"){throw new InvalidArgumentError("Invalid pick. Must be a function")}const dualStack=interceptorOpts?.dualStack??true;let affinity;if(dualStack){affinity=interceptorOpts?.affinity??null}else{affinity=interceptorOpts?.affinity??4}const opts={maxTTL:interceptorOpts?.maxTTL??1e4,lookup:interceptorOpts?.lookup??null,pick:interceptorOpts?.pick??null,dualStack,affinity,maxItems:interceptorOpts?.maxItems??Infinity};const instance=new DNSInstance(opts);return dispatch=>{return function dnsInterceptor(origDispatchOpts,handler){const origin=origDispatchOpts.origin.constructor===URL?origDispatchOpts.origin:new URL(origDispatchOpts.origin);if(isIP(origin.hostname)!==0){return dispatch(origDispatchOpts,handler)}instance.runLookup(origin,origDispatchOpts,(err,newOrigin)=>{if(err){return handler.onError(err)}let dispatchOpts=null;dispatchOpts={...origDispatchOpts,servername:origin.hostname,origin:newOrigin,headers:{host:origin.hostname,...origDispatchOpts.headers}};dispatch(dispatchOpts,instance.getHandler({origin,dispatch,handler},origDispatchOpts))});return true}}}}});var require_headers=__commonJS({"../../node_modules/undici/lib/web/fetch/headers.js"(exports2,module2){"use strict";var{kConstruct}=require_symbols();var{kEnumerableProperty}=require_util();var{iteratorMixin,isValidHeaderName,isValidHeaderValue}=require_util2();var{webidl}=require_webidl();var assert=require("node:assert");var util=require("node:util");var kHeadersMap=Symbol("headers map");var kHeadersSortedMap=Symbol("headers map sorted");function isHTTPWhiteSpaceCharCode(code){return code===10||code===13||code===9||code===32}function headerValueNormalize(potentialValue){let i=0;let j=potentialValue.length;while(j>i&&isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(j-1)))--j;while(j>i&&isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(i)))++i;return i===0&&j===potentialValue.length?potentialValue:potentialValue.substring(i,j)}function fill(headers,object2){if(Array.isArray(object2)){for(let i=0;i>","record"]})}}function appendHeader(headers,name,value){value=headerValueNormalize(value);if(!isValidHeaderName(name)){throw webidl.errors.invalidArgument({prefix:"Headers.append",value:name,type:"header name"})}else if(!isValidHeaderValue(value)){throw webidl.errors.invalidArgument({prefix:"Headers.append",value,type:"header value"})}if(getHeadersGuard(headers)==="immutable"){throw new TypeError("immutable")}return getHeadersList(headers).append(name,value,false)}function compareHeaderName(a,b){return a[0]>1);if(array[pivot][0]<=x[0]){left=pivot+1}else{right=pivot}}if(i!==pivot){j=i;while(j>left){array[j]=array[--j]}array[left]=x}}if(!iterator.next().done){throw new TypeError("Unreachable")}return array}else{let i=0;for(const{0:name,1:{value}}of this[kHeadersMap]){array[i++]=[name,value];assert(value!==null)}return array.sort(compareHeaderName)}}};var Headers2=class _Headers{#guard;#headersList;constructor(init=void 0){webidl.util.markAsUncloneable(this);if(init===kConstruct){return}this.#headersList=new HeadersList;this.#guard="none";if(init!==void 0){init=webidl.converters.HeadersInit(init,"Headers contructor","init");fill(this,init)}}append(name,value){webidl.brandCheck(this,_Headers);webidl.argumentLengthCheck(arguments,2,"Headers.append");const prefix="Headers.append";name=webidl.converters.ByteString(name,prefix,"name");value=webidl.converters.ByteString(value,prefix,"value");return appendHeader(this,name,value)}delete(name){webidl.brandCheck(this,_Headers);webidl.argumentLengthCheck(arguments,1,"Headers.delete");const prefix="Headers.delete";name=webidl.converters.ByteString(name,prefix,"name");if(!isValidHeaderName(name)){throw webidl.errors.invalidArgument({prefix:"Headers.delete",value:name,type:"header name"})}if(this.#guard==="immutable"){throw new TypeError("immutable")}if(!this.#headersList.contains(name,false)){return}this.#headersList.delete(name,false)}get(name){webidl.brandCheck(this,_Headers);webidl.argumentLengthCheck(arguments,1,"Headers.get");const prefix="Headers.get";name=webidl.converters.ByteString(name,prefix,"name");if(!isValidHeaderName(name)){throw webidl.errors.invalidArgument({prefix,value:name,type:"header name"})}return this.#headersList.get(name,false)}has(name){webidl.brandCheck(this,_Headers);webidl.argumentLengthCheck(arguments,1,"Headers.has");const prefix="Headers.has";name=webidl.converters.ByteString(name,prefix,"name");if(!isValidHeaderName(name)){throw webidl.errors.invalidArgument({prefix,value:name,type:"header name"})}return this.#headersList.contains(name,false)}set(name,value){webidl.brandCheck(this,_Headers);webidl.argumentLengthCheck(arguments,2,"Headers.set");const prefix="Headers.set";name=webidl.converters.ByteString(name,prefix,"name");value=webidl.converters.ByteString(value,prefix,"value");value=headerValueNormalize(value);if(!isValidHeaderName(name)){throw webidl.errors.invalidArgument({prefix,value:name,type:"header name"})}else if(!isValidHeaderValue(value)){throw webidl.errors.invalidArgument({prefix,value,type:"header value"})}if(this.#guard==="immutable"){throw new TypeError("immutable")}this.#headersList.set(name,value,false)}getSetCookie(){webidl.brandCheck(this,_Headers);const list=this.#headersList.cookies;if(list){return[...list]}return[]}get[kHeadersSortedMap](){if(this.#headersList[kHeadersSortedMap]){return this.#headersList[kHeadersSortedMap]}const headers=[];const names=this.#headersList.toSortedArray();const cookies=this.#headersList.cookies;if(cookies===null||cookies.length===1){return this.#headersList[kHeadersSortedMap]=names}for(let i=0;i>"](V,prefix,argument,iterator.bind(V))}return webidl.converters["record"](V,prefix,argument)}throw webidl.errors.conversionFailed({prefix:"Headers constructor",argument:"Argument 1",types:["sequence>","record"]})};module2.exports={fill,compareHeaderName,Headers:Headers2,HeadersList,getHeadersGuard,setHeadersGuard,setHeadersList,getHeadersList}}});var require_response=__commonJS({"../../node_modules/undici/lib/web/fetch/response.js"(exports2,module2){"use strict";var{Headers:Headers2,HeadersList,fill,getHeadersGuard,setHeadersGuard,setHeadersList}=require_headers();var{extractBody,cloneBody,mixinBody,hasFinalizationRegistry,streamRegistry,bodyUnusable}=require_body();var util=require_util();var nodeUtil=require("node:util");var{kEnumerableProperty}=util;var{isValidReasonPhrase,isCancelled,isAborted,isBlobLike,serializeJavascriptValueToJSONString,isErrorLike,isomorphicEncode,environmentSettingsObject:relevantRealm}=require_util2();var{redirectStatusSet,nullBodyStatus}=require_constants3();var{kState,kHeaders}=require_symbols2();var{webidl}=require_webidl();var{FormData}=require_formdata();var{URLSerializer}=require_data_url();var{kConstruct}=require_symbols();var assert=require("node:assert");var{types}=require("node:util");var textEncoder=new TextEncoder("utf-8");var Response=class _Response{static error(){const responseObject=fromInnerResponse(makeNetworkError(),"immutable");return responseObject}static json(data,init={}){webidl.argumentLengthCheck(arguments,1,"Response.json");if(init!==null){init=webidl.converters.ResponseInit(init)}const bytes=textEncoder.encode(serializeJavascriptValueToJSONString(data));const body=extractBody(bytes);const responseObject=fromInnerResponse(makeResponse({}),"response");initializeResponse(responseObject,init,{body:body[0],type:"application/json"});return responseObject}static redirect(url,status=302){webidl.argumentLengthCheck(arguments,1,"Response.redirect");url=webidl.converters.USVString(url);status=webidl.converters["unsigned short"](status);let parsedURL;try{parsedURL=new URL(url,relevantRealm.settingsObject.baseUrl)}catch(err){throw new TypeError(`Failed to parse URL from ${url}`,{cause:err})}if(!redirectStatusSet.has(status)){throw new RangeError(`Invalid status code ${status}`)}const responseObject=fromInnerResponse(makeResponse({}),"immutable");responseObject[kState].status=status;const value=isomorphicEncode(URLSerializer(parsedURL));responseObject[kState].headersList.append("location",value,true);return responseObject}constructor(body=null,init={}){webidl.util.markAsUncloneable(this);if(body===kConstruct){return}if(body!==null){body=webidl.converters.BodyInit(body)}init=webidl.converters.ResponseInit(init);this[kState]=makeResponse({});this[kHeaders]=new Headers2(kConstruct);setHeadersGuard(this[kHeaders],"response");setHeadersList(this[kHeaders],this[kState].headersList);let bodyWithType=null;if(body!=null){const[extractedBody,type]=extractBody(body);bodyWithType={body:extractedBody,type}}initializeResponse(this,init,bodyWithType)}get type(){webidl.brandCheck(this,_Response);return this[kState].type}get url(){webidl.brandCheck(this,_Response);const urlList=this[kState].urlList;const url=urlList[urlList.length-1]??null;if(url===null){return""}return URLSerializer(url,true)}get redirected(){webidl.brandCheck(this,_Response);return this[kState].urlList.length>1}get status(){webidl.brandCheck(this,_Response);return this[kState].status}get ok(){webidl.brandCheck(this,_Response);return this[kState].status>=200&&this[kState].status<=299}get statusText(){webidl.brandCheck(this,_Response);return this[kState].statusText}get headers(){webidl.brandCheck(this,_Response);return this[kHeaders]}get body(){webidl.brandCheck(this,_Response);return this[kState].body?this[kState].body.stream:null}get bodyUsed(){webidl.brandCheck(this,_Response);return!!this[kState].body&&util.isDisturbed(this[kState].body.stream)}clone(){webidl.brandCheck(this,_Response);if(bodyUnusable(this)){throw webidl.errors.exception({header:"Response.clone",message:"Body has already been consumed."})}const clonedResponse=cloneResponse(this[kState]);if(hasFinalizationRegistry&&this[kState].body?.stream){streamRegistry.register(this,new WeakRef(this[kState].body.stream))}return fromInnerResponse(clonedResponse,getHeadersGuard(this[kHeaders]))}[nodeUtil.inspect.custom](depth,options){if(options.depth===null){options.depth=2}options.colors??=true;const properties={status:this.status,statusText:this.statusText,headers:this.headers,body:this.body,bodyUsed:this.bodyUsed,ok:this.ok,redirected:this.redirected,type:this.type,url:this.url};return`Response ${nodeUtil.formatWithOptions(options,properties)}`}};mixinBody(Response);Object.defineProperties(Response.prototype,{type:kEnumerableProperty,url:kEnumerableProperty,status:kEnumerableProperty,ok:kEnumerableProperty,redirected:kEnumerableProperty,statusText:kEnumerableProperty,headers:kEnumerableProperty,clone:kEnumerableProperty,body:kEnumerableProperty,bodyUsed:kEnumerableProperty,[Symbol.toStringTag]:{value:"Response",configurable:true}});Object.defineProperties(Response,{json:kEnumerableProperty,redirect:kEnumerableProperty,error:kEnumerableProperty});function cloneResponse(response){if(response.internalResponse){return filterResponse(cloneResponse(response.internalResponse),response.type)}const newResponse=makeResponse({...response,body:null});if(response.body!=null){newResponse.body=cloneBody(newResponse,response.body)}return newResponse}function makeResponse(init){return{aborted:false,rangeRequested:false,timingAllowPassed:false,requestIncludesCredentials:false,type:"default",status:200,timingInfo:null,cacheState:"",statusText:"",...init,headersList:init?.headersList?new HeadersList(init?.headersList):new HeadersList,urlList:init?.urlList?[...init.urlList]:[]}}function makeNetworkError(reason){const isError=isErrorLike(reason);return makeResponse({type:"error",status:0,error:isError?reason:new Error(reason?String(reason):reason),aborted:reason&&reason.name==="AbortError"})}function isNetworkError(response){return response.type==="error"&&response.status===0}function makeFilteredResponse(response,state){state={internalResponse:response,...state};return new Proxy(response,{get(target,p){return p in state?state[p]:target[p]},set(target,p,value){assert(!(p in state));target[p]=value;return true}})}function filterResponse(response,type){if(type==="basic"){return makeFilteredResponse(response,{type:"basic",headersList:response.headersList})}else if(type==="cors"){return makeFilteredResponse(response,{type:"cors",headersList:response.headersList})}else if(type==="opaque"){return makeFilteredResponse(response,{type:"opaque",urlList:Object.freeze([]),status:0,statusText:"",body:null})}else if(type==="opaqueredirect"){return makeFilteredResponse(response,{type:"opaqueredirect",status:0,statusText:"",headersList:[],body:null})}else{assert(false)}}function makeAppropriateNetworkError(fetchParams,err=null){assert(isCancelled(fetchParams));return isAborted(fetchParams)?makeNetworkError(Object.assign(new DOMException("The operation was aborted.","AbortError"),{cause:err})):makeNetworkError(Object.assign(new DOMException("Request was cancelled."),{cause:err}))}function initializeResponse(response,init,body){if(init.status!==null&&(init.status<200||init.status>599)){throw new RangeError('init["status"] must be in the range of 200 to 599, inclusive.')}if("statusText"in init&&init.statusText!=null){if(!isValidReasonPhrase(String(init.statusText))){throw new TypeError("Invalid statusText")}}if("status"in init&&init.status!=null){response[kState].status=init.status}if("statusText"in init&&init.statusText!=null){response[kState].statusText=init.statusText}if("headers"in init&&init.headers!=null){fill(response[kHeaders],init.headers)}if(body){if(nullBodyStatus.includes(response.status)){throw webidl.errors.exception({header:"Response constructor",message:`Invalid response status code ${response.status}`})}response[kState].body=body.body;if(body.type!=null&&!response[kState].headersList.contains("content-type",true)){response[kState].headersList.append("content-type",body.type,true)}}}function fromInnerResponse(innerResponse,guard){const response=new Response(kConstruct);response[kState]=innerResponse;response[kHeaders]=new Headers2(kConstruct);setHeadersList(response[kHeaders],innerResponse.headersList);setHeadersGuard(response[kHeaders],guard);if(hasFinalizationRegistry&&innerResponse.body?.stream){streamRegistry.register(response,new WeakRef(innerResponse.body.stream))}return response}webidl.converters.ReadableStream=webidl.interfaceConverter(ReadableStream);webidl.converters.FormData=webidl.interfaceConverter(FormData);webidl.converters.URLSearchParams=webidl.interfaceConverter(URLSearchParams);webidl.converters.XMLHttpRequestBodyInit=function(V,prefix,name){if(typeof V==="string"){return webidl.converters.USVString(V,prefix,name)}if(isBlobLike(V)){return webidl.converters.Blob(V,prefix,name,{strict:false})}if(ArrayBuffer.isView(V)||types.isArrayBuffer(V)){return webidl.converters.BufferSource(V,prefix,name)}if(util.isFormDataLike(V)){return webidl.converters.FormData(V,prefix,name,{strict:false})}if(V instanceof URLSearchParams){return webidl.converters.URLSearchParams(V,prefix,name)}return webidl.converters.DOMString(V,prefix,name)};webidl.converters.BodyInit=function(V,prefix,argument){if(V instanceof ReadableStream){return webidl.converters.ReadableStream(V,prefix,argument)}if(V?.[Symbol.asyncIterator]){return V}return webidl.converters.XMLHttpRequestBodyInit(V,prefix,argument)};webidl.converters.ResponseInit=webidl.dictionaryConverter([{key:"status",converter:webidl.converters["unsigned short"],defaultValue:()=>200},{key:"statusText",converter:webidl.converters.ByteString,defaultValue:()=>""},{key:"headers",converter:webidl.converters.HeadersInit}]);module2.exports={isNetworkError,makeNetworkError,makeResponse,makeAppropriateNetworkError,filterResponse,Response,cloneResponse,fromInnerResponse}}});var require_dispatcher_weakref=__commonJS({"../../node_modules/undici/lib/web/fetch/dispatcher-weakref.js"(exports2,module2){"use strict";var{kConnected,kSize}=require_symbols();var CompatWeakRef=class{constructor(value){this.value=value}deref(){return this.value[kConnected]===0&&this.value[kSize]===0?void 0:this.value}};var CompatFinalizer=class{constructor(finalizer){this.finalizer=finalizer}register(dispatcher,key){if(dispatcher.on){dispatcher.on("disconnect",()=>{if(dispatcher[kConnected]===0&&dispatcher[kSize]===0){this.finalizer(key)}})}}unregister(key){}};module2.exports=function(){if(process.env.NODE_V8_COVERAGE&&process.version.startsWith("v18")){process._rawDebug("Using compatibility WeakRef and FinalizationRegistry");return{WeakRef:CompatWeakRef,FinalizationRegistry:CompatFinalizer}}return{WeakRef,FinalizationRegistry}}}});var require_request2=__commonJS({"../../node_modules/undici/lib/web/fetch/request.js"(exports2,module2){"use strict";var{extractBody,mixinBody,cloneBody,bodyUnusable}=require_body();var{Headers:Headers2,fill:fillHeaders,HeadersList,setHeadersGuard,getHeadersGuard,setHeadersList,getHeadersList}=require_headers();var{FinalizationRegistry:FinalizationRegistry2}=require_dispatcher_weakref()();var util=require_util();var nodeUtil=require("node:util");var{isValidHTTPToken,sameOrigin,environmentSettingsObject}=require_util2();var{forbiddenMethodsSet,corsSafeListedMethodsSet,referrerPolicy,requestRedirect,requestMode,requestCredentials,requestCache,requestDuplex}=require_constants3();var{kEnumerableProperty,normalizedMethodRecordsBase,normalizedMethodRecords}=util;var{kHeaders,kSignal,kState,kDispatcher}=require_symbols2();var{webidl}=require_webidl();var{URLSerializer}=require_data_url();var{kConstruct}=require_symbols();var assert=require("node:assert");var{getMaxListeners,setMaxListeners,getEventListeners,defaultMaxListeners}=require("node:events");var kAbortController=Symbol("abortController");var requestFinalizer=new FinalizationRegistry2(({signal,abort})=>{signal.removeEventListener("abort",abort)});var dependentControllerMap=new WeakMap;function buildAbort(acRef){return abort;function abort(){const ac=acRef.deref();if(ac!==void 0){requestFinalizer.unregister(abort);this.removeEventListener("abort",abort);ac.abort(this.reason);const controllerList=dependentControllerMap.get(ac.signal);if(controllerList!==void 0){if(controllerList.size!==0){for(const ref of controllerList){const ctrl=ref.deref();if(ctrl!==void 0){ctrl.abort(this.reason)}}controllerList.clear()}dependentControllerMap.delete(ac.signal)}}}}var patchMethodWarning=false;var Request=class _Request{constructor(input,init={}){webidl.util.markAsUncloneable(this);if(input===kConstruct){return}const prefix="Request constructor";webidl.argumentLengthCheck(arguments,1,prefix);input=webidl.converters.RequestInfo(input,prefix,"input");init=webidl.converters.RequestInit(init,prefix,"init");let request=null;let fallbackMode=null;const baseUrl=environmentSettingsObject.settingsObject.baseUrl;let signal=null;if(typeof input==="string"){this[kDispatcher]=init.dispatcher;let parsedURL;try{parsedURL=new URL(input,baseUrl)}catch(err){throw new TypeError("Failed to parse URL from "+input,{cause:err})}if(parsedURL.username||parsedURL.password){throw new TypeError("Request cannot be constructed from a URL that includes credentials: "+input)}request=makeRequest({urlList:[parsedURL]});fallbackMode="cors"}else{this[kDispatcher]=init.dispatcher||input[kDispatcher];assert(input instanceof _Request);request=input[kState];signal=input[kSignal]}const origin=environmentSettingsObject.settingsObject.origin;let window2="client";if(request.window?.constructor?.name==="EnvironmentSettingsObject"&&sameOrigin(request.window,origin)){window2=request.window}if(init.window!=null){throw new TypeError(`'window' option '${window2}' must be null`)}if("window"in init){window2="no-window"}request=makeRequest({method:request.method,headersList:request.headersList,unsafeRequest:request.unsafeRequest,client:environmentSettingsObject.settingsObject,window:window2,priority:request.priority,origin:request.origin,referrer:request.referrer,referrerPolicy:request.referrerPolicy,mode:request.mode,credentials:request.credentials,cache:request.cache,redirect:request.redirect,integrity:request.integrity,keepalive:request.keepalive,reloadNavigation:request.reloadNavigation,historyNavigation:request.historyNavigation,urlList:[...request.urlList]});const initHasKey=Object.keys(init).length!==0;if(initHasKey){if(request.mode==="navigate"){request.mode="same-origin"}request.reloadNavigation=false;request.historyNavigation=false;request.origin="client";request.referrer="client";request.referrerPolicy="";request.url=request.urlList[request.urlList.length-1];request.urlList=[request.url]}if(init.referrer!==void 0){const referrer=init.referrer;if(referrer===""){request.referrer="no-referrer"}else{let parsedReferrer;try{parsedReferrer=new URL(referrer,baseUrl)}catch(err){throw new TypeError(`Referrer "${referrer}" is not a valid URL.`,{cause:err})}if(parsedReferrer.protocol==="about:"&&parsedReferrer.hostname==="client"||origin&&!sameOrigin(parsedReferrer,environmentSettingsObject.settingsObject.baseUrl)){request.referrer="client"}else{request.referrer=parsedReferrer}}}if(init.referrerPolicy!==void 0){request.referrerPolicy=init.referrerPolicy}let mode;if(init.mode!==void 0){mode=init.mode}else{mode=fallbackMode}if(mode==="navigate"){throw webidl.errors.exception({header:"Request constructor",message:"invalid request mode navigate."})}if(mode!=null){request.mode=mode}if(init.credentials!==void 0){request.credentials=init.credentials}if(init.cache!==void 0){request.cache=init.cache}if(request.cache==="only-if-cached"&&request.mode!=="same-origin"){throw new TypeError("'only-if-cached' can be set only with 'same-origin' mode")}if(init.redirect!==void 0){request.redirect=init.redirect}if(init.integrity!=null){request.integrity=String(init.integrity)}if(init.keepalive!==void 0){request.keepalive=Boolean(init.keepalive)}if(init.method!==void 0){let method=init.method;const mayBeNormalized=normalizedMethodRecords[method];if(mayBeNormalized!==void 0){request.method=mayBeNormalized}else{if(!isValidHTTPToken(method)){throw new TypeError(`'${method}' is not a valid HTTP method.`)}const upperCase=method.toUpperCase();if(forbiddenMethodsSet.has(upperCase)){throw new TypeError(`'${method}' HTTP method is unsupported.`)}method=normalizedMethodRecordsBase[upperCase]??method;request.method=method}if(!patchMethodWarning&&request.method==="patch"){process.emitWarning("Using `patch` is highly likely to result in a `405 Method Not Allowed`. `PATCH` is much more likely to succeed.",{code:"UNDICI-FETCH-patch"});patchMethodWarning=true}}if(init.signal!==void 0){signal=init.signal}this[kState]=request;const ac=new AbortController;this[kSignal]=ac.signal;if(signal!=null){if(!signal||typeof signal.aborted!=="boolean"||typeof signal.addEventListener!=="function"){throw new TypeError("Failed to construct 'Request': member signal is not of type AbortSignal.")}if(signal.aborted){ac.abort(signal.reason)}else{this[kAbortController]=ac;const acRef=new WeakRef(ac);const abort=buildAbort(acRef);try{if(typeof getMaxListeners==="function"&&getMaxListeners(signal)===defaultMaxListeners){setMaxListeners(1500,signal)}else if(getEventListeners(signal,"abort").length>=defaultMaxListeners){setMaxListeners(1500,signal)}}catch{}util.addAbortListener(signal,abort);requestFinalizer.register(ac,{signal,abort},abort)}}this[kHeaders]=new Headers2(kConstruct);setHeadersList(this[kHeaders],request.headersList);setHeadersGuard(this[kHeaders],"request");if(mode==="no-cors"){if(!corsSafeListedMethodsSet.has(request.method)){throw new TypeError(`'${request.method} is unsupported in no-cors mode.`)}setHeadersGuard(this[kHeaders],"request-no-cors")}if(initHasKey){const headersList=getHeadersList(this[kHeaders]);const headers=init.headers!==void 0?init.headers:new HeadersList(headersList);headersList.clear();if(headers instanceof HeadersList){for(const{name,value}of headers.rawValues()){headersList.append(name,value,false)}headersList.cookies=headers.cookies}else{fillHeaders(this[kHeaders],headers)}}const inputBody=input instanceof _Request?input[kState].body:null;if((init.body!=null||inputBody!=null)&&(request.method==="GET"||request.method==="HEAD")){throw new TypeError("Request with GET/HEAD method cannot have body.")}let initBody=null;if(init.body!=null){const[extractedBody,contentType]=extractBody(init.body,request.keepalive);initBody=extractedBody;if(contentType&&!getHeadersList(this[kHeaders]).contains("content-type",true)){this[kHeaders].append("content-type",contentType)}}const inputOrInitBody=initBody??inputBody;if(inputOrInitBody!=null&&inputOrInitBody.source==null){if(initBody!=null&&init.duplex==null){throw new TypeError("RequestInit: duplex option is required when sending a body.")}if(request.mode!=="same-origin"&&request.mode!=="cors"){throw new TypeError('If request is made from ReadableStream, mode should be "same-origin" or "cors"')}request.useCORSPreflightFlag=true}let finalBody=inputOrInitBody;if(initBody==null&&inputBody!=null){if(bodyUnusable(input)){throw new TypeError("Cannot construct a Request with a Request object that has already been used.")}const identityTransform=new TransformStream;inputBody.stream.pipeThrough(identityTransform);finalBody={source:inputBody.source,length:inputBody.length,stream:identityTransform.readable}}this[kState].body=finalBody}get method(){webidl.brandCheck(this,_Request);return this[kState].method}get url(){webidl.brandCheck(this,_Request);return URLSerializer(this[kState].url)}get headers(){webidl.brandCheck(this,_Request);return this[kHeaders]}get destination(){webidl.brandCheck(this,_Request);return this[kState].destination}get referrer(){webidl.brandCheck(this,_Request);if(this[kState].referrer==="no-referrer"){return""}if(this[kState].referrer==="client"){return"about:client"}return this[kState].referrer.toString()}get referrerPolicy(){webidl.brandCheck(this,_Request);return this[kState].referrerPolicy}get mode(){webidl.brandCheck(this,_Request);return this[kState].mode}get credentials(){return this[kState].credentials}get cache(){webidl.brandCheck(this,_Request);return this[kState].cache}get redirect(){webidl.brandCheck(this,_Request);return this[kState].redirect}get integrity(){webidl.brandCheck(this,_Request);return this[kState].integrity}get keepalive(){webidl.brandCheck(this,_Request);return this[kState].keepalive}get isReloadNavigation(){webidl.brandCheck(this,_Request);return this[kState].reloadNavigation}get isHistoryNavigation(){webidl.brandCheck(this,_Request);return this[kState].historyNavigation}get signal(){webidl.brandCheck(this,_Request);return this[kSignal]}get body(){webidl.brandCheck(this,_Request);return this[kState].body?this[kState].body.stream:null}get bodyUsed(){webidl.brandCheck(this,_Request);return!!this[kState].body&&util.isDisturbed(this[kState].body.stream)}get duplex(){webidl.brandCheck(this,_Request);return"half"}clone(){webidl.brandCheck(this,_Request);if(bodyUnusable(this)){throw new TypeError("unusable")}const clonedRequest=cloneRequest(this[kState]);const ac=new AbortController;if(this.signal.aborted){ac.abort(this.signal.reason)}else{let list=dependentControllerMap.get(this.signal);if(list===void 0){list=new Set;dependentControllerMap.set(this.signal,list)}const acRef=new WeakRef(ac);list.add(acRef);util.addAbortListener(ac.signal,buildAbort(acRef))}return fromInnerRequest(clonedRequest,ac.signal,getHeadersGuard(this[kHeaders]))}[nodeUtil.inspect.custom](depth,options){if(options.depth===null){options.depth=2}options.colors??=true;const properties={method:this.method,url:this.url,headers:this.headers,destination:this.destination,referrer:this.referrer,referrerPolicy:this.referrerPolicy,mode:this.mode,credentials:this.credentials,cache:this.cache,redirect:this.redirect,integrity:this.integrity,keepalive:this.keepalive,isReloadNavigation:this.isReloadNavigation,isHistoryNavigation:this.isHistoryNavigation,signal:this.signal};return`Request ${nodeUtil.formatWithOptions(options,properties)}`}};mixinBody(Request);function makeRequest(init){return{method:init.method??"GET",localURLsOnly:init.localURLsOnly??false,unsafeRequest:init.unsafeRequest??false,body:init.body??null,client:init.client??null,reservedClient:init.reservedClient??null,replacesClientId:init.replacesClientId??"",window:init.window??"client",keepalive:init.keepalive??false,serviceWorkers:init.serviceWorkers??"all",initiator:init.initiator??"",destination:init.destination??"",priority:init.priority??null,origin:init.origin??"client",policyContainer:init.policyContainer??"client",referrer:init.referrer??"client",referrerPolicy:init.referrerPolicy??"",mode:init.mode??"no-cors",useCORSPreflightFlag:init.useCORSPreflightFlag??false,credentials:init.credentials??"same-origin",useCredentials:init.useCredentials??false,cache:init.cache??"default",redirect:init.redirect??"follow",integrity:init.integrity??"",cryptoGraphicsNonceMetadata:init.cryptoGraphicsNonceMetadata??"",parserMetadata:init.parserMetadata??"",reloadNavigation:init.reloadNavigation??false,historyNavigation:init.historyNavigation??false,userActivation:init.userActivation??false,taintedOrigin:init.taintedOrigin??false,redirectCount:init.redirectCount??0,responseTainting:init.responseTainting??"basic",preventNoCacheCacheControlHeaderModification:init.preventNoCacheCacheControlHeaderModification??false,done:init.done??false,timingAllowFailed:init.timingAllowFailed??false,urlList:init.urlList,url:init.urlList[0],headersList:init.headersList?new HeadersList(init.headersList):new HeadersList}}function cloneRequest(request){const newRequest=makeRequest({...request,body:null});if(request.body!=null){newRequest.body=cloneBody(newRequest,request.body)}return newRequest}function fromInnerRequest(innerRequest,signal,guard){const request=new Request(kConstruct);request[kState]=innerRequest;request[kSignal]=signal;request[kHeaders]=new Headers2(kConstruct);setHeadersList(request[kHeaders],innerRequest.headersList);setHeadersGuard(request[kHeaders],guard);return request}Object.defineProperties(Request.prototype,{method:kEnumerableProperty,url:kEnumerableProperty,headers:kEnumerableProperty,redirect:kEnumerableProperty,clone:kEnumerableProperty,signal:kEnumerableProperty,duplex:kEnumerableProperty,destination:kEnumerableProperty,body:kEnumerableProperty,bodyUsed:kEnumerableProperty,isHistoryNavigation:kEnumerableProperty,isReloadNavigation:kEnumerableProperty,keepalive:kEnumerableProperty,integrity:kEnumerableProperty,cache:kEnumerableProperty,credentials:kEnumerableProperty,attribute:kEnumerableProperty,referrerPolicy:kEnumerableProperty,referrer:kEnumerableProperty,mode:kEnumerableProperty,[Symbol.toStringTag]:{value:"Request",configurable:true}});webidl.converters.Request=webidl.interfaceConverter(Request);webidl.converters.RequestInfo=function(V,prefix,argument){if(typeof V==="string"){return webidl.converters.USVString(V,prefix,argument)}if(V instanceof Request){return webidl.converters.Request(V,prefix,argument)}return webidl.converters.USVString(V,prefix,argument)};webidl.converters.AbortSignal=webidl.interfaceConverter(AbortSignal);webidl.converters.RequestInit=webidl.dictionaryConverter([{key:"method",converter:webidl.converters.ByteString},{key:"headers",converter:webidl.converters.HeadersInit},{key:"body",converter:webidl.nullableConverter(webidl.converters.BodyInit)},{key:"referrer",converter:webidl.converters.USVString},{key:"referrerPolicy",converter:webidl.converters.DOMString,allowedValues:referrerPolicy},{key:"mode",converter:webidl.converters.DOMString,allowedValues:requestMode},{key:"credentials",converter:webidl.converters.DOMString,allowedValues:requestCredentials},{key:"cache",converter:webidl.converters.DOMString,allowedValues:requestCache},{key:"redirect",converter:webidl.converters.DOMString,allowedValues:requestRedirect},{key:"integrity",converter:webidl.converters.DOMString},{key:"keepalive",converter:webidl.converters.boolean},{key:"signal",converter:webidl.nullableConverter(signal=>webidl.converters.AbortSignal(signal,"RequestInit","signal",{strict:false}))},{key:"window",converter:webidl.converters.any},{key:"duplex",converter:webidl.converters.DOMString,allowedValues:requestDuplex},{key:"dispatcher",converter:webidl.converters.any}]);module2.exports={Request,makeRequest,fromInnerRequest,cloneRequest}}});var require_fetch=__commonJS({"../../node_modules/undici/lib/web/fetch/index.js"(exports2,module2){"use strict";var{makeNetworkError,makeAppropriateNetworkError,filterResponse,makeResponse,fromInnerResponse}=require_response();var{HeadersList}=require_headers();var{Request,cloneRequest}=require_request2();var zlib=require("node:zlib");var{bytesMatch,makePolicyContainer,clonePolicyContainer,requestBadPort,TAOCheck,appendRequestOriginHeader,responseLocationURL,requestCurrentURL,setRequestReferrerPolicyOnRedirect,tryUpgradeRequestToAPotentiallyTrustworthyURL,createOpaqueTimingInfo,appendFetchMetadata,corsCheck,crossOriginResourcePolicyCheck,determineRequestsReferrer,coarsenedSharedCurrentTime,createDeferredPromise,isBlobLike,sameOrigin,isCancelled,isAborted,isErrorLike,fullyReadBody,readableStreamClose,isomorphicEncode,urlIsLocal,urlIsHttpHttpsScheme,urlHasHttpsScheme,clampAndCoarsenConnectionTimingInfo,simpleRangeHeaderValue,buildContentRange,createInflate,extractMimeType}=require_util2();var{kState,kDispatcher}=require_symbols2();var assert=require("node:assert");var{safelyExtractBody,extractBody}=require_body();var{redirectStatusSet,nullBodyStatus,safeMethodsSet,requestBodyHeader,subresourceSet}=require_constants3();var EE=require("node:events");var{Readable,pipeline,finished}=require("node:stream");var{addAbortListener,isErrored,isReadable,bufferToLowerCasedHeaderName}=require_util();var{dataURLProcessor,serializeAMimeType,minimizeSupportedMimeType}=require_data_url();var{getGlobalDispatcher}=require_global2();var{webidl}=require_webidl();var{STATUS_CODES}=require("node:http");var GET_OR_HEAD=["GET","HEAD"];var defaultUserAgent=typeof __UNDICI_IS_NODE__!=="undefined"||typeof esbuildDetection!=="undefined"?"node":"undici";var resolveObjectURL;var Fetch=class extends EE{constructor(dispatcher){super();this.dispatcher=dispatcher;this.connection=null;this.dump=false;this.state="ongoing"}terminate(reason){if(this.state!=="ongoing"){return}this.state="terminated";this.connection?.destroy(reason);this.emit("terminated",reason)}abort(error2){if(this.state!=="ongoing"){return}this.state="aborted";if(!error2){error2=new DOMException("The operation was aborted.","AbortError")}this.serializedAbortReason=error2;this.connection?.destroy(error2);this.emit("terminated",error2)}};function handleFetchDone(response){finalizeAndReportTiming(response,"fetch")}function fetch(input,init=void 0){webidl.argumentLengthCheck(arguments,1,"globalThis.fetch");let p=createDeferredPromise();let requestObject;try{requestObject=new Request(input,init)}catch(e){p.reject(e);return p.promise}const request=requestObject[kState];if(requestObject.signal.aborted){abortFetch(p,request,null,requestObject.signal.reason);return p.promise}const globalObject=request.client.globalObject;if(globalObject?.constructor?.name==="ServiceWorkerGlobalScope"){request.serviceWorkers="none"}let responseObject=null;let locallyAborted=false;let controller=null;addAbortListener(requestObject.signal,()=>{locallyAborted=true;assert(controller!=null);controller.abort(requestObject.signal.reason);const realResponse=responseObject?.deref();abortFetch(p,request,realResponse,requestObject.signal.reason)});const processResponse=response=>{if(locallyAborted){return}if(response.aborted){abortFetch(p,request,responseObject,controller.serializedAbortReason);return}if(response.type==="error"){p.reject(new TypeError("fetch failed",{cause:response.error}));return}responseObject=new WeakRef(fromInnerResponse(response,"immutable"));p.resolve(responseObject.deref());p=null};controller=fetching({request,processResponseEndOfBody:handleFetchDone,processResponse,dispatcher:requestObject[kDispatcher]});return p.promise}function finalizeAndReportTiming(response,initiatorType="other"){if(response.type==="error"&&response.aborted){return}if(!response.urlList?.length){return}const originalURL=response.urlList[0];let timingInfo=response.timingInfo;let cacheState=response.cacheState;if(!urlIsHttpHttpsScheme(originalURL)){return}if(timingInfo===null){return}if(!response.timingAllowPassed){timingInfo=createOpaqueTimingInfo({startTime:timingInfo.startTime});cacheState=""}timingInfo.endTime=coarsenedSharedCurrentTime();response.timingInfo=timingInfo;markResourceTiming(timingInfo,originalURL.href,initiatorType,globalThis,cacheState)}var markResourceTiming=performance.markResourceTiming;function abortFetch(p,request,responseObject,error2){if(p){p.reject(error2)}if(request.body!=null&&isReadable(request.body?.stream)){request.body.stream.cancel(error2).catch(err=>{if(err.code==="ERR_INVALID_STATE"){return}throw err})}if(responseObject==null){return}const response=responseObject[kState];if(response.body!=null&&isReadable(response.body?.stream)){response.body.stream.cancel(error2).catch(err=>{if(err.code==="ERR_INVALID_STATE"){return}throw err})}}function fetching({request,processRequestBodyChunkLength,processRequestEndOfBody,processResponse,processResponseEndOfBody,processResponseConsumeBody,useParallelQueue=false,dispatcher=getGlobalDispatcher()}){assert(dispatcher);let taskDestination=null;let crossOriginIsolatedCapability=false;if(request.client!=null){taskDestination=request.client.globalObject;crossOriginIsolatedCapability=request.client.crossOriginIsolatedCapability}const currentTime=coarsenedSharedCurrentTime(crossOriginIsolatedCapability);const timingInfo=createOpaqueTimingInfo({startTime:currentTime});const fetchParams={controller:new Fetch(dispatcher),request,timingInfo,processRequestBodyChunkLength,processRequestEndOfBody,processResponse,processResponseConsumeBody,processResponseEndOfBody,taskDestination,crossOriginIsolatedCapability};assert(!request.body||request.body.stream);if(request.window==="client"){request.window=request.client?.globalObject?.constructor?.name==="Window"?request.client:"no-window"}if(request.origin==="client"){request.origin=request.client.origin}if(request.policyContainer==="client"){if(request.client!=null){request.policyContainer=clonePolicyContainer(request.client.policyContainer)}else{request.policyContainer=makePolicyContainer()}}if(!request.headersList.contains("accept",true)){const value="*/*";request.headersList.append("accept",value,true)}if(!request.headersList.contains("accept-language",true)){request.headersList.append("accept-language","*",true)}if(request.priority===null){}if(subresourceSet.has(request.destination)){}mainFetch(fetchParams).catch(err=>{fetchParams.controller.terminate(err)});return fetchParams.controller}async function mainFetch(fetchParams,recursive=false){const request=fetchParams.request;let response=null;if(request.localURLsOnly&&!urlIsLocal(requestCurrentURL(request))){response=makeNetworkError("local URLs only")}tryUpgradeRequestToAPotentiallyTrustworthyURL(request);if(requestBadPort(request)==="blocked"){response=makeNetworkError("bad port")}if(request.referrerPolicy===""){request.referrerPolicy=request.policyContainer.referrerPolicy}if(request.referrer!=="no-referrer"){request.referrer=determineRequestsReferrer(request)}if(response===null){response=await(async()=>{const currentURL=requestCurrentURL(request);if(sameOrigin(currentURL,request.url)&&request.responseTainting==="basic"||currentURL.protocol==="data:"||(request.mode==="navigate"||request.mode==="websocket")){request.responseTainting="basic";return await schemeFetch(fetchParams)}if(request.mode==="same-origin"){return makeNetworkError('request mode cannot be "same-origin"')}if(request.mode==="no-cors"){if(request.redirect!=="follow"){return makeNetworkError('redirect mode cannot be "follow" for "no-cors" request')}request.responseTainting="opaque";return await schemeFetch(fetchParams)}if(!urlIsHttpHttpsScheme(requestCurrentURL(request))){return makeNetworkError("URL scheme must be a HTTP(S) scheme")}request.responseTainting="cors";return await httpFetch(fetchParams)})()}if(recursive){return response}if(response.status!==0&&!response.internalResponse){if(request.responseTainting==="cors"){}if(request.responseTainting==="basic"){response=filterResponse(response,"basic")}else if(request.responseTainting==="cors"){response=filterResponse(response,"cors")}else if(request.responseTainting==="opaque"){response=filterResponse(response,"opaque")}else{assert(false)}}let internalResponse=response.status===0?response:response.internalResponse;if(internalResponse.urlList.length===0){internalResponse.urlList.push(...request.urlList)}if(!request.timingAllowFailed){response.timingAllowPassed=true}if(response.type==="opaque"&&internalResponse.status===206&&internalResponse.rangeRequested&&!request.headers.contains("range",true)){response=internalResponse=makeNetworkError()}if(response.status!==0&&(request.method==="HEAD"||request.method==="CONNECT"||nullBodyStatus.includes(internalResponse.status))){internalResponse.body=null;fetchParams.controller.dump=true}if(request.integrity){const processBodyError=reason=>fetchFinale(fetchParams,makeNetworkError(reason));if(request.responseTainting==="opaque"||response.body==null){processBodyError(response.error);return}const processBody=bytes=>{if(!bytesMatch(bytes,request.integrity)){processBodyError("integrity mismatch");return}response.body=safelyExtractBody(bytes)[0];fetchFinale(fetchParams,response)};await fullyReadBody(response.body,processBody,processBodyError)}else{fetchFinale(fetchParams,response)}}function schemeFetch(fetchParams){if(isCancelled(fetchParams)&&fetchParams.request.redirectCount===0){return Promise.resolve(makeAppropriateNetworkError(fetchParams))}const{request}=fetchParams;const{protocol:scheme}=requestCurrentURL(request);switch(scheme){case"about:":{return Promise.resolve(makeNetworkError("about scheme is not supported"))}case"blob:":{if(!resolveObjectURL){resolveObjectURL=require("node:buffer").resolveObjectURL}const blobURLEntry=requestCurrentURL(request);if(blobURLEntry.search.length!==0){return Promise.resolve(makeNetworkError("NetworkError when attempting to fetch resource."))}const blob=resolveObjectURL(blobURLEntry.toString());if(request.method!=="GET"||!isBlobLike(blob)){return Promise.resolve(makeNetworkError("invalid method"))}const response=makeResponse();const fullLength=blob.size;const serializedFullLength=isomorphicEncode(`${fullLength}`);const type=blob.type;if(!request.headersList.contains("range",true)){const bodyWithType=extractBody(blob);response.statusText="OK";response.body=bodyWithType[0];response.headersList.set("content-length",serializedFullLength,true);response.headersList.set("content-type",type,true)}else{response.rangeRequested=true;const rangeHeader=request.headersList.get("range",true);const rangeValue=simpleRangeHeaderValue(rangeHeader,true);if(rangeValue==="failure"){return Promise.resolve(makeNetworkError("failed to fetch the data URL"))}let{rangeStartValue:rangeStart,rangeEndValue:rangeEnd}=rangeValue;if(rangeStart===null){rangeStart=fullLength-rangeEnd;rangeEnd=rangeStart+rangeEnd-1}else{if(rangeStart>=fullLength){return Promise.resolve(makeNetworkError("Range start is greater than the blob's size."))}if(rangeEnd===null||rangeEnd>=fullLength){rangeEnd=fullLength-1}}const slicedBlob=blob.slice(rangeStart,rangeEnd,type);const slicedBodyWithType=extractBody(slicedBlob);response.body=slicedBodyWithType[0];const serializedSlicedLength=isomorphicEncode(`${slicedBlob.size}`);const contentRange=buildContentRange(rangeStart,rangeEnd,fullLength);response.status=206;response.statusText="Partial Content";response.headersList.set("content-length",serializedSlicedLength,true);response.headersList.set("content-type",type,true);response.headersList.set("content-range",contentRange,true)}return Promise.resolve(response)}case"data:":{const currentURL=requestCurrentURL(request);const dataURLStruct=dataURLProcessor(currentURL);if(dataURLStruct==="failure"){return Promise.resolve(makeNetworkError("failed to fetch the data URL"))}const mimeType=serializeAMimeType(dataURLStruct.mimeType);return Promise.resolve(makeResponse({statusText:"OK",headersList:[["content-type",{name:"Content-Type",value:mimeType}]],body:safelyExtractBody(dataURLStruct.body)[0]}))}case"file:":{return Promise.resolve(makeNetworkError("not implemented... yet..."))}case"http:":case"https:":{return httpFetch(fetchParams).catch(err=>makeNetworkError(err))}default:{return Promise.resolve(makeNetworkError("unknown scheme"))}}}function finalizeResponse(fetchParams,response){fetchParams.request.done=true;if(fetchParams.processResponseDone!=null){queueMicrotask(()=>fetchParams.processResponseDone(response))}}function fetchFinale(fetchParams,response){let timingInfo=fetchParams.timingInfo;const processResponseEndOfBody=()=>{const unsafeEndTime=Date.now();if(fetchParams.request.destination==="document"){fetchParams.controller.fullTimingInfo=timingInfo}fetchParams.controller.reportTimingSteps=()=>{if(fetchParams.request.url.protocol!=="https:"){return}timingInfo.endTime=unsafeEndTime;let cacheState=response.cacheState;const bodyInfo=response.bodyInfo;if(!response.timingAllowPassed){timingInfo=createOpaqueTimingInfo(timingInfo);cacheState=""}let responseStatus=0;if(fetchParams.request.mode!=="navigator"||!response.hasCrossOriginRedirects){responseStatus=response.status;const mimeType=extractMimeType(response.headersList);if(mimeType!=="failure"){bodyInfo.contentType=minimizeSupportedMimeType(mimeType)}}if(fetchParams.request.initiatorType!=null){markResourceTiming(timingInfo,fetchParams.request.url.href,fetchParams.request.initiatorType,globalThis,cacheState,bodyInfo,responseStatus)}};const processResponseEndOfBodyTask=()=>{fetchParams.request.done=true;if(fetchParams.processResponseEndOfBody!=null){queueMicrotask(()=>fetchParams.processResponseEndOfBody(response))}if(fetchParams.request.initiatorType!=null){fetchParams.controller.reportTimingSteps()}};queueMicrotask(()=>processResponseEndOfBodyTask())};if(fetchParams.processResponse!=null){queueMicrotask(()=>{fetchParams.processResponse(response);fetchParams.processResponse=null})}const internalResponse=response.type==="error"?response:response.internalResponse??response;if(internalResponse.body==null){processResponseEndOfBody()}else{finished(internalResponse.body.stream,()=>{processResponseEndOfBody()})}}async function httpFetch(fetchParams){const request=fetchParams.request;let response=null;let actualResponse=null;const timingInfo=fetchParams.timingInfo;if(request.serviceWorkers==="all"){}if(response===null){if(request.redirect==="follow"){request.serviceWorkers="none"}actualResponse=response=await httpNetworkOrCacheFetch(fetchParams);if(request.responseTainting==="cors"&&corsCheck(request,response)==="failure"){return makeNetworkError("cors failure")}if(TAOCheck(request,response)==="failure"){request.timingAllowFailed=true}}if((request.responseTainting==="opaque"||response.type==="opaque")&&crossOriginResourcePolicyCheck(request.origin,request.client,request.destination,actualResponse)==="blocked"){return makeNetworkError("blocked")}if(redirectStatusSet.has(actualResponse.status)){if(request.redirect!=="manual"){fetchParams.controller.connection.destroy(void 0,false)}if(request.redirect==="error"){response=makeNetworkError("unexpected redirect")}else if(request.redirect==="manual"){response=actualResponse}else if(request.redirect==="follow"){response=await httpRedirectFetch(fetchParams,response)}else{assert(false)}}response.timingInfo=timingInfo;return response}function httpRedirectFetch(fetchParams,response){const request=fetchParams.request;const actualResponse=response.internalResponse?response.internalResponse:response;let locationURL;try{locationURL=responseLocationURL(actualResponse,requestCurrentURL(request).hash);if(locationURL==null){return response}}catch(err){return Promise.resolve(makeNetworkError(err))}if(!urlIsHttpHttpsScheme(locationURL)){return Promise.resolve(makeNetworkError("URL scheme must be a HTTP(S) scheme"))}if(request.redirectCount===20){return Promise.resolve(makeNetworkError("redirect count exceeded"))}request.redirectCount+=1;if(request.mode==="cors"&&(locationURL.username||locationURL.password)&&!sameOrigin(request,locationURL)){return Promise.resolve(makeNetworkError('cross origin not allowed for request mode "cors"'))}if(request.responseTainting==="cors"&&(locationURL.username||locationURL.password)){return Promise.resolve(makeNetworkError('URL cannot contain credentials for request mode "cors"'))}if(actualResponse.status!==303&&request.body!=null&&request.body.source==null){return Promise.resolve(makeNetworkError())}if([301,302].includes(actualResponse.status)&&request.method==="POST"||actualResponse.status===303&&!GET_OR_HEAD.includes(request.method)){request.method="GET";request.body=null;for(const headerName of requestBodyHeader){request.headersList.delete(headerName)}}if(!sameOrigin(requestCurrentURL(request),locationURL)){request.headersList.delete("authorization",true);request.headersList.delete("proxy-authorization",true);request.headersList.delete("cookie",true);request.headersList.delete("host",true)}if(request.body!=null){assert(request.body.source!=null);request.body=safelyExtractBody(request.body.source)[0]}const timingInfo=fetchParams.timingInfo;timingInfo.redirectEndTime=timingInfo.postRedirectStartTime=coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability);if(timingInfo.redirectStartTime===0){timingInfo.redirectStartTime=timingInfo.startTime}request.urlList.push(locationURL);setRequestReferrerPolicyOnRedirect(request,actualResponse);return mainFetch(fetchParams,true)}async function httpNetworkOrCacheFetch(fetchParams,isAuthenticationFetch=false,isNewConnectionFetch=false){const request=fetchParams.request;let httpFetchParams=null;let httpRequest=null;let response=null;const httpCache=null;const revalidatingFlag=false;if(request.window==="no-window"&&request.redirect==="error"){httpFetchParams=fetchParams;httpRequest=request}else{httpRequest=cloneRequest(request);httpFetchParams={...fetchParams};httpFetchParams.request=httpRequest}const includeCredentials=request.credentials==="include"||request.credentials==="same-origin"&&request.responseTainting==="basic";const contentLength=httpRequest.body?httpRequest.body.length:null;let contentLengthHeaderValue=null;if(httpRequest.body==null&&["POST","PUT"].includes(httpRequest.method)){contentLengthHeaderValue="0"}if(contentLength!=null){contentLengthHeaderValue=isomorphicEncode(`${contentLength}`)}if(contentLengthHeaderValue!=null){httpRequest.headersList.append("content-length",contentLengthHeaderValue,true)}if(contentLength!=null&&httpRequest.keepalive){}if(httpRequest.referrer instanceof URL){httpRequest.headersList.append("referer",isomorphicEncode(httpRequest.referrer.href),true)}appendRequestOriginHeader(httpRequest);appendFetchMetadata(httpRequest);if(!httpRequest.headersList.contains("user-agent",true)){httpRequest.headersList.append("user-agent",defaultUserAgent)}if(httpRequest.cache==="default"&&(httpRequest.headersList.contains("if-modified-since",true)||httpRequest.headersList.contains("if-none-match",true)||httpRequest.headersList.contains("if-unmodified-since",true)||httpRequest.headersList.contains("if-match",true)||httpRequest.headersList.contains("if-range",true))){httpRequest.cache="no-store"}if(httpRequest.cache==="no-cache"&&!httpRequest.preventNoCacheCacheControlHeaderModification&&!httpRequest.headersList.contains("cache-control",true)){httpRequest.headersList.append("cache-control","max-age=0",true)}if(httpRequest.cache==="no-store"||httpRequest.cache==="reload"){if(!httpRequest.headersList.contains("pragma",true)){httpRequest.headersList.append("pragma","no-cache",true)}if(!httpRequest.headersList.contains("cache-control",true)){httpRequest.headersList.append("cache-control","no-cache",true)}}if(httpRequest.headersList.contains("range",true)){httpRequest.headersList.append("accept-encoding","identity",true)}if(!httpRequest.headersList.contains("accept-encoding",true)){if(urlHasHttpsScheme(requestCurrentURL(httpRequest))){httpRequest.headersList.append("accept-encoding","br, gzip, deflate",true)}else{httpRequest.headersList.append("accept-encoding","gzip, deflate",true)}}httpRequest.headersList.delete("host",true);if(includeCredentials){}if(httpCache==null){httpRequest.cache="no-store"}if(httpRequest.cache!=="no-store"&&httpRequest.cache!=="reload"){}if(response==null){if(httpRequest.cache==="only-if-cached"){return makeNetworkError("only if cached")}const forwardResponse=await httpNetworkFetch(httpFetchParams,includeCredentials,isNewConnectionFetch);if(!safeMethodsSet.has(httpRequest.method)&&forwardResponse.status>=200&&forwardResponse.status<=399){}if(revalidatingFlag&&forwardResponse.status===304){}if(response==null){response=forwardResponse}}response.urlList=[...httpRequest.urlList];if(httpRequest.headersList.contains("range",true)){response.rangeRequested=true}response.requestIncludesCredentials=includeCredentials;if(response.status===407){if(request.window==="no-window"){return makeNetworkError()}if(isCancelled(fetchParams)){return makeAppropriateNetworkError(fetchParams)}return makeNetworkError("proxy authentication required")}if(response.status===421&&!isNewConnectionFetch&&(request.body==null||request.body.source!=null)){if(isCancelled(fetchParams)){return makeAppropriateNetworkError(fetchParams)}fetchParams.controller.connection.destroy();response=await httpNetworkOrCacheFetch(fetchParams,isAuthenticationFetch,true)}if(isAuthenticationFetch){}return response}async function httpNetworkFetch(fetchParams,includeCredentials=false,forceNewConnection=false){assert(!fetchParams.controller.connection||fetchParams.controller.connection.destroyed);fetchParams.controller.connection={abort:null,destroyed:false,destroy(err,abort=true){if(!this.destroyed){this.destroyed=true;if(abort){this.abort?.(err??new DOMException("The operation was aborted.","AbortError"))}}}};const request=fetchParams.request;let response=null;const timingInfo=fetchParams.timingInfo;const httpCache=null;if(httpCache==null){request.cache="no-store"}const newConnection=forceNewConnection?"yes":"no";if(request.mode==="websocket"){}else{}let requestBody=null;if(request.body==null&&fetchParams.processRequestEndOfBody){queueMicrotask(()=>fetchParams.processRequestEndOfBody())}else if(request.body!=null){const processBodyChunk=async function*(bytes){if(isCancelled(fetchParams)){return}yield bytes;fetchParams.processRequestBodyChunkLength?.(bytes.byteLength)};const processEndOfBody=()=>{if(isCancelled(fetchParams)){return}if(fetchParams.processRequestEndOfBody){fetchParams.processRequestEndOfBody()}};const processBodyError=e=>{if(isCancelled(fetchParams)){return}if(e.name==="AbortError"){fetchParams.controller.abort()}else{fetchParams.controller.terminate(e)}};requestBody=(async function*(){try{for await(const bytes of request.body.stream){yield*processBodyChunk(bytes)}processEndOfBody()}catch(err){processBodyError(err)}})()}try{const{body,status,statusText,headersList,socket}=await dispatch({body:requestBody});if(socket){response=makeResponse({status,statusText,headersList,socket})}else{const iterator=body[Symbol.asyncIterator]();fetchParams.controller.next=()=>iterator.next();response=makeResponse({status,statusText,headersList})}}catch(err){if(err.name==="AbortError"){fetchParams.controller.connection.destroy();return makeAppropriateNetworkError(fetchParams,err)}return makeNetworkError(err)}const pullAlgorithm=async()=>{await fetchParams.controller.resume()};const cancelAlgorithm=reason=>{if(!isCancelled(fetchParams)){fetchParams.controller.abort(reason)}};const stream=new ReadableStream({async start(controller){fetchParams.controller.controller=controller},async pull(controller){await pullAlgorithm(controller)},async cancel(reason){await cancelAlgorithm(reason)},type:"bytes"});response.body={stream,source:null,length:null};fetchParams.controller.onAborted=onAborted;fetchParams.controller.on("terminated",onAborted);fetchParams.controller.resume=async()=>{while(true){let bytes;let isFailure;try{const{done,value}=await fetchParams.controller.next();if(isAborted(fetchParams)){break}bytes=done?void 0:value}catch(err){if(fetchParams.controller.ended&&!timingInfo.encodedBodySize){bytes=void 0}else{bytes=err;isFailure=true}}if(bytes===void 0){readableStreamClose(fetchParams.controller.controller);finalizeResponse(fetchParams,response);return}timingInfo.decodedBodySize+=bytes?.byteLength??0;if(isFailure){fetchParams.controller.terminate(bytes);return}const buffer=new Uint8Array(bytes);if(buffer.byteLength){fetchParams.controller.controller.enqueue(buffer)}if(isErrored(stream)){fetchParams.controller.terminate();return}if(fetchParams.controller.controller.desiredSize<=0){return}}};function onAborted(reason){if(isAborted(fetchParams)){response.aborted=true;if(isReadable(stream)){fetchParams.controller.controller.error(fetchParams.controller.serializedAbortReason)}}else{if(isReadable(stream)){fetchParams.controller.controller.error(new TypeError("terminated",{cause:isErrorLike(reason)?reason:void 0}))}}fetchParams.controller.connection.destroy()}return response;function dispatch({body}){const url=requestCurrentURL(request);const agent=fetchParams.controller.dispatcher;return new Promise((resolve3,reject)=>agent.dispatch({path:url.pathname+url.search,origin:url.origin,method:request.method,body:agent.isMockActive?request.body&&(request.body.source||request.body.stream):body,headers:request.headersList.entries,maxRedirections:0,upgrade:request.mode==="websocket"?"websocket":void 0},{body:null,abort:null,onConnect(abort){const{connection}=fetchParams.controller;timingInfo.finalConnectionTimingInfo=clampAndCoarsenConnectionTimingInfo(void 0,timingInfo.postRedirectStartTime,fetchParams.crossOriginIsolatedCapability);if(connection.destroyed){abort(new DOMException("The operation was aborted.","AbortError"))}else{fetchParams.controller.on("terminated",abort);this.abort=connection.abort=abort}timingInfo.finalNetworkRequestStartTime=coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability)},onResponseStarted(){timingInfo.finalNetworkResponseStartTime=coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability)},onHeaders(status,rawHeaders,resume,statusText){if(status<200){return}let location="";const headersList=new HeadersList;for(let i=0;imaxContentEncodings){reject(new Error(`too many content-encodings in response: ${codings.length}, maximum allowed is ${maxContentEncodings}`));return true}for(let i=codings.length-1;i>=0;--i){const coding=codings[i].trim();if(coding==="x-gzip"||coding==="gzip"){decoders.push(zlib.createGunzip({flush:zlib.constants.Z_SYNC_FLUSH,finishFlush:zlib.constants.Z_SYNC_FLUSH}))}else if(coding==="deflate"){decoders.push(createInflate({flush:zlib.constants.Z_SYNC_FLUSH,finishFlush:zlib.constants.Z_SYNC_FLUSH}))}else if(coding==="br"){decoders.push(zlib.createBrotliDecompress({flush:zlib.constants.BROTLI_OPERATION_FLUSH,finishFlush:zlib.constants.BROTLI_OPERATION_FLUSH}))}else{decoders.length=0;break}}}const onError=this.onError.bind(this);resolve3({status,statusText,headersList,body:decoders.length?pipeline(this.body,...decoders,err=>{if(err){this.onError(err)}}).on("error",onError):this.body.on("error",onError)});return true},onData(chunk){if(fetchParams.controller.dump){return}const bytes=chunk;timingInfo.encodedBodySize+=bytes.byteLength;return this.body.push(bytes)},onComplete(){if(this.abort){fetchParams.controller.off("terminated",this.abort)}if(fetchParams.controller.onAborted){fetchParams.controller.off("terminated",fetchParams.controller.onAborted)}fetchParams.controller.ended=true;this.body.push(null)},onError(error2){if(this.abort){fetchParams.controller.off("terminated",this.abort)}this.body?.destroy(error2);fetchParams.controller.terminate(error2);reject(error2)},onUpgrade(status,rawHeaders,socket){if(status!==101){return}const headersList=new HeadersList;for(let i=0;ifalse},{key:"loaded",converter:webidl.converters["unsigned long long"],defaultValue:()=>0},{key:"total",converter:webidl.converters["unsigned long long"],defaultValue:()=>0},{key:"bubbles",converter:webidl.converters.boolean,defaultValue:()=>false},{key:"cancelable",converter:webidl.converters.boolean,defaultValue:()=>false},{key:"composed",converter:webidl.converters.boolean,defaultValue:()=>false}]);module2.exports={ProgressEvent}}});var require_encoding=__commonJS({"../../node_modules/undici/lib/web/fileapi/encoding.js"(exports2,module2){"use strict";function getEncoding(label){if(!label){return"failure"}switch(label.trim().toLowerCase()){case"unicode-1-1-utf-8":case"unicode11utf8":case"unicode20utf8":case"utf-8":case"utf8":case"x-unicode20utf8":return"UTF-8";case"866":case"cp866":case"csibm866":case"ibm866":return"IBM866";case"csisolatin2":case"iso-8859-2":case"iso-ir-101":case"iso8859-2":case"iso88592":case"iso_8859-2":case"iso_8859-2:1987":case"l2":case"latin2":return"ISO-8859-2";case"csisolatin3":case"iso-8859-3":case"iso-ir-109":case"iso8859-3":case"iso88593":case"iso_8859-3":case"iso_8859-3:1988":case"l3":case"latin3":return"ISO-8859-3";case"csisolatin4":case"iso-8859-4":case"iso-ir-110":case"iso8859-4":case"iso88594":case"iso_8859-4":case"iso_8859-4:1988":case"l4":case"latin4":return"ISO-8859-4";case"csisolatincyrillic":case"cyrillic":case"iso-8859-5":case"iso-ir-144":case"iso8859-5":case"iso88595":case"iso_8859-5":case"iso_8859-5:1988":return"ISO-8859-5";case"arabic":case"asmo-708":case"csiso88596e":case"csiso88596i":case"csisolatinarabic":case"ecma-114":case"iso-8859-6":case"iso-8859-6-e":case"iso-8859-6-i":case"iso-ir-127":case"iso8859-6":case"iso88596":case"iso_8859-6":case"iso_8859-6:1987":return"ISO-8859-6";case"csisolatingreek":case"ecma-118":case"elot_928":case"greek":case"greek8":case"iso-8859-7":case"iso-ir-126":case"iso8859-7":case"iso88597":case"iso_8859-7":case"iso_8859-7:1987":case"sun_eu_greek":return"ISO-8859-7";case"csiso88598e":case"csisolatinhebrew":case"hebrew":case"iso-8859-8":case"iso-8859-8-e":case"iso-ir-138":case"iso8859-8":case"iso88598":case"iso_8859-8":case"iso_8859-8:1988":case"visual":return"ISO-8859-8";case"csiso88598i":case"iso-8859-8-i":case"logical":return"ISO-8859-8-I";case"csisolatin6":case"iso-8859-10":case"iso-ir-157":case"iso8859-10":case"iso885910":case"l6":case"latin6":return"ISO-8859-10";case"iso-8859-13":case"iso8859-13":case"iso885913":return"ISO-8859-13";case"iso-8859-14":case"iso8859-14":case"iso885914":return"ISO-8859-14";case"csisolatin9":case"iso-8859-15":case"iso8859-15":case"iso885915":case"iso_8859-15":case"l9":return"ISO-8859-15";case"iso-8859-16":return"ISO-8859-16";case"cskoi8r":case"koi":case"koi8":case"koi8-r":case"koi8_r":return"KOI8-R";case"koi8-ru":case"koi8-u":return"KOI8-U";case"csmacintosh":case"mac":case"macintosh":case"x-mac-roman":return"macintosh";case"iso-8859-11":case"iso8859-11":case"iso885911":case"tis-620":case"windows-874":return"windows-874";case"cp1250":case"windows-1250":case"x-cp1250":return"windows-1250";case"cp1251":case"windows-1251":case"x-cp1251":return"windows-1251";case"ansi_x3.4-1968":case"ascii":case"cp1252":case"cp819":case"csisolatin1":case"ibm819":case"iso-8859-1":case"iso-ir-100":case"iso8859-1":case"iso88591":case"iso_8859-1":case"iso_8859-1:1987":case"l1":case"latin1":case"us-ascii":case"windows-1252":case"x-cp1252":return"windows-1252";case"cp1253":case"windows-1253":case"x-cp1253":return"windows-1253";case"cp1254":case"csisolatin5":case"iso-8859-9":case"iso-ir-148":case"iso8859-9":case"iso88599":case"iso_8859-9":case"iso_8859-9:1989":case"l5":case"latin5":case"windows-1254":case"x-cp1254":return"windows-1254";case"cp1255":case"windows-1255":case"x-cp1255":return"windows-1255";case"cp1256":case"windows-1256":case"x-cp1256":return"windows-1256";case"cp1257":case"windows-1257":case"x-cp1257":return"windows-1257";case"cp1258":case"windows-1258":case"x-cp1258":return"windows-1258";case"x-mac-cyrillic":case"x-mac-ukrainian":return"x-mac-cyrillic";case"chinese":case"csgb2312":case"csiso58gb231280":case"gb2312":case"gb_2312":case"gb_2312-80":case"gbk":case"iso-ir-58":case"x-gbk":return"GBK";case"gb18030":return"gb18030";case"big5":case"big5-hkscs":case"cn-big5":case"csbig5":case"x-x-big5":return"Big5";case"cseucpkdfmtjapanese":case"euc-jp":case"x-euc-jp":return"EUC-JP";case"csiso2022jp":case"iso-2022-jp":return"ISO-2022-JP";case"csshiftjis":case"ms932":case"ms_kanji":case"shift-jis":case"shift_jis":case"sjis":case"windows-31j":case"x-sjis":return"Shift_JIS";case"cseuckr":case"csksc56011987":case"euc-kr":case"iso-ir-149":case"korean":case"ks_c_5601-1987":case"ks_c_5601-1989":case"ksc5601":case"ksc_5601":case"windows-949":return"EUC-KR";case"csiso2022kr":case"hz-gb-2312":case"iso-2022-cn":case"iso-2022-cn-ext":case"iso-2022-kr":case"replacement":return"replacement";case"unicodefffe":case"utf-16be":return"UTF-16BE";case"csunicode":case"iso-10646-ucs-2":case"ucs-2":case"unicode":case"unicodefeff":case"utf-16":case"utf-16le":return"UTF-16LE";case"x-user-defined":return"x-user-defined";default:return"failure"}}module2.exports={getEncoding}}});var require_util4=__commonJS({"../../node_modules/undici/lib/web/fileapi/util.js"(exports2,module2){"use strict";var{kState,kError,kResult,kAborted,kLastProgressEventFired}=require_symbols3();var{ProgressEvent}=require_progressevent();var{getEncoding}=require_encoding();var{serializeAMimeType,parseMIMEType}=require_data_url();var{types}=require("node:util");var{StringDecoder}=require("string_decoder");var{btoa}=require("node:buffer");var staticPropertyDescriptors={enumerable:true,writable:false,configurable:false};function readOperation(fr,blob,type,encodingName){if(fr[kState]==="loading"){throw new DOMException("Invalid state","InvalidStateError")}fr[kState]="loading";fr[kResult]=null;fr[kError]=null;const stream=blob.stream();const reader=stream.getReader();const bytes=[];let chunkPromise=reader.read();let isFirstChunk=true;(async()=>{while(!fr[kAborted]){try{const{done,value}=await chunkPromise;if(isFirstChunk&&!fr[kAborted]){queueMicrotask(()=>{fireAProgressEvent("loadstart",fr)})}isFirstChunk=false;if(!done&&types.isUint8Array(value)){bytes.push(value);if((fr[kLastProgressEventFired]===void 0||Date.now()-fr[kLastProgressEventFired]>=50)&&!fr[kAborted]){fr[kLastProgressEventFired]=Date.now();queueMicrotask(()=>{fireAProgressEvent("progress",fr)})}chunkPromise=reader.read()}else if(done){queueMicrotask(()=>{fr[kState]="done";try{const result=packageData(bytes,type,blob.type,encodingName);if(fr[kAborted]){return}fr[kResult]=result;fireAProgressEvent("load",fr)}catch(error2){fr[kError]=error2;fireAProgressEvent("error",fr)}if(fr[kState]!=="loading"){fireAProgressEvent("loadend",fr)}});break}}catch(error2){if(fr[kAborted]){return}queueMicrotask(()=>{fr[kState]="done";fr[kError]=error2;fireAProgressEvent("error",fr);if(fr[kState]!=="loading"){fireAProgressEvent("loadend",fr)}});break}}})()}function fireAProgressEvent(e,reader){const event=new ProgressEvent(e,{bubbles:false,cancelable:false});reader.dispatchEvent(event)}function packageData(bytes,type,mimeType,encodingName){switch(type){case"DataURL":{let dataURL="data:";const parsed=parseMIMEType(mimeType||"application/octet-stream");if(parsed!=="failure"){dataURL+=serializeAMimeType(parsed)}dataURL+=";base64,";const decoder=new StringDecoder("latin1");for(const chunk of bytes){dataURL+=btoa(decoder.write(chunk))}dataURL+=btoa(decoder.end());return dataURL}case"Text":{let encoding="failure";if(encodingName){encoding=getEncoding(encodingName)}if(encoding==="failure"&&mimeType){const type2=parseMIMEType(mimeType);if(type2!=="failure"){encoding=getEncoding(type2.parameters.get("charset"))}}if(encoding==="failure"){encoding="UTF-8"}return decode(bytes,encoding)}case"ArrayBuffer":{const sequence=combineByteSequences(bytes);return sequence.buffer}case"BinaryString":{let binaryString="";const decoder=new StringDecoder("latin1");for(const chunk of bytes){binaryString+=decoder.write(chunk)}binaryString+=decoder.end();return binaryString}}}function decode(ioQueue,encoding){const bytes=combineByteSequences(ioQueue);const BOMEncoding=BOMSniffing(bytes);let slice=0;if(BOMEncoding!==null){encoding=BOMEncoding;slice=BOMEncoding==="UTF-8"?3:2}const sliced=bytes.slice(slice);return new TextDecoder(encoding).decode(sliced)}function BOMSniffing(ioQueue){const[a,b,c]=ioQueue;if(a===239&&b===187&&c===191){return"UTF-8"}else if(a===254&&b===255){return"UTF-16BE"}else if(a===255&&b===254){return"UTF-16LE"}return null}function combineByteSequences(sequences){const size=sequences.reduce((a,b)=>{return a+b.byteLength},0);let offset=0;return sequences.reduce((a,b)=>{a.set(b,offset);offset+=b.byteLength;return a},new Uint8Array(size))}module2.exports={staticPropertyDescriptors,readOperation,fireAProgressEvent}}});var require_filereader=__commonJS({"../../node_modules/undici/lib/web/fileapi/filereader.js"(exports2,module2){"use strict";var{staticPropertyDescriptors,readOperation,fireAProgressEvent}=require_util4();var{kState,kError,kResult,kEvents,kAborted}=require_symbols3();var{webidl}=require_webidl();var{kEnumerableProperty}=require_util();var FileReader=class _FileReader extends EventTarget{constructor(){super();this[kState]="empty";this[kResult]=null;this[kError]=null;this[kEvents]={loadend:null,error:null,abort:null,load:null,progress:null,loadstart:null}}readAsArrayBuffer(blob){webidl.brandCheck(this,_FileReader);webidl.argumentLengthCheck(arguments,1,"FileReader.readAsArrayBuffer");blob=webidl.converters.Blob(blob,{strict:false});readOperation(this,blob,"ArrayBuffer")}readAsBinaryString(blob){webidl.brandCheck(this,_FileReader);webidl.argumentLengthCheck(arguments,1,"FileReader.readAsBinaryString");blob=webidl.converters.Blob(blob,{strict:false});readOperation(this,blob,"BinaryString")}readAsText(blob,encoding=void 0){webidl.brandCheck(this,_FileReader);webidl.argumentLengthCheck(arguments,1,"FileReader.readAsText");blob=webidl.converters.Blob(blob,{strict:false});if(encoding!==void 0){encoding=webidl.converters.DOMString(encoding,"FileReader.readAsText","encoding")}readOperation(this,blob,"Text",encoding)}readAsDataURL(blob){webidl.brandCheck(this,_FileReader);webidl.argumentLengthCheck(arguments,1,"FileReader.readAsDataURL");blob=webidl.converters.Blob(blob,{strict:false});readOperation(this,blob,"DataURL")}abort(){if(this[kState]==="empty"||this[kState]==="done"){this[kResult]=null;return}if(this[kState]==="loading"){this[kState]="done";this[kResult]=null}this[kAborted]=true;fireAProgressEvent("abort",this);if(this[kState]!=="loading"){fireAProgressEvent("loadend",this)}}get readyState(){webidl.brandCheck(this,_FileReader);switch(this[kState]){case"empty":return this.EMPTY;case"loading":return this.LOADING;case"done":return this.DONE}}get result(){webidl.brandCheck(this,_FileReader);return this[kResult]}get error(){webidl.brandCheck(this,_FileReader);return this[kError]}get onloadend(){webidl.brandCheck(this,_FileReader);return this[kEvents].loadend}set onloadend(fn){webidl.brandCheck(this,_FileReader);if(this[kEvents].loadend){this.removeEventListener("loadend",this[kEvents].loadend)}if(typeof fn==="function"){this[kEvents].loadend=fn;this.addEventListener("loadend",fn)}else{this[kEvents].loadend=null}}get onerror(){webidl.brandCheck(this,_FileReader);return this[kEvents].error}set onerror(fn){webidl.brandCheck(this,_FileReader);if(this[kEvents].error){this.removeEventListener("error",this[kEvents].error)}if(typeof fn==="function"){this[kEvents].error=fn;this.addEventListener("error",fn)}else{this[kEvents].error=null}}get onloadstart(){webidl.brandCheck(this,_FileReader);return this[kEvents].loadstart}set onloadstart(fn){webidl.brandCheck(this,_FileReader);if(this[kEvents].loadstart){this.removeEventListener("loadstart",this[kEvents].loadstart)}if(typeof fn==="function"){this[kEvents].loadstart=fn;this.addEventListener("loadstart",fn)}else{this[kEvents].loadstart=null}}get onprogress(){webidl.brandCheck(this,_FileReader);return this[kEvents].progress}set onprogress(fn){webidl.brandCheck(this,_FileReader);if(this[kEvents].progress){this.removeEventListener("progress",this[kEvents].progress)}if(typeof fn==="function"){this[kEvents].progress=fn;this.addEventListener("progress",fn)}else{this[kEvents].progress=null}}get onload(){webidl.brandCheck(this,_FileReader);return this[kEvents].load}set onload(fn){webidl.brandCheck(this,_FileReader);if(this[kEvents].load){this.removeEventListener("load",this[kEvents].load)}if(typeof fn==="function"){this[kEvents].load=fn;this.addEventListener("load",fn)}else{this[kEvents].load=null}}get onabort(){webidl.brandCheck(this,_FileReader);return this[kEvents].abort}set onabort(fn){webidl.brandCheck(this,_FileReader);if(this[kEvents].abort){this.removeEventListener("abort",this[kEvents].abort)}if(typeof fn==="function"){this[kEvents].abort=fn;this.addEventListener("abort",fn)}else{this[kEvents].abort=null}}};FileReader.EMPTY=FileReader.prototype.EMPTY=0;FileReader.LOADING=FileReader.prototype.LOADING=1;FileReader.DONE=FileReader.prototype.DONE=2;Object.defineProperties(FileReader.prototype,{EMPTY:staticPropertyDescriptors,LOADING:staticPropertyDescriptors,DONE:staticPropertyDescriptors,readAsArrayBuffer:kEnumerableProperty,readAsBinaryString:kEnumerableProperty,readAsText:kEnumerableProperty,readAsDataURL:kEnumerableProperty,abort:kEnumerableProperty,readyState:kEnumerableProperty,result:kEnumerableProperty,error:kEnumerableProperty,onloadstart:kEnumerableProperty,onprogress:kEnumerableProperty,onload:kEnumerableProperty,onabort:kEnumerableProperty,onerror:kEnumerableProperty,onloadend:kEnumerableProperty,[Symbol.toStringTag]:{value:"FileReader",writable:false,enumerable:false,configurable:true}});Object.defineProperties(FileReader,{EMPTY:staticPropertyDescriptors,LOADING:staticPropertyDescriptors,DONE:staticPropertyDescriptors});module2.exports={FileReader}}});var require_symbols4=__commonJS({"../../node_modules/undici/lib/web/cache/symbols.js"(exports2,module2){"use strict";module2.exports={kConstruct:require_symbols().kConstruct}}});var require_util5=__commonJS({"../../node_modules/undici/lib/web/cache/util.js"(exports2,module2){"use strict";var assert=require("node:assert");var{URLSerializer}=require_data_url();var{isValidHeaderName}=require_util2();function urlEquals(A,B,excludeFragment=false){const serializedA=URLSerializer(A,excludeFragment);const serializedB=URLSerializer(B,excludeFragment);return serializedA===serializedB}function getFieldValues(header){assert(header!==null);const values=[];for(let value of header.split(",")){value=value.trim();if(isValidHeaderName(value)){values.push(value)}}return values}module2.exports={urlEquals,getFieldValues}}});var require_cache=__commonJS({"../../node_modules/undici/lib/web/cache/cache.js"(exports2,module2){"use strict";var{kConstruct}=require_symbols4();var{urlEquals,getFieldValues}=require_util5();var{kEnumerableProperty,isDisturbed}=require_util();var{webidl}=require_webidl();var{Response,cloneResponse,fromInnerResponse}=require_response();var{Request,fromInnerRequest}=require_request2();var{kState}=require_symbols2();var{fetching}=require_fetch();var{urlIsHttpHttpsScheme,createDeferredPromise,readAllBytes}=require_util2();var assert=require("node:assert");var Cache=class _Cache{#relevantRequestResponseList;constructor(){if(arguments[0]!==kConstruct){webidl.illegalConstructor()}webidl.util.markAsUncloneable(this);this.#relevantRequestResponseList=arguments[1]}async match(request,options={}){webidl.brandCheck(this,_Cache);const prefix="Cache.match";webidl.argumentLengthCheck(arguments,1,prefix);request=webidl.converters.RequestInfo(request,prefix,"request");options=webidl.converters.CacheQueryOptions(options,prefix,"options");const p=this.#internalMatchAll(request,options,1);if(p.length===0){return}return p[0]}async matchAll(request=void 0,options={}){webidl.brandCheck(this,_Cache);const prefix="Cache.matchAll";if(request!==void 0)request=webidl.converters.RequestInfo(request,prefix,"request");options=webidl.converters.CacheQueryOptions(options,prefix,"options");return this.#internalMatchAll(request,options)}async add(request){webidl.brandCheck(this,_Cache);const prefix="Cache.add";webidl.argumentLengthCheck(arguments,1,prefix);request=webidl.converters.RequestInfo(request,prefix,"request");const requests=[request];const responseArrayPromise=this.addAll(requests);return await responseArrayPromise}async addAll(requests){webidl.brandCheck(this,_Cache);const prefix="Cache.addAll";webidl.argumentLengthCheck(arguments,1,prefix);const responsePromises=[];const requestList=[];for(let request of requests){if(request===void 0){throw webidl.errors.conversionFailed({prefix,argument:"Argument 1",types:["undefined is not allowed"]})}request=webidl.converters.RequestInfo(request);if(typeof request==="string"){continue}const r=request[kState];if(!urlIsHttpHttpsScheme(r.url)||r.method!=="GET"){throw webidl.errors.exception({header:prefix,message:"Expected http/s scheme when method is not GET."})}}const fetchControllers=[];for(const request of requests){const r=new Request(request)[kState];if(!urlIsHttpHttpsScheme(r.url)){throw webidl.errors.exception({header:prefix,message:"Expected http/s scheme."})}r.initiator="fetch";r.destination="subresource";requestList.push(r);const responsePromise=createDeferredPromise();fetchControllers.push(fetching({request:r,processResponse(response){if(response.type==="error"||response.status===206||response.status<200||response.status>299){responsePromise.reject(webidl.errors.exception({header:"Cache.addAll",message:"Received an invalid status code or the request failed."}))}else if(response.headersList.contains("vary")){const fieldValues=getFieldValues(response.headersList.get("vary"));for(const fieldValue of fieldValues){if(fieldValue==="*"){responsePromise.reject(webidl.errors.exception({header:"Cache.addAll",message:"invalid vary field value"}));for(const controller of fetchControllers){controller.abort()}return}}}},processResponseEndOfBody(response){if(response.aborted){responsePromise.reject(new DOMException("aborted","AbortError"));return}responsePromise.resolve(response)}}));responsePromises.push(responsePromise.promise)}const p=Promise.all(responsePromises);const responses=await p;const operations=[];let index=0;for(const response of responses){const operation={type:"put",request:requestList[index],response};operations.push(operation);index++}const cacheJobPromise=createDeferredPromise();let errorData=null;try{this.#batchCacheOperations(operations)}catch(e){errorData=e}queueMicrotask(()=>{if(errorData===null){cacheJobPromise.resolve(void 0)}else{cacheJobPromise.reject(errorData)}});return cacheJobPromise.promise}async put(request,response){webidl.brandCheck(this,_Cache);const prefix="Cache.put";webidl.argumentLengthCheck(arguments,2,prefix);request=webidl.converters.RequestInfo(request,prefix,"request");response=webidl.converters.Response(response,prefix,"response");let innerRequest=null;if(request instanceof Request){innerRequest=request[kState]}else{innerRequest=new Request(request)[kState]}if(!urlIsHttpHttpsScheme(innerRequest.url)||innerRequest.method!=="GET"){throw webidl.errors.exception({header:prefix,message:"Expected an http/s scheme when method is not GET"})}const innerResponse=response[kState];if(innerResponse.status===206){throw webidl.errors.exception({header:prefix,message:"Got 206 status"})}if(innerResponse.headersList.contains("vary")){const fieldValues=getFieldValues(innerResponse.headersList.get("vary"));for(const fieldValue of fieldValues){if(fieldValue==="*"){throw webidl.errors.exception({header:prefix,message:"Got * vary field value"})}}}if(innerResponse.body&&(isDisturbed(innerResponse.body.stream)||innerResponse.body.stream.locked)){throw webidl.errors.exception({header:prefix,message:"Response body is locked or disturbed"})}const clonedResponse=cloneResponse(innerResponse);const bodyReadPromise=createDeferredPromise();if(innerResponse.body!=null){const stream=innerResponse.body.stream;const reader=stream.getReader();readAllBytes(reader).then(bodyReadPromise.resolve,bodyReadPromise.reject)}else{bodyReadPromise.resolve(void 0)}const operations=[];const operation={type:"put",request:innerRequest,response:clonedResponse};operations.push(operation);const bytes=await bodyReadPromise.promise;if(clonedResponse.body!=null){clonedResponse.body.source=bytes}const cacheJobPromise=createDeferredPromise();let errorData=null;try{this.#batchCacheOperations(operations)}catch(e){errorData=e}queueMicrotask(()=>{if(errorData===null){cacheJobPromise.resolve()}else{cacheJobPromise.reject(errorData)}});return cacheJobPromise.promise}async delete(request,options={}){webidl.brandCheck(this,_Cache);const prefix="Cache.delete";webidl.argumentLengthCheck(arguments,1,prefix);request=webidl.converters.RequestInfo(request,prefix,"request");options=webidl.converters.CacheQueryOptions(options,prefix,"options");let r=null;if(request instanceof Request){r=request[kState];if(r.method!=="GET"&&!options.ignoreMethod){return false}}else{assert(typeof request==="string");r=new Request(request)[kState]}const operations=[];const operation={type:"delete",request:r,options};operations.push(operation);const cacheJobPromise=createDeferredPromise();let errorData=null;let requestResponses;try{requestResponses=this.#batchCacheOperations(operations)}catch(e){errorData=e}queueMicrotask(()=>{if(errorData===null){cacheJobPromise.resolve(!!requestResponses?.length)}else{cacheJobPromise.reject(errorData)}});return cacheJobPromise.promise}async keys(request=void 0,options={}){webidl.brandCheck(this,_Cache);const prefix="Cache.keys";if(request!==void 0)request=webidl.converters.RequestInfo(request,prefix,"request");options=webidl.converters.CacheQueryOptions(options,prefix,"options");let r=null;if(request!==void 0){if(request instanceof Request){r=request[kState];if(r.method!=="GET"&&!options.ignoreMethod){return[]}}else if(typeof request==="string"){r=new Request(request)[kState]}}const promise=createDeferredPromise();const requests=[];if(request===void 0){for(const requestResponse of this.#relevantRequestResponseList){requests.push(requestResponse[0])}}else{const requestResponses=this.#queryCache(r,options);for(const requestResponse of requestResponses){requests.push(requestResponse[0])}}queueMicrotask(()=>{const requestList=[];for(const request2 of requests){const requestObject=fromInnerRequest(request2,new AbortController().signal,"immutable");requestList.push(requestObject)}promise.resolve(Object.freeze(requestList))});return promise.promise}#batchCacheOperations(operations){const cache=this.#relevantRequestResponseList;const backupCache=[...cache];const addedItems=[];const resultList=[];try{for(const operation of operations){if(operation.type!=="delete"&&operation.type!=="put"){throw webidl.errors.exception({header:"Cache.#batchCacheOperations",message:'operation type does not match "delete" or "put"'})}if(operation.type==="delete"&&operation.response!=null){throw webidl.errors.exception({header:"Cache.#batchCacheOperations",message:"delete operation should not have an associated response"})}if(this.#queryCache(operation.request,operation.options,addedItems).length){throw new DOMException("???","InvalidStateError")}let requestResponses;if(operation.type==="delete"){requestResponses=this.#queryCache(operation.request,operation.options);if(requestResponses.length===0){return[]}for(const requestResponse of requestResponses){const idx=cache.indexOf(requestResponse);assert(idx!==-1);cache.splice(idx,1)}}else if(operation.type==="put"){if(operation.response==null){throw webidl.errors.exception({header:"Cache.#batchCacheOperations",message:"put operation should have an associated response"})}const r=operation.request;if(!urlIsHttpHttpsScheme(r.url)){throw webidl.errors.exception({header:"Cache.#batchCacheOperations",message:"expected http or https scheme"})}if(r.method!=="GET"){throw webidl.errors.exception({header:"Cache.#batchCacheOperations",message:"not get method"})}if(operation.options!=null){throw webidl.errors.exception({header:"Cache.#batchCacheOperations",message:"options must not be defined"})}requestResponses=this.#queryCache(operation.request);for(const requestResponse of requestResponses){const idx=cache.indexOf(requestResponse);assert(idx!==-1);cache.splice(idx,1)}cache.push([operation.request,operation.response]);addedItems.push([operation.request,operation.response])}resultList.push([operation.request,operation.response])}return resultList}catch(e){this.#relevantRequestResponseList.length=0;this.#relevantRequestResponseList=backupCache;throw e}}#queryCache(requestQuery,options,targetStorage){const resultList=[];const storage=targetStorage??this.#relevantRequestResponseList;for(const requestResponse of storage){const[cachedRequest,cachedResponse]=requestResponse;if(this.#requestMatchesCachedItem(requestQuery,cachedRequest,cachedResponse,options)){resultList.push(requestResponse)}}return resultList}#requestMatchesCachedItem(requestQuery,request,response=null,options){const queryURL=new URL(requestQuery.url);const cachedURL=new URL(request.url);if(options?.ignoreSearch){cachedURL.search="";queryURL.search=""}if(!urlEquals(queryURL,cachedURL,true)){return false}if(response==null||options?.ignoreVary||!response.headersList.contains("vary")){return true}const fieldValues=getFieldValues(response.headersList.get("vary"));for(const fieldValue of fieldValues){if(fieldValue==="*"){return false}const requestValue=request.headersList.get(fieldValue);const queryValue=requestQuery.headersList.get(fieldValue);if(requestValue!==queryValue){return false}}return true}#internalMatchAll(request,options,maxResponses=Infinity){let r=null;if(request!==void 0){if(request instanceof Request){r=request[kState];if(r.method!=="GET"&&!options.ignoreMethod){return[]}}else if(typeof request==="string"){r=new Request(request)[kState]}}const responses=[];if(request===void 0){for(const requestResponse of this.#relevantRequestResponseList){responses.push(requestResponse[1])}}else{const requestResponses=this.#queryCache(r,options);for(const requestResponse of requestResponses){responses.push(requestResponse[1])}}const responseList=[];for(const response of responses){const responseObject=fromInnerResponse(response,"immutable");responseList.push(responseObject.clone());if(responseList.length>=maxResponses){break}}return Object.freeze(responseList)}};Object.defineProperties(Cache.prototype,{[Symbol.toStringTag]:{value:"Cache",configurable:true},match:kEnumerableProperty,matchAll:kEnumerableProperty,add:kEnumerableProperty,addAll:kEnumerableProperty,put:kEnumerableProperty,delete:kEnumerableProperty,keys:kEnumerableProperty});var cacheQueryOptionConverters=[{key:"ignoreSearch",converter:webidl.converters.boolean,defaultValue:()=>false},{key:"ignoreMethod",converter:webidl.converters.boolean,defaultValue:()=>false},{key:"ignoreVary",converter:webidl.converters.boolean,defaultValue:()=>false}];webidl.converters.CacheQueryOptions=webidl.dictionaryConverter(cacheQueryOptionConverters);webidl.converters.MultiCacheQueryOptions=webidl.dictionaryConverter([...cacheQueryOptionConverters,{key:"cacheName",converter:webidl.converters.DOMString}]);webidl.converters.Response=webidl.interfaceConverter(Response);webidl.converters["sequence"]=webidl.sequenceConverter(webidl.converters.RequestInfo);module2.exports={Cache}}});var require_cachestorage=__commonJS({"../../node_modules/undici/lib/web/cache/cachestorage.js"(exports2,module2){"use strict";var{kConstruct}=require_symbols4();var{Cache}=require_cache();var{webidl}=require_webidl();var{kEnumerableProperty}=require_util();var CacheStorage=class _CacheStorage{#caches=new Map;constructor(){if(arguments[0]!==kConstruct){webidl.illegalConstructor()}webidl.util.markAsUncloneable(this)}async match(request,options={}){webidl.brandCheck(this,_CacheStorage);webidl.argumentLengthCheck(arguments,1,"CacheStorage.match");request=webidl.converters.RequestInfo(request);options=webidl.converters.MultiCacheQueryOptions(options);if(options.cacheName!=null){if(this.#caches.has(options.cacheName)){const cacheList=this.#caches.get(options.cacheName);const cache=new Cache(kConstruct,cacheList);return await cache.match(request,options)}}else{for(const cacheList of this.#caches.values()){const cache=new Cache(kConstruct,cacheList);const response=await cache.match(request,options);if(response!==void 0){return response}}}}async has(cacheName){webidl.brandCheck(this,_CacheStorage);const prefix="CacheStorage.has";webidl.argumentLengthCheck(arguments,1,prefix);cacheName=webidl.converters.DOMString(cacheName,prefix,"cacheName");return this.#caches.has(cacheName)}async open(cacheName){webidl.brandCheck(this,_CacheStorage);const prefix="CacheStorage.open";webidl.argumentLengthCheck(arguments,1,prefix);cacheName=webidl.converters.DOMString(cacheName,prefix,"cacheName");if(this.#caches.has(cacheName)){const cache2=this.#caches.get(cacheName);return new Cache(kConstruct,cache2)}const cache=[];this.#caches.set(cacheName,cache);return new Cache(kConstruct,cache)}async delete(cacheName){webidl.brandCheck(this,_CacheStorage);const prefix="CacheStorage.delete";webidl.argumentLengthCheck(arguments,1,prefix);cacheName=webidl.converters.DOMString(cacheName,prefix,"cacheName");return this.#caches.delete(cacheName)}async keys(){webidl.brandCheck(this,_CacheStorage);const keys=this.#caches.keys();return[...keys]}};Object.defineProperties(CacheStorage.prototype,{[Symbol.toStringTag]:{value:"CacheStorage",configurable:true},match:kEnumerableProperty,has:kEnumerableProperty,open:kEnumerableProperty,delete:kEnumerableProperty,keys:kEnumerableProperty});module2.exports={CacheStorage}}});var require_constants4=__commonJS({"../../node_modules/undici/lib/web/cookies/constants.js"(exports2,module2){"use strict";var maxAttributeValueSize=1024;var maxNameValuePairSize=4096;module2.exports={maxAttributeValueSize,maxNameValuePairSize}}});var require_util6=__commonJS({"../../node_modules/undici/lib/web/cookies/util.js"(exports2,module2){"use strict";function isCTLExcludingHtab(value){for(let i=0;i=0&&code<=8||code>=10&&code<=31||code===127){return true}}return false}function validateCookieName(name){for(let i=0;i126||code===34||code===40||code===41||code===60||code===62||code===64||code===44||code===59||code===58||code===92||code===47||code===91||code===93||code===63||code===61||code===123||code===125){throw new Error("Invalid cookie name")}}}function validateCookieValue(value){let len=value.length;let i=0;if(value[0]==='"'){if(len===1||value[len-1]!=='"'){throw new Error("Invalid cookie value")}--len;++i}while(i126||code===34||code===44||code===59||code===92){throw new Error("Invalid cookie value")}}}function validateCookiePath(path){for(let i=0;i126||code===59){throw new Error("Invalid cookie path")}}}function isLetterOrDigit(code){return code>=48&&code<=57||code>=65&&code<=90||code>=97&&code<=122}function validateCookieDomain(domain){if(domain===" "){return}if(domain.length>255){throw new Error("Invalid cookie domain")}let labelLength=0;for(let i=0;i63){throw new Error("Invalid cookie domain")}}if(labelLength===0||domain.charCodeAt(domain.length-1)===45){throw new Error("Invalid cookie domain")}}var IMFDays=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];var IMFMonths=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];var IMFPaddedNumbers=Array(61).fill(0).map((_,i)=>i.toString().padStart(2,"0"));function toIMFDate(date){if(typeof date==="number"){date=new Date(date)}return`${IMFDays[date.getUTCDay()]}, ${IMFPaddedNumbers[date.getUTCDate()]} ${IMFMonths[date.getUTCMonth()]} ${date.getUTCFullYear()} ${IMFPaddedNumbers[date.getUTCHours()]}:${IMFPaddedNumbers[date.getUTCMinutes()]}:${IMFPaddedNumbers[date.getUTCSeconds()]} GMT`}function validateCookieMaxAge(maxAge){if(maxAge<0){throw new Error("Invalid cookie max-age")}}function stringify(cookie){if(cookie.name.length===0){return null}validateCookieName(cookie.name);validateCookieValue(cookie.value);const out=[`${cookie.name}=${cookie.value}`];if(cookie.name.startsWith("__Secure-")){cookie.secure=true}if(cookie.name.startsWith("__Host-")){cookie.secure=true;cookie.domain=null;cookie.path="/"}if(cookie.secure){out.push("Secure")}if(cookie.httpOnly){out.push("HttpOnly")}if(typeof cookie.maxAge==="number"){validateCookieMaxAge(cookie.maxAge);out.push(`Max-Age=${cookie.maxAge}`)}if(cookie.domain){validateCookieDomain(cookie.domain);out.push(`Domain=${cookie.domain}`)}if(cookie.path){validateCookiePath(cookie.path);out.push(`Path=${cookie.path}`)}if(cookie.expires&&cookie.expires.toString()!=="Invalid Date"){out.push(`Expires=${toIMFDate(cookie.expires)}`)}if(cookie.sameSite){out.push(`SameSite=${cookie.sameSite}`)}for(const part of cookie.unparsed){if(!part.includes("=")){throw new Error("Invalid unparsed")}const[key,...value]=part.split("=");const trimmedKey=key.trim();const joinedValue=value.join("=");validateCookieName(trimmedKey);validateCookieValue(joinedValue);out.push(`${trimmedKey}=${joinedValue}`)}return out.join("; ")}module2.exports={isCTLExcludingHtab,validateCookieName,validateCookiePath,validateCookieValue,toIMFDate,stringify}}});var require_parse=__commonJS({"../../node_modules/undici/lib/web/cookies/parse.js"(exports2,module2){"use strict";var{maxNameValuePairSize,maxAttributeValueSize}=require_constants4();var{isCTLExcludingHtab}=require_util6();var{collectASequenceOfCodePointsFast}=require_data_url();var assert=require("node:assert");function parseSetCookie(header){if(isCTLExcludingHtab(header)){return null}let nameValuePair="";let unparsedAttributes="";let name="";let value="";if(header.includes(";")){const position={position:0};nameValuePair=collectASequenceOfCodePointsFast(";",header,position);unparsedAttributes=header.slice(position.position)}else{nameValuePair=header}if(!nameValuePair.includes("=")){value=nameValuePair}else{const position={position:0};name=collectASequenceOfCodePointsFast("=",nameValuePair,position);value=nameValuePair.slice(position.position+1)}name=name.trim();value=value.trim();if(name.length+value.length>maxNameValuePairSize){return null}return{name,value,...parseUnparsedAttributes(unparsedAttributes)}}function parseUnparsedAttributes(unparsedAttributes,cookieAttributeList={}){if(unparsedAttributes.length===0){return cookieAttributeList}assert(unparsedAttributes[0]===";");unparsedAttributes=unparsedAttributes.slice(1);let cookieAv="";if(unparsedAttributes.includes(";")){cookieAv=collectASequenceOfCodePointsFast(";",unparsedAttributes,{position:0});unparsedAttributes=unparsedAttributes.slice(cookieAv.length)}else{cookieAv=unparsedAttributes;unparsedAttributes=""}let attributeName="";let attributeValue="";if(cookieAv.includes("=")){const position={position:0};attributeName=collectASequenceOfCodePointsFast("=",cookieAv,position);attributeValue=cookieAv.slice(position.position+1)}else{attributeName=cookieAv}attributeName=attributeName.trim();attributeValue=attributeValue.trim();if(attributeValue.length>maxAttributeValueSize){return parseUnparsedAttributes(unparsedAttributes,cookieAttributeList)}const attributeNameLowercase=attributeName.toLowerCase();if(attributeNameLowercase==="expires"){const expiryTime=new Date(attributeValue);cookieAttributeList.expires=expiryTime}else if(attributeNameLowercase==="max-age"){const charCode=attributeValue.charCodeAt(0);if((charCode<48||charCode>57)&&attributeValue[0]!=="-"){return parseUnparsedAttributes(unparsedAttributes,cookieAttributeList)}if(!/^\d+$/.test(attributeValue)){return parseUnparsedAttributes(unparsedAttributes,cookieAttributeList)}const deltaSeconds=Number(attributeValue);cookieAttributeList.maxAge=deltaSeconds}else if(attributeNameLowercase==="domain"){let cookieDomain=attributeValue;if(cookieDomain[0]==="."){cookieDomain=cookieDomain.slice(1)}cookieDomain=cookieDomain.toLowerCase();cookieAttributeList.domain=cookieDomain}else if(attributeNameLowercase==="path"){let cookiePath="";if(attributeValue.length===0||attributeValue[0]!=="/"){cookiePath="/"}else{cookiePath=attributeValue}cookieAttributeList.path=cookiePath}else if(attributeNameLowercase==="secure"){cookieAttributeList.secure=true}else if(attributeNameLowercase==="httponly"){cookieAttributeList.httpOnly=true}else if(attributeNameLowercase==="samesite"){const attributeValueLowercase=attributeValue.toLowerCase();if(attributeValueLowercase==="none"){cookieAttributeList.sameSite="None"}else if(attributeValueLowercase==="strict"){cookieAttributeList.sameSite="Strict"}else if(attributeValueLowercase==="lax"){cookieAttributeList.sameSite="Lax"}}else{cookieAttributeList.unparsed??=[];cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`)}return parseUnparsedAttributes(unparsedAttributes,cookieAttributeList)}module2.exports={parseSetCookie,parseUnparsedAttributes}}});var require_cookies=__commonJS({"../../node_modules/undici/lib/web/cookies/index.js"(exports2,module2){"use strict";var{parseSetCookie}=require_parse();var{stringify}=require_util6();var{webidl}=require_webidl();var{Headers:Headers2}=require_headers();function getCookies(headers){webidl.argumentLengthCheck(arguments,1,"getCookies");webidl.brandCheck(headers,Headers2,{strict:false});const cookie=headers.get("cookie");const out={};if(!cookie){return out}for(const piece of cookie.split(";")){const[name,...value]=piece.split("=");out[name.trim()]=value.join("=")}return out}function deleteCookie(headers,name,attributes){webidl.brandCheck(headers,Headers2,{strict:false});const prefix="deleteCookie";webidl.argumentLengthCheck(arguments,2,prefix);name=webidl.converters.DOMString(name,prefix,"name");attributes=webidl.converters.DeleteCookieAttributes(attributes);setCookie(headers,{name,value:"",expires:new Date(0),...attributes})}function getSetCookies(headers){webidl.argumentLengthCheck(arguments,1,"getSetCookies");webidl.brandCheck(headers,Headers2,{strict:false});const cookies=headers.getSetCookie();if(!cookies){return[]}return cookies.map(pair=>parseSetCookie(pair))}function setCookie(headers,cookie){webidl.argumentLengthCheck(arguments,2,"setCookie");webidl.brandCheck(headers,Headers2,{strict:false});cookie=webidl.converters.Cookie(cookie);const str=stringify(cookie);if(str){headers.append("Set-Cookie",str)}}webidl.converters.DeleteCookieAttributes=webidl.dictionaryConverter([{converter:webidl.nullableConverter(webidl.converters.DOMString),key:"path",defaultValue:()=>null},{converter:webidl.nullableConverter(webidl.converters.DOMString),key:"domain",defaultValue:()=>null}]);webidl.converters.Cookie=webidl.dictionaryConverter([{converter:webidl.converters.DOMString,key:"name"},{converter:webidl.converters.DOMString,key:"value"},{converter:webidl.nullableConverter(value=>{if(typeof value==="number"){return webidl.converters["unsigned long long"](value)}return new Date(value)}),key:"expires",defaultValue:()=>null},{converter:webidl.nullableConverter(webidl.converters["long long"]),key:"maxAge",defaultValue:()=>null},{converter:webidl.nullableConverter(webidl.converters.DOMString),key:"domain",defaultValue:()=>null},{converter:webidl.nullableConverter(webidl.converters.DOMString),key:"path",defaultValue:()=>null},{converter:webidl.nullableConverter(webidl.converters.boolean),key:"secure",defaultValue:()=>null},{converter:webidl.nullableConverter(webidl.converters.boolean),key:"httpOnly",defaultValue:()=>null},{converter:webidl.converters.USVString,key:"sameSite",allowedValues:["Strict","Lax","None"]},{converter:webidl.sequenceConverter(webidl.converters.DOMString),key:"unparsed",defaultValue:()=>new Array(0)}]);module2.exports={getCookies,deleteCookie,getSetCookies,setCookie}}});var require_events=__commonJS({"../../node_modules/undici/lib/web/websocket/events.js"(exports2,module2){"use strict";var{webidl}=require_webidl();var{kEnumerableProperty}=require_util();var{kConstruct}=require_symbols();var{MessagePort}=require("node:worker_threads");var MessageEvent=class _MessageEvent extends Event{#eventInit;constructor(type,eventInitDict={}){if(type===kConstruct){super(arguments[1],arguments[2]);webidl.util.markAsUncloneable(this);return}const prefix="MessageEvent constructor";webidl.argumentLengthCheck(arguments,1,prefix);type=webidl.converters.DOMString(type,prefix,"type");eventInitDict=webidl.converters.MessageEventInit(eventInitDict,prefix,"eventInitDict");super(type,eventInitDict);this.#eventInit=eventInitDict;webidl.util.markAsUncloneable(this)}get data(){webidl.brandCheck(this,_MessageEvent);return this.#eventInit.data}get origin(){webidl.brandCheck(this,_MessageEvent);return this.#eventInit.origin}get lastEventId(){webidl.brandCheck(this,_MessageEvent);return this.#eventInit.lastEventId}get source(){webidl.brandCheck(this,_MessageEvent);return this.#eventInit.source}get ports(){webidl.brandCheck(this,_MessageEvent);if(!Object.isFrozen(this.#eventInit.ports)){Object.freeze(this.#eventInit.ports)}return this.#eventInit.ports}initMessageEvent(type,bubbles=false,cancelable=false,data=null,origin="",lastEventId="",source=null,ports=[]){webidl.brandCheck(this,_MessageEvent);webidl.argumentLengthCheck(arguments,1,"MessageEvent.initMessageEvent");return new _MessageEvent(type,{bubbles,cancelable,data,origin,lastEventId,source,ports})}static createFastMessageEvent(type,init){const messageEvent=new _MessageEvent(kConstruct,type,init);messageEvent.#eventInit=init;messageEvent.#eventInit.data??=null;messageEvent.#eventInit.origin??="";messageEvent.#eventInit.lastEventId??="";messageEvent.#eventInit.source??=null;messageEvent.#eventInit.ports??=[];return messageEvent}};var{createFastMessageEvent}=MessageEvent;delete MessageEvent.createFastMessageEvent;var CloseEvent=class _CloseEvent extends Event{#eventInit;constructor(type,eventInitDict={}){const prefix="CloseEvent constructor";webidl.argumentLengthCheck(arguments,1,prefix);type=webidl.converters.DOMString(type,prefix,"type");eventInitDict=webidl.converters.CloseEventInit(eventInitDict);super(type,eventInitDict);this.#eventInit=eventInitDict;webidl.util.markAsUncloneable(this)}get wasClean(){webidl.brandCheck(this,_CloseEvent);return this.#eventInit.wasClean}get code(){webidl.brandCheck(this,_CloseEvent);return this.#eventInit.code}get reason(){webidl.brandCheck(this,_CloseEvent);return this.#eventInit.reason}};var ErrorEvent=class _ErrorEvent extends Event{#eventInit;constructor(type,eventInitDict){const prefix="ErrorEvent constructor";webidl.argumentLengthCheck(arguments,1,prefix);super(type,eventInitDict);webidl.util.markAsUncloneable(this);type=webidl.converters.DOMString(type,prefix,"type");eventInitDict=webidl.converters.ErrorEventInit(eventInitDict??{});this.#eventInit=eventInitDict}get message(){webidl.brandCheck(this,_ErrorEvent);return this.#eventInit.message}get filename(){webidl.brandCheck(this,_ErrorEvent);return this.#eventInit.filename}get lineno(){webidl.brandCheck(this,_ErrorEvent);return this.#eventInit.lineno}get colno(){webidl.brandCheck(this,_ErrorEvent);return this.#eventInit.colno}get error(){webidl.brandCheck(this,_ErrorEvent);return this.#eventInit.error}};Object.defineProperties(MessageEvent.prototype,{[Symbol.toStringTag]:{value:"MessageEvent",configurable:true},data:kEnumerableProperty,origin:kEnumerableProperty,lastEventId:kEnumerableProperty,source:kEnumerableProperty,ports:kEnumerableProperty,initMessageEvent:kEnumerableProperty});Object.defineProperties(CloseEvent.prototype,{[Symbol.toStringTag]:{value:"CloseEvent",configurable:true},reason:kEnumerableProperty,code:kEnumerableProperty,wasClean:kEnumerableProperty});Object.defineProperties(ErrorEvent.prototype,{[Symbol.toStringTag]:{value:"ErrorEvent",configurable:true},message:kEnumerableProperty,filename:kEnumerableProperty,lineno:kEnumerableProperty,colno:kEnumerableProperty,error:kEnumerableProperty});webidl.converters.MessagePort=webidl.interfaceConverter(MessagePort);webidl.converters["sequence"]=webidl.sequenceConverter(webidl.converters.MessagePort);var eventInit=[{key:"bubbles",converter:webidl.converters.boolean,defaultValue:()=>false},{key:"cancelable",converter:webidl.converters.boolean,defaultValue:()=>false},{key:"composed",converter:webidl.converters.boolean,defaultValue:()=>false}];webidl.converters.MessageEventInit=webidl.dictionaryConverter([...eventInit,{key:"data",converter:webidl.converters.any,defaultValue:()=>null},{key:"origin",converter:webidl.converters.USVString,defaultValue:()=>""},{key:"lastEventId",converter:webidl.converters.DOMString,defaultValue:()=>""},{key:"source",converter:webidl.nullableConverter(webidl.converters.MessagePort),defaultValue:()=>null},{key:"ports",converter:webidl.converters["sequence"],defaultValue:()=>new Array(0)}]);webidl.converters.CloseEventInit=webidl.dictionaryConverter([...eventInit,{key:"wasClean",converter:webidl.converters.boolean,defaultValue:()=>false},{key:"code",converter:webidl.converters["unsigned short"],defaultValue:()=>0},{key:"reason",converter:webidl.converters.USVString,defaultValue:()=>""}]);webidl.converters.ErrorEventInit=webidl.dictionaryConverter([...eventInit,{key:"message",converter:webidl.converters.DOMString,defaultValue:()=>""},{key:"filename",converter:webidl.converters.USVString,defaultValue:()=>""},{key:"lineno",converter:webidl.converters["unsigned long"],defaultValue:()=>0},{key:"colno",converter:webidl.converters["unsigned long"],defaultValue:()=>0},{key:"error",converter:webidl.converters.any}]);module2.exports={MessageEvent,CloseEvent,ErrorEvent,createFastMessageEvent}}});var require_constants5=__commonJS({"../../node_modules/undici/lib/web/websocket/constants.js"(exports2,module2){"use strict";var uid="258EAFA5-E914-47DA-95CA-C5AB0DC85B11";var staticPropertyDescriptors={enumerable:true,writable:false,configurable:false};var states={CONNECTING:0,OPEN:1,CLOSING:2,CLOSED:3};var sentCloseFrameState={NOT_SENT:0,PROCESSING:1,SENT:2};var opcodes={CONTINUATION:0,TEXT:1,BINARY:2,CLOSE:8,PING:9,PONG:10};var maxUnsigned16Bit=2**16-1;var parserStates={INFO:0,PAYLOADLENGTH_16:2,PAYLOADLENGTH_64:3,READ_DATA:4};var emptyBuffer=Buffer.allocUnsafe(0);var sendHints={string:1,typedArray:2,arrayBuffer:3,blob:4};module2.exports={uid,sentCloseFrameState,staticPropertyDescriptors,states,opcodes,maxUnsigned16Bit,parserStates,emptyBuffer,sendHints}}});var require_symbols5=__commonJS({"../../node_modules/undici/lib/web/websocket/symbols.js"(exports2,module2){"use strict";module2.exports={kWebSocketURL:Symbol("url"),kReadyState:Symbol("ready state"),kController:Symbol("controller"),kResponse:Symbol("response"),kBinaryType:Symbol("binary type"),kSentClose:Symbol("sent close"),kReceivedClose:Symbol("received close"),kByteParser:Symbol("byte parser")}}});var require_util7=__commonJS({"../../node_modules/undici/lib/web/websocket/util.js"(exports2,module2){"use strict";var{kReadyState,kController,kResponse,kBinaryType,kWebSocketURL}=require_symbols5();var{states,opcodes}=require_constants5();var{ErrorEvent,createFastMessageEvent}=require_events();var{isUtf8}=require("node:buffer");var{collectASequenceOfCodePointsFast,removeHTTPWhitespace}=require_data_url();function isConnecting(ws){return ws[kReadyState]===states.CONNECTING}function isEstablished(ws){return ws[kReadyState]===states.OPEN}function isClosing(ws){return ws[kReadyState]===states.CLOSING}function isClosed(ws){return ws[kReadyState]===states.CLOSED}function fireEvent(e,target,eventFactory=(type,init)=>new Event(type,init),eventInitDict={}){const event=eventFactory(e,eventInitDict);target.dispatchEvent(event)}function websocketMessageReceived(ws,type,data){if(ws[kReadyState]!==states.OPEN){return}let dataForEvent;if(type===opcodes.TEXT){try{dataForEvent=utf8Decode(data)}catch{failWebsocketConnection(ws,"Received invalid UTF-8 in text frame.");return}}else if(type===opcodes.BINARY){if(ws[kBinaryType]==="blob"){dataForEvent=new Blob([data])}else{dataForEvent=toArrayBuffer(data)}}fireEvent("message",ws,createFastMessageEvent,{origin:ws[kWebSocketURL].origin,data:dataForEvent})}function toArrayBuffer(buffer){if(buffer.byteLength===buffer.buffer.byteLength){return buffer.buffer}return buffer.buffer.slice(buffer.byteOffset,buffer.byteOffset+buffer.byteLength)}function isValidSubprotocol(protocol){if(protocol.length===0){return false}for(let i=0;i126||code===34||code===40||code===41||code===44||code===47||code===58||code===59||code===60||code===61||code===62||code===63||code===64||code===91||code===92||code===93||code===123||code===125){return false}}return true}function isValidStatusCode(code){if(code>=1e3&&code<1015){return code!==1004&&code!==1005&&code!==1006}return code>=3e3&&code<=4999}function failWebsocketConnection(ws,reason){const{[kController]:controller,[kResponse]:response}=ws;controller.abort();if(response?.socket&&!response.socket.destroyed){response.socket.destroy()}if(reason){fireEvent("error",ws,(type,init)=>new ErrorEvent(type,init),{error:new Error(reason),message:reason})}}function isControlFrame(opcode){return opcode===opcodes.CLOSE||opcode===opcodes.PING||opcode===opcodes.PONG}function isContinuationFrame(opcode){return opcode===opcodes.CONTINUATION}function isTextBinaryFrame(opcode){return opcode===opcodes.TEXT||opcode===opcodes.BINARY}function isValidOpcode(opcode){return isTextBinaryFrame(opcode)||isContinuationFrame(opcode)||isControlFrame(opcode)}function parseExtensions(extensions){const position={position:0};const extensionList=new Map;while(position.position57){return false}}const num=Number.parseInt(value,10);return num>=8&&num<=15}var hasIntl=typeof process.versions.icu==="string";var fatalDecoder=hasIntl?new TextDecoder("utf-8",{fatal:true}):void 0;var utf8Decode=hasIntl?fatalDecoder.decode.bind(fatalDecoder):function(buffer){if(isUtf8(buffer)){return buffer.toString("utf-8")}throw new TypeError("Invalid utf-8 received.")};module2.exports={isConnecting,isEstablished,isClosing,isClosed,fireEvent,isValidSubprotocol,isValidStatusCode,failWebsocketConnection,websocketMessageReceived,utf8Decode,isControlFrame,isContinuationFrame,isTextBinaryFrame,isValidOpcode,parseExtensions,isValidClientWindowBits}}});var require_frame=__commonJS({"../../node_modules/undici/lib/web/websocket/frame.js"(exports2,module2){"use strict";var{maxUnsigned16Bit}=require_constants5();var BUFFER_SIZE=16386;var crypto2;var buffer=null;var bufIdx=BUFFER_SIZE;try{crypto2=require("node:crypto")}catch{crypto2={randomFillSync:function randomFillSync(buffer2,_offset,_size){for(let i=0;imaxUnsigned16Bit){offset+=8;payloadLength=127}else if(bodyLength>125){offset+=2;payloadLength=126}const buffer2=Buffer.allocUnsafe(bodyLength+offset);buffer2[0]=buffer2[1]=0;buffer2[0]|=128;buffer2[0]=(buffer2[0]&240)+opcode;buffer2[offset-4]=maskKey[0];buffer2[offset-3]=maskKey[1];buffer2[offset-2]=maskKey[2];buffer2[offset-1]=maskKey[3];buffer2[1]=payloadLength;if(payloadLength===126){buffer2.writeUInt16BE(bodyLength,2)}else if(payloadLength===127){buffer2[2]=buffer2[3]=0;buffer2.writeUIntBE(bodyLength,4,6)}buffer2[1]|=128;for(let i=0;inew CloseEvent(type,init),{wasClean,code,reason});if(channels.close.hasSubscribers){channels.close.publish({websocket:ws,code,reason})}}function onSocketError(error2){const{ws}=this;ws[kReadyState]=states.CLOSING;if(channels.socketError.hasSubscribers){channels.socketError.publish(error2)}this.destroy()}module2.exports={establishWebSocketConnection,closeWebSocketConnection}}});var require_permessage_deflate=__commonJS({"../../node_modules/undici/lib/web/websocket/permessage-deflate.js"(exports2,module2){"use strict";var{createInflateRaw,Z_DEFAULT_WINDOWBITS}=require("node:zlib");var{isValidClientWindowBits}=require_util7();var{MessageSizeExceededError}=require_errors();var tail=Buffer.from([0,0,255,255]);var kBuffer=Symbol("kBuffer");var kLength=Symbol("kLength");var PerMessageDeflate=class{#inflate;#options={};#maxPayloadSize=0;constructor(extensions,options){this.#options.serverNoContextTakeover=extensions.has("server_no_context_takeover");this.#options.serverMaxWindowBits=extensions.get("server_max_window_bits");this.#maxPayloadSize=options.maxPayloadSize}decompress(chunk,fin,callback){if(!this.#inflate){let windowBits=Z_DEFAULT_WINDOWBITS;if(this.#options.serverMaxWindowBits){if(!isValidClientWindowBits(this.#options.serverMaxWindowBits)){callback(new Error("Invalid server_max_window_bits"));return}windowBits=Number.parseInt(this.#options.serverMaxWindowBits)}try{this.#inflate=createInflateRaw({windowBits})}catch(err){callback(err);return}this.#inflate[kBuffer]=[];this.#inflate[kLength]=0;this.#inflate.on("data",data=>{this.#inflate[kLength]+=data.length;if(this.#maxPayloadSize>0&&this.#inflate[kLength]>this.#maxPayloadSize){callback(new MessageSizeExceededError);this.#inflate.removeAllListeners();this.#inflate=null;return}this.#inflate[kBuffer].push(data)});this.#inflate.on("error",err=>{this.#inflate=null;callback(err)})}this.#inflate.write(chunk);if(fin){this.#inflate.write(tail)}this.#inflate.flush(()=>{if(!this.#inflate){return}const full=Buffer.concat(this.#inflate[kBuffer],this.#inflate[kLength]);this.#inflate[kBuffer].length=0;this.#inflate[kLength]=0;callback(null,full)})}};module2.exports={PerMessageDeflate}}});var require_receiver=__commonJS({"../../node_modules/undici/lib/web/websocket/receiver.js"(exports2,module2){"use strict";var{Writable}=require("node:stream");var assert=require("node:assert");var{parserStates,opcodes,states,emptyBuffer,sentCloseFrameState}=require_constants5();var{kReadyState,kSentClose,kResponse,kReceivedClose}=require_symbols5();var{channels}=require_diagnostics();var{isValidStatusCode,isValidOpcode,failWebsocketConnection,websocketMessageReceived,utf8Decode,isControlFrame,isTextBinaryFrame,isContinuationFrame}=require_util7();var{WebsocketFrameSend}=require_frame();var{closeWebSocketConnection}=require_connection();var{PerMessageDeflate}=require_permessage_deflate();var{MessageSizeExceededError}=require_errors();function failWebsocketConnectionWithCode(ws,code,reason){closeWebSocketConnection(ws,code,reason,Buffer.byteLength(reason));failWebsocketConnection(ws,reason)}var ByteParser=class extends Writable{#buffers=[];#fragmentsBytes=0;#byteOffset=0;#loop=false;#state=parserStates.INFO;#info={};#fragments=[];#extensions;#maxFragments;#maxPayloadSize;constructor(ws,extensions,options={}){super();this.ws=ws;this.#extensions=extensions==null?new Map:extensions;this.#maxFragments=options.maxFragments??0;this.#maxPayloadSize=options.maxPayloadSize??0;if(this.#extensions.has("permessage-deflate")){this.#extensions.set("permessage-deflate",new PerMessageDeflate(extensions,options))}}_write(chunk,_,callback){this.#buffers.push(chunk);this.#byteOffset+=chunk.length;this.#loop=true;this.run(callback)}#validatePayloadLength(){if(this.#maxPayloadSize>0&&!isControlFrame(this.#info.opcode)&&this.#info.payloadLength+this.#fragmentsBytes>this.#maxPayloadSize){failWebsocketConnectionWithCode(this.ws,1009,"Payload size exceeds maximum allowed size");return false}return true}run(callback){while(this.#loop){if(this.#state===parserStates.INFO){if(this.#byteOffset<2){return callback()}const buffer=this.consume(2);const fin=(buffer[0]&128)!==0;const opcode=buffer[0]&15;const masked=(buffer[1]&128)===128;const fragmented=!fin&&opcode!==opcodes.CONTINUATION;const payloadLength=buffer[1]&127;const rsv1=buffer[0]&64;const rsv2=buffer[0]&32;const rsv3=buffer[0]&16;if(!isValidOpcode(opcode)){failWebsocketConnection(this.ws,"Invalid opcode received");return callback()}if(masked){failWebsocketConnection(this.ws,"Frame cannot be masked");return callback()}if(rsv1!==0&&!this.#extensions.has("permessage-deflate")){failWebsocketConnection(this.ws,"Expected RSV1 to be clear.");return}if(rsv2!==0||rsv3!==0){failWebsocketConnection(this.ws,"RSV1, RSV2, RSV3 must be clear");return}if(fragmented&&!isTextBinaryFrame(opcode)){failWebsocketConnection(this.ws,"Invalid frame type was fragmented.");return}if(isTextBinaryFrame(opcode)&&this.#fragments.length>0){failWebsocketConnection(this.ws,"Expected continuation frame");return}if(this.#info.fragmented&&fragmented){failWebsocketConnection(this.ws,"Fragmented frame exceeded 125 bytes.");return}if((payloadLength>125||fragmented)&&isControlFrame(opcode)){failWebsocketConnection(this.ws,"Control frame either too large or fragmented");return}if(isContinuationFrame(opcode)&&this.#fragments.length===0&&!this.#info.compressed){failWebsocketConnection(this.ws,"Unexpected continuation frame");return}if(payloadLength<=125){this.#info.payloadLength=payloadLength;this.#state=parserStates.READ_DATA;if(!this.#validatePayloadLength()){return}}else if(payloadLength===126){this.#state=parserStates.PAYLOADLENGTH_16}else if(payloadLength===127){this.#state=parserStates.PAYLOADLENGTH_64}if(isTextBinaryFrame(opcode)){this.#info.binaryType=opcode;this.#info.compressed=rsv1!==0}this.#info.opcode=opcode;this.#info.masked=masked;this.#info.fin=fin;this.#info.fragmented=fragmented}else if(this.#state===parserStates.PAYLOADLENGTH_16){if(this.#byteOffset<2){return callback()}const buffer=this.consume(2);this.#info.payloadLength=buffer.readUInt16BE(0);this.#state=parserStates.READ_DATA;if(!this.#validatePayloadLength()){return}}else if(this.#state===parserStates.PAYLOADLENGTH_64){if(this.#byteOffset<8){return callback()}const buffer=this.consume(8);const upper=buffer.readUInt32BE(0);const lower=buffer.readUInt32BE(4);if(upper!==0||lower>2**31-1){failWebsocketConnection(this.ws,"Received payload length > 2^31 bytes.");return}this.#info.payloadLength=lower;this.#state=parserStates.READ_DATA;if(!this.#validatePayloadLength()){return}}else if(this.#state===parserStates.READ_DATA){if(this.#byteOffset0&&this.#fragmentsBytes>this.#maxPayloadSize){failWebsocketConnectionWithCode(this.ws,1009,new MessageSizeExceededError().message);return}if(!this.#info.fragmented&&this.#info.fin){websocketMessageReceived(this.ws,this.#info.binaryType,this.consumeFragments())}this.#state=parserStates.INFO}else{this.#extensions.get("permessage-deflate").decompress(body,this.#info.fin,(error2,data)=>{if(error2){const code=error2 instanceof MessageSizeExceededError?1009:1007;failWebsocketConnectionWithCode(this.ws,code,error2.message);return}if(!this.writeFragments(data)){return}if(this.#maxPayloadSize>0&&this.#fragmentsBytes>this.#maxPayloadSize){failWebsocketConnectionWithCode(this.ws,1009,new MessageSizeExceededError().message);return}if(!this.#info.fin){this.#state=parserStates.INFO;this.#loop=true;this.run(callback);return}websocketMessageReceived(this.ws,this.#info.binaryType,this.consumeFragments());this.#loop=true;this.#state=parserStates.INFO;this.run(callback)});this.#loop=false;break}}}}}consume(n){if(n>this.#byteOffset){throw new Error("Called consume() before buffers satiated.")}else if(n===0){return emptyBuffer}if(this.#buffers[0].length===n){this.#byteOffset-=this.#buffers[0].length;return this.#buffers.shift()}const buffer=Buffer.allocUnsafe(n);let offset=0;while(offset!==n){const next=this.#buffers[0];const{length}=next;if(length+offset===n){buffer.set(this.#buffers.shift(),offset);break}else if(length+offset>n){buffer.set(next.subarray(0,n-offset),offset);this.#buffers[0]=next.subarray(n-offset);break}else{buffer.set(this.#buffers.shift(),offset);offset+=next.length}}this.#byteOffset-=n;return buffer}writeFragments(fragment){if(this.#maxFragments>0&&this.#fragments.length===this.#maxFragments){failWebsocketConnectionWithCode(this.ws,1008,"Too many message fragments");return false}this.#fragmentsBytes+=fragment.length;this.#fragments.push(fragment);return true}consumeFragments(){const fragments=this.#fragments;if(fragments.length===1){this.#fragmentsBytes=0;return fragments.shift()}const output=Buffer.concat(fragments,this.#fragmentsBytes);this.#fragments=[];this.#fragmentsBytes=0;return output}parseCloseBody(data){assert(data.length!==1);let code;if(data.length>=2){code=data.readUInt16BE(0)}if(code!==void 0&&!isValidStatusCode(code)){return{code:1002,reason:"Invalid status code",error:true}}let reason=data.subarray(2);if(reason[0]===239&&reason[1]===187&&reason[2]===191){reason=reason.subarray(3)}try{reason=utf8Decode(reason)}catch{return{code:1007,reason:"Invalid UTF-8",error:true}}return{code,reason,error:false}}parseControlFrame(body){const{opcode,payloadLength}=this.#info;if(opcode===opcodes.CLOSE){if(payloadLength===1){failWebsocketConnection(this.ws,"Received close frame with a 1-byte body.");return false}this.#info.closeInfo=this.parseCloseBody(body);if(this.#info.closeInfo.error){const{code,reason}=this.#info.closeInfo;closeWebSocketConnection(this.ws,code,reason,reason.length);failWebsocketConnection(this.ws,reason);return false}if(this.ws[kSentClose]!==sentCloseFrameState.SENT){let body2=emptyBuffer;if(this.#info.closeInfo.code){body2=Buffer.allocUnsafe(2);body2.writeUInt16BE(this.#info.closeInfo.code,0)}const closeFrame=new WebsocketFrameSend(body2);this.ws[kResponse].socket.write(closeFrame.createFrame(opcodes.CLOSE),err=>{if(!err){this.ws[kSentClose]=sentCloseFrameState.SENT}})}this.ws[kReadyState]=states.CLOSING;this.ws[kReceivedClose]=true;return false}else if(opcode===opcodes.PING){if(!this.ws[kReceivedClose]){const frame=new WebsocketFrameSend(body);this.ws[kResponse].socket.write(frame.createFrame(opcodes.PONG));if(channels.ping.hasSubscribers){channels.ping.publish({payload:body})}}}else if(opcode===opcodes.PONG){if(channels.pong.hasSubscribers){channels.pong.publish({payload:body})}}return true}get closingInfo(){return this.#info.closeInfo}};module2.exports={ByteParser}}});var require_sender=__commonJS({"../../node_modules/undici/lib/web/websocket/sender.js"(exports2,module2){"use strict";var{WebsocketFrameSend}=require_frame();var{opcodes,sendHints}=require_constants5();var FixedQueue=require_fixed_queue();var FastBuffer=Buffer[Symbol.species];var SendQueue=class{#queue=new FixedQueue;#running=false;#socket;constructor(socket){this.#socket=socket}add(item,cb,hint){if(hint!==sendHints.blob){const frame=createFrame(item,hint);if(!this.#running){this.#socket.write(frame,cb)}else{const node2={promise:null,callback:cb,frame};this.#queue.push(node2)}return}const node={promise:item.arrayBuffer().then(ab=>{node.promise=null;node.frame=createFrame(ab,hint)}),callback:cb,frame:null};this.#queue.push(node);if(!this.#running){this.#run()}}async#run(){this.#running=true;const queue=this.#queue;while(!queue.isEmpty()){const node=queue.shift();if(node.promise!==null){await node.promise}this.#socket.write(node.frame,node.callback);node.callback=node.frame=null}this.#running=false}};function createFrame(data,hint){return new WebsocketFrameSend(toBuffer(data,hint)).createFrame(hint===sendHints.string?opcodes.TEXT:opcodes.BINARY)}function toBuffer(data,hint){switch(hint){case sendHints.string:return Buffer.from(data);case sendHints.arrayBuffer:case sendHints.blob:return new FastBuffer(data);case sendHints.typedArray:return new FastBuffer(data.buffer,data.byteOffset,data.byteLength)}}module2.exports={SendQueue}}});var require_websocket=__commonJS({"../../node_modules/undici/lib/web/websocket/websocket.js"(exports2,module2){"use strict";var{webidl}=require_webidl();var{URLSerializer}=require_data_url();var{environmentSettingsObject}=require_util2();var{staticPropertyDescriptors,states,sentCloseFrameState,sendHints}=require_constants5();var{kWebSocketURL,kReadyState,kController,kBinaryType,kResponse,kSentClose,kByteParser}=require_symbols5();var{isConnecting,isEstablished,isClosing,isValidSubprotocol,fireEvent}=require_util7();var{establishWebSocketConnection,closeWebSocketConnection}=require_connection();var{ByteParser}=require_receiver();var{kEnumerableProperty,isBlobLike}=require_util();var{getGlobalDispatcher}=require_global2();var{types}=require("node:util");var{ErrorEvent,CloseEvent}=require_events();var{SendQueue}=require_sender();var WebSocket=class _WebSocket extends EventTarget{#events={open:null,error:null,close:null,message:null};#bufferedAmount=0;#protocol="";#extensions="";#sendQueue;constructor(url,protocols=[]){super();webidl.util.markAsUncloneable(this);const prefix="WebSocket constructor";webidl.argumentLengthCheck(arguments,1,prefix);const options=webidl.converters["DOMString or sequence or WebSocketInit"](protocols,prefix,"options");url=webidl.converters.USVString(url,prefix,"url");protocols=options.protocols;const baseURL=environmentSettingsObject.settingsObject.baseUrl;let urlRecord;try{urlRecord=new URL(url,baseURL)}catch(e){throw new DOMException(e,"SyntaxError")}if(urlRecord.protocol==="http:"){urlRecord.protocol="ws:"}else if(urlRecord.protocol==="https:"){urlRecord.protocol="wss:"}if(urlRecord.protocol!=="ws:"&&urlRecord.protocol!=="wss:"){throw new DOMException(`Expected a ws: or wss: protocol, got ${urlRecord.protocol}`,"SyntaxError")}if(urlRecord.hash||urlRecord.href.endsWith("#")){throw new DOMException("Got fragment","SyntaxError")}if(typeof protocols==="string"){protocols=[protocols]}if(protocols.length!==new Set(protocols.map(p=>p.toLowerCase())).size){throw new DOMException("Invalid Sec-WebSocket-Protocol value","SyntaxError")}if(protocols.length>0&&!protocols.every(p=>isValidSubprotocol(p))){throw new DOMException("Invalid Sec-WebSocket-Protocol value","SyntaxError")}this[kWebSocketURL]=new URL(urlRecord.href);const client=environmentSettingsObject.settingsObject;this[kController]=establishWebSocketConnection(urlRecord,protocols,client,this,(response,extensions)=>this.#onConnectionEstablished(response,extensions),options);this[kReadyState]=_WebSocket.CONNECTING;this[kSentClose]=sentCloseFrameState.NOT_SENT;this[kBinaryType]="blob"}close(code=void 0,reason=void 0){webidl.brandCheck(this,_WebSocket);const prefix="WebSocket.close";if(code!==void 0){code=webidl.converters["unsigned short"](code,prefix,"code",{clamp:true})}if(reason!==void 0){reason=webidl.converters.USVString(reason,prefix,"reason")}if(code!==void 0){if(code!==1e3&&(code<3e3||code>4999)){throw new DOMException("invalid code","InvalidAccessError")}}let reasonByteLength=0;if(reason!==void 0){reasonByteLength=Buffer.byteLength(reason);if(reasonByteLength>123){throw new DOMException(`Reason must be less than 123 bytes; received ${reasonByteLength}`,"SyntaxError")}}closeWebSocketConnection(this,code,reason,reasonByteLength)}send(data){webidl.brandCheck(this,_WebSocket);const prefix="WebSocket.send";webidl.argumentLengthCheck(arguments,1,prefix);data=webidl.converters.WebSocketSendData(data,prefix,"data");if(isConnecting(this)){throw new DOMException("Sent before connected.","InvalidStateError")}if(!isEstablished(this)||isClosing(this)){return}if(typeof data==="string"){const length=Buffer.byteLength(data);this.#bufferedAmount+=length;this.#sendQueue.add(data,()=>{this.#bufferedAmount-=length},sendHints.string)}else if(types.isArrayBuffer(data)){this.#bufferedAmount+=data.byteLength;this.#sendQueue.add(data,()=>{this.#bufferedAmount-=data.byteLength},sendHints.arrayBuffer)}else if(ArrayBuffer.isView(data)){this.#bufferedAmount+=data.byteLength;this.#sendQueue.add(data,()=>{this.#bufferedAmount-=data.byteLength},sendHints.typedArray)}else if(isBlobLike(data)){this.#bufferedAmount+=data.size;this.#sendQueue.add(data,()=>{this.#bufferedAmount-=data.size},sendHints.blob)}}get readyState(){webidl.brandCheck(this,_WebSocket);return this[kReadyState]}get bufferedAmount(){webidl.brandCheck(this,_WebSocket);return this.#bufferedAmount}get url(){webidl.brandCheck(this,_WebSocket);return URLSerializer(this[kWebSocketURL])}get extensions(){webidl.brandCheck(this,_WebSocket);return this.#extensions}get protocol(){webidl.brandCheck(this,_WebSocket);return this.#protocol}get onopen(){webidl.brandCheck(this,_WebSocket);return this.#events.open}set onopen(fn){webidl.brandCheck(this,_WebSocket);if(this.#events.open){this.removeEventListener("open",this.#events.open)}if(typeof fn==="function"){this.#events.open=fn;this.addEventListener("open",fn)}else{this.#events.open=null}}get onerror(){webidl.brandCheck(this,_WebSocket);return this.#events.error}set onerror(fn){webidl.brandCheck(this,_WebSocket);if(this.#events.error){this.removeEventListener("error",this.#events.error)}if(typeof fn==="function"){this.#events.error=fn;this.addEventListener("error",fn)}else{this.#events.error=null}}get onclose(){webidl.brandCheck(this,_WebSocket);return this.#events.close}set onclose(fn){webidl.brandCheck(this,_WebSocket);if(this.#events.close){this.removeEventListener("close",this.#events.close)}if(typeof fn==="function"){this.#events.close=fn;this.addEventListener("close",fn)}else{this.#events.close=null}}get onmessage(){webidl.brandCheck(this,_WebSocket);return this.#events.message}set onmessage(fn){webidl.brandCheck(this,_WebSocket);if(this.#events.message){this.removeEventListener("message",this.#events.message)}if(typeof fn==="function"){this.#events.message=fn;this.addEventListener("message",fn)}else{this.#events.message=null}}get binaryType(){webidl.brandCheck(this,_WebSocket);return this[kBinaryType]}set binaryType(type){webidl.brandCheck(this,_WebSocket);if(type!=="blob"&&type!=="arraybuffer"){this[kBinaryType]="blob"}else{this[kBinaryType]=type}}#onConnectionEstablished(response,parsedExtensions){this[kResponse]=response;const webSocketOptions=this[kController]?.dispatcher?.webSocketOptions;const maxFragments=webSocketOptions?.maxFragments;const maxPayloadSize=webSocketOptions?.maxPayloadSize;const parser2=new ByteParser(this,parsedExtensions,{maxFragments,maxPayloadSize});parser2.on("drain",onParserDrain);parser2.on("error",onParserError.bind(this));response.socket.ws=this;this[kByteParser]=parser2;this.#sendQueue=new SendQueue(response.socket);this[kReadyState]=states.OPEN;const extensions=response.headersList.get("sec-websocket-extensions");if(extensions!==null){this.#extensions=extensions}const protocol=response.headersList.get("sec-websocket-protocol");if(protocol!==null){this.#protocol=protocol}fireEvent("open",this)}};WebSocket.CONNECTING=WebSocket.prototype.CONNECTING=states.CONNECTING;WebSocket.OPEN=WebSocket.prototype.OPEN=states.OPEN;WebSocket.CLOSING=WebSocket.prototype.CLOSING=states.CLOSING;WebSocket.CLOSED=WebSocket.prototype.CLOSED=states.CLOSED;Object.defineProperties(WebSocket.prototype,{CONNECTING:staticPropertyDescriptors,OPEN:staticPropertyDescriptors,CLOSING:staticPropertyDescriptors,CLOSED:staticPropertyDescriptors,url:kEnumerableProperty,readyState:kEnumerableProperty,bufferedAmount:kEnumerableProperty,onopen:kEnumerableProperty,onerror:kEnumerableProperty,onclose:kEnumerableProperty,close:kEnumerableProperty,onmessage:kEnumerableProperty,binaryType:kEnumerableProperty,send:kEnumerableProperty,extensions:kEnumerableProperty,protocol:kEnumerableProperty,[Symbol.toStringTag]:{value:"WebSocket",writable:false,enumerable:false,configurable:true}});Object.defineProperties(WebSocket,{CONNECTING:staticPropertyDescriptors,OPEN:staticPropertyDescriptors,CLOSING:staticPropertyDescriptors,CLOSED:staticPropertyDescriptors});webidl.converters["sequence"]=webidl.sequenceConverter(webidl.converters.DOMString);webidl.converters["DOMString or sequence"]=function(V,prefix,argument){if(webidl.util.Type(V)==="Object"&&Symbol.iterator in V){return webidl.converters["sequence"](V)}return webidl.converters.DOMString(V,prefix,argument)};webidl.converters.WebSocketInit=webidl.dictionaryConverter([{key:"protocols",converter:webidl.converters["DOMString or sequence"],defaultValue:()=>new Array(0)},{key:"dispatcher",converter:webidl.converters.any,defaultValue:()=>getGlobalDispatcher()},{key:"headers",converter:webidl.nullableConverter(webidl.converters.HeadersInit)}]);webidl.converters["DOMString or sequence or WebSocketInit"]=function(V){if(webidl.util.Type(V)==="Object"&&!(Symbol.iterator in V)){return webidl.converters.WebSocketInit(V)}return{protocols:webidl.converters["DOMString or sequence"](V)}};webidl.converters.WebSocketSendData=function(V){if(webidl.util.Type(V)==="Object"){if(isBlobLike(V)){return webidl.converters.Blob(V,{strict:false})}if(ArrayBuffer.isView(V)||types.isArrayBuffer(V)){return webidl.converters.BufferSource(V)}}return webidl.converters.USVString(V)};function onParserDrain(){this.ws[kResponse].socket.resume()}function onParserError(err){let message;let code;if(err instanceof CloseEvent){message=err.reason;code=err.code}else{message=err.message}fireEvent("error",this,()=>new ErrorEvent("error",{error:err,message}));closeWebSocketConnection(this,code)}module2.exports={WebSocket}}});var require_util8=__commonJS({"../../node_modules/undici/lib/web/eventsource/util.js"(exports2,module2){"use strict";function isValidLastEventId(value){return value.indexOf("\0")===-1}function isASCIINumber(value){if(value.length===0)return false;for(let i=0;i57)return false}return true}function delay(ms){return new Promise(resolve3=>{setTimeout(resolve3,ms).unref()})}module2.exports={isValidLastEventId,isASCIINumber,delay}}});var require_eventsource_stream=__commonJS({"../../node_modules/undici/lib/web/eventsource/eventsource-stream.js"(exports2,module2){"use strict";var{Transform}=require("node:stream");var{isASCIINumber,isValidLastEventId}=require_util8();var BOM=[239,187,191];var LF=10;var CR=13;var COLON=58;var SPACE=32;var EventSourceStream=class extends Transform{state=null;checkBOM=true;crlfCheck=false;eventEndCheck=false;buffer=null;pos=0;event={data:void 0,event:void 0,id:void 0,retry:void 0};constructor(options={}){options.readableObjectMode=true;super(options);this.state=options.eventSourceSettings||{};if(options.push){this.push=options.push}}_transform(chunk,_encoding,callback){if(chunk.length===0){callback();return}if(this.buffer){this.buffer=Buffer.concat([this.buffer,chunk])}else{this.buffer=chunk}if(this.checkBOM){switch(this.buffer.length){case 1:if(this.buffer[0]===BOM[0]){callback();return}this.checkBOM=false;callback();return;case 2:if(this.buffer[0]===BOM[0]&&this.buffer[1]===BOM[1]){callback();return}this.checkBOM=false;break;case 3:if(this.buffer[0]===BOM[0]&&this.buffer[1]===BOM[1]&&this.buffer[2]===BOM[2]){this.buffer=Buffer.alloc(0);this.checkBOM=false;callback();return}this.checkBOM=false;break;default:if(this.buffer[0]===BOM[0]&&this.buffer[1]===BOM[1]&&this.buffer[2]===BOM[2]){this.buffer=this.buffer.subarray(3)}this.checkBOM=false;break}}while(this.pos0){event[field]=value}break}}processEvent(event){if(event.retry&&isASCIINumber(event.retry)){this.state.reconnectionTime=parseInt(event.retry,10)}if(event.id&&isValidLastEventId(event.id)){this.state.lastEventId=event.id}if(event.data!==void 0){this.push({type:event.event||"message",options:{data:event.data,lastEventId:this.state.lastEventId,origin:this.state.origin}})}}clearEvent(){this.event={data:void 0,event:void 0,id:void 0,retry:void 0}}};module2.exports={EventSourceStream}}});var require_eventsource=__commonJS({"../../node_modules/undici/lib/web/eventsource/eventsource.js"(exports2,module2){"use strict";var{pipeline}=require("node:stream");var{fetching}=require_fetch();var{makeRequest}=require_request2();var{webidl}=require_webidl();var{EventSourceStream}=require_eventsource_stream();var{parseMIMEType}=require_data_url();var{createFastMessageEvent}=require_events();var{isNetworkError}=require_response();var{delay}=require_util8();var{kEnumerableProperty}=require_util();var{environmentSettingsObject}=require_util2();var experimentalWarned=false;var defaultReconnectionTime=3e3;var CONNECTING=0;var OPEN=1;var CLOSED=2;var ANONYMOUS="anonymous";var USE_CREDENTIALS="use-credentials";var EventSource=class _EventSource extends EventTarget{#events={open:null,error:null,message:null};#url=null;#withCredentials=false;#readyState=CONNECTING;#request=null;#controller=null;#dispatcher;#state;constructor(url,eventSourceInitDict={}){super();webidl.util.markAsUncloneable(this);const prefix="EventSource constructor";webidl.argumentLengthCheck(arguments,1,prefix);if(!experimentalWarned){experimentalWarned=true;process.emitWarning("EventSource is experimental, expect them to change at any time.",{code:"UNDICI-ES"})}url=webidl.converters.USVString(url,prefix,"url");eventSourceInitDict=webidl.converters.EventSourceInitDict(eventSourceInitDict,prefix,"eventSourceInitDict");this.#dispatcher=eventSourceInitDict.dispatcher;this.#state={lastEventId:"",reconnectionTime:defaultReconnectionTime};const settings=environmentSettingsObject;let urlRecord;try{urlRecord=new URL(url,settings.settingsObject.baseUrl);this.#state.origin=urlRecord.origin}catch(e){throw new DOMException(e,"SyntaxError")}this.#url=urlRecord.href;let corsAttributeState=ANONYMOUS;if(eventSourceInitDict.withCredentials){corsAttributeState=USE_CREDENTIALS;this.#withCredentials=true}const initRequest={redirect:"follow",keepalive:true,mode:"cors",credentials:corsAttributeState==="anonymous"?"same-origin":"omit",referrer:"no-referrer"};initRequest.client=environmentSettingsObject.settingsObject;initRequest.headersList=[["accept",{name:"accept",value:"text/event-stream"}]];initRequest.cache="no-store";initRequest.initiator="other";initRequest.urlList=[new URL(this.#url)];this.#request=makeRequest(initRequest);this.#connect()}get readyState(){return this.#readyState}get url(){return this.#url}get withCredentials(){return this.#withCredentials}#connect(){if(this.#readyState===CLOSED)return;this.#readyState=CONNECTING;const fetchParams={request:this.#request,dispatcher:this.#dispatcher};const processEventSourceEndOfBody=response=>{if(isNetworkError(response)){this.dispatchEvent(new Event("error"));this.close()}this.#reconnect()};fetchParams.processResponseEndOfBody=processEventSourceEndOfBody;fetchParams.processResponse=response=>{if(isNetworkError(response)){if(response.aborted){this.close();this.dispatchEvent(new Event("error"));return}else{this.#reconnect();return}}const contentType=response.headersList.get("content-type",true);const mimeType=contentType!==null?parseMIMEType(contentType):"failure";const contentTypeValid=mimeType!=="failure"&&mimeType.essence==="text/event-stream";if(response.status!==200||contentTypeValid===false){this.close();this.dispatchEvent(new Event("error"));return}this.#readyState=OPEN;this.dispatchEvent(new Event("open"));this.#state.origin=response.urlList[response.urlList.length-1].origin;const eventSourceStream=new EventSourceStream({eventSourceSettings:this.#state,push:event=>{this.dispatchEvent(createFastMessageEvent(event.type,event.options))}});pipeline(response.body.stream,eventSourceStream,error2=>{if(error2?.aborted===false){this.close();this.dispatchEvent(new Event("error"))}})};this.#controller=fetching(fetchParams)}async#reconnect(){if(this.#readyState===CLOSED)return;this.#readyState=CONNECTING;this.dispatchEvent(new Event("error"));await delay(this.#state.reconnectionTime);if(this.#readyState!==CONNECTING)return;if(this.#state.lastEventId.length){this.#request.headersList.set("last-event-id",this.#state.lastEventId,true)}this.#connect()}close(){webidl.brandCheck(this,_EventSource);if(this.#readyState===CLOSED)return;this.#readyState=CLOSED;this.#controller.abort();this.#request=null}get onopen(){return this.#events.open}set onopen(fn){if(this.#events.open){this.removeEventListener("open",this.#events.open)}if(typeof fn==="function"){this.#events.open=fn;this.addEventListener("open",fn)}else{this.#events.open=null}}get onmessage(){return this.#events.message}set onmessage(fn){if(this.#events.message){this.removeEventListener("message",this.#events.message)}if(typeof fn==="function"){this.#events.message=fn;this.addEventListener("message",fn)}else{this.#events.message=null}}get onerror(){return this.#events.error}set onerror(fn){if(this.#events.error){this.removeEventListener("error",this.#events.error)}if(typeof fn==="function"){this.#events.error=fn;this.addEventListener("error",fn)}else{this.#events.error=null}}};var constantsPropertyDescriptors={CONNECTING:{__proto__:null,configurable:false,enumerable:true,value:CONNECTING,writable:false},OPEN:{__proto__:null,configurable:false,enumerable:true,value:OPEN,writable:false},CLOSED:{__proto__:null,configurable:false,enumerable:true,value:CLOSED,writable:false}};Object.defineProperties(EventSource,constantsPropertyDescriptors);Object.defineProperties(EventSource.prototype,constantsPropertyDescriptors);Object.defineProperties(EventSource.prototype,{close:kEnumerableProperty,onerror:kEnumerableProperty,onmessage:kEnumerableProperty,onopen:kEnumerableProperty,readyState:kEnumerableProperty,url:kEnumerableProperty,withCredentials:kEnumerableProperty});webidl.converters.EventSourceInitDict=webidl.dictionaryConverter([{key:"withCredentials",converter:webidl.converters.boolean,defaultValue:()=>false},{key:"dispatcher",converter:webidl.converters.any}]);module2.exports={EventSource,defaultReconnectionTime}}});var require_undici=__commonJS({"../../node_modules/undici/index.js"(exports2,module2){"use strict";var Client=require_client();var Dispatcher=require_dispatcher();var Pool=require_pool();var BalancedPool=require_balanced_pool();var Agent=require_agent();var ProxyAgent2=require_proxy_agent();var EnvHttpProxyAgent=require_env_http_proxy_agent();var RetryAgent=require_retry_agent();var errors=require_errors();var util=require_util();var{InvalidArgumentError}=errors;var api=require_api();var buildConnector=require_connect();var MockClient=require_mock_client();var MockAgent=require_mock_agent();var MockPool=require_mock_pool();var mockErrors=require_mock_errors();var RetryHandler=require_retry_handler();var{getGlobalDispatcher,setGlobalDispatcher}=require_global2();var DecoratorHandler=require_decorator_handler();var RedirectHandler=require_redirect_handler();var createRedirectInterceptor=require_redirect_interceptor();Object.assign(Dispatcher.prototype,api);module2.exports.Dispatcher=Dispatcher;module2.exports.Client=Client;module2.exports.Pool=Pool;module2.exports.BalancedPool=BalancedPool;module2.exports.Agent=Agent;module2.exports.ProxyAgent=ProxyAgent2;module2.exports.EnvHttpProxyAgent=EnvHttpProxyAgent;module2.exports.RetryAgent=RetryAgent;module2.exports.RetryHandler=RetryHandler;module2.exports.DecoratorHandler=DecoratorHandler;module2.exports.RedirectHandler=RedirectHandler;module2.exports.createRedirectInterceptor=createRedirectInterceptor;module2.exports.interceptors={redirect:require_redirect(),retry:require_retry(),dump:require_dump(),dns:require_dns()};module2.exports.buildConnector=buildConnector;module2.exports.errors=errors;module2.exports.util={parseHeaders:util.parseHeaders,headerNameToString:util.headerNameToString};function makeDispatcher(fn){return(url,opts,handler)=>{if(typeof opts==="function"){handler=opts;opts=null}if(!url||typeof url!=="string"&&typeof url!=="object"&&!(url instanceof URL)){throw new InvalidArgumentError("invalid url")}if(opts!=null&&typeof opts!=="object"){throw new InvalidArgumentError("invalid opts")}if(opts&&opts.path!=null){if(typeof opts.path!=="string"){throw new InvalidArgumentError("invalid opts.path")}let path=opts.path;if(!opts.path.startsWith("/")){path=`/${path}`}url=new URL(util.parseOrigin(url).origin+path)}else{if(!opts){opts=typeof url==="object"?url:{}}url=util.parseURL(url)}const{agent,dispatcher=getGlobalDispatcher()}=opts;if(agent){throw new InvalidArgumentError("unsupported opts.agent. Did you mean opts.client?")}return fn.call(dispatcher,{...opts,origin:url.origin,path:url.search?`${url.pathname}${url.search}`:url.pathname,method:opts.method||(opts.body?"PUT":"GET")},handler)}}module2.exports.setGlobalDispatcher=setGlobalDispatcher;module2.exports.getGlobalDispatcher=getGlobalDispatcher;var fetchImpl=require_fetch().fetch;module2.exports.fetch=async function fetch(init,options=void 0){try{return await fetchImpl(init,options)}catch(err){if(err&&typeof err==="object"){Error.captureStackTrace(err)}throw err}};module2.exports.Headers=require_headers().Headers;module2.exports.Response=require_response().Response;module2.exports.Request=require_request2().Request;module2.exports.FormData=require_formdata().FormData;module2.exports.File=globalThis.File??require("node:buffer").File;module2.exports.FileReader=require_filereader().FileReader;var{setGlobalOrigin,getGlobalOrigin}=require_global();module2.exports.setGlobalOrigin=setGlobalOrigin;module2.exports.getGlobalOrigin=getGlobalOrigin;var{CacheStorage}=require_cachestorage();var{kConstruct}=require_symbols4();module2.exports.caches=new CacheStorage(kConstruct);var{deleteCookie,getCookies,getSetCookies,setCookie}=require_cookies();module2.exports.deleteCookie=deleteCookie;module2.exports.getCookies=getCookies;module2.exports.getSetCookies=getSetCookies;module2.exports.setCookie=setCookie;var{parseMIMEType,serializeAMimeType}=require_data_url();module2.exports.parseMIMEType=parseMIMEType;module2.exports.serializeAMimeType=serializeAMimeType;var{CloseEvent,ErrorEvent,MessageEvent}=require_events();module2.exports.WebSocket=require_websocket().WebSocket;module2.exports.CloseEvent=CloseEvent;module2.exports.ErrorEvent=ErrorEvent;module2.exports.MessageEvent=MessageEvent;module2.exports.request=makeDispatcher(api.request);module2.exports.stream=makeDispatcher(api.stream);module2.exports.pipeline=makeDispatcher(api.pipeline);module2.exports.connect=makeDispatcher(api.connect);module2.exports.upgrade=makeDispatcher(api.upgrade);module2.exports.MockClient=MockClient;module2.exports.MockPool=MockPool;module2.exports.MockAgent=MockAgent;module2.exports.mockErrors=mockErrors;var{EventSource}=require_eventsource();module2.exports.EventSource=EventSource}});var os=__toESM(require("os"),1);function toCommandValue(input){if(input===null||input===void 0){return""}else if(typeof input==="string"||input instanceof String){return input}return JSON.stringify(input)}function toCommandProperties(annotationProperties){if(!Object.keys(annotationProperties).length){return{}}return{title:annotationProperties.title,file:annotationProperties.file,line:annotationProperties.startLine,endLine:annotationProperties.endLine,col:annotationProperties.startColumn,endColumn:annotationProperties.endColumn}}function issueCommand(command,properties,message){const cmd=new Command(command,properties,message);process.stdout.write(cmd.toString()+os.EOL)}var CMD_STRING="::";var Command=class{constructor(command,properties,message){if(!command){command="missing.command"}this.command=command;this.properties=properties;this.message=message}toString(){let cmdStr=CMD_STRING+this.command;if(this.properties&&Object.keys(this.properties).length>0){cmdStr+=" ";let first=true;for(const key in this.properties){if(this.properties.hasOwnProperty(key)){const val=this.properties[key];if(val){if(first){first=false}else{cmdStr+=","}cmdStr+=`${key}=${escapeProperty(val)}`}}}}cmdStr+=`${CMD_STRING}${escapeData(this.message)}`;return cmdStr}};function escapeData(s){return toCommandValue(s).replace(/%/g,"%25").replace(/\r/g,"%0D").replace(/\n/g,"%0A")}function escapeProperty(s){return toCommandValue(s).replace(/%/g,"%25").replace(/\r/g,"%0D").replace(/\n/g,"%0A").replace(/:/g,"%3A").replace(/,/g,"%2C")}var crypto=__toESM(require("crypto"),1);var fs=__toESM(require("fs"),1);var os2=__toESM(require("os"),1);function issueFileCommand(command,message){const filePath=process.env[`GITHUB_${command}`];if(!filePath){throw new Error(`Unable to find environment variable for file command ${command}`)}if(!fs.existsSync(filePath)){throw new Error(`Missing file at path: ${filePath}`)}fs.appendFileSync(filePath,`${toCommandValue(message)}${os2.EOL}`,{encoding:"utf8"})}function prepareKeyValueMessage(key,value){const delimiter=`ghadelimiter_${crypto.randomUUID()}`;const convertedValue=toCommandValue(value);if(key.includes(delimiter)){throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`)}if(convertedValue.includes(delimiter)){throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`)}return`${key}<<${delimiter}${os2.EOL}${convertedValue}${os2.EOL}${delimiter}`}var os4=__toESM(require("os"),1);var tunnel=__toESM(require_tunnel2(),1);var import_undici=__toESM(require_undici(),1);var HttpCodes;(function(HttpCodes2){HttpCodes2[HttpCodes2["OK"]=200]="OK";HttpCodes2[HttpCodes2["MultipleChoices"]=300]="MultipleChoices";HttpCodes2[HttpCodes2["MovedPermanently"]=301]="MovedPermanently";HttpCodes2[HttpCodes2["ResourceMoved"]=302]="ResourceMoved";HttpCodes2[HttpCodes2["SeeOther"]=303]="SeeOther";HttpCodes2[HttpCodes2["NotModified"]=304]="NotModified";HttpCodes2[HttpCodes2["UseProxy"]=305]="UseProxy";HttpCodes2[HttpCodes2["SwitchProxy"]=306]="SwitchProxy";HttpCodes2[HttpCodes2["TemporaryRedirect"]=307]="TemporaryRedirect";HttpCodes2[HttpCodes2["PermanentRedirect"]=308]="PermanentRedirect";HttpCodes2[HttpCodes2["BadRequest"]=400]="BadRequest";HttpCodes2[HttpCodes2["Unauthorized"]=401]="Unauthorized";HttpCodes2[HttpCodes2["PaymentRequired"]=402]="PaymentRequired";HttpCodes2[HttpCodes2["Forbidden"]=403]="Forbidden";HttpCodes2[HttpCodes2["NotFound"]=404]="NotFound";HttpCodes2[HttpCodes2["MethodNotAllowed"]=405]="MethodNotAllowed";HttpCodes2[HttpCodes2["NotAcceptable"]=406]="NotAcceptable";HttpCodes2[HttpCodes2["ProxyAuthenticationRequired"]=407]="ProxyAuthenticationRequired";HttpCodes2[HttpCodes2["RequestTimeout"]=408]="RequestTimeout";HttpCodes2[HttpCodes2["Conflict"]=409]="Conflict";HttpCodes2[HttpCodes2["Gone"]=410]="Gone";HttpCodes2[HttpCodes2["TooManyRequests"]=429]="TooManyRequests";HttpCodes2[HttpCodes2["InternalServerError"]=500]="InternalServerError";HttpCodes2[HttpCodes2["NotImplemented"]=501]="NotImplemented";HttpCodes2[HttpCodes2["BadGateway"]=502]="BadGateway";HttpCodes2[HttpCodes2["ServiceUnavailable"]=503]="ServiceUnavailable";HttpCodes2[HttpCodes2["GatewayTimeout"]=504]="GatewayTimeout"})(HttpCodes||(HttpCodes={}));var Headers;(function(Headers2){Headers2["Accept"]="accept";Headers2["ContentType"]="content-type"})(Headers||(Headers={}));var MediaTypes;(function(MediaTypes2){MediaTypes2["ApplicationJson"]="application/json"})(MediaTypes||(MediaTypes={}));var HttpRedirectCodes=[HttpCodes.MovedPermanently,HttpCodes.ResourceMoved,HttpCodes.SeeOther,HttpCodes.TemporaryRedirect,HttpCodes.PermanentRedirect];var HttpResponseRetryCodes=[HttpCodes.BadGateway,HttpCodes.ServiceUnavailable,HttpCodes.GatewayTimeout];var import_os=require("os");var import_fs=require("fs");var __awaiter=function(thisArg,_arguments,P,generator){function adopt(value){return value instanceof P?value:new P(function(resolve3){resolve3(value)})}return new(P||(P=Promise))(function(resolve3,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator["throw"](value))}catch(e){reject(e)}}function step(result){result.done?resolve3(result.value):adopt(result.value).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})};var{access,appendFile,writeFile}=import_fs.promises;var SUMMARY_ENV_VAR="GITHUB_STEP_SUMMARY";var Summary=class{constructor(){this._buffer=""}filePath(){return __awaiter(this,void 0,void 0,function*(){if(this._filePath){return this._filePath}const pathFromEnv=process.env[SUMMARY_ENV_VAR];if(!pathFromEnv){throw new Error(`Unable to find environment variable for $${SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`)}try{yield access(pathFromEnv,import_fs.constants.R_OK|import_fs.constants.W_OK)}catch(_a){throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`)}this._filePath=pathFromEnv;return this._filePath})}wrap(tag,content,attrs={}){const htmlAttrs=Object.entries(attrs).map(([key,value])=>` ${key}="${value}"`).join("");if(!content){return`<${tag}${htmlAttrs}>`}return`<${tag}${htmlAttrs}>${content}`}write(options){return __awaiter(this,void 0,void 0,function*(){const overwrite=!!(options===null||options===void 0?void 0:options.overwrite);const filePath=yield this.filePath();const writeFunc=overwrite?writeFile:appendFile;yield writeFunc(filePath,this._buffer,{encoding:"utf8"});return this.emptyBuffer()})}clear(){return __awaiter(this,void 0,void 0,function*(){return this.emptyBuffer().write({overwrite:true})})}stringify(){return this._buffer}isEmptyBuffer(){return this._buffer.length===0}emptyBuffer(){this._buffer="";return this}addRaw(text,addEOL=false){this._buffer+=text;return addEOL?this.addEOL():this}addEOL(){return this.addRaw(import_os.EOL)}addCodeBlock(code,lang){const attrs=Object.assign({},lang&&{lang});const element=this.wrap("pre",this.wrap("code",code),attrs);return this.addRaw(element).addEOL()}addList(items,ordered=false){const tag=ordered?"ol":"ul";const listItems=items.map(item=>this.wrap("li",item)).join("");const element=this.wrap(tag,listItems);return this.addRaw(element).addEOL()}addTable(rows){const tableBody=rows.map(row=>{const cells=row.map(cell=>{if(typeof cell==="string"){return this.wrap("td",cell)}const{header,data,colspan,rowspan}=cell;const tag=header?"th":"td";const attrs=Object.assign(Object.assign({},colspan&&{colspan}),rowspan&&{rowspan});return this.wrap(tag,data,attrs)}).join("");return this.wrap("tr",cells)}).join("");const element=this.wrap("table",tableBody);return this.addRaw(element).addEOL()}addDetails(label,content){const element=this.wrap("details",this.wrap("summary",label)+content);return this.addRaw(element).addEOL()}addImage(src,alt,options){const{width,height}=options||{};const attrs=Object.assign(Object.assign({},width&&{width}),height&&{height});const element=this.wrap("img",null,Object.assign({src,alt},attrs));return this.addRaw(element).addEOL()}addHeading(text,level){const tag=`h${level}`;const allowedTag=["h1","h2","h3","h4","h5","h6"].includes(tag)?tag:"h1";const element=this.wrap(allowedTag,text);return this.addRaw(element).addEOL()}addSeparator(){const element=this.wrap("hr",null);return this.addRaw(element).addEOL()}addBreak(){const element=this.wrap("br",null);return this.addRaw(element).addEOL()}addQuote(text,cite){const attrs=Object.assign({},cite&&{cite});const element=this.wrap("blockquote",text,attrs);return this.addRaw(element).addEOL()}addLink(text,href){const element=this.wrap("a",text,{href});return this.addRaw(element).addEOL()}};var _summary=new Summary;var summary=_summary;var import_os2=__toESM(require("os"),1);var fs2=__toESM(require("fs"),1);var{chmod,copyFile,lstat,mkdir,open,readdir,rename,rm,rmdir,stat,symlink,unlink}=fs2.promises;var IS_WINDOWS=process.platform==="win32";var READONLY=fs2.constants.O_RDONLY;var IS_WINDOWS2=process.platform==="win32";var platform=import_os2.default.platform();var arch=import_os2.default.arch();var ExitCode;(function(ExitCode2){ExitCode2[ExitCode2["Success"]=0]="Success";ExitCode2[ExitCode2["Failure"]=1]="Failure"})(ExitCode||(ExitCode={}));function getInput(name,options){const val=process.env[`INPUT_${name.replace(/ /g,"_").toUpperCase()}`]||"";if(options&&options.required&&!val){throw new Error(`Input required and not supplied: ${name}`)}if(options&&options.trimWhitespace===false){return val}return val.trim()}function setOutput(name,value){const filePath=process.env["GITHUB_OUTPUT"]||"";if(filePath){return issueFileCommand("OUTPUT",prepareKeyValueMessage(name,value))}process.stdout.write(os4.EOL);issueCommand("set-output",{name},toCommandValue(value))}function setFailed(message){process.exitCode=ExitCode.Failure;error(message)}function error(message,properties={}){issueCommand("error",toCommandProperties(properties),message instanceof Error?message.toString():message)}function info(message){process.stdout.write(message+os4.EOL)}var import_promises4=require("node:fs/promises");var import_node_path2=require("node:path");var import_promises=require("node:fs/promises");var import_node_path=require("node:path");var import_node_crypto=require("node:crypto");var ENGINE_VERSION="0.7.0";var RULE_SET_VERSION="1.1.0";var PRODUCT_NAME="seo-crawl-audit";var DEFAULT_USER_AGENT=`${PRODUCT_NAME}/${ENGINE_VERSION}`;var DEFAULT_OPEN_GRAPH={title:null,description:null,image:null};var DEFAULT_TWITTER={card:null,title:null,description:null,image:null};function baselineInput(value){if(!value||typeof value!=="object"||Array.isArray(value)){throw new Error("snapshot must be an object")}return value}function pageInput(value){if(!value||typeof value!=="object"||typeof value.url!=="string"){throw new Error("snapshot page URL must be a string")}return value}function stableJson(value){if(Array.isArray(value)){return`[${value.map(stableJson).join(",")}]`}if(value&&typeof value==="object"){return`{${Object.entries(value).sort(([left],[right])=>left.localeCompare(right)).map(([key,child])=>`${JSON.stringify(key)}:${stableJson(child)}`).join(",")}}`}return JSON.stringify(value)}function hashConfiguration(config){return(0,import_node_crypto.createHash)("sha256").update(stableJson(config)).digest("hex")}function normalizePage(page){return{url:page.url,finalUrl:page.finalUrl??null,status:page.status??null,contentType:page.contentType??null,blockedByRobots:page.blockedByRobots??false,error:page.error??null,title:page.title??null,description:page.description??null,canonical:page.canonical??null,canonicalRaw:page.canonicalRaw??page.canonical??null,robots:page.robots??null,xRobotsTag:page.xRobotsTag??null,lang:page.lang??null,h1Count:page.h1Count??0,openGraph:page.openGraph??DEFAULT_OPEN_GRAPH,twitter:page.twitter??DEFAULT_TWITTER,hreflang:page.hreflang??[],jsonLd:page.jsonLd??[],images:page.images??[],links:[...page.links??[]].sort(),internalLinks:[...page.internalLinks??[]].sort(),externalLinks:[...page.externalLinks??[]].sort(),wordCount:page.wordCount??0,contentHash:page.contentHash??null,depth:page.depth??0,redirectChain:page.redirectChain??[],responseBytes:page.responseBytes??0}}function defaultConfig(input){const source=input.source??{};const options=input.options??{};const firstPage=input.pages?.[0];const firstPageUrl=firstPage&&typeof firstPage==="object"?firstPage.url:void 0;const url=input.siteUrl??input.startUrl??source.startUrl??(typeof firstPageUrl==="string"?firstPageUrl:void 0);if(!url)throw new Error("snapshot site URL must be a string");return{schemaVersion:1,url,sitemap:options.sitemap??source.sitemap??"auto",maxPages:options.maxPages??source.maxPages??100,concurrency:options.concurrency??5,delay:options.requestDelay??source.requestDelay??100,timeout:options.timeout??1e4,respectRobots:options.respectRobots??source.respectRobots??true,includeQuery:options.includeQuery??source.includeQuery??false,maxRedirects:options.maxRedirects??10,maxResponseBytes:options.maxResponseBytes??5*1024*1024,enabledRules:options.enabledRules??null,severityOverrides:options.severityOverrides??{},suppressions:options.suppressions??[],regressionBudgets:options.regressionBudgets??{},report:options.report??{}}}function createLinkGraph(pages,sitemapUrls){const known=new Set(pages.map(page=>page.url));const linked=new Set(pages.flatMap(page=>page.internalLinks));const broken=new Set;for(const page of pages){if(page.error||page.blockedByRobots||(page.status??500)>=400){broken.add(page.url)}}return{internalEdges:pages.reduce((sum,page)=>sum+page.internalLinks.length,0),externalEdges:pages.reduce((sum,page)=>sum+page.externalLinks.length,0),orphanUrls:sitemapUrls.filter(url=>known.has(url)&&!linked.has(url)),brokenInternalUrls:[...broken].sort()}}function createStatistics(input,pages){const blockedByRobots=pages.filter(page=>page.blockedByRobots).length;const failed=pages.filter(page=>page.error||(page.status??500)>=400).length;return{requested:input.requested??pages.length,completed:pages.length,succeeded:pages.length-failed-blockedByRobots,failed,blockedByRobots,redirected:pages.filter(page=>page.redirectChain.length>0||page.url!==page.finalUrl).length,durationMs:input.durationMs??0,truncated:input.truncated??false,partial:input.partial??false}}function createBaseline(scanInput){const scan2=baselineInput(scanInput);const config=defaultConfig(scan2);const pages=(scan2.pages??[]).map(page=>normalizePage(pageInput(page))).sort((left,right)=>left.url.localeCompare(right.url));const sitemapUrls=scan2.sitemap?.urls??[];if(scan2.sitemap&&!scan2.sitemap.url)throw new Error("snapshot sitemap URL must be a string");const sitemap=scan2.sitemap?{url:scan2.sitemap.url,urls:[...sitemapUrls].sort(),sitemapCount:scan2.sitemap.sitemapCount??0,truncated:scan2.sitemap.truncated??false,error:scan2.sitemap.error??null}:null;const siteUrl=scan2.startUrl??config.url;const truncated=scan2.truncated??false;return{schemaVersion:2,engineVersion:ENGINE_VERSION,ruleSetVersion:RULE_SET_VERSION,generatedAt:scan2.generatedAt??new Date().toISOString(),siteUrl,configurationHash:hashConfiguration(config),config,robots:{url:scan2.robots?.url??new URL("/robots.txt",siteUrl).href,status:scan2.robots?.status??null,sha256:scan2.robots?.sha256??null,error:scan2.robots?.error??null,denyAll:scan2.robots?.denyAll??false},sitemap,pages,linkGraph:scan2.linkGraph??createLinkGraph(pages,sitemapUrls),statistics:scan2.statistics??createStatistics(scan2,pages),partial:scan2.partial??false,source:{startUrl:siteUrl,maxPages:config.maxPages,requestDelay:config.delay,includeQuery:config.includeQuery,respectRobots:config.respectRobots,sitemap:typeof config.sitemap==="string"&&!["auto","none"].includes(config.sitemap)?config.sitemap:null},truncated}}function migrateSnapshot(input){const value=baselineInput(input);if(!Array.isArray(value.pages)){throw new Error("snapshot pages must be an array")}if(value.schemaVersion===2){return createBaseline({...value,startUrl:value.siteUrl,options:value.config,pages:value.pages,generatedAt:value.generatedAt,partial:value.partial,statistics:value.statistics,linkGraph:value.linkGraph})}if(value.schemaVersion===1){return createBaseline(value)}throw new Error(`unsupported snapshot schema version: ${String(value.schemaVersion)}`)}var DEFAULT_CONFIG_FILE="seo-audit.config.json";var DEFAULT_SCAN_CONFIG=Object.freeze({schemaVersion:1,url:"",sitemap:"auto",maxPages:100,concurrency:5,delay:100,timeout:1e4,respectRobots:true,includeQuery:false,maxRedirects:10,maxResponseBytes:5*1024*1024,enabledRules:null,severityOverrides:{},suppressions:[],regressionBudgets:{},report:{}});function object(value,field){if(!value||typeof value!=="object"||Array.isArray(value)){throw new Error(`${field} must be an object`)}return value}function integer(value,field,minimum,maximum=Number.MAX_SAFE_INTEGER){if(!Number.isInteger(value)||valuemaximum){throw new Error(`${field} must be an integer between ${minimum} and ${maximum}`)}return value}function optionalString(value,field){if(value===void 0)return void 0;if(typeof value!=="string")throw new Error(`${field} must be a string`);return value}function validateConfig(input){const value=object(input,"config");const allowed=new Set(["$schema","schemaVersion","url","sitemap","maxPages","concurrency","delay","timeout","respectRobots","includeQuery","maxRedirects","maxResponseBytes","enabledRules","severityOverrides","suppressions","regressionBudgets","report"]);for(const key of Object.keys(value)){if(!allowed.has(key))throw new Error(`unknown config property: ${key}`)}const result={};if(value.schemaVersion!==void 0&&value.schemaVersion!==1)throw new Error("schemaVersion must be 1");if(value.url!==void 0){const url=optionalString(value.url,"url");if(!/^https?:\/\//i.test(url))throw new Error("url must be an HTTP(S) URL");result.url=url}if(value.sitemap!==void 0){const sitemap=optionalString(value.sitemap,"sitemap");if(!["auto","none"].includes(sitemap)&&!/^https?:\/\//i.test(sitemap)){throw new Error("sitemap must be auto, none, or an HTTP(S) URL")}result.sitemap=sitemap}if(value.maxPages!==void 0)result.maxPages=integer(value.maxPages,"maxPages",1);if(value.concurrency!==void 0)result.concurrency=integer(value.concurrency,"concurrency",1,50);if(value.delay!==void 0)result.delay=integer(value.delay,"delay",0);if(value.timeout!==void 0)result.timeout=integer(value.timeout,"timeout",1);if(value.maxRedirects!==void 0)result.maxRedirects=integer(value.maxRedirects,"maxRedirects",0,50);if(value.maxResponseBytes!==void 0)result.maxResponseBytes=integer(value.maxResponseBytes,"maxResponseBytes",1024);for(const field of["respectRobots","includeQuery"]){if(value[field]!==void 0){if(typeof value[field]!=="boolean")throw new Error(`${field} must be a boolean`);result[field]=value[field]}}if(value.enabledRules!==void 0){if(value.enabledRules!==null&&(!Array.isArray(value.enabledRules)||value.enabledRules.some(rule=>typeof rule!=="string"))){throw new Error("enabledRules must be null or an array of rule IDs")}result.enabledRules=value.enabledRules}if(value.severityOverrides!==void 0){const overrides=object(value.severityOverrides,"severityOverrides");for(const[rule,severity]of Object.entries(overrides)){if(!["error","warning","info"].includes(severity)){throw new Error(`severityOverrides.${rule} must be error, warning, or info`)}}result.severityOverrides=overrides}if(value.suppressions!==void 0){if(!Array.isArray(value.suppressions))throw new Error("suppressions must be an array");result.suppressions=value.suppressions.map((entry,index)=>{const suppression=object(entry,`suppressions[${index}]`);for(const field of["rule","urlPattern","reason"]){if(typeof suppression[field]!=="string"||suppression[field]===""){throw new Error(`suppressions[${index}].${field} must be a non-empty string`)}}if(suppression.expiresAt!==void 0&&!/^\d{4}-\d{2}-\d{2}$/.test(String(suppression.expiresAt))){throw new Error(`suppressions[${index}].expiresAt must use YYYY-MM-DD`)}return suppression})}if(value.regressionBudgets!==void 0){const budgets=object(value.regressionBudgets,"regressionBudgets");result.regressionBudgets=Object.fromEntries(Object.entries(budgets).map(([key,budget])=>[key,integer(budget,`regressionBudgets.${key}`,0)]))}if(value.report!==void 0){const report=object(value.report,"report");const branding={};const agencyName=optionalString(report.agencyName,"report.agencyName");const logo=optionalString(report.logo,"report.logo");const primaryColor=optionalString(report.primaryColor,"report.primaryColor");if(agencyName!==void 0)branding.agencyName=agencyName;if(logo!==void 0)branding.logo=logo;if(primaryColor!==void 0)branding.primaryColor=primaryColor;if(branding.primaryColor&&!/^#[0-9a-f]{6}$/i.test(branding.primaryColor)){throw new Error("report.primaryColor must be a six-digit hex color")}result.report=Object.fromEntries(Object.entries(branding).filter(([,child])=>child!==void 0))}return result}function resolveConfig(cli,file={},baseline={}){const merged={...DEFAULT_SCAN_CONFIG,...baseline,...file,...cli};return{...merged,schemaVersion:1,severityOverrides:{...baseline.severityOverrides??{},...file.severityOverrides??{},...cli.severityOverrides??{}},regressionBudgets:{...baseline.regressionBudgets??{},...file.regressionBudgets??{},...cli.regressionBudgets??{}},report:{...baseline.report??{},...file.report??{},...cli.report??{}},suppressions:cli.suppressions??file.suppressions??baseline.suppressions??[]}}function segmentToken(segment){if(/^\d+$/.test(segment))return":id";if(/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(segment))return":uuid";if(/^\d{4}-\d{2}-\d{2}$/.test(segment))return":date";if(/^[0-9a-f]{16,}$/i.test(segment))return":hash";return null}function parseIssueUrls(issues){return issues.flatMap(issue2=>{try{const url=new URL(issue2.url);return[{issue:issue2,url,segments:url.pathname.split("/").filter(Boolean)}]}catch{return[]}})}function dynamicSegments(pages){const siblings=new Map;for(const page of pages){for(let index=1;indexvalues.size>=2).map(([key])=>key))}function templateFor(page,dynamic){const segments=page.segments.map((segment,index)=>{const token=segmentToken(segment);if(token)return token;const prefix=page.segments.slice(0,index).join("/");const key=`${page.url.origin}|${page.segments.length}|${index}|${prefix}`;return index>0&&dynamic.has(key)?":slug":segment});return`/${segments.join("/")}${page.url.pathname.endsWith("/")&&segments.length>0?"/":""}`}function groupIssuesByTemplate(issues){const pages=parseIssueUrls(issues);const dynamic=dynamicSegments(pages);const grouped=new Map;for(const page of pages){const template=templateFor(page,dynamic);const key=`${page.url.origin}${template}`;const group=grouped.get(key)??{origin:page.url.origin,template,issues:[],urls:new Set};group.issues.push(page.issue);group.urls.add(page.issue.url);grouped.set(key,group)}return[...grouped.values()].map(group=>{const severities={error:0,warning:0,info:0};const rules={};const owners={};for(const issue2 of group.issues){severities[issue2.severity]+=1;rules[issue2.ruleId]=(rules[issue2.ruleId]??0)+1;owners[issue2.owner]=(owners[issue2.owner]??0)+1}const urls=[...group.urls].sort();return{origin:group.origin,template:group.template,issueCount:group.issues.length,affectedPages:urls.length,severities,rules,owners,urls,representativeUrls:urls.slice(0,3)}}).sort((left,right)=>right.issueCount-left.issueCount||left.template.localeCompare(right.template)||left.origin.localeCompare(right.origin))}function englishRuleLabel(ruleId){const text=ruleId.replaceAll("-"," ");return text.charAt(0).toUpperCase()+text.slice(1)}var UK_RULE_LABELS={"page-unreachable":"\u041D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430","http-error":"HTTP-\u043F\u043E\u043C\u0438\u043B\u043A\u0430",noindex:"Noindex","x-robots-noindex":"Noindex \u0443 X-Robots-Tag","robots-blocked":"\u0417\u0430\u0431\u043B\u043E\u043A\u043E\u0432\u0430\u043D\u043E robots.txt","missing-canonical":"\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439 canonical","invalid-canonical":"\u041D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 canonical","cross-domain-canonical":"Canonical \u043D\u0430 \u0456\u043D\u0448\u043E\u043C\u0443 \u0434\u043E\u043C\u0435\u043D\u0456","canonical-target-error":"\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u0446\u0456\u043B\u0456 canonical","redirect-loop":"\u0426\u0438\u043A\u043B \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044C","long-redirect-chain":"\u0414\u043E\u0432\u0433\u0438\u0439 \u043B\u0430\u043D\u0446\u044E\u0436\u043E\u043A \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044C","sitemap-unavailable":"Sitemap \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439","noindex-in-sitemap":"Noindex \u0443 sitemap","redirect-in-sitemap":"\u041F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044F \u0443 sitemap","missing-title":"\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439 title","duplicate-title":"\u0414\u0443\u0431\u043B\u044C\u043E\u0432\u0430\u043D\u0438\u0439 title","title-length":"\u0414\u043E\u0432\u0436\u0438\u043D\u0430 title","missing-description":"\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439 description","duplicate-description":"\u0414\u0443\u0431\u043B\u044C\u043E\u0432\u0430\u043D\u0438\u0439 description","description-length":"\u0414\u043E\u0432\u0436\u0438\u043D\u0430 description","missing-h1":"\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439 H1","broken-internal-link":"\u041D\u0435\u0440\u043E\u0431\u043E\u0447\u0435 \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0454 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F","orphan-sitemap-page":"\u0406\u0437\u043E\u043B\u044C\u043E\u0432\u0430\u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 sitemap","crawlable-not-in-sitemap":"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u0432\u0456\u0434\u0441\u0443\u0442\u043D\u044F \u0443 sitemap","invalid-hreflang":"\u041D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 hreflang","malformed-json-ld":"\u041D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 JSON-LD","http-on-https-site":"HTTP URL \u043D\u0430 HTTPS-\u0441\u0430\u0439\u0442\u0456","invalid-language":"\u041D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0435 \u043E\u0433\u043E\u043B\u043E\u0448\u0435\u043D\u043D\u044F \u043C\u043E\u0432\u0438","duplicate-content":"\u0414\u0443\u0431\u043B\u044C\u043E\u0432\u0430\u043D\u0438\u0439 \u043A\u043E\u043D\u0442\u0435\u043D\u0442","multiple-h1":"\u041A\u0456\u043B\u044C\u043A\u0430 H1","missing-open-graph":"\u041D\u0435\u043F\u043E\u0432\u043D\u0456 Open Graph metadata","missing-twitter-metadata":"\u041D\u0435\u043F\u043E\u0432\u043D\u0456 Twitter metadata","image-missing-alt":"\u0417\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u0431\u0435\u0437 alt","low-word-count":"\u041C\u0430\u043B\u043E \u0442\u0435\u043A\u0441\u0442\u0443","robots-changed":"robots.txt \u0437\u043C\u0456\u043D\u0435\u043D\u043E","page-missing":"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u043D\u0435 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u043E","status-regression":"\u0420\u0435\u0433\u0440\u0435\u0441\u0456\u044F HTTP-\u0441\u0442\u0430\u0442\u0443\u0441\u0443","new-noindex":"\u041D\u043E\u0432\u0438\u0439 noindex","title-removed":"Title \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E","title-changed":"Title \u0437\u043C\u0456\u043D\u0435\u043D\u043E","description-removed":"Description \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E","canonical-removed":"Canonical \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E","canonical-changed":"Canonical \u0437\u043C\u0456\u043D\u0435\u043D\u043E","h1-removed":"H1 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E","redirect-changed":"\u041F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044F \u0437\u043C\u0456\u043D\u0435\u043D\u043E","sitemap-url-count-drop":"\u0417\u043C\u0435\u043D\u0448\u0435\u043D\u043D\u044F URL \u0443 sitemap"};var UK_REMEDIATIONS={"page-unreachable":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0430\u0431\u043E \u043F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u043D\u0430 \u043D\u0435\u0457.","http-error":"\u041F\u043E\u0432\u0435\u0440\u043D\u0456\u0442\u044C \u0443\u0441\u043F\u0456\u0448\u043D\u0443 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C \u0430\u0431\u043E \u0441\u0432\u0456\u0434\u043E\u043C\u0435 \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044F.",noindex:"\u041F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C noindex, \u044F\u043A\u0449\u043E \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0430\u0454 \u0437\u2019\u044F\u0432\u043B\u044F\u0442\u0438\u0441\u044F \u0432 \u043F\u043E\u0448\u0443\u043A\u0443.","x-robots-noindex":"\u041F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C noindex \u0456\u0437 X-Robots-Tag, \u044F\u043A\u0449\u043E \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0430\u0454 \u0456\u043D\u0434\u0435\u043A\u0441\u0443\u0432\u0430\u0442\u0438\u0441\u044F.","robots-blocked":"\u0414\u043E\u0437\u0432\u043E\u043B\u044C\u0442\u0435 URL \u0443 robots.txt, \u044F\u043A\u0449\u043E \u0439\u043E\u0433\u043E \u043F\u043E\u0442\u0440\u0456\u0431\u043D\u043E \u0441\u043A\u0430\u043D\u0443\u0432\u0430\u0442\u0438.","missing-canonical":"\u0412\u043A\u0430\u0436\u0456\u0442\u044C \u0431\u0430\u0436\u0430\u043D\u0438\u0439 canonical URL, \u044F\u043A\u0449\u043E \u043C\u043E\u0436\u043B\u0438\u0432\u0456 \u0434\u0443\u0431\u043B\u0456\u043A\u0430\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0438.","invalid-canonical":"\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u0439\u0442\u0435 \u0430\u0431\u0441\u043E\u043B\u044E\u0442\u043D\u0438\u0439 \u0430\u0431\u043E \u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 \u0432\u0456\u0434\u043D\u043E\u0441\u043D\u0438\u0439 HTTP(S) canonical URL.","cross-domain-canonical":"\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u0437\u043E\u0432\u043D\u0456\u0448\u043D\u0456\u0439 canonical \u0430\u0431\u043E \u0432\u043A\u0430\u0436\u0456\u0442\u044C \u043F\u043E\u0442\u0440\u0456\u0431\u043D\u0438\u0439 URL \u0446\u044C\u043E\u0433\u043E \u0441\u0430\u0439\u0442\u0443.","canonical-target-error":"\u0421\u043F\u0440\u044F\u043C\u0443\u0439\u0442\u0435 canonical \u043D\u0430 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439 URL, \u0434\u043E\u0437\u0432\u043E\u043B\u0435\u043D\u0438\u0439 \u0434\u043B\u044F \u0456\u043D\u0434\u0435\u043A\u0441\u0430\u0446\u0456\u0457.","redirect-loop":"\u041F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u0446\u0438\u043A\u043B\u0456\u0447\u043D\u0438\u0439 \u043C\u0430\u0440\u0448\u0440\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044C.","long-redirect-chain":"\u041F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u0439\u0442\u0435 \u043E\u0434\u0440\u0430\u0437\u0443 \u043D\u0430 \u043A\u0456\u043D\u0446\u0435\u0432\u0443 \u0430\u0434\u0440\u0435\u0441\u0443.","sitemap-unavailable":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 \u0456 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439 XML sitemap.","noindex-in-sitemap":"\u041F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C URL \u0456\u0437 sitemap \u0430\u0431\u043E \u0434\u043E\u0437\u0432\u043E\u043B\u044C\u0442\u0435 \u0439\u043E\u0433\u043E \u0456\u043D\u0434\u0435\u043A\u0441\u0430\u0446\u0456\u044E.","redirect-in-sitemap":"\u0417\u0430\u043C\u0456\u043D\u0456\u0442\u044C URL \u0443 sitemap \u043D\u0430 \u0439\u043E\u0433\u043E \u043A\u0456\u043D\u0446\u0435\u0432\u0443 canonical-\u0430\u0434\u0440\u0435\u0441\u0443.","missing-title":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u0443\u043D\u0456\u043A\u0430\u043B\u044C\u043D\u0438\u0439 \u043E\u043F\u0438\u0441\u043E\u0432\u0438\u0439 HTML title.","duplicate-title":"\u041D\u0430\u043F\u0438\u0448\u0456\u0442\u044C title, \u044F\u043A\u0438\u0439 \u0443\u043D\u0456\u043A\u0430\u043B\u044C\u043D\u043E \u043E\u043F\u0438\u0441\u0443\u0454 \u0446\u044E \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443.","title-length":"\u0417\u0440\u043E\u0431\u0456\u0442\u044C title \u0441\u0442\u0438\u0441\u043B\u0438\u043C \u0456 \u0437\u043C\u0456\u0441\u0442\u043E\u0432\u043D\u0438\u043C, \u0437\u0430\u0437\u0432\u0438\u0447\u0430\u0439 10\u201360 \u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432.","missing-description":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0439 meta description.","duplicate-description":"\u041D\u0430\u043F\u0438\u0448\u0456\u0442\u044C \u0443\u043D\u0456\u043A\u0430\u043B\u044C\u043D\u0438\u0439 meta description \u0434\u043B\u044F \u0446\u0456\u0454\u0457 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438.","description-length":"\u0417\u0440\u043E\u0431\u0456\u0442\u044C description \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043C \u0456 \u0437\u0430\u0437\u0432\u0438\u0447\u0430\u0439 \u0434\u043E\u0432\u0436\u0438\u043D\u043E\u044E 50\u2013160 \u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432.","missing-h1":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u043E\u0434\u0438\u043D \u0437\u0440\u043E\u0437\u0443\u043C\u0456\u043B\u0438\u0439 \u043E\u0441\u043D\u043E\u0432\u043D\u0438\u0439 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A.","broken-internal-link":"\u041E\u043D\u043E\u0432\u0456\u0442\u044C \u0430\u0431\u043E \u043F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0454 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u0447\u0438 \u0432\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u0439\u043E\u0433\u043E \u0446\u0456\u043B\u044C.","orphan-sitemap-page":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u0437\u043C\u0456\u0441\u0442\u043E\u0432\u043D\u0456 \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0456 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0456\u0437 sitemap.","crawlable-not-in-sitemap":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0434\u043E sitemap \u0430\u0431\u043E \u0441\u0432\u0456\u0434\u043E\u043C\u043E \u0432\u0438\u043A\u043B\u044E\u0447\u0456\u0442\u044C \u0457\u0457.","invalid-hreflang":"\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u0439\u0442\u0435 \u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0456 \u043C\u043E\u0432\u043D\u0456 \u0442\u0435\u0433\u0438 \u0442\u0430 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0456 HTTP(S) alternate URL.","malformed-json-ld":"\u0412\u0438\u043F\u0440\u0430\u0432\u0442\u0435 JSON-\u0441\u0438\u043D\u0442\u0430\u043A\u0441\u0438\u0441 \u0443 \u0431\u043B\u043E\u0446\u0456 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u043E\u0432\u0430\u043D\u0438\u0445 \u0434\u0430\u043D\u0438\u0445.","http-on-https-site":"\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0439\u0442\u0435 HTTPS \u0434\u043B\u044F \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0456\u0445 URL \u0456 metadata.","invalid-language":"\u0412\u043A\u0430\u0436\u0456\u0442\u044C \u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 \u043C\u043E\u0432\u043D\u0438\u0439 \u0442\u0435\u0433 BCP 47 \u0432 \u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0456 html.","duplicate-content":"\u041E\u0431\u2019\u0454\u0434\u043D\u0430\u0439\u0442\u0435 \u0434\u0443\u0431\u043B\u044C\u043E\u0432\u0430\u043D\u0456 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0430\u0431\u043E \u0437\u0440\u043E\u0431\u0456\u0442\u044C \u0457\u0445\u043D\u0456\u0439 \u043E\u0441\u043D\u043E\u0432\u043D\u0438\u0439 \u043A\u043E\u043D\u0442\u0435\u043D\u0442 \u0432\u0456\u0434\u043C\u0456\u043D\u043D\u0438\u043C.","multiple-h1":"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435, \u0447\u0438 \u043E\u0434\u0438\u043D \u043E\u0441\u043D\u043E\u0432\u043D\u0438\u0439 H1 \u043D\u0435 \u0437\u0440\u043E\u0431\u0438\u0442\u044C \u0456\u0454\u0440\u0430\u0440\u0445\u0456\u044E \u0437\u0440\u043E\u0437\u0443\u043C\u0456\u043B\u0456\u0448\u043E\u044E.","missing-open-graph":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 Open Graph title, description \u0442\u0430 image \u0434\u043B\u044F \u043F\u043E\u0448\u0438\u0440\u0435\u043D\u043D\u044F \u0432 \u0441\u043E\u0446\u043C\u0435\u0440\u0435\u0436\u0430\u0445.","missing-twitter-metadata":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 Twitter card metadata, \u044F\u043A\u0449\u043E \u0432\u0430\u0436\u043B\u0438\u0432\u0456 \u0441\u043E\u0446\u0456\u0430\u043B\u044C\u043D\u0456 \u043F\u0440\u0435\u0432\u2019\u044E.","image-missing-alt":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u0437\u043C\u0456\u0441\u0442\u043E\u0432\u043D\u0438\u0439 alt \u0430\u0431\u043E \u043F\u043E\u0440\u043E\u0436\u043D\u0456\u0439 alt \u0434\u043B\u044F \u0434\u0435\u043A\u043E\u0440\u0430\u0442\u0438\u0432\u043D\u0438\u0445 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u044C.","low-word-count":"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435, \u0447\u0438 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u0434\u043E\u0441\u0442\u0430\u0442\u043D\u044C\u043E \u043A\u043E\u0440\u0438\u0441\u043D\u043E\u0433\u043E \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u0433\u043E \u043A\u043E\u043D\u0442\u0435\u043D\u0442\u0443.","robots-changed":"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u0437\u043C\u0456\u043D\u0443 robots.txt \u0456 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435, \u0449\u043E \u0434\u043E\u0441\u0442\u0443\u043F \u0434\u043B\u044F \u0441\u043A\u0430\u043D\u0443\u0432\u0430\u043D\u043D\u044F \u0437\u043C\u0456\u043D\u0435\u043D\u043E \u0441\u0432\u0456\u0434\u043E\u043C\u043E.","page-missing":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0434\u043E \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438 \u0430\u0431\u043E \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435, \u0449\u043E \u0457\u0457 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E \u0441\u0432\u0456\u0434\u043E\u043C\u043E.","status-regression":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u043D\u044E \u0443\u0441\u043F\u0456\u0448\u043D\u0443 HTTP-\u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C.","new-noindex":"\u041F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u043D\u043E\u0432\u0438\u0439 noindex, \u044F\u043A\u0449\u043E \u0439\u043E\u0433\u043E \u043D\u0435 \u0434\u043E\u0434\u0430\u043D\u043E \u043D\u0430\u0432\u043C\u0438\u0441\u043D\u043E.","title-removed":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u0437\u043C\u0456\u0441\u0442\u043E\u0432\u043D\u0438\u0439 title.","title-changed":"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u0442\u0430 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u0437\u043C\u0456\u043D\u0435\u043D\u0438\u0439 title.","description-removed":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0439 meta description.","canonical-removed":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C canonical.","canonical-changed":"\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435, \u0449\u043E \u043D\u043E\u0432\u0430 \u0446\u0456\u043B\u044C canonical \u0441\u0432\u0456\u0434\u043E\u043C\u0430 \u0439 \u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0430.","h1-removed":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u0437\u0440\u043E\u0437\u0443\u043C\u0456\u043B\u0438\u0439 \u043E\u0441\u043D\u043E\u0432\u043D\u0438\u0439 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A.","redirect-changed":"\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435, \u0449\u043E \u043D\u043E\u0432\u0430 \u0446\u0456\u043B\u044C \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044F \u0441\u0432\u0456\u0434\u043E\u043C\u0430.","sitemap-url-count-drop":"\u0414\u043E\u0441\u043B\u0456\u0434\u0456\u0442\u044C \u0432\u0442\u0440\u0430\u0442\u0443 URL \u0443 sitemap \u0456 \u043F\u043E\u0432\u0435\u0440\u043D\u0456\u0442\u044C \u043F\u0440\u043E\u043F\u0443\u0449\u0435\u043D\u0456 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0434\u043B\u044F \u0456\u043D\u0434\u0435\u043A\u0441\u0430\u0446\u0456\u0457."};function actual(issue2){return issue2.evidence?.actual??issue2.after}function ukrainianMessage(issue2,ruleId){const value=actual(issue2);switch(ruleId){case"page-unreachable":case"redirect-loop":return`\u0417\u0430\u043F\u0438\u0442 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0432\u0441\u044F \u043F\u043E\u043C\u0438\u043B\u043A\u043E\u044E: ${String(value??"\u043D\u0435\u0432\u0456\u0434\u043E\u043C\u0430 \u043F\u043E\u043C\u0438\u043B\u043A\u0430")}`;case"http-error":return`\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043F\u043E\u0432\u0435\u0440\u043D\u0443\u043B\u0430 HTTP ${String(value??"\u043D\u0435\u0432\u0456\u0434\u043E\u043C\u043E")}`;case"noindex":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u0434\u0438\u0440\u0435\u043A\u0442\u0438\u0432\u0443 noindex \u0443 meta";case"x-robots-noindex":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0456\u0441\u0442\u0438\u0442\u044C noindex \u0443 X-Robots-Tag";case"robots-blocked":return issue2.before===false?"\u0422\u0435\u043F\u0435\u0440 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0437\u0430\u0431\u043B\u043E\u043A\u043E\u0432\u0430\u043D\u043E \u0447\u0435\u0440\u0435\u0437 robots.txt":"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0437\u0430\u0431\u043B\u043E\u043A\u043E\u0432\u0430\u043D\u043E \u0447\u0435\u0440\u0435\u0437 robots.txt";case"missing-canonical":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043D\u0435 \u043C\u0456\u0441\u0442\u0438\u0442\u044C canonical URL";case"invalid-canonical":return"Canonical URL \u043D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439";case"cross-domain-canonical":return"Canonical \u0432\u043A\u0430\u0437\u0443\u0454 \u043D\u0430 \u0456\u043D\u0448\u0438\u0439 \u0434\u043E\u043C\u0435\u043D";case"canonical-target-error":return"\u0426\u0456\u043B\u044C canonical \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430";case"long-redirect-chain":return`\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0454 ${String(value??0)} \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044C`;case"sitemap-unavailable":return"\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438 \u043D\u0430\u043B\u0430\u0448\u0442\u043E\u0432\u0430\u043D\u0438\u0439 sitemap";case"noindex-in-sitemap":return"URL \u0456\u0437 sitemap \u043F\u043E\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439 noindex";case"redirect-in-sitemap":return"URL \u0456\u0437 sitemap \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u0454\u0442\u044C\u0441\u044F";case"missing-title":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043D\u0435 \u043C\u0430\u0454 title";case"duplicate-title":return"\u041A\u0456\u043B\u044C\u043A\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043E\u043A \u043C\u0430\u044E\u0442\u044C \u043E\u0434\u043D\u0430\u043A\u043E\u0432\u0438\u0439 title";case"title-length":return`\u0414\u043E\u0432\u0436\u0438\u043D\u0430 title \u2014 ${String(value??0)} \u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432`;case"missing-description":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043D\u0435 \u043C\u0430\u0454 meta description";case"duplicate-description":return"\u041A\u0456\u043B\u044C\u043A\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043E\u043A \u043C\u0430\u044E\u0442\u044C \u043E\u0434\u043D\u0430\u043A\u043E\u0432\u0438\u0439 meta description";case"description-length":return`\u0414\u043E\u0432\u0436\u0438\u043D\u0430 description \u2014 ${String(value??0)} \u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432`;case"missing-h1":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043D\u0435 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430 H1";case"multiple-h1":return`\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0456\u0441\u0442\u0438\u0442\u044C H1 \u0443 \u043A\u0456\u043B\u044C\u043A\u043E\u0441\u0442\u0456: ${String(value??0)}`;case"broken-internal-link":return"\u0412\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0454 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u0432\u0435\u0434\u0435 \u043D\u0430 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0443 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443";case"orphan-sitemap-page":return"\u041D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0456\u0437 sitemap \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0456\u0445 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u044C";case"crawlable-not-in-sitemap":return"\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u0434\u043B\u044F \u0441\u043A\u0430\u043D\u0443\u0432\u0430\u043D\u043D\u044F \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u0432\u0456\u0434\u0441\u0443\u0442\u043D\u044F \u0443 sitemap";case"invalid-hreflang":return"\u041E\u0433\u043E\u043B\u043E\u0448\u0435\u043D\u043D\u044F hreflang \u043D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0435";case"malformed-json-ld":return"\u0411\u043B\u043E\u043A JSON-LD \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u043D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 JSON";case"http-on-https-site":return"HTTPS-\u0441\u0430\u0439\u0442 \u043F\u043E\u0441\u0438\u043B\u0430\u0454\u0442\u044C\u0441\u044F \u043D\u0430 \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0456\u0439 HTTP URL";case"invalid-language":return"\u041E\u0433\u043E\u043B\u043E\u0448\u0435\u043D\u043D\u044F \u043C\u043E\u0432\u0438 HTML \u043D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0435";case"duplicate-content":return"\u041E\u0441\u043D\u043E\u0432\u043D\u0438\u0439 \u0442\u0435\u043A\u0441\u0442 \u0454 \u0442\u043E\u0447\u043D\u0438\u043C \u0434\u0443\u0431\u043B\u0435\u043C \u0456\u043D\u0448\u043E\u0457 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438";case"missing-open-graph":return"Open Graph metadata \u043D\u0435\u043F\u043E\u0432\u043D\u0456";case"missing-twitter-metadata":return"Twitter card metadata \u043D\u0435\u043F\u043E\u0432\u043D\u0456";case"image-missing-alt":return`${Array.isArray(value)?value.length:String(value??0)} \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u044C \u043D\u0435 \u043C\u0430\u044E\u0442\u044C \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 alt`;case"low-word-count":return`\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u043F\u0440\u0438\u0431\u043B\u0438\u0437\u043D\u043E ${String(value??0)} \u0432\u0438\u0434\u0438\u043C\u0438\u0445 \u0441\u043B\u0456\u0432`;case"robots-changed":return"\u0412\u043C\u0456\u0441\u0442 robots.txt \u0437\u043C\u0456\u043D\u0438\u0432\u0441\u044F";case"page-missing":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u043D\u0435 \u0431\u0443\u043B\u043E \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u043E";case"status-regression":return`HTTP-\u0441\u0442\u0430\u0442\u0443\u0441 \u043F\u043E\u0433\u0456\u0440\u0448\u0438\u0432\u0441\u044F \u0437 ${String(issue2.before??"\u043D\u0435\u0432\u0456\u0434\u043E\u043C\u043E")} \u0434\u043E ${String(issue2.after??"\u0432\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439")}`;case"new-noindex":return"\u0422\u0435\u043F\u0435\u0440 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u0434\u0438\u0440\u0435\u043A\u0442\u0438\u0432\u0443 noindex";case"title-removed":return"Title \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E";case"title-changed":return"Title \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0437\u043C\u0456\u043D\u0435\u043D\u043E";case"description-removed":return"Meta description \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E";case"canonical-removed":return"Canonical URL \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E";case"canonical-changed":return"Canonical URL \u0437\u043C\u0456\u043D\u0435\u043D\u043E";case"h1-removed":return"\u0423\u0441\u0456 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0438 H1 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E";case"redirect-changed":return"\u041A\u0456\u043D\u0446\u0435\u0432\u0438\u0439 URL \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044F \u0437\u043C\u0456\u043D\u0435\u043D\u043E";case"sitemap-url-count-drop":return`\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C URL \u0443 sitemap \u0437\u043C\u0435\u043D\u0448\u0438\u043B\u0430\u0441\u044F \u043D\u0430 ${String((Number(issue2.before)||0)-(Number(issue2.after)||0))}`;default:return issue2.message??"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0443 \u0442\u0430 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u043E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u0443 \u043F\u043E\u0432\u0435\u0434\u0456\u043D\u043A\u0443."}}function localizeIssue(issue2,ruleId){const englishRemediation=issue2.remediation??"Review the finding and confirm the intended behavior.";return{en:{rule:englishRuleLabel(ruleId),message:issue2.message??"",remediation:englishRemediation},uk:{rule:UK_RULE_LABELS[ruleId]??englishRuleLabel(ruleId),message:ukrainianMessage(issue2,ruleId),remediation:UK_REMEDIATIONS[ruleId]??"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0443 \u0442\u0430 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u043E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u0443 \u043F\u043E\u0432\u0435\u0434\u0456\u043D\u043A\u0443."}}}var REPORT_COPY={en:{language:"Language",titles:{partial:"Partial SEO scan report",check:"SEO regression report",scan:"SEO baseline audit"},generated:"Generated",engine:"Engine",rules:"Rules",issueLifecycle:"Issue lifecycle",partialTitle:"Partial results.",partialMessage:"This report contains the pages saved so far. Run the same scan command again to resume without requesting them twice.",incompleteTitle:"Incomplete comparison.",incompleteMessage:"Regressions found on checked pages are shown, but unchecked pages are not marked missing or resolved.",previewTitle:"Preview deployment comparison.",production:"Production",preview:"Preview",cards:{pages:"Pages checked",error:"Errors",warning:"Warnings",info:"Info",affected:"Affected pages"},analytics:{title:"Issue statistics",hint:"Select a chart item to filter the issue table.",severity:"By severity",topRules:"Most frequent checks",owners:"By owner",lifecycle:"By lifecycle",templates:"Affected page templates",total:"Total issues",noData:"No issues to chart.",filterBy:"Filter by"},history:{title:"Local scan history",hint:"Issue trends from snapshots stored on this device.",chartLabel:"Issue trend across runs.",runs:"Runs",pages:"Latest pages",newIssues:"New issues",resolvedIssues:"Resolved issues",sitemapUrls:"Sitemap URLs",maxDepth:"Maximum crawl depth"},tabs:{current:"Current / all",new:"New",ongoing:"Ongoing",resolved:"Resolved",unchanged:"Unchanged"},filters:{search:"URL or text",searchPlaceholder:"URL, check, or message",severity:"Severity",rule:"Check",template:"Page template",owner:"Owner",rows:"Rows"},all:{severity:"All severities",rule:"All checks",template:"All templates",owner:"All owners"},severities:{error:"Error",warning:"Warning",info:"Info"},owners:{seo:"SEO",content:"Content",developer:"Developer"},rows:{100:"100 per page",250:"250 per page",500:"500 per page"},guide:{error:"Errors",errorText:"need attention first.",warning:"Warnings",warningText:"are important improvements.",info:"Info",infoText:"is useful context.",score:"No opaque SEO score is used."},exportCsv:"Export CSV",previous:"Previous",next:"Next",table:{severity:"Severity",lifecycle:"Lifecycle",ruleOwner:"Check / owner",page:"Page",finding:"What was found",change:"Change",before:"Before",evidence:"Evidence / after",remediation:"Remediation",fingerprint:"Fingerprint"},empty:{cleanTitle:"No SEO issues found",cleanMessage:"The scanned pages passed all current checks.",filteredTitle:"No matching issues",filteredMessage:"Try a different lifecycle tab or clear the selected filters.",clear:"Clear filters"},lifecycle:{current:"Current",new:"New",ongoing:"Ongoing",resolved:"Resolved",unchanged:"Unchanged"},notPresent:"Not present",page:"Page",of:"of",issue:"issue",issues:"issues",docs:"docs",footer:"Generated locally. No report data was uploaded."},uk:{language:"\u041C\u043E\u0432\u0430",titles:{partial:"\u0417\u0432\u0456\u0442 \u0447\u0430\u0441\u0442\u043A\u043E\u0432\u043E\u0433\u043E SEO-\u0441\u043A\u0430\u043D\u0443\u0432\u0430\u043D\u043D\u044F",check:"\u0417\u0432\u0456\u0442 \u043F\u0440\u043E SEO-\u0440\u0435\u0433\u0440\u0435\u0441\u0456\u0457",scan:"\u0411\u0430\u0437\u043E\u0432\u0438\u0439 SEO-\u0430\u0443\u0434\u0438\u0442"},generated:"\u0421\u0442\u0432\u043E\u0440\u0435\u043D\u043E",engine:"\u0420\u0443\u0448\u0456\u0439",rules:"\u041F\u0440\u0430\u0432\u0438\u043B\u0430",issueLifecycle:"\u0421\u0442\u0430\u043D\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C",partialTitle:"\u0427\u0430\u0441\u0442\u043A\u043E\u0432\u0456 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0438.",partialMessage:"\u0417\u0432\u0456\u0442 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u0443\u0436\u0435 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0456 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438. \u0417\u0430\u043F\u0443\u0441\u0442\u0456\u0442\u044C \u0442\u0443 \u0441\u0430\u043C\u0443 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 \u0449\u0435 \u0440\u0430\u0437, \u0449\u043E\u0431 \u043F\u0440\u043E\u0434\u043E\u0432\u0436\u0438\u0442\u0438 \u0431\u0435\u0437 \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u0438\u0445 \u0437\u0430\u043F\u0438\u0442\u0456\u0432.",incompleteTitle:"\u041D\u0435\u043F\u043E\u0432\u043D\u0435 \u043F\u043E\u0440\u0456\u0432\u043D\u044F\u043D\u043D\u044F.",incompleteMessage:"\u041F\u043E\u043A\u0430\u0437\u0430\u043D\u043E \u0440\u0435\u0433\u0440\u0435\u0441\u0456\u0457 \u043D\u0430 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u0438\u0445 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430\u0445, \u0430\u043B\u0435 \u043D\u0435\u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u0456 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u043D\u0435 \u043F\u043E\u0437\u043D\u0430\u0447\u0435\u043D\u043E \u044F\u043A \u0432\u0456\u0434\u0441\u0443\u0442\u043D\u0456 \u0447\u0438 \u0432\u0438\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0456.",previewTitle:"\u041F\u043E\u0440\u0456\u0432\u043D\u044F\u043D\u043D\u044F production \u0456 preview.",production:"Production",preview:"Preview",cards:{pages:"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u043E \u0441\u0442\u043E\u0440\u0456\u043D\u043E\u043A",error:"\u041F\u043E\u043C\u0438\u043B\u043A\u0438",warning:"\u041F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0435\u043D\u043D\u044F",info:"\u0406\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F",affected:"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0437 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430\u043C\u0438"},analytics:{title:"\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430 \u043F\u0440\u043E\u0431\u043B\u0435\u043C",hint:"\u041E\u0431\u0435\u0440\u0456\u0442\u044C \u0435\u043B\u0435\u043C\u0435\u043D\u0442 \u0433\u0440\u0430\u0444\u0456\u043A\u0430, \u0449\u043E\u0431 \u0432\u0456\u0434\u0444\u0456\u043B\u044C\u0442\u0440\u0443\u0432\u0430\u0442\u0438 \u0442\u0430\u0431\u043B\u0438\u0446\u044E \u043F\u0440\u043E\u0431\u043B\u0435\u043C.",severity:"\u0417\u0430 \u0432\u0430\u0436\u043B\u0438\u0432\u0456\u0441\u0442\u044E",topRules:"\u041D\u0430\u0439\u0447\u0430\u0441\u0442\u0456\u0448\u0456 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438",owners:"\u0417\u0430 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u043B\u044C\u043D\u0438\u043C\u0438",lifecycle:"\u0417\u0430 \u0441\u0442\u0430\u043D\u043E\u043C",templates:"\u0428\u0430\u0431\u043B\u043E\u043D\u0438 \u0441\u0442\u043E\u0440\u0456\u043D\u043E\u043A \u0456\u0437 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430\u043C\u0438",total:"\u0423\u0441\u044C\u043E\u0433\u043E \u043F\u0440\u043E\u0431\u043B\u0435\u043C",noData:"\u041D\u0435\u043C\u0430\u0454 \u043F\u0440\u043E\u0431\u043B\u0435\u043C \u0434\u043B\u044F \u0432\u0456\u0434\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F.",filterBy:"\u0424\u0456\u043B\u044C\u0442\u0440\u0443\u0432\u0430\u0442\u0438 \u0437\u0430"},history:{title:"\u041B\u043E\u043A\u0430\u043B\u044C\u043D\u0430 \u0456\u0441\u0442\u043E\u0440\u0456\u044F \u0441\u043A\u0430\u043D\u0443\u0432\u0430\u043D\u044C",hint:"\u0414\u0438\u043D\u0430\u043C\u0456\u043A\u0430 \u043F\u0440\u043E\u0431\u043B\u0435\u043C \u0437\u0456 snapshot-\u0444\u0430\u0439\u043B\u0456\u0432, \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0438\u0445 \u043D\u0430 \u0446\u044C\u043E\u043C\u0443 \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u0457.",chartLabel:"\u0414\u0438\u043D\u0430\u043C\u0456\u043A\u0430 \u043F\u0440\u043E\u0431\u043B\u0435\u043C \u0437\u0430 \u0437\u0430\u043F\u0443\u0441\u043A\u0430\u043C\u0438.",runs:"\u0417\u0430\u043F\u0443\u0441\u043A\u0438",pages:"\u0421\u0442\u043E\u0440\u0456\u043D\u043E\u043A \u0432\u043E\u0441\u0442\u0430\u043D\u043D\u0454",newIssues:"\u041D\u043E\u0432\u0456 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0438",resolvedIssues:"\u0412\u0438\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0456 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0438",sitemapUrls:"URL \u0443 sitemap",maxDepth:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0430 \u0433\u043B\u0438\u0431\u0438\u043D\u0430"},tabs:{current:"\u041F\u043E\u0442\u043E\u0447\u043D\u0456 / \u0443\u0441\u0456",new:"\u041D\u043E\u0432\u0456",ongoing:"\u0422\u0440\u0438\u0432\u0430\u044E\u0442\u044C",resolved:"\u0412\u0438\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0456",unchanged:"\u0411\u0435\u0437 \u0437\u043C\u0456\u043D"},filters:{search:"URL \u0430\u0431\u043E \u0442\u0435\u043A\u0441\u0442",searchPlaceholder:"URL, \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 \u0430\u0431\u043E \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F",severity:"\u0412\u0430\u0436\u043B\u0438\u0432\u0456\u0441\u0442\u044C",rule:"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430",template:"\u0428\u0430\u0431\u043B\u043E\u043D \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438",owner:"\u0412\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u043B\u044C\u043D\u0438\u0439",rows:"\u0420\u044F\u0434\u043A\u0438"},all:{severity:"\u0423\u0441\u0456 \u0440\u0456\u0432\u043D\u0456",rule:"\u0423\u0441\u0456 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438",template:"\u0423\u0441\u0456 \u0448\u0430\u0431\u043B\u043E\u043D\u0438",owner:"\u0423\u0441\u0456 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u043B\u044C\u043D\u0456"},severities:{error:"\u041F\u043E\u043C\u0438\u043B\u043A\u0430",warning:"\u041F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0435\u043D\u043D\u044F",info:"\u0406\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F"},owners:{seo:"SEO",content:"\u041A\u043E\u043D\u0442\u0435\u043D\u0442",developer:"\u0420\u043E\u0437\u0440\u043E\u0431\u043D\u0438\u043A"},rows:{100:"100 \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443",250:"250 \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443",500:"500 \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443"},guide:{error:"\u041F\u043E\u043C\u0438\u043B\u043A\u0438",errorText:"\u043F\u043E\u0442\u0440\u0435\u0431\u0443\u044E\u0442\u044C \u043F\u0435\u0440\u0448\u043E\u0447\u0435\u0440\u0433\u043E\u0432\u043E\u0457 \u0443\u0432\u0430\u0433\u0438.",warning:"\u041F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0435\u043D\u043D\u044F",warningText:"\u043F\u043E\u0437\u043D\u0430\u0447\u0430\u044E\u0442\u044C \u0432\u0430\u0436\u043B\u0438\u0432\u0456 \u043F\u043E\u043A\u0440\u0430\u0449\u0435\u043D\u043D\u044F.",info:"\u0406\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F",infoText:"\u0434\u0430\u0454 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0439 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442.",score:"\u041D\u0435\u043F\u0440\u043E\u0437\u043E\u0440\u0430 SEO-\u043E\u0446\u0456\u043D\u043A\u0430 \u043D\u0435 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0454\u0442\u044C\u0441\u044F."},exportCsv:"\u0415\u043A\u0441\u043F\u043E\u0440\u0442 CSV",previous:"\u041D\u0430\u0437\u0430\u0434",next:"\u0414\u0430\u043B\u0456",table:{severity:"\u0412\u0430\u0436\u043B\u0438\u0432\u0456\u0441\u0442\u044C",lifecycle:"\u0421\u0442\u0430\u043D",ruleOwner:"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 / \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u043B\u044C\u043D\u0438\u0439",page:"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430",finding:"\u0429\u043E \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E",change:"\u0417\u043C\u0456\u043D\u0430",before:"\u0411\u0443\u043B\u043E",evidence:"\u0414\u043E\u043A\u0430\u0437 / \u0441\u0442\u0430\u043B\u043E",remediation:"\u042F\u043A \u0432\u0438\u043F\u0440\u0430\u0432\u0438\u0442\u0438",fingerprint:"\u0412\u0456\u0434\u0431\u0438\u0442\u043E\u043A"},empty:{cleanTitle:"SEO-\u043F\u0440\u043E\u0431\u043B\u0435\u043C \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E",cleanMessage:"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u0456 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u043F\u0440\u043E\u0439\u0448\u043B\u0438 \u0432\u0441\u0456 \u0430\u043A\u0442\u0438\u0432\u043D\u0456 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438.",filteredTitle:"\u0417\u0431\u0456\u0433\u0456\u0432 \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E",filteredMessage:"\u041E\u0431\u0435\u0440\u0456\u0442\u044C \u0456\u043D\u0448\u0438\u0439 \u0441\u0442\u0430\u043D \u0430\u0431\u043E \u043E\u0447\u0438\u0441\u0442\u044C\u0442\u0435 \u0444\u0456\u043B\u044C\u0442\u0440\u0438.",clear:"\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u0438 \u0444\u0456\u043B\u044C\u0442\u0440\u0438"},lifecycle:{current:"\u041F\u043E\u0442\u043E\u0447\u043D\u0430",new:"\u041D\u043E\u0432\u0430",ongoing:"\u0422\u0440\u0438\u0432\u0430\u0454",resolved:"\u0412\u0438\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0430",unchanged:"\u0411\u0435\u0437 \u0437\u043C\u0456\u043D"},notPresent:"\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0454",page:"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430",of:"\u0437",issue:"\u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430",issues:"\u043F\u0440\u043E\u0431\u043B\u0435\u043C",docs:"\u0434\u043E\u0432\u0456\u0434\u043A\u0430",footer:"\u0421\u0442\u0432\u043E\u0440\u0435\u043D\u043E \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E. \u0414\u0430\u043D\u0456 \u0437\u0432\u0456\u0442\u0443 \u043D\u0456\u043A\u0443\u0434\u0438 \u043D\u0435 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0443\u0432\u0430\u043B\u0438\u0441\u044F."}};function escapeHtml(value){return String(value??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function safeJson(value){return JSON.stringify(value).replaceAll("<","\\u003c").replaceAll(">","\\u003e").replaceAll("&","\\u0026")}function normalizeIssue(candidate,fallbackLifecycle="current"){const ruleId=candidate.ruleId??candidate.rule??"unknown";return{fingerprint:candidate.fingerprint??"legacy",ruleId,rule:candidate.rule??candidate.ruleId??"unknown",severity:candidate.severity??"info",scope:candidate.scope??"page",url:candidate.url??"",message:candidate.message??"",evidence:candidate.evidence??{actual:candidate.after},owner:candidate.owner??"seo",remediation:candidate.remediation??"Review the finding and confirm the intended behavior.",documentationUrl:candidate.documentationUrl??"https://github.com/MelnixDev/seo-crawl-audit/tree/main/docs/rules",before:candidate.before,after:candidate.after,lifecycle:candidate.lifecycle??fallbackLifecycle,template:"",localized:localizeIssue(candidate,ruleId)}}function countIssues(issues,key){return issues.reduce((counts,issue2)=>{const value=String(issue2[key]);counts[value]=(counts[value]??0)+1;return counts},{})}function renderHtmlReport(input,options={}){const mode=input.mode??"scan";const pages=input.pages??[];const current=(input.issues??[]).map(item=>normalizeIssue(item));const lifecycle2=[...(input.newIssues??[]).map(item=>normalizeIssue(item,"new")),...(input.ongoingIssues??[]).map(item=>normalizeIssue(item,"ongoing")),...(input.resolvedIssues??[]).map(item=>normalizeIssue(item,"resolved")),...(input.unchangedIssues??[]).map(item=>normalizeIssue(item,"unchanged"))];const issues=lifecycle2.length>0?lifecycle2:current;const templateGroups=groupIssuesByTemplate(issues);const templateByUrl=new Map(templateGroups.flatMap(group=>group.urls.map(url=>[url,group.template])));for(const issue2 of issues)issue2.template=templateByUrl.get(issue2.url)??"";const counts=issues.reduce((summary2,item)=>{summary2[item.severity]+=1;return summary2},{error:0,warning:0,info:0});const affectedPages=new Set(issues.map(item=>item.url)).size;const ruleCounts=countIssues(issues,"rule");const statistics={total:issues.length,pagesChecked:pages.length,targetPages:input.targetPages??null,affectedPages,severity:counts,rules:Object.entries(ruleCounts).map(([id,count])=>({id,count})).sort((left,right)=>right.count-left.count||left.id.localeCompare(right.id)),owners:countIssues(issues,"owner"),lifecycle:countIssues(issues,"lifecycle"),templates:templateGroups.map(({template,issueCount,affectedPages:affectedPages2})=>({template,issueCount,affectedPages:affectedPages2}))};const partial=input.partial??false;const incompleteComparison=mode==="check"&&input.complete===false;const reportTitle=partial?"Partial SEO scan report":mode==="check"?"SEO regression report":"SEO baseline audit";const branding={...input.branding??{},...options.branding??{}};const primaryColor=/^#[0-9a-f]{6}$/i.test(branding.primaryColor??"")?branding.primaryColor:"#3157d5";const logo=branding.logo&&(/^data:image\//.test(branding.logo)||/^https:\/\//.test(branding.logo))?``:"";const data=safeJson({mode,issues,statistics,copy:REPORT_COPY,partial,incompleteComparison,comparison:input.comparison??null,history:input.history??null});const generatedAt=input.generatedAt??new Date().toISOString();const startUrl=input.startUrl??"";const targetPages=input.targetPages??null;const isCheck=mode==="check";return` +${value}`}break;case"retry":if(isASCIINumber(value)){event[field]=value}break;case"id":if(isValidLastEventId(value)){event[field]=value}break;case"event":if(value.length>0){event[field]=value}break}}processEvent(event){if(event.retry&&isASCIINumber(event.retry)){this.state.reconnectionTime=parseInt(event.retry,10)}if(event.id&&isValidLastEventId(event.id)){this.state.lastEventId=event.id}if(event.data!==void 0){this.push({type:event.event||"message",options:{data:event.data,lastEventId:this.state.lastEventId,origin:this.state.origin}})}}clearEvent(){this.event={data:void 0,event:void 0,id:void 0,retry:void 0}}};module2.exports={EventSourceStream}}});var require_eventsource=__commonJS({"../../node_modules/undici/lib/web/eventsource/eventsource.js"(exports2,module2){"use strict";var{pipeline}=require("node:stream");var{fetching}=require_fetch();var{makeRequest}=require_request2();var{webidl}=require_webidl();var{EventSourceStream}=require_eventsource_stream();var{parseMIMEType}=require_data_url();var{createFastMessageEvent}=require_events();var{isNetworkError}=require_response();var{delay}=require_util8();var{kEnumerableProperty}=require_util();var{environmentSettingsObject}=require_util2();var experimentalWarned=false;var defaultReconnectionTime=3e3;var CONNECTING=0;var OPEN=1;var CLOSED=2;var ANONYMOUS="anonymous";var USE_CREDENTIALS="use-credentials";var EventSource=class _EventSource extends EventTarget{#events={open:null,error:null,message:null};#url=null;#withCredentials=false;#readyState=CONNECTING;#request=null;#controller=null;#dispatcher;#state;constructor(url,eventSourceInitDict={}){super();webidl.util.markAsUncloneable(this);const prefix="EventSource constructor";webidl.argumentLengthCheck(arguments,1,prefix);if(!experimentalWarned){experimentalWarned=true;process.emitWarning("EventSource is experimental, expect them to change at any time.",{code:"UNDICI-ES"})}url=webidl.converters.USVString(url,prefix,"url");eventSourceInitDict=webidl.converters.EventSourceInitDict(eventSourceInitDict,prefix,"eventSourceInitDict");this.#dispatcher=eventSourceInitDict.dispatcher;this.#state={lastEventId:"",reconnectionTime:defaultReconnectionTime};const settings=environmentSettingsObject;let urlRecord;try{urlRecord=new URL(url,settings.settingsObject.baseUrl);this.#state.origin=urlRecord.origin}catch(e){throw new DOMException(e,"SyntaxError")}this.#url=urlRecord.href;let corsAttributeState=ANONYMOUS;if(eventSourceInitDict.withCredentials){corsAttributeState=USE_CREDENTIALS;this.#withCredentials=true}const initRequest={redirect:"follow",keepalive:true,mode:"cors",credentials:corsAttributeState==="anonymous"?"same-origin":"omit",referrer:"no-referrer"};initRequest.client=environmentSettingsObject.settingsObject;initRequest.headersList=[["accept",{name:"accept",value:"text/event-stream"}]];initRequest.cache="no-store";initRequest.initiator="other";initRequest.urlList=[new URL(this.#url)];this.#request=makeRequest(initRequest);this.#connect()}get readyState(){return this.#readyState}get url(){return this.#url}get withCredentials(){return this.#withCredentials}#connect(){if(this.#readyState===CLOSED)return;this.#readyState=CONNECTING;const fetchParams={request:this.#request,dispatcher:this.#dispatcher};const processEventSourceEndOfBody=response=>{if(isNetworkError(response)){this.dispatchEvent(new Event("error"));this.close()}this.#reconnect()};fetchParams.processResponseEndOfBody=processEventSourceEndOfBody;fetchParams.processResponse=response=>{if(isNetworkError(response)){if(response.aborted){this.close();this.dispatchEvent(new Event("error"));return}else{this.#reconnect();return}}const contentType=response.headersList.get("content-type",true);const mimeType=contentType!==null?parseMIMEType(contentType):"failure";const contentTypeValid=mimeType!=="failure"&&mimeType.essence==="text/event-stream";if(response.status!==200||contentTypeValid===false){this.close();this.dispatchEvent(new Event("error"));return}this.#readyState=OPEN;this.dispatchEvent(new Event("open"));this.#state.origin=response.urlList[response.urlList.length-1].origin;const eventSourceStream=new EventSourceStream({eventSourceSettings:this.#state,push:event=>{this.dispatchEvent(createFastMessageEvent(event.type,event.options))}});pipeline(response.body.stream,eventSourceStream,error2=>{if(error2?.aborted===false){this.close();this.dispatchEvent(new Event("error"))}})};this.#controller=fetching(fetchParams)}async#reconnect(){if(this.#readyState===CLOSED)return;this.#readyState=CONNECTING;this.dispatchEvent(new Event("error"));await delay(this.#state.reconnectionTime);if(this.#readyState!==CONNECTING)return;if(this.#state.lastEventId.length){this.#request.headersList.set("last-event-id",this.#state.lastEventId,true)}this.#connect()}close(){webidl.brandCheck(this,_EventSource);if(this.#readyState===CLOSED)return;this.#readyState=CLOSED;this.#controller.abort();this.#request=null}get onopen(){return this.#events.open}set onopen(fn){if(this.#events.open){this.removeEventListener("open",this.#events.open)}if(typeof fn==="function"){this.#events.open=fn;this.addEventListener("open",fn)}else{this.#events.open=null}}get onmessage(){return this.#events.message}set onmessage(fn){if(this.#events.message){this.removeEventListener("message",this.#events.message)}if(typeof fn==="function"){this.#events.message=fn;this.addEventListener("message",fn)}else{this.#events.message=null}}get onerror(){return this.#events.error}set onerror(fn){if(this.#events.error){this.removeEventListener("error",this.#events.error)}if(typeof fn==="function"){this.#events.error=fn;this.addEventListener("error",fn)}else{this.#events.error=null}}};var constantsPropertyDescriptors={CONNECTING:{__proto__:null,configurable:false,enumerable:true,value:CONNECTING,writable:false},OPEN:{__proto__:null,configurable:false,enumerable:true,value:OPEN,writable:false},CLOSED:{__proto__:null,configurable:false,enumerable:true,value:CLOSED,writable:false}};Object.defineProperties(EventSource,constantsPropertyDescriptors);Object.defineProperties(EventSource.prototype,constantsPropertyDescriptors);Object.defineProperties(EventSource.prototype,{close:kEnumerableProperty,onerror:kEnumerableProperty,onmessage:kEnumerableProperty,onopen:kEnumerableProperty,readyState:kEnumerableProperty,url:kEnumerableProperty,withCredentials:kEnumerableProperty});webidl.converters.EventSourceInitDict=webidl.dictionaryConverter([{key:"withCredentials",converter:webidl.converters.boolean,defaultValue:()=>false},{key:"dispatcher",converter:webidl.converters.any}]);module2.exports={EventSource,defaultReconnectionTime}}});var require_undici=__commonJS({"../../node_modules/undici/index.js"(exports2,module2){"use strict";var Client=require_client();var Dispatcher=require_dispatcher();var Pool=require_pool();var BalancedPool=require_balanced_pool();var Agent=require_agent();var ProxyAgent2=require_proxy_agent();var EnvHttpProxyAgent=require_env_http_proxy_agent();var RetryAgent=require_retry_agent();var errors=require_errors();var util=require_util();var{InvalidArgumentError}=errors;var api=require_api();var buildConnector=require_connect();var MockClient=require_mock_client();var MockAgent=require_mock_agent();var MockPool=require_mock_pool();var mockErrors=require_mock_errors();var RetryHandler=require_retry_handler();var{getGlobalDispatcher,setGlobalDispatcher}=require_global2();var DecoratorHandler=require_decorator_handler();var RedirectHandler=require_redirect_handler();var createRedirectInterceptor=require_redirect_interceptor();Object.assign(Dispatcher.prototype,api);module2.exports.Dispatcher=Dispatcher;module2.exports.Client=Client;module2.exports.Pool=Pool;module2.exports.BalancedPool=BalancedPool;module2.exports.Agent=Agent;module2.exports.ProxyAgent=ProxyAgent2;module2.exports.EnvHttpProxyAgent=EnvHttpProxyAgent;module2.exports.RetryAgent=RetryAgent;module2.exports.RetryHandler=RetryHandler;module2.exports.DecoratorHandler=DecoratorHandler;module2.exports.RedirectHandler=RedirectHandler;module2.exports.createRedirectInterceptor=createRedirectInterceptor;module2.exports.interceptors={redirect:require_redirect(),retry:require_retry(),dump:require_dump(),dns:require_dns()};module2.exports.buildConnector=buildConnector;module2.exports.errors=errors;module2.exports.util={parseHeaders:util.parseHeaders,headerNameToString:util.headerNameToString};function makeDispatcher(fn){return(url,opts,handler)=>{if(typeof opts==="function"){handler=opts;opts=null}if(!url||typeof url!=="string"&&typeof url!=="object"&&!(url instanceof URL)){throw new InvalidArgumentError("invalid url")}if(opts!=null&&typeof opts!=="object"){throw new InvalidArgumentError("invalid opts")}if(opts&&opts.path!=null){if(typeof opts.path!=="string"){throw new InvalidArgumentError("invalid opts.path")}let path=opts.path;if(!opts.path.startsWith("/")){path=`/${path}`}url=new URL(util.parseOrigin(url).origin+path)}else{if(!opts){opts=typeof url==="object"?url:{}}url=util.parseURL(url)}const{agent,dispatcher=getGlobalDispatcher()}=opts;if(agent){throw new InvalidArgumentError("unsupported opts.agent. Did you mean opts.client?")}return fn.call(dispatcher,{...opts,origin:url.origin,path:url.search?`${url.pathname}${url.search}`:url.pathname,method:opts.method||(opts.body?"PUT":"GET")},handler)}}module2.exports.setGlobalDispatcher=setGlobalDispatcher;module2.exports.getGlobalDispatcher=getGlobalDispatcher;var fetchImpl=require_fetch().fetch;module2.exports.fetch=async function fetch(init,options=void 0){try{return await fetchImpl(init,options)}catch(err){if(err&&typeof err==="object"){Error.captureStackTrace(err)}throw err}};module2.exports.Headers=require_headers().Headers;module2.exports.Response=require_response().Response;module2.exports.Request=require_request2().Request;module2.exports.FormData=require_formdata().FormData;module2.exports.File=globalThis.File??require("node:buffer").File;module2.exports.FileReader=require_filereader().FileReader;var{setGlobalOrigin,getGlobalOrigin}=require_global();module2.exports.setGlobalOrigin=setGlobalOrigin;module2.exports.getGlobalOrigin=getGlobalOrigin;var{CacheStorage}=require_cachestorage();var{kConstruct}=require_symbols4();module2.exports.caches=new CacheStorage(kConstruct);var{deleteCookie,getCookies,getSetCookies,setCookie}=require_cookies();module2.exports.deleteCookie=deleteCookie;module2.exports.getCookies=getCookies;module2.exports.getSetCookies=getSetCookies;module2.exports.setCookie=setCookie;var{parseMIMEType,serializeAMimeType}=require_data_url();module2.exports.parseMIMEType=parseMIMEType;module2.exports.serializeAMimeType=serializeAMimeType;var{CloseEvent,ErrorEvent,MessageEvent}=require_events();module2.exports.WebSocket=require_websocket().WebSocket;module2.exports.CloseEvent=CloseEvent;module2.exports.ErrorEvent=ErrorEvent;module2.exports.MessageEvent=MessageEvent;module2.exports.request=makeDispatcher(api.request);module2.exports.stream=makeDispatcher(api.stream);module2.exports.pipeline=makeDispatcher(api.pipeline);module2.exports.connect=makeDispatcher(api.connect);module2.exports.upgrade=makeDispatcher(api.upgrade);module2.exports.MockClient=MockClient;module2.exports.MockPool=MockPool;module2.exports.MockAgent=MockAgent;module2.exports.mockErrors=mockErrors;var{EventSource}=require_eventsource();module2.exports.EventSource=EventSource}});var os=__toESM(require("os"),1);function toCommandValue(input){if(input===null||input===void 0){return""}else if(typeof input==="string"||input instanceof String){return input}return JSON.stringify(input)}function toCommandProperties(annotationProperties){if(!Object.keys(annotationProperties).length){return{}}return{title:annotationProperties.title,file:annotationProperties.file,line:annotationProperties.startLine,endLine:annotationProperties.endLine,col:annotationProperties.startColumn,endColumn:annotationProperties.endColumn}}function issueCommand(command,properties,message){const cmd=new Command(command,properties,message);process.stdout.write(cmd.toString()+os.EOL)}var CMD_STRING="::";var Command=class{constructor(command,properties,message){if(!command){command="missing.command"}this.command=command;this.properties=properties;this.message=message}toString(){let cmdStr=CMD_STRING+this.command;if(this.properties&&Object.keys(this.properties).length>0){cmdStr+=" ";let first=true;for(const key in this.properties){if(this.properties.hasOwnProperty(key)){const val=this.properties[key];if(val){if(first){first=false}else{cmdStr+=","}cmdStr+=`${key}=${escapeProperty(val)}`}}}}cmdStr+=`${CMD_STRING}${escapeData(this.message)}`;return cmdStr}};function escapeData(s){return toCommandValue(s).replace(/%/g,"%25").replace(/\r/g,"%0D").replace(/\n/g,"%0A")}function escapeProperty(s){return toCommandValue(s).replace(/%/g,"%25").replace(/\r/g,"%0D").replace(/\n/g,"%0A").replace(/:/g,"%3A").replace(/,/g,"%2C")}var crypto=__toESM(require("crypto"),1);var fs=__toESM(require("fs"),1);var os2=__toESM(require("os"),1);function issueFileCommand(command,message){const filePath=process.env[`GITHUB_${command}`];if(!filePath){throw new Error(`Unable to find environment variable for file command ${command}`)}if(!fs.existsSync(filePath)){throw new Error(`Missing file at path: ${filePath}`)}fs.appendFileSync(filePath,`${toCommandValue(message)}${os2.EOL}`,{encoding:"utf8"})}function prepareKeyValueMessage(key,value){const delimiter=`ghadelimiter_${crypto.randomUUID()}`;const convertedValue=toCommandValue(value);if(key.includes(delimiter)){throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`)}if(convertedValue.includes(delimiter)){throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`)}return`${key}<<${delimiter}${os2.EOL}${convertedValue}${os2.EOL}${delimiter}`}var os4=__toESM(require("os"),1);var tunnel=__toESM(require_tunnel2(),1);var import_undici=__toESM(require_undici(),1);var HttpCodes;(function(HttpCodes2){HttpCodes2[HttpCodes2["OK"]=200]="OK";HttpCodes2[HttpCodes2["MultipleChoices"]=300]="MultipleChoices";HttpCodes2[HttpCodes2["MovedPermanently"]=301]="MovedPermanently";HttpCodes2[HttpCodes2["ResourceMoved"]=302]="ResourceMoved";HttpCodes2[HttpCodes2["SeeOther"]=303]="SeeOther";HttpCodes2[HttpCodes2["NotModified"]=304]="NotModified";HttpCodes2[HttpCodes2["UseProxy"]=305]="UseProxy";HttpCodes2[HttpCodes2["SwitchProxy"]=306]="SwitchProxy";HttpCodes2[HttpCodes2["TemporaryRedirect"]=307]="TemporaryRedirect";HttpCodes2[HttpCodes2["PermanentRedirect"]=308]="PermanentRedirect";HttpCodes2[HttpCodes2["BadRequest"]=400]="BadRequest";HttpCodes2[HttpCodes2["Unauthorized"]=401]="Unauthorized";HttpCodes2[HttpCodes2["PaymentRequired"]=402]="PaymentRequired";HttpCodes2[HttpCodes2["Forbidden"]=403]="Forbidden";HttpCodes2[HttpCodes2["NotFound"]=404]="NotFound";HttpCodes2[HttpCodes2["MethodNotAllowed"]=405]="MethodNotAllowed";HttpCodes2[HttpCodes2["NotAcceptable"]=406]="NotAcceptable";HttpCodes2[HttpCodes2["ProxyAuthenticationRequired"]=407]="ProxyAuthenticationRequired";HttpCodes2[HttpCodes2["RequestTimeout"]=408]="RequestTimeout";HttpCodes2[HttpCodes2["Conflict"]=409]="Conflict";HttpCodes2[HttpCodes2["Gone"]=410]="Gone";HttpCodes2[HttpCodes2["TooManyRequests"]=429]="TooManyRequests";HttpCodes2[HttpCodes2["InternalServerError"]=500]="InternalServerError";HttpCodes2[HttpCodes2["NotImplemented"]=501]="NotImplemented";HttpCodes2[HttpCodes2["BadGateway"]=502]="BadGateway";HttpCodes2[HttpCodes2["ServiceUnavailable"]=503]="ServiceUnavailable";HttpCodes2[HttpCodes2["GatewayTimeout"]=504]="GatewayTimeout"})(HttpCodes||(HttpCodes={}));var Headers;(function(Headers2){Headers2["Accept"]="accept";Headers2["ContentType"]="content-type"})(Headers||(Headers={}));var MediaTypes;(function(MediaTypes2){MediaTypes2["ApplicationJson"]="application/json"})(MediaTypes||(MediaTypes={}));var HttpRedirectCodes=[HttpCodes.MovedPermanently,HttpCodes.ResourceMoved,HttpCodes.SeeOther,HttpCodes.TemporaryRedirect,HttpCodes.PermanentRedirect];var HttpResponseRetryCodes=[HttpCodes.BadGateway,HttpCodes.ServiceUnavailable,HttpCodes.GatewayTimeout];var import_os=require("os");var import_fs=require("fs");var __awaiter=function(thisArg,_arguments,P,generator){function adopt(value){return value instanceof P?value:new P(function(resolve3){resolve3(value)})}return new(P||(P=Promise))(function(resolve3,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator["throw"](value))}catch(e){reject(e)}}function step(result){result.done?resolve3(result.value):adopt(result.value).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})};var{access,appendFile,writeFile}=import_fs.promises;var SUMMARY_ENV_VAR="GITHUB_STEP_SUMMARY";var Summary=class{constructor(){this._buffer=""}filePath(){return __awaiter(this,void 0,void 0,function*(){if(this._filePath){return this._filePath}const pathFromEnv=process.env[SUMMARY_ENV_VAR];if(!pathFromEnv){throw new Error(`Unable to find environment variable for $${SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`)}try{yield access(pathFromEnv,import_fs.constants.R_OK|import_fs.constants.W_OK)}catch(_a){throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`)}this._filePath=pathFromEnv;return this._filePath})}wrap(tag,content,attrs={}){const htmlAttrs=Object.entries(attrs).map(([key,value])=>` ${key}="${value}"`).join("");if(!content){return`<${tag}${htmlAttrs}>`}return`<${tag}${htmlAttrs}>${content}`}write(options){return __awaiter(this,void 0,void 0,function*(){const overwrite=!!(options===null||options===void 0?void 0:options.overwrite);const filePath=yield this.filePath();const writeFunc=overwrite?writeFile:appendFile;yield writeFunc(filePath,this._buffer,{encoding:"utf8"});return this.emptyBuffer()})}clear(){return __awaiter(this,void 0,void 0,function*(){return this.emptyBuffer().write({overwrite:true})})}stringify(){return this._buffer}isEmptyBuffer(){return this._buffer.length===0}emptyBuffer(){this._buffer="";return this}addRaw(text,addEOL=false){this._buffer+=text;return addEOL?this.addEOL():this}addEOL(){return this.addRaw(import_os.EOL)}addCodeBlock(code,lang){const attrs=Object.assign({},lang&&{lang});const element=this.wrap("pre",this.wrap("code",code),attrs);return this.addRaw(element).addEOL()}addList(items,ordered=false){const tag=ordered?"ol":"ul";const listItems=items.map(item=>this.wrap("li",item)).join("");const element=this.wrap(tag,listItems);return this.addRaw(element).addEOL()}addTable(rows){const tableBody=rows.map(row=>{const cells=row.map(cell=>{if(typeof cell==="string"){return this.wrap("td",cell)}const{header,data,colspan,rowspan}=cell;const tag=header?"th":"td";const attrs=Object.assign(Object.assign({},colspan&&{colspan}),rowspan&&{rowspan});return this.wrap(tag,data,attrs)}).join("");return this.wrap("tr",cells)}).join("");const element=this.wrap("table",tableBody);return this.addRaw(element).addEOL()}addDetails(label,content){const element=this.wrap("details",this.wrap("summary",label)+content);return this.addRaw(element).addEOL()}addImage(src,alt,options){const{width,height}=options||{};const attrs=Object.assign(Object.assign({},width&&{width}),height&&{height});const element=this.wrap("img",null,Object.assign({src,alt},attrs));return this.addRaw(element).addEOL()}addHeading(text,level){const tag=`h${level}`;const allowedTag=["h1","h2","h3","h4","h5","h6"].includes(tag)?tag:"h1";const element=this.wrap(allowedTag,text);return this.addRaw(element).addEOL()}addSeparator(){const element=this.wrap("hr",null);return this.addRaw(element).addEOL()}addBreak(){const element=this.wrap("br",null);return this.addRaw(element).addEOL()}addQuote(text,cite){const attrs=Object.assign({},cite&&{cite});const element=this.wrap("blockquote",text,attrs);return this.addRaw(element).addEOL()}addLink(text,href){const element=this.wrap("a",text,{href});return this.addRaw(element).addEOL()}};var _summary=new Summary;var summary=_summary;var import_os2=__toESM(require("os"),1);var fs2=__toESM(require("fs"),1);var{chmod,copyFile,lstat,mkdir,open,readdir,rename,rm,rmdir,stat,symlink,unlink}=fs2.promises;var IS_WINDOWS=process.platform==="win32";var READONLY=fs2.constants.O_RDONLY;var IS_WINDOWS2=process.platform==="win32";var platform=import_os2.default.platform();var arch=import_os2.default.arch();var ExitCode;(function(ExitCode2){ExitCode2[ExitCode2["Success"]=0]="Success";ExitCode2[ExitCode2["Failure"]=1]="Failure"})(ExitCode||(ExitCode={}));function getInput(name,options){const val=process.env[`INPUT_${name.replace(/ /g,"_").toUpperCase()}`]||"";if(options&&options.required&&!val){throw new Error(`Input required and not supplied: ${name}`)}if(options&&options.trimWhitespace===false){return val}return val.trim()}function setOutput(name,value){const filePath=process.env["GITHUB_OUTPUT"]||"";if(filePath){return issueFileCommand("OUTPUT",prepareKeyValueMessage(name,value))}process.stdout.write(os4.EOL);issueCommand("set-output",{name},toCommandValue(value))}function setFailed(message){process.exitCode=ExitCode.Failure;error(message)}function error(message,properties={}){issueCommand("error",toCommandProperties(properties),message instanceof Error?message.toString():message)}function info(message){process.stdout.write(message+os4.EOL)}var import_promises4=require("node:fs/promises");var import_node_path2=require("node:path");var import_promises=require("node:fs/promises");var import_node_path=require("node:path");var import_node_crypto=require("node:crypto");var ENGINE_VERSION="0.7.0";var RULE_SET_VERSION="1.1.0";var PRODUCT_NAME="seo-crawl-audit";var DEFAULT_USER_AGENT=`${PRODUCT_NAME}/${ENGINE_VERSION}`;var DEFAULT_OPEN_GRAPH={title:null,description:null,image:null};var DEFAULT_TWITTER={card:null,title:null,description:null,image:null};function baselineInput(value){if(!value||typeof value!=="object"||Array.isArray(value)){throw new Error("snapshot must be an object")}return value}function pageInput(value){if(!value||typeof value!=="object"||typeof value.url!=="string"){throw new Error("snapshot page URL must be a string")}return value}function stableJson(value){if(Array.isArray(value)){return`[${value.map(stableJson).join(",")}]`}if(value&&typeof value==="object"){return`{${Object.entries(value).sort(([left],[right])=>left.localeCompare(right)).map(([key,child])=>`${JSON.stringify(key)}:${stableJson(child)}`).join(",")}}`}return JSON.stringify(value)}function hashConfiguration(config){return(0,import_node_crypto.createHash)("sha256").update(stableJson(config)).digest("hex")}function normalizePage(page){return{url:page.url,finalUrl:page.finalUrl??null,status:page.status??null,contentType:page.contentType??null,blockedByRobots:page.blockedByRobots??false,error:page.error??null,title:page.title??null,description:page.description??null,canonical:page.canonical??null,canonicalRaw:page.canonicalRaw??page.canonical??null,robots:page.robots??null,xRobotsTag:page.xRobotsTag??null,lang:page.lang??null,h1Count:page.h1Count??0,openGraph:page.openGraph??DEFAULT_OPEN_GRAPH,twitter:page.twitter??DEFAULT_TWITTER,hreflang:page.hreflang??[],jsonLd:page.jsonLd??[],images:page.images??[],links:[...page.links??[]].sort(),internalLinks:[...page.internalLinks??[]].sort(),externalLinks:[...page.externalLinks??[]].sort(),wordCount:page.wordCount??0,contentHash:page.contentHash??null,depth:page.depth??0,redirectChain:page.redirectChain??[],responseBytes:page.responseBytes??0}}function defaultConfig(input){const source=input.source??{};const options=input.options??{};const firstPage=input.pages?.[0];const firstPageUrl=firstPage&&typeof firstPage==="object"?firstPage.url:void 0;const url=input.siteUrl??input.startUrl??source.startUrl??(typeof firstPageUrl==="string"?firstPageUrl:void 0);if(!url)throw new Error("snapshot site URL must be a string");return{schemaVersion:1,url,sitemap:options.sitemap??source.sitemap??"auto",maxPages:options.maxPages??source.maxPages??100,concurrency:options.concurrency??5,delay:options.requestDelay??source.requestDelay??100,timeout:options.timeout??1e4,respectRobots:options.respectRobots??source.respectRobots??true,includeQuery:options.includeQuery??source.includeQuery??false,maxRedirects:options.maxRedirects??10,maxResponseBytes:options.maxResponseBytes??5*1024*1024,enabledRules:options.enabledRules??null,severityOverrides:options.severityOverrides??{},suppressions:options.suppressions??[],regressionBudgets:options.regressionBudgets??{},report:options.report??{}}}function createLinkGraph(pages,sitemapUrls){const known=new Set(pages.map(page=>page.url));const linked=new Set(pages.flatMap(page=>page.internalLinks));const broken=new Set;for(const page of pages){if(page.error||page.blockedByRobots||(page.status??500)>=400){broken.add(page.url)}}return{internalEdges:pages.reduce((sum,page)=>sum+page.internalLinks.length,0),externalEdges:pages.reduce((sum,page)=>sum+page.externalLinks.length,0),orphanUrls:sitemapUrls.filter(url=>known.has(url)&&!linked.has(url)),brokenInternalUrls:[...broken].sort()}}function createStatistics(input,pages){const blockedByRobots=pages.filter(page=>page.blockedByRobots).length;const failed=pages.filter(page=>page.error||(page.status??500)>=400).length;return{requested:input.requested??pages.length,completed:pages.length,succeeded:pages.length-failed-blockedByRobots,failed,blockedByRobots,redirected:pages.filter(page=>page.redirectChain.length>0||page.url!==page.finalUrl).length,durationMs:input.durationMs??0,truncated:input.truncated??false,partial:input.partial??false}}function createBaseline(scanInput){const scan2=baselineInput(scanInput);const config=defaultConfig(scan2);const pages=(scan2.pages??[]).map(page=>normalizePage(pageInput(page))).sort((left,right)=>left.url.localeCompare(right.url));const sitemapUrls=scan2.sitemap?.urls??[];if(scan2.sitemap&&!scan2.sitemap.url)throw new Error("snapshot sitemap URL must be a string");const sitemap=scan2.sitemap?{url:scan2.sitemap.url,urls:[...sitemapUrls].sort(),sitemapCount:scan2.sitemap.sitemapCount??0,truncated:scan2.sitemap.truncated??false,error:scan2.sitemap.error??null}:null;const siteUrl=scan2.startUrl??config.url;const truncated=scan2.truncated??false;return{schemaVersion:2,engineVersion:ENGINE_VERSION,ruleSetVersion:RULE_SET_VERSION,generatedAt:scan2.generatedAt??new Date().toISOString(),siteUrl,configurationHash:hashConfiguration(config),config,robots:{url:scan2.robots?.url??new URL("/robots.txt",siteUrl).href,status:scan2.robots?.status??null,sha256:scan2.robots?.sha256??null,error:scan2.robots?.error??null,denyAll:scan2.robots?.denyAll??false},sitemap,pages,linkGraph:scan2.linkGraph??createLinkGraph(pages,sitemapUrls),statistics:scan2.statistics??createStatistics(scan2,pages),partial:scan2.partial??false,source:{startUrl:siteUrl,maxPages:config.maxPages,requestDelay:config.delay,includeQuery:config.includeQuery,respectRobots:config.respectRobots,sitemap:typeof config.sitemap==="string"&&!["auto","none"].includes(config.sitemap)?config.sitemap:null},truncated}}function migrateSnapshot(input){const value=baselineInput(input);if(!Array.isArray(value.pages)){throw new Error("snapshot pages must be an array")}if(value.schemaVersion===2){return createBaseline({...value,startUrl:value.siteUrl,options:value.config,pages:value.pages,generatedAt:value.generatedAt,partial:value.partial,statistics:value.statistics,linkGraph:value.linkGraph})}if(value.schemaVersion===1){return createBaseline(value)}throw new Error(`unsupported snapshot schema version: ${String(value.schemaVersion)}`)}var DEFAULT_CONFIG_FILE="seo-audit.config.json";var DEFAULT_SCAN_CONFIG=Object.freeze({schemaVersion:1,url:"",sitemap:"auto",maxPages:100,concurrency:5,delay:100,timeout:1e4,respectRobots:true,includeQuery:false,maxRedirects:10,maxResponseBytes:5*1024*1024,enabledRules:null,severityOverrides:{},suppressions:[],regressionBudgets:{},report:{}});function object(value,field){if(!value||typeof value!=="object"||Array.isArray(value)){throw new Error(`${field} must be an object`)}return value}function integer(value,field,minimum,maximum=Number.MAX_SAFE_INTEGER){if(!Number.isInteger(value)||valuemaximum){throw new Error(`${field} must be an integer between ${minimum} and ${maximum}`)}return value}function optionalString(value,field){if(value===void 0)return void 0;if(typeof value!=="string")throw new Error(`${field} must be a string`);return value}function validateConfig(input){const value=object(input,"config");const allowed=new Set(["$schema","schemaVersion","url","sitemap","maxPages","concurrency","delay","timeout","respectRobots","includeQuery","maxRedirects","maxResponseBytes","enabledRules","severityOverrides","suppressions","regressionBudgets","report"]);for(const key of Object.keys(value)){if(!allowed.has(key))throw new Error(`unknown config property: ${key}`)}const result={};if(value.schemaVersion!==void 0&&value.schemaVersion!==1)throw new Error("schemaVersion must be 1");if(value.url!==void 0){const url=optionalString(value.url,"url");if(!/^https?:\/\//i.test(url))throw new Error("url must be an HTTP(S) URL");result.url=url}if(value.sitemap!==void 0){const sitemap=optionalString(value.sitemap,"sitemap");if(!["auto","none"].includes(sitemap)&&!/^https?:\/\//i.test(sitemap)){throw new Error("sitemap must be auto, none, or an HTTP(S) URL")}result.sitemap=sitemap}if(value.maxPages!==void 0)result.maxPages=integer(value.maxPages,"maxPages",1);if(value.concurrency!==void 0)result.concurrency=integer(value.concurrency,"concurrency",1,50);if(value.delay!==void 0)result.delay=integer(value.delay,"delay",0);if(value.timeout!==void 0)result.timeout=integer(value.timeout,"timeout",1);if(value.maxRedirects!==void 0)result.maxRedirects=integer(value.maxRedirects,"maxRedirects",0,50);if(value.maxResponseBytes!==void 0)result.maxResponseBytes=integer(value.maxResponseBytes,"maxResponseBytes",1024);for(const field of["respectRobots","includeQuery"]){if(value[field]!==void 0){if(typeof value[field]!=="boolean")throw new Error(`${field} must be a boolean`);result[field]=value[field]}}if(value.enabledRules!==void 0){if(value.enabledRules!==null&&(!Array.isArray(value.enabledRules)||value.enabledRules.some(rule=>typeof rule!=="string"))){throw new Error("enabledRules must be null or an array of rule IDs")}result.enabledRules=value.enabledRules}if(value.severityOverrides!==void 0){const overrides=object(value.severityOverrides,"severityOverrides");for(const[rule,severity]of Object.entries(overrides)){if(!["error","warning","info"].includes(severity)){throw new Error(`severityOverrides.${rule} must be error, warning, or info`)}}result.severityOverrides=overrides}if(value.suppressions!==void 0){if(!Array.isArray(value.suppressions))throw new Error("suppressions must be an array");result.suppressions=value.suppressions.map((entry,index)=>{const suppression=object(entry,`suppressions[${index}]`);for(const field of["rule","urlPattern","reason"]){if(typeof suppression[field]!=="string"||suppression[field]===""){throw new Error(`suppressions[${index}].${field} must be a non-empty string`)}}if(suppression.expiresAt!==void 0&&!/^\d{4}-\d{2}-\d{2}$/.test(String(suppression.expiresAt))){throw new Error(`suppressions[${index}].expiresAt must use YYYY-MM-DD`)}return suppression})}if(value.regressionBudgets!==void 0){const budgets=object(value.regressionBudgets,"regressionBudgets");result.regressionBudgets=Object.fromEntries(Object.entries(budgets).map(([key,budget])=>[key,integer(budget,`regressionBudgets.${key}`,0)]))}if(value.report!==void 0){const report=object(value.report,"report");const branding={};const agencyName=optionalString(report.agencyName,"report.agencyName");const logo=optionalString(report.logo,"report.logo");const primaryColor=optionalString(report.primaryColor,"report.primaryColor");if(agencyName!==void 0)branding.agencyName=agencyName;if(logo!==void 0)branding.logo=logo;if(primaryColor!==void 0)branding.primaryColor=primaryColor;if(branding.primaryColor&&!/^#[0-9a-f]{6}$/i.test(branding.primaryColor)){throw new Error("report.primaryColor must be a six-digit hex color")}result.report=Object.fromEntries(Object.entries(branding).filter(([,child])=>child!==void 0))}return result}function resolveConfig(cli,file={},baseline={}){const merged={...DEFAULT_SCAN_CONFIG,...baseline,...file,...cli};return{...merged,schemaVersion:1,severityOverrides:{...baseline.severityOverrides??{},...file.severityOverrides??{},...cli.severityOverrides??{}},regressionBudgets:{...baseline.regressionBudgets??{},...file.regressionBudgets??{},...cli.regressionBudgets??{}},report:{...baseline.report??{},...file.report??{},...cli.report??{}},suppressions:cli.suppressions??file.suppressions??baseline.suppressions??[]}}function segmentToken(segment){if(/^\d+$/.test(segment))return":id";if(/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(segment))return":uuid";if(/^\d{4}-\d{2}-\d{2}$/.test(segment))return":date";if(/^[0-9a-f]{16,}$/i.test(segment))return":hash";return null}function parseIssueUrls(issues){return issues.flatMap(issue2=>{try{const url=new URL(issue2.url);return[{issue:issue2,url,segments:url.pathname.split("/").filter(Boolean)}]}catch{return[]}})}function dynamicSegments(pages){const siblings=new Map;for(const page of pages){for(let index=1;indexvalues.size>=2).map(([key])=>key))}function templateFor(page,dynamic){const segments=page.segments.map((segment,index)=>{const token=segmentToken(segment);if(token)return token;const prefix=page.segments.slice(0,index).join("/");const key=`${page.url.origin}|${page.segments.length}|${index}|${prefix}`;return index>0&&dynamic.has(key)?":slug":segment});return`/${segments.join("/")}${page.url.pathname.endsWith("/")&&segments.length>0?"/":""}`}function groupIssuesByTemplate(issues){const pages=parseIssueUrls(issues);const dynamic=dynamicSegments(pages);const grouped=new Map;for(const page of pages){const template=templateFor(page,dynamic);const key=`${page.url.origin}${template}`;const group=grouped.get(key)??{origin:page.url.origin,template,issues:[],urls:new Set};group.issues.push(page.issue);group.urls.add(page.issue.url);grouped.set(key,group)}return[...grouped.values()].map(group=>{const severities={error:0,warning:0,info:0};const rules={};const owners={};for(const issue2 of group.issues){severities[issue2.severity]+=1;rules[issue2.ruleId]=(rules[issue2.ruleId]??0)+1;owners[issue2.owner]=(owners[issue2.owner]??0)+1}const urls=[...group.urls].sort();return{origin:group.origin,template:group.template,issueCount:group.issues.length,affectedPages:urls.length,severities,rules,owners,urls,representativeUrls:urls.slice(0,3)}}).sort((left,right)=>right.issueCount-left.issueCount||left.template.localeCompare(right.template)||left.origin.localeCompare(right.origin))}function englishRuleLabel(ruleId){const text=ruleId.replaceAll("-"," ");return text.charAt(0).toUpperCase()+text.slice(1)}var UK_RULE_LABELS={"page-unreachable":"\u041D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430","http-error":"HTTP-\u043F\u043E\u043C\u0438\u043B\u043A\u0430",noindex:"Noindex","x-robots-noindex":"Noindex \u0443 X-Robots-Tag","robots-blocked":"\u0417\u0430\u0431\u043B\u043E\u043A\u043E\u0432\u0430\u043D\u043E robots.txt","missing-canonical":"\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439 canonical","invalid-canonical":"\u041D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 canonical","cross-domain-canonical":"Canonical \u043D\u0430 \u0456\u043D\u0448\u043E\u043C\u0443 \u0434\u043E\u043C\u0435\u043D\u0456","canonical-target-error":"\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u0446\u0456\u043B\u0456 canonical","redirect-loop":"\u0426\u0438\u043A\u043B \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044C","long-redirect-chain":"\u0414\u043E\u0432\u0433\u0438\u0439 \u043B\u0430\u043D\u0446\u044E\u0436\u043E\u043A \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044C","sitemap-unavailable":"Sitemap \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439","noindex-in-sitemap":"Noindex \u0443 sitemap","redirect-in-sitemap":"\u041F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044F \u0443 sitemap","missing-title":"\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439 title","duplicate-title":"\u0414\u0443\u0431\u043B\u044C\u043E\u0432\u0430\u043D\u0438\u0439 title","title-length":"\u0414\u043E\u0432\u0436\u0438\u043D\u0430 title","missing-description":"\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439 description","duplicate-description":"\u0414\u0443\u0431\u043B\u044C\u043E\u0432\u0430\u043D\u0438\u0439 description","description-length":"\u0414\u043E\u0432\u0436\u0438\u043D\u0430 description","missing-h1":"\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439 H1","broken-internal-link":"\u041D\u0435\u0440\u043E\u0431\u043E\u0447\u0435 \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0454 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F","orphan-sitemap-page":"\u0406\u0437\u043E\u043B\u044C\u043E\u0432\u0430\u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 sitemap","crawlable-not-in-sitemap":"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u0432\u0456\u0434\u0441\u0443\u0442\u043D\u044F \u0443 sitemap","invalid-hreflang":"\u041D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 hreflang","malformed-json-ld":"\u041D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 JSON-LD","http-on-https-site":"HTTP URL \u043D\u0430 HTTPS-\u0441\u0430\u0439\u0442\u0456","invalid-language":"\u041D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0435 \u043E\u0433\u043E\u043B\u043E\u0448\u0435\u043D\u043D\u044F \u043C\u043E\u0432\u0438","duplicate-content":"\u0414\u0443\u0431\u043B\u044C\u043E\u0432\u0430\u043D\u0438\u0439 \u043A\u043E\u043D\u0442\u0435\u043D\u0442","multiple-h1":"\u041A\u0456\u043B\u044C\u043A\u0430 H1","missing-open-graph":"\u041D\u0435\u043F\u043E\u0432\u043D\u0456 Open Graph metadata","missing-twitter-metadata":"\u041D\u0435\u043F\u043E\u0432\u043D\u0456 Twitter metadata","image-missing-alt":"\u0417\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u0431\u0435\u0437 alt","low-word-count":"\u041C\u0430\u043B\u043E \u0442\u0435\u043A\u0441\u0442\u0443","robots-changed":"robots.txt \u0437\u043C\u0456\u043D\u0435\u043D\u043E","page-missing":"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u043D\u0435 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u043E","status-regression":"\u0420\u0435\u0433\u0440\u0435\u0441\u0456\u044F HTTP-\u0441\u0442\u0430\u0442\u0443\u0441\u0443","new-noindex":"\u041D\u043E\u0432\u0438\u0439 noindex","title-removed":"Title \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E","title-changed":"Title \u0437\u043C\u0456\u043D\u0435\u043D\u043E","description-removed":"Description \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E","canonical-removed":"Canonical \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E","canonical-changed":"Canonical \u0437\u043C\u0456\u043D\u0435\u043D\u043E","h1-removed":"H1 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E","redirect-changed":"\u041F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044F \u0437\u043C\u0456\u043D\u0435\u043D\u043E","sitemap-url-count-drop":"\u0417\u043C\u0435\u043D\u0448\u0435\u043D\u043D\u044F URL \u0443 sitemap"};var UK_REMEDIATIONS={"page-unreachable":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0430\u0431\u043E \u043F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u043D\u0430 \u043D\u0435\u0457.","http-error":"\u041F\u043E\u0432\u0435\u0440\u043D\u0456\u0442\u044C \u0443\u0441\u043F\u0456\u0448\u043D\u0443 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C \u0430\u0431\u043E \u0441\u0432\u0456\u0434\u043E\u043C\u0435 \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044F.",noindex:"\u041F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C noindex, \u044F\u043A\u0449\u043E \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0430\u0454 \u0437\u2019\u044F\u0432\u043B\u044F\u0442\u0438\u0441\u044F \u0432 \u043F\u043E\u0448\u0443\u043A\u0443.","x-robots-noindex":"\u041F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C noindex \u0456\u0437 X-Robots-Tag, \u044F\u043A\u0449\u043E \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0430\u0454 \u0456\u043D\u0434\u0435\u043A\u0441\u0443\u0432\u0430\u0442\u0438\u0441\u044F.","robots-blocked":"\u0414\u043E\u0437\u0432\u043E\u043B\u044C\u0442\u0435 URL \u0443 robots.txt, \u044F\u043A\u0449\u043E \u0439\u043E\u0433\u043E \u043F\u043E\u0442\u0440\u0456\u0431\u043D\u043E \u0441\u043A\u0430\u043D\u0443\u0432\u0430\u0442\u0438.","missing-canonical":"\u0412\u043A\u0430\u0436\u0456\u0442\u044C \u0431\u0430\u0436\u0430\u043D\u0438\u0439 canonical URL, \u044F\u043A\u0449\u043E \u043C\u043E\u0436\u043B\u0438\u0432\u0456 \u0434\u0443\u0431\u043B\u0456\u043A\u0430\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0438.","invalid-canonical":"\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u0439\u0442\u0435 \u0430\u0431\u0441\u043E\u043B\u044E\u0442\u043D\u0438\u0439 \u0430\u0431\u043E \u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 \u0432\u0456\u0434\u043D\u043E\u0441\u043D\u0438\u0439 HTTP(S) canonical URL.","cross-domain-canonical":"\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u0437\u043E\u0432\u043D\u0456\u0448\u043D\u0456\u0439 canonical \u0430\u0431\u043E \u0432\u043A\u0430\u0436\u0456\u0442\u044C \u043F\u043E\u0442\u0440\u0456\u0431\u043D\u0438\u0439 URL \u0446\u044C\u043E\u0433\u043E \u0441\u0430\u0439\u0442\u0443.","canonical-target-error":"\u0421\u043F\u0440\u044F\u043C\u0443\u0439\u0442\u0435 canonical \u043D\u0430 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439 URL, \u0434\u043E\u0437\u0432\u043E\u043B\u0435\u043D\u0438\u0439 \u0434\u043B\u044F \u0456\u043D\u0434\u0435\u043A\u0441\u0430\u0446\u0456\u0457.","redirect-loop":"\u041F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u0446\u0438\u043A\u043B\u0456\u0447\u043D\u0438\u0439 \u043C\u0430\u0440\u0448\u0440\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044C.","long-redirect-chain":"\u041F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u0439\u0442\u0435 \u043E\u0434\u0440\u0430\u0437\u0443 \u043D\u0430 \u043A\u0456\u043D\u0446\u0435\u0432\u0443 \u0430\u0434\u0440\u0435\u0441\u0443.","sitemap-unavailable":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 \u0456 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439 XML sitemap.","noindex-in-sitemap":"\u041F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C URL \u0456\u0437 sitemap \u0430\u0431\u043E \u0434\u043E\u0437\u0432\u043E\u043B\u044C\u0442\u0435 \u0439\u043E\u0433\u043E \u0456\u043D\u0434\u0435\u043A\u0441\u0430\u0446\u0456\u044E.","redirect-in-sitemap":"\u0417\u0430\u043C\u0456\u043D\u0456\u0442\u044C URL \u0443 sitemap \u043D\u0430 \u0439\u043E\u0433\u043E \u043A\u0456\u043D\u0446\u0435\u0432\u0443 canonical-\u0430\u0434\u0440\u0435\u0441\u0443.","missing-title":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u0443\u043D\u0456\u043A\u0430\u043B\u044C\u043D\u0438\u0439 \u043E\u043F\u0438\u0441\u043E\u0432\u0438\u0439 HTML title.","duplicate-title":"\u041D\u0430\u043F\u0438\u0448\u0456\u0442\u044C title, \u044F\u043A\u0438\u0439 \u0443\u043D\u0456\u043A\u0430\u043B\u044C\u043D\u043E \u043E\u043F\u0438\u0441\u0443\u0454 \u0446\u044E \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443.","title-length":"\u0417\u0440\u043E\u0431\u0456\u0442\u044C title \u0441\u0442\u0438\u0441\u043B\u0438\u043C \u0456 \u0437\u043C\u0456\u0441\u0442\u043E\u0432\u043D\u0438\u043C, \u0437\u0430\u0437\u0432\u0438\u0447\u0430\u0439 10\u201360 \u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432.","missing-description":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0439 meta description.","duplicate-description":"\u041D\u0430\u043F\u0438\u0448\u0456\u0442\u044C \u0443\u043D\u0456\u043A\u0430\u043B\u044C\u043D\u0438\u0439 meta description \u0434\u043B\u044F \u0446\u0456\u0454\u0457 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438.","description-length":"\u0417\u0440\u043E\u0431\u0456\u0442\u044C description \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043C \u0456 \u0437\u0430\u0437\u0432\u0438\u0447\u0430\u0439 \u0434\u043E\u0432\u0436\u0438\u043D\u043E\u044E 50\u2013160 \u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432.","missing-h1":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u043E\u0434\u0438\u043D \u0437\u0440\u043E\u0437\u0443\u043C\u0456\u043B\u0438\u0439 \u043E\u0441\u043D\u043E\u0432\u043D\u0438\u0439 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A.","broken-internal-link":"\u041E\u043D\u043E\u0432\u0456\u0442\u044C \u0430\u0431\u043E \u043F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0454 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u0447\u0438 \u0432\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u0439\u043E\u0433\u043E \u0446\u0456\u043B\u044C.","orphan-sitemap-page":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u0437\u043C\u0456\u0441\u0442\u043E\u0432\u043D\u0456 \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0456 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0456\u0437 sitemap.","crawlable-not-in-sitemap":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0434\u043E sitemap \u0430\u0431\u043E \u0441\u0432\u0456\u0434\u043E\u043C\u043E \u0432\u0438\u043A\u043B\u044E\u0447\u0456\u0442\u044C \u0457\u0457.","invalid-hreflang":"\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u0439\u0442\u0435 \u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0456 \u043C\u043E\u0432\u043D\u0456 \u0442\u0435\u0433\u0438 \u0442\u0430 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0456 HTTP(S) alternate URL.","malformed-json-ld":"\u0412\u0438\u043F\u0440\u0430\u0432\u0442\u0435 JSON-\u0441\u0438\u043D\u0442\u0430\u043A\u0441\u0438\u0441 \u0443 \u0431\u043B\u043E\u0446\u0456 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u043E\u0432\u0430\u043D\u0438\u0445 \u0434\u0430\u043D\u0438\u0445.","http-on-https-site":"\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0439\u0442\u0435 HTTPS \u0434\u043B\u044F \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0456\u0445 URL \u0456 metadata.","invalid-language":"\u0412\u043A\u0430\u0436\u0456\u0442\u044C \u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 \u043C\u043E\u0432\u043D\u0438\u0439 \u0442\u0435\u0433 BCP 47 \u0432 \u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0456 html.","duplicate-content":"\u041E\u0431\u2019\u0454\u0434\u043D\u0430\u0439\u0442\u0435 \u0434\u0443\u0431\u043B\u044C\u043E\u0432\u0430\u043D\u0456 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0430\u0431\u043E \u0437\u0440\u043E\u0431\u0456\u0442\u044C \u0457\u0445\u043D\u0456\u0439 \u043E\u0441\u043D\u043E\u0432\u043D\u0438\u0439 \u043A\u043E\u043D\u0442\u0435\u043D\u0442 \u0432\u0456\u0434\u043C\u0456\u043D\u043D\u0438\u043C.","multiple-h1":"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435, \u0447\u0438 \u043E\u0434\u0438\u043D \u043E\u0441\u043D\u043E\u0432\u043D\u0438\u0439 H1 \u043D\u0435 \u0437\u0440\u043E\u0431\u0438\u0442\u044C \u0456\u0454\u0440\u0430\u0440\u0445\u0456\u044E \u0437\u0440\u043E\u0437\u0443\u043C\u0456\u043B\u0456\u0448\u043E\u044E.","missing-open-graph":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 Open Graph title, description \u0442\u0430 image \u0434\u043B\u044F \u043F\u043E\u0448\u0438\u0440\u0435\u043D\u043D\u044F \u0432 \u0441\u043E\u0446\u043C\u0435\u0440\u0435\u0436\u0430\u0445.","missing-twitter-metadata":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 Twitter card metadata, \u044F\u043A\u0449\u043E \u0432\u0430\u0436\u043B\u0438\u0432\u0456 \u0441\u043E\u0446\u0456\u0430\u043B\u044C\u043D\u0456 \u043F\u0440\u0435\u0432\u2019\u044E.","image-missing-alt":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u0437\u043C\u0456\u0441\u0442\u043E\u0432\u043D\u0438\u0439 alt \u0430\u0431\u043E \u043F\u043E\u0440\u043E\u0436\u043D\u0456\u0439 alt \u0434\u043B\u044F \u0434\u0435\u043A\u043E\u0440\u0430\u0442\u0438\u0432\u043D\u0438\u0445 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u044C.","low-word-count":"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435, \u0447\u0438 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u0434\u043E\u0441\u0442\u0430\u0442\u043D\u044C\u043E \u043A\u043E\u0440\u0438\u0441\u043D\u043E\u0433\u043E \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u0433\u043E \u043A\u043E\u043D\u0442\u0435\u043D\u0442\u0443.","robots-changed":"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u0437\u043C\u0456\u043D\u0443 robots.txt \u0456 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435, \u0449\u043E \u0434\u043E\u0441\u0442\u0443\u043F \u0434\u043B\u044F \u0441\u043A\u0430\u043D\u0443\u0432\u0430\u043D\u043D\u044F \u0437\u043C\u0456\u043D\u0435\u043D\u043E \u0441\u0432\u0456\u0434\u043E\u043C\u043E.","page-missing":"\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0434\u043E \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438 \u0430\u0431\u043E \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435, \u0449\u043E \u0457\u0457 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E \u0441\u0432\u0456\u0434\u043E\u043C\u043E.","status-regression":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u043D\u044E \u0443\u0441\u043F\u0456\u0448\u043D\u0443 HTTP-\u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C.","new-noindex":"\u041F\u0440\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u043D\u043E\u0432\u0438\u0439 noindex, \u044F\u043A\u0449\u043E \u0439\u043E\u0433\u043E \u043D\u0435 \u0434\u043E\u0434\u0430\u043D\u043E \u043D\u0430\u0432\u043C\u0438\u0441\u043D\u043E.","title-removed":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u0437\u043C\u0456\u0441\u0442\u043E\u0432\u043D\u0438\u0439 title.","title-changed":"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u0442\u0430 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u0437\u043C\u0456\u043D\u0435\u043D\u0438\u0439 title.","description-removed":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0439 meta description.","canonical-removed":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C canonical.","canonical-changed":"\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435, \u0449\u043E \u043D\u043E\u0432\u0430 \u0446\u0456\u043B\u044C canonical \u0441\u0432\u0456\u0434\u043E\u043C\u0430 \u0439 \u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0430.","h1-removed":"\u0412\u0456\u0434\u043D\u043E\u0432\u0456\u0442\u044C \u0437\u0440\u043E\u0437\u0443\u043C\u0456\u043B\u0438\u0439 \u043E\u0441\u043D\u043E\u0432\u043D\u0438\u0439 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A.","redirect-changed":"\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435, \u0449\u043E \u043D\u043E\u0432\u0430 \u0446\u0456\u043B\u044C \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044F \u0441\u0432\u0456\u0434\u043E\u043C\u0430.","sitemap-url-count-drop":"\u0414\u043E\u0441\u043B\u0456\u0434\u0456\u0442\u044C \u0432\u0442\u0440\u0430\u0442\u0443 URL \u0443 sitemap \u0456 \u043F\u043E\u0432\u0435\u0440\u043D\u0456\u0442\u044C \u043F\u0440\u043E\u043F\u0443\u0449\u0435\u043D\u0456 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0434\u043B\u044F \u0456\u043D\u0434\u0435\u043A\u0441\u0430\u0446\u0456\u0457."};function actual(issue2){return issue2.evidence?.actual??issue2.after}function ukrainianMessage(issue2,ruleId){const value=actual(issue2);switch(ruleId){case"page-unreachable":case"redirect-loop":return`\u0417\u0430\u043F\u0438\u0442 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0432\u0441\u044F \u043F\u043E\u043C\u0438\u043B\u043A\u043E\u044E: ${String(value??"\u043D\u0435\u0432\u0456\u0434\u043E\u043C\u0430 \u043F\u043E\u043C\u0438\u043B\u043A\u0430")}`;case"http-error":return`\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043F\u043E\u0432\u0435\u0440\u043D\u0443\u043B\u0430 HTTP ${String(value??"\u043D\u0435\u0432\u0456\u0434\u043E\u043C\u043E")}`;case"noindex":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u0434\u0438\u0440\u0435\u043A\u0442\u0438\u0432\u0443 noindex \u0443 meta";case"x-robots-noindex":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0456\u0441\u0442\u0438\u0442\u044C noindex \u0443 X-Robots-Tag";case"robots-blocked":return issue2.before===false?"\u0422\u0435\u043F\u0435\u0440 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0437\u0430\u0431\u043B\u043E\u043A\u043E\u0432\u0430\u043D\u043E \u0447\u0435\u0440\u0435\u0437 robots.txt":"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0437\u0430\u0431\u043B\u043E\u043A\u043E\u0432\u0430\u043D\u043E \u0447\u0435\u0440\u0435\u0437 robots.txt";case"missing-canonical":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043D\u0435 \u043C\u0456\u0441\u0442\u0438\u0442\u044C canonical URL";case"invalid-canonical":return"Canonical URL \u043D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439";case"cross-domain-canonical":return"Canonical \u0432\u043A\u0430\u0437\u0443\u0454 \u043D\u0430 \u0456\u043D\u0448\u0438\u0439 \u0434\u043E\u043C\u0435\u043D";case"canonical-target-error":return"\u0426\u0456\u043B\u044C canonical \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430";case"long-redirect-chain":return`\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0454 ${String(value??0)} \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044C`;case"sitemap-unavailable":return"\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438 \u043D\u0430\u043B\u0430\u0448\u0442\u043E\u0432\u0430\u043D\u0438\u0439 sitemap";case"noindex-in-sitemap":return"URL \u0456\u0437 sitemap \u043F\u043E\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439 noindex";case"redirect-in-sitemap":return"URL \u0456\u0437 sitemap \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u0454\u0442\u044C\u0441\u044F";case"missing-title":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043D\u0435 \u043C\u0430\u0454 title";case"duplicate-title":return"\u041A\u0456\u043B\u044C\u043A\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043E\u043A \u043C\u0430\u044E\u0442\u044C \u043E\u0434\u043D\u0430\u043A\u043E\u0432\u0438\u0439 title";case"title-length":return`\u0414\u043E\u0432\u0436\u0438\u043D\u0430 title \u2014 ${String(value??0)} \u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432`;case"missing-description":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043D\u0435 \u043C\u0430\u0454 meta description";case"duplicate-description":return"\u041A\u0456\u043B\u044C\u043A\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043E\u043A \u043C\u0430\u044E\u0442\u044C \u043E\u0434\u043D\u0430\u043A\u043E\u0432\u0438\u0439 meta description";case"description-length":return`\u0414\u043E\u0432\u0436\u0438\u043D\u0430 description \u2014 ${String(value??0)} \u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432`;case"missing-h1":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043D\u0435 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430 H1";case"multiple-h1":return`\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0456\u0441\u0442\u0438\u0442\u044C H1 \u0443 \u043A\u0456\u043B\u044C\u043A\u043E\u0441\u0442\u0456: ${String(value??0)}`;case"broken-internal-link":return"\u0412\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0454 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u0432\u0435\u0434\u0435 \u043D\u0430 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0443 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443";case"orphan-sitemap-page":return"\u041D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0456\u0437 sitemap \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0456\u0445 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u044C";case"crawlable-not-in-sitemap":return"\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u0434\u043B\u044F \u0441\u043A\u0430\u043D\u0443\u0432\u0430\u043D\u043D\u044F \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u0432\u0456\u0434\u0441\u0443\u0442\u043D\u044F \u0443 sitemap";case"invalid-hreflang":return"\u041E\u0433\u043E\u043B\u043E\u0448\u0435\u043D\u043D\u044F hreflang \u043D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0435";case"malformed-json-ld":return"\u0411\u043B\u043E\u043A JSON-LD \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u043D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0438\u0439 JSON";case"http-on-https-site":return"HTTPS-\u0441\u0430\u0439\u0442 \u043F\u043E\u0441\u0438\u043B\u0430\u0454\u0442\u044C\u0441\u044F \u043D\u0430 \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u0456\u0439 HTTP URL";case"invalid-language":return"\u041E\u0433\u043E\u043B\u043E\u0448\u0435\u043D\u043D\u044F \u043C\u043E\u0432\u0438 HTML \u043D\u0435\u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0435";case"duplicate-content":return"\u041E\u0441\u043D\u043E\u0432\u043D\u0438\u0439 \u0442\u0435\u043A\u0441\u0442 \u0454 \u0442\u043E\u0447\u043D\u0438\u043C \u0434\u0443\u0431\u043B\u0435\u043C \u0456\u043D\u0448\u043E\u0457 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438";case"missing-open-graph":return"Open Graph metadata \u043D\u0435\u043F\u043E\u0432\u043D\u0456";case"missing-twitter-metadata":return"Twitter card metadata \u043D\u0435\u043F\u043E\u0432\u043D\u0456";case"image-missing-alt":return`${Array.isArray(value)?value.length:String(value??0)} \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u044C \u043D\u0435 \u043C\u0430\u044E\u0442\u044C \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 alt`;case"low-word-count":return`\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u043F\u0440\u0438\u0431\u043B\u0438\u0437\u043D\u043E ${String(value??0)} \u0432\u0438\u0434\u0438\u043C\u0438\u0445 \u0441\u043B\u0456\u0432`;case"robots-changed":return"\u0412\u043C\u0456\u0441\u0442 robots.txt \u0437\u043C\u0456\u043D\u0438\u0432\u0441\u044F";case"page-missing":return"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u043D\u0435 \u0431\u0443\u043B\u043E \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u043E";case"status-regression":return`HTTP-\u0441\u0442\u0430\u0442\u0443\u0441 \u043F\u043E\u0433\u0456\u0440\u0448\u0438\u0432\u0441\u044F \u0437 ${String(issue2.before??"\u043D\u0435\u0432\u0456\u0434\u043E\u043C\u043E")} \u0434\u043E ${String(issue2.after??"\u0432\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439")}`;case"new-noindex":return"\u0422\u0435\u043F\u0435\u0440 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u0434\u0438\u0440\u0435\u043A\u0442\u0438\u0432\u0443 noindex";case"title-removed":return"Title \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E";case"title-changed":return"Title \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0437\u043C\u0456\u043D\u0435\u043D\u043E";case"description-removed":return"Meta description \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E";case"canonical-removed":return"Canonical URL \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E";case"canonical-changed":return"Canonical URL \u0437\u043C\u0456\u043D\u0435\u043D\u043E";case"h1-removed":return"\u0423\u0441\u0456 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0438 H1 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E";case"redirect-changed":return"\u041A\u0456\u043D\u0446\u0435\u0432\u0438\u0439 URL \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044F \u0437\u043C\u0456\u043D\u0435\u043D\u043E";case"sitemap-url-count-drop":return`\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C URL \u0443 sitemap \u0437\u043C\u0435\u043D\u0448\u0438\u043B\u0430\u0441\u044F \u043D\u0430 ${String((Number(issue2.before)||0)-(Number(issue2.after)||0))}`;default:return issue2.message??"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0443 \u0442\u0430 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u043E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u0443 \u043F\u043E\u0432\u0435\u0434\u0456\u043D\u043A\u0443."}}function localizeIssue(issue2,ruleId){const englishRemediation=issue2.remediation??"Review the finding and confirm the intended behavior.";return{en:{rule:englishRuleLabel(ruleId),message:issue2.message??"",remediation:englishRemediation},uk:{rule:UK_RULE_LABELS[ruleId]??englishRuleLabel(ruleId),message:ukrainianMessage(issue2,ruleId),remediation:UK_REMEDIATIONS[ruleId]??"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0443 \u0442\u0430 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435 \u043E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u0443 \u043F\u043E\u0432\u0435\u0434\u0456\u043D\u043A\u0443."}}}var REPORT_COPY={en:{language:"Language",titles:{partial:"Partial SEO scan report",check:"SEO regression report",scan:"SEO baseline audit"},generated:"Generated",engine:"Engine",rules:"Rules",issueLifecycle:"Issue lifecycle",partialTitle:"Partial results.",partialMessage:"This report contains the pages saved so far. Run the same scan command again to resume without requesting them twice.",incompleteTitle:"Incomplete comparison.",incompleteMessage:"Regressions found on checked pages are shown, but unchecked pages are not marked missing or resolved.",previewTitle:"Preview deployment comparison.",production:"Production",preview:"Preview",cards:{pages:"Pages checked",error:"Errors",warning:"Warnings",info:"Info",affected:"Affected pages"},analytics:{title:"Issue statistics",hint:"Select a chart item to filter the issue table.",severity:"By severity",topRules:"Most frequent checks",owners:"By owner",lifecycle:"By lifecycle",templates:"Affected page templates",total:"Total issues",noData:"No issues to chart.",filterBy:"Filter by"},history:{title:"Local scan history",hint:"Issue trends from snapshots stored on this device.",chartLabel:"Issue trend across runs.",runs:"Runs",pages:"Latest pages",newIssues:"New issues",resolvedIssues:"Resolved issues",sitemapUrls:"Sitemap URLs",maxDepth:"Maximum crawl depth"},tabs:{current:"Current / all",new:"New",ongoing:"Ongoing",resolved:"Resolved",unchanged:"Unchanged"},filters:{search:"URL or text",searchPlaceholder:"URL, check, or message",severity:"Severity",rule:"Check",template:"Page template",owner:"Owner",rows:"Rows"},all:{severity:"All severities",rule:"All checks",template:"All templates",owner:"All owners"},severities:{error:"Error",warning:"Warning",info:"Info"},owners:{seo:"SEO",content:"Content",developer:"Developer"},rows:{100:"100 per page",250:"250 per page",500:"500 per page"},guide:{error:"Errors",errorText:"need attention first.",warning:"Warnings",warningText:"are important improvements.",info:"Info",infoText:"is useful context.",score:"No opaque SEO score is used."},exportCsv:"Export CSV",previous:"Previous",next:"Next",table:{severity:"Severity",lifecycle:"Lifecycle",ruleOwner:"Check / owner",page:"Page",finding:"What was found",change:"Change",before:"Before",evidence:"Evidence / after",remediation:"Remediation",fingerprint:"Fingerprint"},empty:{cleanTitle:"No SEO issues found",cleanMessage:"The scanned pages passed all current checks.",filteredTitle:"No matching issues",filteredMessage:"Try a different lifecycle tab or clear the selected filters.",clear:"Clear filters"},lifecycle:{current:"Current",new:"New",ongoing:"Ongoing",resolved:"Resolved",unchanged:"Unchanged"},notPresent:"Not present",page:"Page",of:"of",issue:"issue",issues:"issues",docs:"docs",footer:"Generated locally. No report data was uploaded."},uk:{language:"\u041C\u043E\u0432\u0430",titles:{partial:"\u0417\u0432\u0456\u0442 \u0447\u0430\u0441\u0442\u043A\u043E\u0432\u043E\u0433\u043E SEO-\u0441\u043A\u0430\u043D\u0443\u0432\u0430\u043D\u043D\u044F",check:"\u0417\u0432\u0456\u0442 \u043F\u0440\u043E SEO-\u0440\u0435\u0433\u0440\u0435\u0441\u0456\u0457",scan:"\u0411\u0430\u0437\u043E\u0432\u0438\u0439 SEO-\u0430\u0443\u0434\u0438\u0442"},generated:"\u0421\u0442\u0432\u043E\u0440\u0435\u043D\u043E",engine:"\u0420\u0443\u0448\u0456\u0439",rules:"\u041F\u0440\u0430\u0432\u0438\u043B\u0430",issueLifecycle:"\u0421\u0442\u0430\u043D\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C",partialTitle:"\u0427\u0430\u0441\u0442\u043A\u043E\u0432\u0456 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0438.",partialMessage:"\u0417\u0432\u0456\u0442 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u0443\u0436\u0435 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0456 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438. \u0417\u0430\u043F\u0443\u0441\u0442\u0456\u0442\u044C \u0442\u0443 \u0441\u0430\u043C\u0443 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 \u0449\u0435 \u0440\u0430\u0437, \u0449\u043E\u0431 \u043F\u0440\u043E\u0434\u043E\u0432\u0436\u0438\u0442\u0438 \u0431\u0435\u0437 \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u0438\u0445 \u0437\u0430\u043F\u0438\u0442\u0456\u0432.",incompleteTitle:"\u041D\u0435\u043F\u043E\u0432\u043D\u0435 \u043F\u043E\u0440\u0456\u0432\u043D\u044F\u043D\u043D\u044F.",incompleteMessage:"\u041F\u043E\u043A\u0430\u0437\u0430\u043D\u043E \u0440\u0435\u0433\u0440\u0435\u0441\u0456\u0457 \u043D\u0430 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u0438\u0445 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430\u0445, \u0430\u043B\u0435 \u043D\u0435\u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u0456 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u043D\u0435 \u043F\u043E\u0437\u043D\u0430\u0447\u0435\u043D\u043E \u044F\u043A \u0432\u0456\u0434\u0441\u0443\u0442\u043D\u0456 \u0447\u0438 \u0432\u0438\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0456.",previewTitle:"\u041F\u043E\u0440\u0456\u0432\u043D\u044F\u043D\u043D\u044F production \u0456 preview.",production:"Production",preview:"Preview",cards:{pages:"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u043E \u0441\u0442\u043E\u0440\u0456\u043D\u043E\u043A",error:"\u041F\u043E\u043C\u0438\u043B\u043A\u0438",warning:"\u041F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0435\u043D\u043D\u044F",info:"\u0406\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F",affected:"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u0437 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430\u043C\u0438"},analytics:{title:"\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430 \u043F\u0440\u043E\u0431\u043B\u0435\u043C",hint:"\u041E\u0431\u0435\u0440\u0456\u0442\u044C \u0435\u043B\u0435\u043C\u0435\u043D\u0442 \u0433\u0440\u0430\u0444\u0456\u043A\u0430, \u0449\u043E\u0431 \u0432\u0456\u0434\u0444\u0456\u043B\u044C\u0442\u0440\u0443\u0432\u0430\u0442\u0438 \u0442\u0430\u0431\u043B\u0438\u0446\u044E \u043F\u0440\u043E\u0431\u043B\u0435\u043C.",severity:"\u0417\u0430 \u0432\u0430\u0436\u043B\u0438\u0432\u0456\u0441\u0442\u044E",topRules:"\u041D\u0430\u0439\u0447\u0430\u0441\u0442\u0456\u0448\u0456 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438",owners:"\u0417\u0430 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u043B\u044C\u043D\u0438\u043C\u0438",lifecycle:"\u0417\u0430 \u0441\u0442\u0430\u043D\u043E\u043C",templates:"\u0428\u0430\u0431\u043B\u043E\u043D\u0438 \u0441\u0442\u043E\u0440\u0456\u043D\u043E\u043A \u0456\u0437 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430\u043C\u0438",total:"\u0423\u0441\u044C\u043E\u0433\u043E \u043F\u0440\u043E\u0431\u043B\u0435\u043C",noData:"\u041D\u0435\u043C\u0430\u0454 \u043F\u0440\u043E\u0431\u043B\u0435\u043C \u0434\u043B\u044F \u0432\u0456\u0434\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F.",filterBy:"\u0424\u0456\u043B\u044C\u0442\u0440\u0443\u0432\u0430\u0442\u0438 \u0437\u0430"},history:{title:"\u041B\u043E\u043A\u0430\u043B\u044C\u043D\u0430 \u0456\u0441\u0442\u043E\u0440\u0456\u044F \u0441\u043A\u0430\u043D\u0443\u0432\u0430\u043D\u044C",hint:"\u0414\u0438\u043D\u0430\u043C\u0456\u043A\u0430 \u043F\u0440\u043E\u0431\u043B\u0435\u043C \u0437\u0456 snapshot-\u0444\u0430\u0439\u043B\u0456\u0432, \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0438\u0445 \u043D\u0430 \u0446\u044C\u043E\u043C\u0443 \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u0457.",chartLabel:"\u0414\u0438\u043D\u0430\u043C\u0456\u043A\u0430 \u043F\u0440\u043E\u0431\u043B\u0435\u043C \u0437\u0430 \u0437\u0430\u043F\u0443\u0441\u043A\u0430\u043C\u0438.",runs:"\u0417\u0430\u043F\u0443\u0441\u043A\u0438",pages:"\u0421\u0442\u043E\u0440\u0456\u043D\u043E\u043A \u0432\u043E\u0441\u0442\u0430\u043D\u043D\u0454",newIssues:"\u041D\u043E\u0432\u0456 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0438",resolvedIssues:"\u0412\u0438\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0456 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0438",sitemapUrls:"URL \u0443 sitemap",maxDepth:"\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0430 \u0433\u043B\u0438\u0431\u0438\u043D\u0430"},tabs:{current:"\u041F\u043E\u0442\u043E\u0447\u043D\u0456 / \u0443\u0441\u0456",new:"\u041D\u043E\u0432\u0456",ongoing:"\u0422\u0440\u0438\u0432\u0430\u044E\u0442\u044C",resolved:"\u0412\u0438\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0456",unchanged:"\u0411\u0435\u0437 \u0437\u043C\u0456\u043D"},filters:{search:"URL \u0430\u0431\u043E \u0442\u0435\u043A\u0441\u0442",searchPlaceholder:"URL, \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 \u0430\u0431\u043E \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F",severity:"\u0412\u0430\u0436\u043B\u0438\u0432\u0456\u0441\u0442\u044C",rule:"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430",template:"\u0428\u0430\u0431\u043B\u043E\u043D \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438",owner:"\u0412\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u043B\u044C\u043D\u0438\u0439",rows:"\u0420\u044F\u0434\u043A\u0438"},all:{severity:"\u0423\u0441\u0456 \u0440\u0456\u0432\u043D\u0456",rule:"\u0423\u0441\u0456 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438",template:"\u0423\u0441\u0456 \u0448\u0430\u0431\u043B\u043E\u043D\u0438",owner:"\u0423\u0441\u0456 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u043B\u044C\u043D\u0456"},severities:{error:"\u041F\u043E\u043C\u0438\u043B\u043A\u0430",warning:"\u041F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0435\u043D\u043D\u044F",info:"\u0406\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F"},owners:{seo:"SEO",content:"\u041A\u043E\u043D\u0442\u0435\u043D\u0442",developer:"\u0420\u043E\u0437\u0440\u043E\u0431\u043D\u0438\u043A"},rows:{100:"100 \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443",250:"250 \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443",500:"500 \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443"},guide:{error:"\u041F\u043E\u043C\u0438\u043B\u043A\u0438",errorText:"\u043F\u043E\u0442\u0440\u0435\u0431\u0443\u044E\u0442\u044C \u043F\u0435\u0440\u0448\u043E\u0447\u0435\u0440\u0433\u043E\u0432\u043E\u0457 \u0443\u0432\u0430\u0433\u0438.",warning:"\u041F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0435\u043D\u043D\u044F",warningText:"\u043F\u043E\u0437\u043D\u0430\u0447\u0430\u044E\u0442\u044C \u0432\u0430\u0436\u043B\u0438\u0432\u0456 \u043F\u043E\u043A\u0440\u0430\u0449\u0435\u043D\u043D\u044F.",info:"\u0406\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F",infoText:"\u0434\u0430\u0454 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0439 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442.",score:"\u041D\u0435\u043F\u0440\u043E\u0437\u043E\u0440\u0430 SEO-\u043E\u0446\u0456\u043D\u043A\u0430 \u043D\u0435 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0454\u0442\u044C\u0441\u044F."},exportCsv:"\u0415\u043A\u0441\u043F\u043E\u0440\u0442 CSV",previous:"\u041D\u0430\u0437\u0430\u0434",next:"\u0414\u0430\u043B\u0456",table:{severity:"\u0412\u0430\u0436\u043B\u0438\u0432\u0456\u0441\u0442\u044C",lifecycle:"\u0421\u0442\u0430\u043D",ruleOwner:"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 / \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u043B\u044C\u043D\u0438\u0439",page:"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430",finding:"\u0429\u043E \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E",change:"\u0417\u043C\u0456\u043D\u0430",before:"\u0411\u0443\u043B\u043E",evidence:"\u0414\u043E\u043A\u0430\u0437 / \u0441\u0442\u0430\u043B\u043E",remediation:"\u042F\u043A \u0432\u0438\u043F\u0440\u0430\u0432\u0438\u0442\u0438",fingerprint:"\u0412\u0456\u0434\u0431\u0438\u0442\u043E\u043A"},empty:{cleanTitle:"SEO-\u043F\u0440\u043E\u0431\u043B\u0435\u043C \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E",cleanMessage:"\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u0456 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438 \u043F\u0440\u043E\u0439\u0448\u043B\u0438 \u0432\u0441\u0456 \u0430\u043A\u0442\u0438\u0432\u043D\u0456 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438.",filteredTitle:"\u0417\u0431\u0456\u0433\u0456\u0432 \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E",filteredMessage:"\u041E\u0431\u0435\u0440\u0456\u0442\u044C \u0456\u043D\u0448\u0438\u0439 \u0441\u0442\u0430\u043D \u0430\u0431\u043E \u043E\u0447\u0438\u0441\u0442\u044C\u0442\u0435 \u0444\u0456\u043B\u044C\u0442\u0440\u0438.",clear:"\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u0438 \u0444\u0456\u043B\u044C\u0442\u0440\u0438"},lifecycle:{current:"\u041F\u043E\u0442\u043E\u0447\u043D\u0430",new:"\u041D\u043E\u0432\u0430",ongoing:"\u0422\u0440\u0438\u0432\u0430\u0454",resolved:"\u0412\u0438\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0430",unchanged:"\u0411\u0435\u0437 \u0437\u043C\u0456\u043D"},notPresent:"\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0454",page:"\u0421\u0442\u043E\u0440\u0456\u043D\u043A\u0430",of:"\u0437",issue:"\u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430",issues:"\u043F\u0440\u043E\u0431\u043B\u0435\u043C",docs:"\u0434\u043E\u0432\u0456\u0434\u043A\u0430",footer:"\u0421\u0442\u0432\u043E\u0440\u0435\u043D\u043E \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E. \u0414\u0430\u043D\u0456 \u0437\u0432\u0456\u0442\u0443 \u043D\u0456\u043A\u0443\u0434\u0438 \u043D\u0435 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0443\u0432\u0430\u043B\u0438\u0441\u044F."}};function escapeHtml(value){return String(value??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function safeJson(value){return JSON.stringify(value).replaceAll("<","\\u003c").replaceAll(">","\\u003e").replaceAll("&","\\u0026")}function normalizeIssue(candidate,fallbackLifecycle="current"){const ruleId=candidate.ruleId??candidate.rule??"unknown";return{fingerprint:candidate.fingerprint??"legacy",ruleId,rule:candidate.rule??candidate.ruleId??"unknown",severity:candidate.severity??"info",scope:candidate.scope??"page",url:candidate.url??"",message:candidate.message??"",evidence:candidate.evidence??{actual:candidate.after},owner:candidate.owner??"seo",remediation:candidate.remediation??"Review the finding and confirm the intended behavior.",documentationUrl:candidate.documentationUrl??"https://github.com/MelnixDev/seo-crawl-audit/blob/main/docs/rules.md",before:candidate.before,after:candidate.after,lifecycle:candidate.lifecycle??fallbackLifecycle,template:"",localized:localizeIssue(candidate,ruleId)}}function countIssues(issues,key){return issues.reduce((counts,issue2)=>{const value=String(issue2[key]);counts[value]=(counts[value]??0)+1;return counts},{})}function renderHtmlReport(input,options={}){const mode=input.mode??"scan";const pages=input.pages??[];const current=(input.issues??[]).map(item=>normalizeIssue(item));const lifecycle2=[...(input.newIssues??[]).map(item=>normalizeIssue(item,"new")),...(input.ongoingIssues??[]).map(item=>normalizeIssue(item,"ongoing")),...(input.resolvedIssues??[]).map(item=>normalizeIssue(item,"resolved")),...(input.unchangedIssues??[]).map(item=>normalizeIssue(item,"unchanged"))];const issues=lifecycle2.length>0?lifecycle2:current;const templateGroups=groupIssuesByTemplate(issues);const templateByUrl=new Map(templateGroups.flatMap(group=>group.urls.map(url=>[url,group.template])));for(const issue2 of issues)issue2.template=templateByUrl.get(issue2.url)??"";const counts=issues.reduce((summary2,item)=>{summary2[item.severity]+=1;return summary2},{error:0,warning:0,info:0});const affectedPages=new Set(issues.map(item=>item.url)).size;const ruleCounts=countIssues(issues,"rule");const statistics={total:issues.length,pagesChecked:pages.length,targetPages:input.targetPages??null,affectedPages,severity:counts,rules:Object.entries(ruleCounts).map(([id,count])=>({id,count})).sort((left,right)=>right.count-left.count||left.id.localeCompare(right.id)),owners:countIssues(issues,"owner"),lifecycle:countIssues(issues,"lifecycle"),templates:templateGroups.map(({template,issueCount,affectedPages:affectedPages2})=>({template,issueCount,affectedPages:affectedPages2}))};const partial=input.partial??false;const incompleteComparison=mode==="check"&&input.complete===false;const reportTitle=partial?"Partial SEO scan report":mode==="check"?"SEO regression report":"SEO baseline audit";const branding={...input.branding??{},...options.branding??{}};const primaryColor=/^#[0-9a-f]{6}$/i.test(branding.primaryColor??"")?branding.primaryColor:"#3157d5";const logo=branding.logo&&(/^data:image\//.test(branding.logo)||/^https:\/\//.test(branding.logo))?``:"";const data=safeJson({mode,issues,statistics,copy:REPORT_COPY,partial,incompleteComparison,comparison:input.comparison??null,history:input.history??null});const generatedAt=input.generatedAt??new Date().toISOString();const startUrl=input.startUrl??"";const targetPages=input.targetPages??null;const isCheck=mode==="check";return` @@ -111,7 +111,7 @@ ${input.history&&input.history.points.length>0?`
{if(activeTab&&issue.lifecycle!==activeTab)return false;if(severity.value&&issue.severity!==severity.value)return false;if(rule.value&&issue.rule!==rule.value)return false;if(template.value&&issue.template!==template.value)return false;if(owner.value&&issue.owner!==owner.value)return false;if(!query)return true;const localized=issueText(issue);return [issue.url,issue.template,issue.rule,issue.message,issue.remediation,localized.rule,localized.message,localized.remediation,issue.owner,valueText(issue.evidence),valueText(issue.before),valueText(issue.after)].join(" ").toLowerCase().includes(query)});const rowsPerPage=Number(pageSize.value);const pageCount=Math.max(1,Math.ceil(lastFiltered.length/rowsPerPage));currentPage=Math.min(currentPage,pageCount);const visible=lastFiltered.slice((currentPage-1)*rowsPerPage,currentPage*rowsPerPage);tbody.replaceChildren(); - for(const issue of visible){const localized=issueText(issue);const row=document.createElement("tr");const severityCell=document.createElement("td");const severityBadge=document.createElement("span");severityBadge.className="badge "+issue.severity;severityBadge.textContent=text.severities[issue.severity];severityCell.append(severityBadge);row.append(severityCell);const lifeCell=document.createElement("td");const lifeBadge=document.createElement("span");lifeBadge.className="badge "+issue.lifecycle;lifeBadge.textContent=text.lifecycle[issue.lifecycle]||issue.lifecycle;lifeCell.append(lifeBadge);row.append(lifeCell);cell(row,localized.rule+" \xB7 "+text.owners[issue.owner]);const pageCell=document.createElement("td");const link=document.createElement("a");link.href=issue.url;link.target="_blank";link.rel="noreferrer";link.textContent=issue.url;pageCell.append(link);row.append(pageCell);cell(row,localized.message);if(report.mode==="check"){const beforeCell=document.createElement("td");const code=document.createElement("code");code.textContent=valueText(issue.before);beforeCell.append(code);row.append(beforeCell)}const evidenceCell=document.createElement("td");const evidence=document.createElement("code");evidence.textContent=valueText(issue.after!==undefined?issue.after:issue.evidence);evidenceCell.append(evidence);row.append(evidenceCell);cell(row,localized.remediation,"remediation");const fingerprint=cell(row,issue.fingerprint,"fingerprint");const docs=document.createElement("a");docs.href=issue.documentationUrl;docs.target="_blank";docs.rel="noreferrer";docs.textContent=" "+text.docs;fingerprint.append(docs);tbody.append(row)} + for(const issue of visible){const localized=issueText(issue);const row=document.createElement("tr");const severityCell=document.createElement("td");const severityBadge=document.createElement("span");severityBadge.className="badge "+issue.severity;severityBadge.textContent=text.severities[issue.severity];severityCell.append(severityBadge);row.append(severityCell);const lifeCell=document.createElement("td");const lifeBadge=document.createElement("span");lifeBadge.className="badge "+issue.lifecycle;lifeBadge.textContent=text.lifecycle[issue.lifecycle]||issue.lifecycle;lifeCell.append(lifeBadge);row.append(lifeCell);cell(row,localized.rule+" \xB7 "+text.owners[issue.owner]);const pageCell=document.createElement("td");const link=document.createElement("a");link.href=issue.url;link.target="_blank";link.rel="noreferrer";link.textContent=issue.url;pageCell.append(link);row.append(pageCell);cell(row,localized.message);if(report.mode==="check"){const beforeCell=document.createElement("td");const code=document.createElement("code");code.textContent=valueText(issue.before);beforeCell.append(code);row.append(beforeCell)}const evidenceCell=document.createElement("td");const evidence=document.createElement("code");evidence.textContent=valueText(issue.after!==undefined?issue.after:issue.evidence);evidenceCell.append(evidence);row.append(evidenceCell);cell(row,localized.remediation,"remediation");const fingerprint=cell(row,issue.fingerprint,"fingerprint");const docs=document.createElement("a");docs.href=locale==="uk"?issue.documentationUrl.replace("/docs/rules.md#","/docs/rules.uk.md#"):issue.documentationUrl;docs.target="_blank";docs.rel="noreferrer";docs.textContent=" "+text.docs;fingerprint.append(docs);tbody.append(row)} const issueLabel=locale==="uk"?text.issues:report.issues.length===1?text.issue:text.issues;resultCount.textContent=number(lastFiltered.length)+" "+text.of+" "+number(report.issues.length)+" "+issueLabel;pageInfo.textContent=text.page+" "+number(currentPage)+" "+text.of+" "+number(pageCount);previous.disabled=currentPage===1;next.disabled=currentPage===pageCount;pagination.hidden=lastFiltered.length===0||pageCount===1;tableWrap.hidden=lastFiltered.length===0;empty.hidden=lastFiltered.length!==0;if(lastFiltered.length===0){const reportIsClean=report.issues.length===0;emptyTitle.textContent=reportIsClean?text.empty.cleanTitle:text.empty.filteredTitle;emptyMessage.textContent=reportIsClean?text.empty.cleanMessage:text.empty.filteredMessage;clearFilters.hidden=reportIsClean}syncChartButtons() } for(const element of [search,severity,rule,template,owner,pageSize]){const update=()=>{currentPage=1;render()};element.addEventListener("input",update);element.addEventListener("change",update)}for(const tab of document.querySelectorAll("[data-tab]")){tab.addEventListener("click",()=>{setActiveTab(tab.dataset.tab);currentPage=1;render()})}previous.addEventListener("click",()=>{currentPage-=1;render()});next.addEventListener("click",()=>{currentPage+=1;render()});clearFilters.addEventListener("click",()=>{search.value="";severity.value="";rule.value="";template.value="";owner.value="";setActiveTab("");currentPage=1;render()});language.addEventListener("change",()=>{locale=language.value;applyLocale()}); diff --git a/packages/cli/bundle/cli.js b/packages/cli/bundle/cli.js index 5ed313d..71b217e 100644 --- a/packages/cli/bundle/cli.js +++ b/packages/cli/bundle/cli.js @@ -1,7 +1,7 @@ import{createHash}from"node:crypto";var DOCS_BASE="https://github.com/MelnixDev/seo-crawl-audit/blob/main/docs/rules.md";var definitions=[{id:"page-unreachable",severity:"error",owner:"developer",scope:"page",remediation:"Restore the page or remove references to it."},{id:"http-error",severity:"error",owner:"developer",scope:"page",remediation:"Return a successful response or a deliberate redirect."},{id:"noindex",severity:"info",owner:"seo",scope:"page",remediation:"Remove noindex when the page should appear in search."},{id:"x-robots-noindex",severity:"error",owner:"developer",scope:"page",remediation:"Remove the noindex X-Robots-Tag when indexing is intended."},{id:"robots-blocked",severity:"error",owner:"developer",scope:"page",remediation:"Allow the URL in robots.txt when it should be crawled."},{id:"missing-canonical",severity:"warning",owner:"seo",scope:"page",remediation:"Declare the preferred canonical URL when duplicate URL variants are possible."},{id:"invalid-canonical",severity:"error",owner:"developer",scope:"page",remediation:"Use an absolute or valid relative HTTP(S) canonical URL."},{id:"cross-domain-canonical",severity:"error",owner:"seo",scope:"page",remediation:"Confirm the external canonical or point it to the intended same-site URL."},{id:"canonical-target-error",severity:"error",owner:"developer",scope:"page",remediation:"Point the canonical to an accessible, indexable URL."},{id:"redirect-loop",severity:"error",owner:"developer",scope:"page",remediation:"Remove the circular redirect path."},{id:"long-redirect-chain",severity:"warning",owner:"developer",scope:"page",remediation:"Redirect directly to the final destination."},{id:"sitemap-unavailable",severity:"error",owner:"developer",scope:"site",remediation:"Restore a valid, reachable XML sitemap."},{id:"noindex-in-sitemap",severity:"error",owner:"seo",scope:"page",remediation:"Remove the URL from the sitemap or make it indexable."},{id:"redirect-in-sitemap",severity:"error",owner:"seo",scope:"page",remediation:"Replace the sitemap URL with its final canonical destination."},{id:"missing-title",severity:"error",owner:"content",scope:"page",remediation:"Add a unique, descriptive HTML title."},{id:"duplicate-title",severity:"warning",owner:"content",scope:"page",remediation:"Write a title that uniquely describes this page."},{id:"title-length",severity:"warning",owner:"content",scope:"page",remediation:"Keep the title concise and descriptive, usually 10\u201360 characters."},{id:"missing-description",severity:"warning",owner:"content",scope:"page",remediation:"Add a useful meta description."},{id:"duplicate-description",severity:"warning",owner:"content",scope:"page",remediation:"Write a unique meta description for this page."},{id:"description-length",severity:"warning",owner:"content",scope:"page",remediation:"Keep the description useful and usually between 50 and 160 characters."},{id:"missing-h1",severity:"warning",owner:"content",scope:"page",remediation:"Add one clear primary heading."},{id:"broken-internal-link",severity:"error",owner:"developer",scope:"page",remediation:"Update or remove the internal link, or restore its target."},{id:"orphan-sitemap-page",severity:"warning",owner:"seo",scope:"page",remediation:"Add meaningful internal links to the sitemap page."},{id:"crawlable-not-in-sitemap",severity:"warning",owner:"seo",scope:"page",remediation:"Add the indexable page to the sitemap or intentionally exclude it."},{id:"invalid-hreflang",severity:"warning",owner:"seo",scope:"page",remediation:"Use valid language tags and resolvable HTTP(S) alternate URLs."},{id:"malformed-json-ld",severity:"warning",owner:"developer",scope:"page",remediation:"Fix JSON syntax in the structured-data block."},{id:"http-on-https-site",severity:"warning",owner:"developer",scope:"page",remediation:"Use HTTPS for internal URLs and metadata references."},{id:"invalid-language",severity:"warning",owner:"developer",scope:"page",remediation:"Set a valid BCP 47 language tag on the html element."},{id:"duplicate-content",severity:"warning",owner:"content",scope:"page",remediation:"Consolidate duplicate pages or differentiate their main content."},{id:"multiple-h1",severity:"info",owner:"content",scope:"page",remediation:"Review whether one primary H1 would make the hierarchy clearer."},{id:"missing-open-graph",severity:"info",owner:"content",scope:"page",remediation:"Add Open Graph title, description, and image for social sharing."},{id:"missing-twitter-metadata",severity:"info",owner:"content",scope:"page",remediation:"Add Twitter card metadata when social previews matter."},{id:"image-missing-alt",severity:"info",owner:"content",scope:"page",remediation:"Add meaningful alt text, or an empty alt for decorative images."},{id:"low-word-count",severity:"info",owner:"content",scope:"page",remediation:"Review whether the page provides enough useful primary content."},{id:"robots-changed",severity:"warning",owner:"developer",scope:"site",remediation:"Review the robots.txt change and confirm that crawl access is intentional."},{id:"page-missing",severity:"error",owner:"developer",scope:"page",remediation:"Include the page in the scan or confirm that its removal is intentional."},{id:"status-regression",severity:"error",owner:"developer",scope:"page",remediation:"Restore the previous successful HTTP response."},{id:"new-noindex",severity:"error",owner:"seo",scope:"page",remediation:"Remove the newly introduced noindex unless it is intentional."},{id:"title-removed",severity:"error",owner:"content",scope:"page",remediation:"Restore a descriptive title."},{id:"title-changed",severity:"warning",owner:"content",scope:"page",remediation:"Review and approve the changed title."},{id:"description-removed",severity:"warning",owner:"content",scope:"page",remediation:"Restore a useful meta description."},{id:"canonical-removed",severity:"error",owner:"seo",scope:"page",remediation:"Restore the canonical declaration."},{id:"canonical-changed",severity:"warning",owner:"seo",scope:"page",remediation:"Confirm the new canonical target is deliberate and valid."},{id:"h1-removed",severity:"warning",owner:"content",scope:"page",remediation:"Restore a clear primary heading."},{id:"redirect-changed",severity:"warning",owner:"developer",scope:"page",remediation:"Confirm the new redirect destination is intentional."},{id:"sitemap-url-count-drop",severity:"error",owner:"seo",scope:"site",remediation:"Investigate the sitemap URL loss and restore omitted indexable pages."}];var RULE_REGISTRY=Object.freeze(definitions.map(definition=>Object.freeze({...definition})));var RULES=new Map(RULE_REGISTRY.map(rule=>[rule.id,rule]));function stableStringify(value){if(Array.isArray(value))return`[${value.map(stableStringify).join(",")}]`;if(value&&typeof value==="object")return`{${Object.entries(value).sort(([a],[b])=>a.localeCompare(b)).map(([key,child])=>`${key}:${stableStringify(child)}`).join(",")}}`;return JSON.stringify(value)}function issueFingerprint(ruleId,scope,url,identity){return createHash("sha256").update(`${ruleId} ${scope} ${url} -${stableStringify(identity??null)}`).digest("hex").slice(0,24)}function createIssue(ruleId,url,message,evidence={},identity){const definition=RULES.get(ruleId);if(!definition)throw new Error(`unknown rule: ${ruleId}`);return{fingerprint:issueFingerprint(ruleId,definition.scope,url,identity),ruleId,rule:ruleId,severity:definition.severity,scope:definition.scope,url,message,evidence,owner:definition.owner,remediation:definition.remediation,documentationUrl:`${DOCS_BASE}#${ruleId}`,after:evidence.actual}}function hasDirective(value,directive){return new RegExp(`(^|[\\s,])${directive}($|[\\s,])`,"i").test(value??"")}function validLanguage(language){if(language.toLowerCase()==="x-default")return true;try{new Intl.Locale(language);return true}catch{return false}}function duplicateMap(pages,select){const groups=new Map;for(const page of pages){const value=select(page)?.trim().toLowerCase();if(!value)continue;const urls=groups.get(value)??[];urls.push(page.url);groups.set(value,urls)}return new Map([...groups].filter(([,urls])=>urls.length>1))}function evaluateCurrentRules(snapshot){const issues=[];const add=candidate=>{issues.push(candidate)};const pageByUrl=new Map(snapshot.pages.map(page=>[page.url,page]));const sitemapUrls=new Set(snapshot.sitemap?.urls??[]);const titles=duplicateMap(snapshot.pages,page=>page.title);const descriptions=duplicateMap(snapshot.pages,page=>page.description);const content=duplicateMap(snapshot.pages,page=>page.contentHash);if(snapshot.sitemap?.error)add(createIssue("sitemap-unavailable",snapshot.sitemap.url,"The configured sitemap could not be loaded",{actual:snapshot.sitemap.error}));for(const page of snapshot.pages){if(page.blockedByRobots){add(createIssue("robots-blocked",page.url,"Page is blocked by robots.txt",{actual:true}));continue}if(page.error){add(createIssue(page.error.includes("redirect loop")?"redirect-loop":"page-unreachable",page.url,`Page request failed: ${page.error}`,{actual:page.error,redirectChain:page.redirectChain}));continue}if(page.status===null||page.status>=400)add(createIssue("http-error",page.url,`Page returned HTTP ${page.status??"unknown"}`,{actual:page.status}));if(hasDirective(page.robots,"noindex"))add(createIssue("noindex",page.url,"Page contains a noindex meta directive",{actual:page.robots}));if(hasDirective(page.xRobotsTag,"noindex"))add(createIssue("x-robots-noindex",page.url,"Page contains a noindex X-Robots-Tag",{actual:page.xRobotsTag}));if(!page.canonicalRaw&&!page.canonical)add(createIssue("missing-canonical",page.url,"Page does not declare a canonical URL",{actual:null}));if(page.canonicalRaw&&!page.canonical)add(createIssue("invalid-canonical",page.url,"Canonical URL is invalid",{actual:page.canonicalRaw}));if(page.canonical&&new URL(page.canonical).origin!==new URL(snapshot.siteUrl).origin)add(createIssue("cross-domain-canonical",page.url,"Canonical points to another origin",{actual:page.canonical}));if(page.canonical){const target=pageByUrl.get(page.canonical);if(target&&(target.error||(target.status??500)>=400))add(createIssue("canonical-target-error",page.url,"Canonical target is unavailable",{target:page.canonical,actual:target.status??target.error},page.canonical))}if(page.redirectChain.length>3)add(createIssue("long-redirect-chain",page.url,`Page uses ${page.redirectChain.length} redirects`,{actual:page.redirectChain.length,redirectChain:page.redirectChain}));if(sitemapUrls.has(page.url)&&(hasDirective(page.robots,"noindex")||hasDirective(page.xRobotsTag,"noindex")))add(createIssue("noindex-in-sitemap",page.url,"Sitemap URL is marked noindex",{actual:page.robots??page.xRobotsTag}));if(sitemapUrls.has(page.url)&&page.redirectChain.length>0)add(createIssue("redirect-in-sitemap",page.url,"Sitemap URL redirects",{actual:page.finalUrl,redirectChain:page.redirectChain}));if(!page.title)add(createIssue("missing-title",page.url,"Page does not have a title",{actual:null}));else{if(titles.get(page.title.trim().toLowerCase()))add(createIssue("duplicate-title",page.url,"Title is shared by multiple pages",{actual:page.title,urls:titles.get(page.title.trim().toLowerCase())},page.title.trim().toLowerCase()));if(page.title.length<10||page.title.length>60)add(createIssue("title-length",page.url,`Title length is ${page.title.length} characters`,{actual:page.title.length,value:page.title}))}if(!page.description)add(createIssue("missing-description",page.url,"Page does not have a meta description",{actual:null}));else{if(descriptions.get(page.description.trim().toLowerCase()))add(createIssue("duplicate-description",page.url,"Meta description is shared by multiple pages",{actual:page.description,urls:descriptions.get(page.description.trim().toLowerCase())},page.description.trim().toLowerCase()));if(page.description.length<50||page.description.length>160)add(createIssue("description-length",page.url,`Description length is ${page.description.length} characters`,{actual:page.description.length,value:page.description}))}if(page.h1Count===0)add(createIssue("missing-h1",page.url,"Page does not contain an H1 heading",{actual:0}));else if(page.h1Count>1)add(createIssue("multiple-h1",page.url,`Page contains ${page.h1Count} H1 headings`,{actual:page.h1Count}));for(const targetUrl of page.internalLinks){const target=pageByUrl.get(targetUrl);if(target&&(target.error||(target.status??500)>=400))add(createIssue("broken-internal-link",page.url,"Internal link points to an unavailable page",{target:targetUrl,actual:target.status??target.error},targetUrl))}if(sitemapUrls.has(page.url)&&page.url!==snapshot.siteUrl&&snapshot.linkGraph.orphanUrls.includes(page.url))add(createIssue("orphan-sitemap-page",page.url,"Sitemap page has no discovered internal links",{actual:true}));if(snapshot.sitemap&&!sitemapUrls.has(page.url)&&!hasDirective(page.robots,"noindex")&&(page.status??500)<400)add(createIssue("crawlable-not-in-sitemap",page.url,"Crawlable page is absent from the sitemap",{actual:false}));for(const alternate of page.hreflang)if(!validLanguage(alternate.lang)||!alternate.url)add(createIssue("invalid-hreflang",page.url,"Hreflang declaration is invalid",{actual:alternate},alternate));for(const[index,block]of page.jsonLd.entries())if(!block.valid)add(createIssue("malformed-json-ld",page.url,"JSON-LD block contains invalid JSON",{actual:block.error,index},index));if(snapshot.siteUrl.startsWith("https:")&&[page.url,page.canonical,...page.internalLinks].some(url=>url?.startsWith("http:")))add(createIssue("http-on-https-site",page.url,"HTTPS site references an internal HTTP URL",{actual:[page.url,page.canonical,...page.internalLinks].filter(url=>url?.startsWith("http:"))}));if(page.lang&&!validLanguage(page.lang))add(createIssue("invalid-language",page.url,"HTML language declaration is invalid",{actual:page.lang}));if(page.contentHash&&content.get(page.contentHash))add(createIssue("duplicate-content",page.url,"Main text is an exact duplicate of another page",{urls:content.get(page.contentHash)},page.contentHash));if(!page.openGraph.title||!page.openGraph.description||!page.openGraph.image)add(createIssue("missing-open-graph",page.url,"Open Graph metadata is incomplete",{actual:page.openGraph}));if(!page.twitter.card||!page.twitter.title||!page.twitter.description||!page.twitter.image)add(createIssue("missing-twitter-metadata",page.url,"Twitter card metadata is incomplete",{actual:page.twitter}));const missingAlt=page.images.filter(image=>image.alt===null).map(image=>image.src);if(missingAlt.length>0)add(createIssue("image-missing-alt",page.url,`${missingAlt.length} image(s) do not have an alt attribute`,{actual:missingAlt}));if(page.wordCount<200)add(createIssue("low-word-count",page.url,`Page contains approximately ${page.wordCount} visible words`,{actual:page.wordCount}))}return issues}var severityOrder={error:0,warning:1,info:2};function globMatches(url,pattern){const pathname=(()=>{try{return new URL(url).pathname}catch{return url}})();const expression=pattern.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replaceAll("**","\0").replaceAll("*","[^/]*").replaceAll("\0",".*");const regex=new RegExp(`^${expression}$`);return regex.test(pathname)||regex.test(url)}function activeSuppression(issue,suppressions,now){return suppressions.find(suppression=>{if(suppression.rule!==issue.ruleId||!globMatches(issue.url,suppression.urlPattern))return false;if(!suppression.expiresAt)return true;return new Date(`${suppression.expiresAt}T23:59:59.999Z`).getTime()>=now.getTime()})??null}function sortIssues(issues){return issues.sort((left,right)=>severityOrder[left.severity]-severityOrder[right.severity]||left.url.localeCompare(right.url)||left.ruleId.localeCompare(right.ruleId)||left.fingerprint.localeCompare(right.fingerprint))}function applyRulePolicy(issues,snapshot,ruleSet={}){const enabled=ruleSet.enabledRules??snapshot.config.enabledRules;const enabledSet=enabled?new Set(enabled):null;const overrides={...snapshot.config.severityOverrides,...ruleSet.severityOverrides??{}};const suppressions=ruleSet.suppressions??snapshot.config.suppressions;const now=new Date(ruleSet.now??Date.now());return sortIssues(issues.filter(candidate=>!enabledSet||enabledSet.has(candidate.ruleId)).map(candidate=>({...candidate,severity:overrides[candidate.ruleId]??candidate.severity})).filter(candidate=>!activeSuppression(candidate,suppressions,now)))}import{createHash as createHash2}from"node:crypto";var ENGINE_VERSION="0.7.0";var RULE_SET_VERSION="1.1.0";var PRODUCT_NAME="seo-crawl-audit";var DEFAULT_USER_AGENT=`${PRODUCT_NAME}/${ENGINE_VERSION}`;var DEFAULT_OPEN_GRAPH={title:null,description:null,image:null};var DEFAULT_TWITTER={card:null,title:null,description:null,image:null};function baselineInput(value){if(!value||typeof value!=="object"||Array.isArray(value)){throw new Error("snapshot must be an object")}return value}function pageInput(value){if(!value||typeof value!=="object"||typeof value.url!=="string"){throw new Error("snapshot page URL must be a string")}return value}function stableJson(value){if(Array.isArray(value)){return`[${value.map(stableJson).join(",")}]`}if(value&&typeof value==="object"){return`{${Object.entries(value).sort(([left],[right])=>left.localeCompare(right)).map(([key,child])=>`${JSON.stringify(key)}:${stableJson(child)}`).join(",")}}`}return JSON.stringify(value)}function hashConfiguration(config){return createHash2("sha256").update(stableJson(config)).digest("hex")}function normalizePage(page){return{url:page.url,finalUrl:page.finalUrl??null,status:page.status??null,contentType:page.contentType??null,blockedByRobots:page.blockedByRobots??false,error:page.error??null,title:page.title??null,description:page.description??null,canonical:page.canonical??null,canonicalRaw:page.canonicalRaw??page.canonical??null,robots:page.robots??null,xRobotsTag:page.xRobotsTag??null,lang:page.lang??null,h1Count:page.h1Count??0,openGraph:page.openGraph??DEFAULT_OPEN_GRAPH,twitter:page.twitter??DEFAULT_TWITTER,hreflang:page.hreflang??[],jsonLd:page.jsonLd??[],images:page.images??[],links:[...page.links??[]].sort(),internalLinks:[...page.internalLinks??[]].sort(),externalLinks:[...page.externalLinks??[]].sort(),wordCount:page.wordCount??0,contentHash:page.contentHash??null,depth:page.depth??0,redirectChain:page.redirectChain??[],responseBytes:page.responseBytes??0}}function defaultConfig(input){const source=input.source??{};const options=input.options??{};const firstPage=input.pages?.[0];const firstPageUrl=firstPage&&typeof firstPage==="object"?firstPage.url:void 0;const url=input.siteUrl??input.startUrl??source.startUrl??(typeof firstPageUrl==="string"?firstPageUrl:void 0);if(!url)throw new Error("snapshot site URL must be a string");return{schemaVersion:1,url,sitemap:options.sitemap??source.sitemap??"auto",maxPages:options.maxPages??source.maxPages??100,concurrency:options.concurrency??5,delay:options.requestDelay??source.requestDelay??100,timeout:options.timeout??1e4,respectRobots:options.respectRobots??source.respectRobots??true,includeQuery:options.includeQuery??source.includeQuery??false,maxRedirects:options.maxRedirects??10,maxResponseBytes:options.maxResponseBytes??5*1024*1024,enabledRules:options.enabledRules??null,severityOverrides:options.severityOverrides??{},suppressions:options.suppressions??[],regressionBudgets:options.regressionBudgets??{},report:options.report??{}}}function createLinkGraph(pages,sitemapUrls){const known=new Set(pages.map(page=>page.url));const linked=new Set(pages.flatMap(page=>page.internalLinks));const broken=new Set;for(const page of pages){if(page.error||page.blockedByRobots||(page.status??500)>=400){broken.add(page.url)}}return{internalEdges:pages.reduce((sum,page)=>sum+page.internalLinks.length,0),externalEdges:pages.reduce((sum,page)=>sum+page.externalLinks.length,0),orphanUrls:sitemapUrls.filter(url=>known.has(url)&&!linked.has(url)),brokenInternalUrls:[...broken].sort()}}function createStatistics(input,pages){const blockedByRobots=pages.filter(page=>page.blockedByRobots).length;const failed=pages.filter(page=>page.error||(page.status??500)>=400).length;return{requested:input.requested??pages.length,completed:pages.length,succeeded:pages.length-failed-blockedByRobots,failed,blockedByRobots,redirected:pages.filter(page=>page.redirectChain.length>0||page.url!==page.finalUrl).length,durationMs:input.durationMs??0,truncated:input.truncated??false,partial:input.partial??false}}function createBaseline(scanInput){const scan2=baselineInput(scanInput);const config=defaultConfig(scan2);const pages=(scan2.pages??[]).map(page=>normalizePage(pageInput(page))).sort((left,right)=>left.url.localeCompare(right.url));const sitemapUrls=scan2.sitemap?.urls??[];if(scan2.sitemap&&!scan2.sitemap.url)throw new Error("snapshot sitemap URL must be a string");const sitemap=scan2.sitemap?{url:scan2.sitemap.url,urls:[...sitemapUrls].sort(),sitemapCount:scan2.sitemap.sitemapCount??0,truncated:scan2.sitemap.truncated??false,error:scan2.sitemap.error??null}:null;const siteUrl=scan2.startUrl??config.url;const truncated=scan2.truncated??false;return{schemaVersion:2,engineVersion:ENGINE_VERSION,ruleSetVersion:RULE_SET_VERSION,generatedAt:scan2.generatedAt??new Date().toISOString(),siteUrl,configurationHash:hashConfiguration(config),config,robots:{url:scan2.robots?.url??new URL("/robots.txt",siteUrl).href,status:scan2.robots?.status??null,sha256:scan2.robots?.sha256??null,error:scan2.robots?.error??null,denyAll:scan2.robots?.denyAll??false},sitemap,pages,linkGraph:scan2.linkGraph??createLinkGraph(pages,sitemapUrls),statistics:scan2.statistics??createStatistics(scan2,pages),partial:scan2.partial??false,source:{startUrl:siteUrl,maxPages:config.maxPages,requestDelay:config.delay,includeQuery:config.includeQuery,respectRobots:config.respectRobots,sitemap:typeof config.sitemap==="string"&&!["auto","none"].includes(config.sitemap)?config.sitemap:null},truncated}}function migrateSnapshot(input){const value=baselineInput(input);if(!Array.isArray(value.pages)){throw new Error("snapshot pages must be an array")}if(value.schemaVersion===2){return createBaseline({...value,startUrl:value.siteUrl,options:value.config,pages:value.pages,generatedAt:value.generatedAt,partial:value.partial,statistics:value.statistics,linkGraph:value.linkGraph})}if(value.schemaVersion===1){return createBaseline(value)}throw new Error(`unsupported snapshot schema version: ${String(value.schemaVersion)}`)}function normalizeSnapshotInput(input){if(input.schemaVersion===2)return input;const legacy=input;const firstPage=legacy.pages?.[0];const firstPageUrl=firstPage&&typeof firstPage==="object"?firstPage.url:void 0;const firstUrl=typeof firstPageUrl==="string"?firstPageUrl:legacy.source?.startUrl??"https://invalid.local/";return createBaseline({...legacy,startUrl:legacy.siteUrl??legacy.source?.startUrl??firstUrl,robots:legacy.robots??{url:new URL("/robots.txt",firstUrl).href,status:null,sha256:null,error:null},options:legacy.config??legacy.options??{}})}function audit(snapshotInput,ruleSet={}){const snapshot=normalizeSnapshotInput(snapshotInput);return applyRulePolicy(evaluateCurrentRules(snapshot),snapshot,ruleSet)}function hasDirective2(value,directive){return new RegExp(`(^|[\\s,])${directive}($|[\\s,])`,"i").test(value??"")}function changedIssue(ruleId,url,message,before,after){const candidate=createIssue(ruleId,url,message,{before,after,actual:after});candidate.before=before;candidate.after=after;return candidate}function evaluateRegressionRules(baseline,current){const complete=!current.partial&&!current.truncated;const issues=[];const currentPages=new Map(current.pages.map(page=>[page.url,page]));if(baseline.robots.sha256&¤t.robots.sha256&&baseline.robots.sha256!==current.robots.sha256){issues.push(changedIssue("robots-changed",current.robots.url,"robots.txt content changed",baseline.robots.sha256,current.robots.sha256))}const previousSitemapCount=baseline.sitemap?.urls.length??0;const currentSitemapCount=current.sitemap?.urls.length??0;const sitemapDrop=previousSitemapCount-currentSitemapCount;if(complete&&previousSitemapCount>0&&sitemapDrop>=Math.max(5,Math.ceil(previousSitemapCount*.2))){issues.push(changedIssue("sitemap-url-count-drop",current.sitemap?.url??baseline.sitemap?.url??current.siteUrl,`Sitemap URL count dropped by ${sitemapDrop}`,previousSitemapCount,currentSitemapCount))}for(const before of baseline.pages){const after=currentPages.get(before.url);if(!after){if(complete)issues.push(changedIssue("page-missing",before.url,"Page was not checked",before.status,null));continue}if(after.blockedByRobots&&!before.blockedByRobots){issues.push(changedIssue("robots-blocked",before.url,"Page is now blocked by robots.txt",false,true));continue}if(after.error&&!before.error){issues.push(changedIssue(after.error.includes("redirect loop")?"redirect-loop":"page-unreachable",before.url,`Page request failed: ${after.error}`,before.error,after.error));continue}if(before.status!==null&&before.status<400&&(after.status===null||after.status>=400))issues.push(changedIssue("status-regression",before.url,`HTTP status regressed from ${before.status} to ${after.status??"none"}`,before.status,after.status));const beforeRobots=`${before.robots??""},${before.xRobotsTag??""}`;const afterRobots=`${after.robots??""},${after.xRobotsTag??""}`;if(!hasDirective2(beforeRobots,"noindex")&&hasDirective2(afterRobots,"noindex"))issues.push(changedIssue("new-noindex",before.url,"Page now contains a noindex directive",beforeRobots,afterRobots));if(before.title&&!after.title)issues.push(changedIssue("title-removed",before.url,"Page title was removed",before.title,after.title));else if(before.title&&after.title&&before.title!==after.title)issues.push(changedIssue("title-changed",before.url,"Page title changed",before.title,after.title));if(before.description&&!after.description)issues.push(changedIssue("description-removed",before.url,"Meta description was removed",before.description,after.description));if(before.canonical&&!after.canonical)issues.push(changedIssue("canonical-removed",before.url,"Canonical URL was removed",before.canonical,after.canonical));else if(before.canonical&&after.canonical&&before.canonical!==after.canonical){const candidate=changedIssue("canonical-changed",before.url,"Canonical URL changed",before.canonical,after.canonical);if(new URL(after.canonical).origin!==new URL(before.url).origin)candidate.severity="error";issues.push(candidate)}if(before.h1Count>0&&after.h1Count===0)issues.push(changedIssue("h1-removed",before.url,"All H1 headings were removed",before.h1Count,after.h1Count));if(before.finalUrl&&after.finalUrl&&before.finalUrl!==after.finalUrl){const candidate=changedIssue("redirect-changed",before.url,"Final redirect URL changed",before.finalUrl,after.finalUrl);if(new URL(after.finalUrl).origin!==new URL(before.url).origin)candidate.severity="error";issues.push(candidate)}}return issues}function compareBaselines(baselineInput2,currentInput,ruleSet={}){const baseline=normalizeSnapshotInput(baselineInput2);const current=normalizeSnapshotInput(currentInput);return applyRulePolicy(evaluateRegressionRules(baseline,current),current,ruleSet)}function lifecycle(issue,value){return{...issue,lifecycle:value}}function diff(previousInput,currentInput,ruleSet={}){const previous=normalizeSnapshotInput(previousInput);const current=normalizeSnapshotInput(currentInput);const complete=!current.partial&&!current.truncated;const checkedUrls=new Set(current.pages.map(page=>page.url));const previousIssues=new Map(audit(previous,ruleSet).map(candidate=>[candidate.fingerprint,candidate]));const currentIssues=new Map(audit(current,ruleSet).map(candidate=>[candidate.fingerprint,candidate]));const newIssues=[];const ongoingIssues=[];const unchangedIssues=[];const resolvedIssues=[];for(const[fingerprint,candidate]of currentIssues){const before=previousIssues.get(fingerprint);if(!before)newIssues.push(lifecycle(candidate,"new"));else if(JSON.stringify(before.evidence)===JSON.stringify(candidate.evidence))unchangedIssues.push(lifecycle(candidate,"unchanged"));else ongoingIssues.push(lifecycle({...candidate,before:before.evidence,after:candidate.evidence},"ongoing"))}for(const[fingerprint,candidate]of previousIssues){const evaluated=candidate.scope==="page"?checkedUrls.has(candidate.url):complete;if(evaluated&&!currentIssues.has(fingerprint))resolvedIssues.push(lifecycle(candidate,"resolved"))}const known=new Set(newIssues.map(candidate=>candidate.fingerprint));for(const regression of compareBaselines(previous,current,ruleSet)){if(!known.has(regression.fingerprint))newIssues.push(lifecycle(regression,"new"))}const budgets={...previous.config.regressionBudgets,...current.config.regressionBudgets};const budgetExceeded=Object.entries(budgets).flatMap(([budget,allowed])=>{const actual2=newIssues.filter(candidate=>candidate.severity===budget||candidate.ruleId===budget).length;return actual2>allowed?[{budget,allowed,actual:actual2}]:[]});sortIssues(newIssues);sortIssues(ongoingIssues);sortIssues(unchangedIssues);sortIssues(resolvedIssues);return{complete,newIssues,ongoingIssues,resolvedIssues,unchangedIssues,issues:[...newIssues,...ongoingIssues],budgetExceeded}}var DEFAULT_CONFIG_FILE="seo-audit.config.json";var DEFAULT_SCAN_CONFIG=Object.freeze({schemaVersion:1,url:"",sitemap:"auto",maxPages:100,concurrency:5,delay:100,timeout:1e4,respectRobots:true,includeQuery:false,maxRedirects:10,maxResponseBytes:5*1024*1024,enabledRules:null,severityOverrides:{},suppressions:[],regressionBudgets:{},report:{}});function object(value,field){if(!value||typeof value!=="object"||Array.isArray(value)){throw new Error(`${field} must be an object`)}return value}function integer(value,field,minimum,maximum=Number.MAX_SAFE_INTEGER){if(!Number.isInteger(value)||valuemaximum){throw new Error(`${field} must be an integer between ${minimum} and ${maximum}`)}return value}function optionalString(value,field){if(value===void 0)return void 0;if(typeof value!=="string")throw new Error(`${field} must be a string`);return value}function validateConfig(input){const value=object(input,"config");const allowed=new Set(["$schema","schemaVersion","url","sitemap","maxPages","concurrency","delay","timeout","respectRobots","includeQuery","maxRedirects","maxResponseBytes","enabledRules","severityOverrides","suppressions","regressionBudgets","report"]);for(const key of Object.keys(value)){if(!allowed.has(key))throw new Error(`unknown config property: ${key}`)}const result={};if(value.schemaVersion!==void 0&&value.schemaVersion!==1)throw new Error("schemaVersion must be 1");if(value.url!==void 0){const url=optionalString(value.url,"url");if(!/^https?:\/\//i.test(url))throw new Error("url must be an HTTP(S) URL");result.url=url}if(value.sitemap!==void 0){const sitemap=optionalString(value.sitemap,"sitemap");if(!["auto","none"].includes(sitemap)&&!/^https?:\/\//i.test(sitemap)){throw new Error("sitemap must be auto, none, or an HTTP(S) URL")}result.sitemap=sitemap}if(value.maxPages!==void 0)result.maxPages=integer(value.maxPages,"maxPages",1);if(value.concurrency!==void 0)result.concurrency=integer(value.concurrency,"concurrency",1,50);if(value.delay!==void 0)result.delay=integer(value.delay,"delay",0);if(value.timeout!==void 0)result.timeout=integer(value.timeout,"timeout",1);if(value.maxRedirects!==void 0)result.maxRedirects=integer(value.maxRedirects,"maxRedirects",0,50);if(value.maxResponseBytes!==void 0)result.maxResponseBytes=integer(value.maxResponseBytes,"maxResponseBytes",1024);for(const field of["respectRobots","includeQuery"]){if(value[field]!==void 0){if(typeof value[field]!=="boolean")throw new Error(`${field} must be a boolean`);result[field]=value[field]}}if(value.enabledRules!==void 0){if(value.enabledRules!==null&&(!Array.isArray(value.enabledRules)||value.enabledRules.some(rule=>typeof rule!=="string"))){throw new Error("enabledRules must be null or an array of rule IDs")}result.enabledRules=value.enabledRules}if(value.severityOverrides!==void 0){const overrides=object(value.severityOverrides,"severityOverrides");for(const[rule,severity]of Object.entries(overrides)){if(!["error","warning","info"].includes(severity)){throw new Error(`severityOverrides.${rule} must be error, warning, or info`)}}result.severityOverrides=overrides}if(value.suppressions!==void 0){if(!Array.isArray(value.suppressions))throw new Error("suppressions must be an array");result.suppressions=value.suppressions.map((entry,index)=>{const suppression=object(entry,`suppressions[${index}]`);for(const field of["rule","urlPattern","reason"]){if(typeof suppression[field]!=="string"||suppression[field]===""){throw new Error(`suppressions[${index}].${field} must be a non-empty string`)}}if(suppression.expiresAt!==void 0&&!/^\d{4}-\d{2}-\d{2}$/.test(String(suppression.expiresAt))){throw new Error(`suppressions[${index}].expiresAt must use YYYY-MM-DD`)}return suppression})}if(value.regressionBudgets!==void 0){const budgets=object(value.regressionBudgets,"regressionBudgets");result.regressionBudgets=Object.fromEntries(Object.entries(budgets).map(([key,budget])=>[key,integer(budget,`regressionBudgets.${key}`,0)]))}if(value.report!==void 0){const report=object(value.report,"report");const branding={};const agencyName=optionalString(report.agencyName,"report.agencyName");const logo=optionalString(report.logo,"report.logo");const primaryColor=optionalString(report.primaryColor,"report.primaryColor");if(agencyName!==void 0)branding.agencyName=agencyName;if(logo!==void 0)branding.logo=logo;if(primaryColor!==void 0)branding.primaryColor=primaryColor;if(branding.primaryColor&&!/^#[0-9a-f]{6}$/i.test(branding.primaryColor)){throw new Error("report.primaryColor must be a six-digit hex color")}result.report=Object.fromEntries(Object.entries(branding).filter(([,child])=>child!==void 0))}return result}function resolveConfig(cli,file={},baseline={}){const merged={...DEFAULT_SCAN_CONFIG,...baseline,...file,...cli};return{...merged,schemaVersion:1,severityOverrides:{...baseline.severityOverrides??{},...file.severityOverrides??{},...cli.severityOverrides??{}},regressionBudgets:{...baseline.regressionBudgets??{},...file.regressionBudgets??{},...cli.regressionBudgets??{}},report:{...baseline.report??{},...file.report??{},...cli.report??{}},suppressions:cli.suppressions??file.suppressions??baseline.suppressions??[]}}function noop(){}var NOOP_LOGGER=Object.freeze({debug:noop,info:noop,warn:noop,error:noop});import{setTimeout as sleep}from"node:timers/promises";function createRequestGate(intervalMs=0,{now=Date.now,wait=sleep}={}){const interval=Math.max(0,intervalMs);let nextStartAt=0;let queue=Promise.resolve();return function waitForRequestSlot(){if(interval===0)return Promise.resolve();const slot=queue.then(async()=>{const remaining=Math.max(0,nextStartAt-now());if(remaining>0)await wait(remaining);nextStartAt=now()+interval});queue=slot.catch(()=>void 0);return slot}}function createPerOriginRequestGate(intervalMs=0,factory=createRequestGate){const gates=new Map;return url=>{const origin=new URL(url).origin;let gate=gates.get(origin);if(!gate){gate=factory(intervalMs);gates.set(origin,gate)}return gate()}}import{createHash as createHash3}from"node:crypto";import{setTimeout as sleep2}from"node:timers/promises";var RequestFailure=class extends Error{redirectChain;constructor(message,redirectChain=[],options){super(message,options);this.name="RequestFailure";this.redirectChain=redirectChain}};function retryableStatus(status){return status===429||status===500||status===502||status===503||status===504}function retryAfterMs(value,now=Date.now()){if(!value)return null;const seconds=Number(value);if(Number.isFinite(seconds)&&seconds>=0)return Math.min(seconds*1e3,3e4);const date=Date.parse(value);return Number.isNaN(date)?null:Math.min(Math.max(0,date-now),3e4)}function requestSignal(timeout,signal){const timeoutSignal=AbortSignal.timeout(timeout);return signal?AbortSignal.any([signal,timeoutSignal]):timeoutSignal}async function fetchRedirectChain(initialUrl,init,policy2){const chain=[];const visited=new Set([initialUrl]);let url=initialUrl;while(true){policy2.signal?.throwIfAborted();await policy2.gate?.(url);const response=await policy2.fetch(url,{...init,redirect:"manual",signal:requestSignal(policy2.timeout,policy2.signal)});const location=response.headers.get("location");if(response.status<300||response.status>=400||!location){return{response,redirectChain:chain}}const next=new URL(location,url).href;chain.push({url,status:response.status,location:next});await response.body?.cancel();if(visited.has(next))throw new RequestFailure(`redirect loop detected at ${next}`,chain);if(chain.length>policy2.maxRedirects){throw new RequestFailure(`redirect limit of ${policy2.maxRedirects} exceeded`,chain)}visited.add(next);url=next}}async function fetchWithRetry(url,init,policy2){let lastError;for(let attempt=0;attempt<=policy2.retries;attempt+=1){try{const result=await fetchRedirectChain(url,init,policy2);if(!retryableStatus(result.response.status)||attempt===policy2.retries)return result;const serverDelay=retryAfterMs(result.response.headers.get("retry-after"));await result.response.body?.cancel();const jitter=Math.floor((policy2.random??Math.random)()*100);const delayMs=serverDelay??Math.min(250*2**attempt+jitter,3e4);await policy2.onEvent?.({type:"retry",url,attempt:attempt+1,delayMs});await sleep2(delayMs,void 0,{signal:policy2.signal})}catch(error){if(policy2.signal?.aborted)throw policy2.signal.reason??error;lastError=error;if(error instanceof RequestFailure||attempt===policy2.retries)break;const jitter=Math.floor((policy2.random??Math.random)()*100);const delayMs=Math.min(250*2**attempt+jitter,3e4);await policy2.onEvent?.({type:"retry",url,attempt:attempt+1,delayMs});await sleep2(delayMs,void 0,{signal:policy2.signal})}}if(lastError instanceof RequestFailure)throw lastError;throw new RequestFailure(lastError instanceof Error?lastError.message:String(lastError),[],{cause:lastError})}async function readResponseBody(response,maxBytes){if(!response.body)return{text:"",bytes:0,buffer:Buffer.alloc(0)};const reader=response.body.getReader();const chunks=[];let total=0;while(true){const{done,value}=await reader.read();if(done)break;total+=value.byteLength;if(total>maxBytes){await reader.cancel();throw new RequestFailure(`response exceeds ${maxBytes} bytes`)}chunks.push(Buffer.from(value))}const buffer=Buffer.concat(chunks);return{text:buffer.toString("utf8"),bytes:total,buffer}}function patternMatches(pathWithQuery,pattern){if(!pattern)return false;const anchored=pattern.endsWith("$");const source=anchored?pattern.slice(0,-1):pattern;const escaped=source.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replaceAll("*",".*");return new RegExp(`^${escaped}${anchored?"$":""}`).test(pathWithQuery)}function parseRobots(body,userAgent){const groups=[];let current=null;for(const rawLine of body.replace(/^\uFEFF/,"").split(/\r?\n/)){const line=rawLine.replace(/#.*$/,"").trim();const separator=line.indexOf(":");if(!line||separator<0)continue;const field=line.slice(0,separator).trim().toLowerCase();const value=line.slice(separator+1).trim();if(field==="user-agent"){if(!current||current.hasRules){current={agents:[],rules:[],hasRules:false};groups.push(current)}if(value)current.agents.push(value.toLowerCase());continue}if(current&&(field==="allow"||field==="disallow")&&value){current.rules.push({type:field,path:value});current.hasRules=true}}const normalizedAgent=userAgent.toLowerCase();const specific=groups.filter(group=>group.agents.some(agent=>agent!=="*"&&normalizedAgent.includes(agent)));const matching=specific.length>0?specific:groups.filter(group=>group.agents.includes("*"));return matching.flatMap(group=>group.rules)}function isAllowedByRobots(url,robots){if(robots.denyAll)return false;const parsed=new URL(url);const pathWithQuery=`${parsed.pathname}${parsed.search}`;const matches=(robots.rules??[]).filter(rule=>patternMatches(pathWithQuery,rule.path)).sort((left,right)=>right.path.length-left.path.length||(left.type==="allow"?-1:1));return matches.length===0||matches[0]?.type==="allow"}async function fetchRobots(startUrl,options){const robotsUrl=new URL("/robots.txt",startUrl).href;try{const{response}=await fetchWithRetry(robotsUrl,{headers:{accept:"text/plain,*/*;q=0.1","user-agent":options.userAgent}},{fetch:options.fetch,timeout:options.timeout,maxRedirects:options.maxRedirects,retries:options.retries,signal:options.signal,gate:options.requestGate,onEvent:options.onEvent});const{text:body}=await readResponseBody(response,MAX_ROBOTS_BYTES);return{url:robotsUrl,status:response.status,body,sha256:createHash3("sha256").update(body).digest("hex"),rules:response.ok?parseRobots(body,options.userAgent):[],denyAll:response.status===401||response.status===403,error:null}}catch(error){if(options.signal?.aborted)throw error;return{url:robotsUrl,status:null,body:"",sha256:null,rules:[],denyAll:false,error:error instanceof Error?error.message:String(error)}}}var MAX_ROBOTS_BYTES=512*1024;import{gunzipSync}from"node:zlib";var nameStartChar=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD";var nameChar=nameStartChar+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040";var nameRegexp="["+nameStartChar+"]["+nameChar+"]*";var regexName=new RegExp("^"+nameRegexp+"$");function getAllMatches(string,regex){const matches=[];let match=regex.exec(string);while(match){const allmatches=[];allmatches.startIndex=regex.lastIndex-match[0].length;const len=match.length;for(let index=0;index"&&xmlData[i]!==" "&&xmlData[i]!==" "&&xmlData[i]!=="\n"&&xmlData[i]!=="\r";i++){tagName+=xmlData[i]}tagName=tagName.trim();if(tagName[tagName.length-1]==="/"){tagName=tagName.substring(0,tagName.length-1);i--}if(!validateTagName(tagName)){let msg;if(tagName.trim().length===0){msg="Invalid space after '<'."}else{msg="Tag '"+tagName+"' is an invalid name."}return getErrorObject("InvalidTag",msg,getLineNumberForPosition(xmlData,i))}const result=readAttributeStr(xmlData,i);if(result===false){return getErrorObject("InvalidAttr","Attributes for '"+tagName+"' have open quote.",getLineNumberForPosition(xmlData,i))}let attrStr=result.value;i=result.index;if(attrStr[attrStr.length-1]==="/"){const attrStrStart=i-attrStr.length;attrStr=attrStr.substring(0,attrStr.length-1);const isValid=validateAttributeString(attrStr,options);if(isValid===true){tagFound=true}else{return getErrorObject(isValid.err.code,isValid.err.msg,getLineNumberForPosition(xmlData,attrStrStart+isValid.err.line))}}else if(closingTag){if(!result.tagClosed){return getErrorObject("InvalidTag","Closing tag '"+tagName+"' doesn't have proper closing.",getLineNumberForPosition(xmlData,i))}else if(attrStr.trim().length>0){return getErrorObject("InvalidTag","Closing tag '"+tagName+"' can't have attributes or invalid starting.",getLineNumberForPosition(xmlData,tagStartPos))}else if(tags.length===0){return getErrorObject("InvalidTag","Closing tag '"+tagName+"' has not been opened.",getLineNumberForPosition(xmlData,tagStartPos))}else{const otg=tags.pop();if(tagName!==otg.tagName){let openPos=getLineNumberForPosition(xmlData,otg.tagStartPos);return getErrorObject("InvalidTag","Expected closing tag '"+otg.tagName+"' (opened in line "+openPos.line+", col "+openPos.col+") instead of closing tag '"+tagName+"'.",getLineNumberForPosition(xmlData,tagStartPos))}if(tags.length==0){reachedRoot=true}}}else{const isValid=validateAttributeString(attrStr,options);if(isValid!==true){return getErrorObject(isValid.err.code,isValid.err.msg,getLineNumberForPosition(xmlData,i-attrStr.length+isValid.err.line))}if(reachedRoot===true){return getErrorObject("InvalidXml","Multiple possible root nodes found.",getLineNumberForPosition(xmlData,i))}else if(options.unpairedTags.indexOf(tagName)!==-1){}else{tags.push({tagName,tagStartPos})}tagFound=true}for(i++;i0){return getErrorObject("InvalidXml","Invalid '"+JSON.stringify(tags.map(t=>t.tagName),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1})}return true}function isWhiteSpace(char){return char===" "||char===" "||char==="\n"||char==="\r"}function readPI(xmlData,i){const start=i;for(;i5&&tagname==="xml"){return getErrorObject("InvalidXml","XML declaration allowed only at the start of the document.",getLineNumberForPosition(xmlData,i))}else if(xmlData[i]=="?"&&xmlData[i+1]==">"){i++;break}else{continue}}}return i}function readCommentAndCDATA(xmlData,i){if(xmlData.length>i+5&&xmlData[i+1]==="-"&&xmlData[i+2]==="-"){for(i+=3;i"){i+=2;break}}}else if(xmlData.length>i+8&&xmlData[i+1]==="D"&&xmlData[i+2]==="O"&&xmlData[i+3]==="C"&&xmlData[i+4]==="T"&&xmlData[i+5]==="Y"&&xmlData[i+6]==="P"&&xmlData[i+7]==="E"){let angleBracketsCount=1;for(i+=8;i"){angleBracketsCount--;if(angleBracketsCount===0){break}}}}else if(xmlData.length>i+9&&xmlData[i+1]==="["&&xmlData[i+2]==="C"&&xmlData[i+3]==="D"&&xmlData[i+4]==="A"&&xmlData[i+5]==="T"&&xmlData[i+6]==="A"&&xmlData[i+7]==="["){for(i+=8;i"){i+=2;break}}}return i}var doubleQuote='"';var singleQuote="'";function readAttributeStr(xmlData,i){let attrStr="";let startChar="";let tagClosed=false;for(;i"){if(startChar===""){tagClosed=true;break}}attrStr+=xmlData[i]}if(startChar!==""){return false}return{value:attrStr,index:i,tagClosed}}var validAttrStrRegxp=new RegExp(`(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['"])(([\\s\\S])*?)\\5)?`,"g");function validateAttributeString(attrStr,options){const matches=getAllMatches(attrStr,validAttrStrRegxp);const attrNames={};for(let i=0;i",lt:"<",quot:'"'};var COMMON_HTML={nbsp:"\xA0",copy:"\xA9",reg:"\xAE",trade:"\u2122",mdash:"\u2014",ndash:"\u2013",hellip:"\u2026",laquo:"\xAB",raquo:"\xBB",lsquo:"\u2018",rsquo:"\u2019",ldquo:"\u201C",rdquo:"\u201D",bull:"\u2022",para:"\xB6",sect:"\xA7",deg:"\xB0",frac12:"\xBD",frac14:"\xBC",frac34:"\xBE"};var ENTITY_ACTION=Object.freeze({ALLOW:"allow",BLOCK:"block",THROW:"throw"});var SPECIAL_CHARS=new Set("!?\\\\/[]$%{}^&*()<>|+");function validateEntityName(name){if(name[0]==="#"){throw new Error(`[EntityReplacer] Invalid character '#' in entity name: "${name}"`)}for(const ch of name){if(SPECIAL_CHARS.has(ch)){throw new Error(`[EntityReplacer] Invalid character '${ch}' in entity name: "${name}"`)}}return name}function mergeEntityMaps(...maps){const out=Object.create(null);for(const map of maps){if(!map)continue;for(const key of Object.keys(map)){const raw=map[key];if(typeof raw==="string"){out[key]=raw}else if(raw&&typeof raw==="object"&&raw.val!==void 0){const val=raw.val;if(typeof val==="string"){out[key]=val}}}}return out}var LIMIT_TIER_EXTERNAL="external";var LIMIT_TIER_BASE="base";var LIMIT_TIER_ALL="all";function parseLimitTiers(raw){if(!raw||raw===LIMIT_TIER_EXTERNAL)return new Set([LIMIT_TIER_EXTERNAL]);if(raw===LIMIT_TIER_ALL)return new Set([LIMIT_TIER_ALL]);if(raw===LIMIT_TIER_BASE)return new Set([LIMIT_TIER_BASE]);if(Array.isArray(raw))return new Set(raw);return new Set([LIMIT_TIER_EXTERNAL])}var NCR_LEVEL=Object.freeze({allow:0,leave:1,remove:2,throw:3});var XML10_ALLOWED_C0=new Set([9,10,13]);function parseNCRConfig(ncr){if(!ncr){return{xmlVersion:1,onLevel:NCR_LEVEL.allow,nullLevel:NCR_LEVEL.remove}}const xmlVersion=ncr.xmlVersion===1.1?1.1:1;const onLevel=NCR_LEVEL[ncr.onNCR]??NCR_LEVEL.allow;const nullLevel=NCR_LEVEL[ncr.nullNCR]??NCR_LEVEL.remove;const clampedNull=Math.max(nullLevel,NCR_LEVEL.remove);return{xmlVersion,onLevel,nullLevel:clampedNull}}var EntityDecoder=class{constructor(options={}){this._limit=options.limit||{};this._maxTotalExpansions=this._limit.maxTotalExpansions||0;this._maxExpandedLength=this._limit.maxExpandedLength||0;this._postCheck=typeof options.postCheck==="function"?options.postCheck:r=>r;this._limitTiers=parseLimitTiers(this._limit.applyLimitsTo??LIMIT_TIER_EXTERNAL);this._numericAllowed=options.numericAllowed??true;this._baseMap=mergeEntityMaps(XML,options.namedEntities||null);this._externalMap=Object.create(null);this._inputMap=Object.create(null);this._totalExpansions=0;this._expandedLength=0;this._removeSet=new Set(options.remove&&Array.isArray(options.remove)?options.remove:[]);this._leaveSet=new Set(options.leave&&Array.isArray(options.leave)?options.leave:[]);const ncrCfg=parseNCRConfig(options.ncr);this._ncrXmlVersion=ncrCfg.xmlVersion;this._ncrOnLevel=ncrCfg.onLevel;this._ncrNullLevel=ncrCfg.nullLevel;this._onExternalEntity=typeof options.onExternalEntity==="function"?options.onExternalEntity:null;this._onInputEntity=typeof options.onInputEntity==="function"?options.onInputEntity:null}_applyRegistrationHook(hook,name,value,context){if(!hook)return true;const action=hook(name,value);if(action===ENTITY_ACTION.BLOCK)return false;if(action===ENTITY_ACTION.THROW){throw new Error(`[EntityDecoder] Registration of ${context} entity "&${name};" was rejected by hook`)}return true}setExternalEntities(map){if(map){for(const key of Object.keys(map)){validateEntityName(key)}}if(!this._onExternalEntity){this._externalMap=mergeEntityMaps(map);return}const flat=mergeEntityMaps(map);const filtered=Object.create(null);for(const[name,value]of Object.entries(flat)){if(this._applyRegistrationHook(this._onExternalEntity,name,value,"external")){filtered[name]=value}}this._externalMap=filtered}addExternalEntity(key,value){validateEntityName(key);if(typeof value==="string"&&value.indexOf("&")===-1){if(this._applyRegistrationHook(this._onExternalEntity,key,value,"external")){this._externalMap[key]=value}}}addInputEntities(map){this._totalExpansions=0;this._expandedLength=0;if(!this._onInputEntity){this._inputMap=mergeEntityMaps(map);return}const flat=mergeEntityMaps(map);const filtered=Object.create(null);for(const[name,value]of Object.entries(flat)){if(this._applyRegistrationHook(this._onInputEntity,name,value,"input")){filtered[name]=value}}this._inputMap=filtered}reset(){this._inputMap=Object.create(null);this._totalExpansions=0;this._expandedLength=0;return this}setXmlVersion(version){this._ncrXmlVersion=version===1.1?1.1:1}decode(str){if(typeof str!=="string"||str.length===0)return str;if(str.indexOf("&")===-1)return str;const original=str;const chunks=[];const len=str.length;let last=0;let i=0;const limitExpansions=this._maxTotalExpansions>0;const limitLength=this._maxExpandedLength>0;const checkLimits=limitExpansions||limitLength;while(i=len||str.charCodeAt(j)!==59){i++;continue}const token=str.slice(i+1,j);if(token.length===0){i++;continue}let replacement;let tier;if(this._removeSet.has(token)){replacement="";if(tier===void 0){tier=LIMIT_TIER_EXTERNAL}}else if(this._leaveSet.has(token)){i++;continue}else if(token.charCodeAt(0)===35){const ncrResult=this._resolveNCR(token);if(ncrResult===void 0){i++;continue}replacement=ncrResult;tier=LIMIT_TIER_BASE}else{const resolved=this._resolveName(token);replacement=resolved?.value;tier=resolved?.tier}if(replacement===void 0){i++;continue}if(i>last)chunks.push(str.slice(last,i));chunks.push(replacement);last=j+1;i=last;if(checkLimits&&this._tierCounts(tier)){if(limitExpansions){this._totalExpansions++;if(this._totalExpansions>this._maxTotalExpansions){throw new Error(`[EntityReplacer] Entity expansion count limit exceeded: ${this._totalExpansions} > ${this._maxTotalExpansions}`)}}if(limitLength){const delta=replacement.length-(token.length+2);if(delta>0){this._expandedLength+=delta;if(this._expandedLength>this._maxExpandedLength){throw new Error(`[EntityReplacer] Expanded content length limit exceeded: ${this._expandedLength} > ${this._maxExpandedLength}`)}}}}}if(last=55296&&cp<=57343)return NCR_LEVEL.remove;if(this._ncrXmlVersion===1){if(cp>=1&&cp<=31&&!XML10_ALLOWED_C0.has(cp))return NCR_LEVEL.remove}return-1}_applyNCRAction(action,token,cp){switch(action){case NCR_LEVEL.allow:return String.fromCodePoint(cp);case NCR_LEVEL.remove:return"";case NCR_LEVEL.leave:return void 0;case NCR_LEVEL.throw:throw new Error(`[EntityDecoder] Prohibited numeric character reference &${token}; (U+${cp.toString(16).toUpperCase().padStart(4,"0")})`);default:return String.fromCodePoint(cp)}}_resolveNCR(token){const second=token.charCodeAt(1);let cp;if(second===120||second===88){cp=parseInt(token.slice(2),16)}else{cp=parseInt(token.slice(1),10)}if(Number.isNaN(cp)||cp<0||cp>1114111)return void 0;const minimum=this._classifyNCR(cp);if(!this._numericAllowed&&minimum{if(DANGEROUS_PROPERTY_NAMES.includes(name)){return"__"+name}return name};var defaultOptions2={preserveOrder:false,attributeNamePrefix:"@_",attributesGroupName:false,textNodeName:"#text",ignoreAttributes:true,removeNSPrefix:false,allowBooleanAttributes:false,parseTagValue:true,parseAttributeValue:false,trimValues:true,cdataPropName:false,numberParseOptions:{hex:true,leadingZeros:true,eNotation:true,unicode:false},tagValueProcessor:function(tagName,val){return val},attributeValueProcessor:function(attrName,val){return val},stopNodes:[],alwaysCreateTextNode:false,isArray:()=>false,commentPropName:false,unpairedTags:[],processEntities:true,htmlEntities:false,entityDecoder:null,ignoreDeclaration:false,ignorePiTags:false,transformTagName:false,transformAttributeName:false,updateTag:function(tagName,jPath,attrs){return tagName},captureMetaData:false,maxNestedTags:100,strictReservedNames:true,jPath:true,onDangerousProperty:defaultOnDangerousProperty};function validatePropertyName(propertyName,optionName){if(typeof propertyName!=="string"){return}const normalized=propertyName.toLowerCase();if(DANGEROUS_PROPERTY_NAMES.some(dangerous=>normalized===dangerous.toLowerCase())){throw new Error(`[SECURITY] Invalid ${optionName}: "${propertyName}" is a reserved JavaScript keyword that could cause prototype pollution`)}if(criticalProperties.some(dangerous=>normalized===dangerous.toLowerCase())){throw new Error(`[SECURITY] Invalid ${optionName}: "${propertyName}" is a reserved JavaScript keyword that could cause prototype pollution`)}}function normalizeProcessEntities(value,htmlEntities){if(typeof value==="boolean"){return{enabled:value,maxEntitySize:1e4,maxExpansionDepth:1e4,maxTotalExpansions:Infinity,maxExpandedLength:1e5,maxEntityCount:1e3,allowedTags:null,tagFilter:null,appliesTo:"all"}}if(typeof value==="object"&&value!==null){return{enabled:value.enabled!==false,maxEntitySize:Math.max(1,value.maxEntitySize??1e4),maxExpansionDepth:Math.max(1,value.maxExpansionDepth??1e4),maxTotalExpansions:Math.max(1,value.maxTotalExpansions??Infinity),maxExpandedLength:Math.max(1,value.maxExpandedLength??1e5),maxEntityCount:Math.max(1,value.maxEntityCount??1e3),allowedTags:value.allowedTags??null,tagFilter:value.tagFilter??null,appliesTo:value.appliesTo??"all"}}return normalizeProcessEntities(true)}var buildOptions=function(options){const built=Object.assign({},defaultOptions2,options);const propertyNameOptions=[{value:built.attributeNamePrefix,name:"attributeNamePrefix"},{value:built.attributesGroupName,name:"attributesGroupName"},{value:built.textNodeName,name:"textNodeName"},{value:built.cdataPropName,name:"cdataPropName"},{value:built.commentPropName,name:"commentPropName"}];for(const{value,name}of propertyNameOptions){if(value){validatePropertyName(value,name)}}if(built.onDangerousProperty===null){built.onDangerousProperty=defaultOnDangerousProperty}built.processEntities=normalizeProcessEntities(built.processEntities,built.htmlEntities);built.unpairedTagsSet=new Set(built.unpairedTags);if(built.stopNodes&&Array.isArray(built.stopNodes)){built.stopNodes=built.stopNodes.map(node=>{if(typeof node==="string"&&node.startsWith("*.")){return".."+node.substring(2)}return node})}return built};var METADATA_SYMBOL;if(typeof Symbol!=="function"){METADATA_SYMBOL="@@xmlMetadata"}else{METADATA_SYMBOL=Symbol("XML Node Metadata")}var XmlNode=class{constructor(tagname){this.tagname=tagname;this.child=[];this[":@"]=Object.create(null)}add(key,val){if(key==="__proto__")key="#__proto__";this.child.push({[key]:val})}addChild(node,startIndex){if(node.tagname==="__proto__")node.tagname="#__proto__";if(node[":@"]&&Object.keys(node[":@"]).length>0){this.child.push({[node.tagname]:node.child,[":@"]:node[":@"]})}else{this.child.push({[node.tagname]:node.child})}if(startIndex!==void 0){this.child[this.child.length-1][METADATA_SYMBOL]={startIndex}}}static getMetaDataSymbol(){return METADATA_SYMBOL}};var nameStartChar10=":A-Za-z_\xC0-\xD6\xD8-\xF6\xF8-\u02FF\u0370-\u037D\u037F-\u0486\u0488-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD";var nameChar10=nameStartChar10+"\\-\\.\\d\xB7\u0300-\u036F\u203F-\u2040";var nameStartChar11=":A-Za-z_\xC0-\u02FF\u0370-\u037D\u037F-\u0486\u0488-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u{10000}-\u{EFFFF}";var nameChar11=nameStartChar11+"\\-\\.\\d\xB7\u0300-\u036F\u0487\u203F-\u2040";var buildRegexes=(startChar,char,flags="")=>{const ncStart=startChar.replace(":","");const ncChar=char.replace(":","");const ncNamePat=`[${ncStart}][${ncChar}]*`;return{name:new RegExp(`^[${startChar}][${char}]*$`,flags),ncName:new RegExp(`^${ncNamePat}$`,flags),qName:new RegExp(`^${ncNamePat}(?::${ncNamePat})?$`,flags),nmToken:new RegExp(`^[${char}]+$`,flags),nmTokens:new RegExp(`^[${char}]+(?:\\s+[${char}]+)*$`,flags)}};var regexes10=buildRegexes(nameStartChar10,nameChar10);var regexes11=buildRegexes(nameStartChar11,nameChar11,"u");var nameStartCharAscii=":A-Za-z_";var nameCharAscii=nameStartCharAscii+"\\-\\.\\d";var regexesAscii=buildRegexes(nameStartCharAscii,nameCharAscii);var getRegexes=(xmlVersion="1.0",asciiOnly=false)=>{if(asciiOnly)return regexesAscii;return xmlVersion==="1.1"?regexes11:regexes10};var qName=(str,{xmlVersion="1.0",asciiOnly=false}={})=>getRegexes(xmlVersion,asciiOnly).qName.test(str);var DocTypeReader=class{constructor(options,xmlVersion){this.suppressValidationErr=!options;this.options=options;this.xmlVersion=xmlVersion||1}setXmlVersion(xmlVersion=1){this.xmlVersion=xmlVersion}readDocType(xmlData,i){const entities=Object.create(null);let entityCount=0;if(xmlData[i+3]==="O"&&xmlData[i+4]==="C"&&xmlData[i+5]==="T"&&xmlData[i+6]==="Y"&&xmlData[i+7]==="P"&&xmlData[i+8]==="E"){i=i+9;let angleBracketsCount=1;let hasBody=false,comment=false;let exp="";for(;i=this.options.maxEntityCount){throw new Error(`Entity count (${entityCount+1}) exceeds maximum allowed (${this.options.maxEntityCount})`)}entities[entityName]=val;entityCount++}}else if(hasBody&&hasSeq(xmlData,"!ELEMENT",i)){i+=8;const{index}=this.readElementExp(xmlData,i+1);i=index}else if(hasBody&&hasSeq(xmlData,"!ATTLIST",i)){i+=8}else if(hasBody&&hasSeq(xmlData,"!NOTATION",i)){i+=9;const{index}=this.readNotationExp(xmlData,i+1,this.suppressValidationErr);i=index}else if(hasSeq(xmlData,"!--",i))comment=true;else throw new Error(`Invalid DOCTYPE`);angleBracketsCount++;exp=""}else if(xmlData[i]===">"){if(comment){if(xmlData[i-1]==="-"&&xmlData[i-2]==="-"){comment=false;angleBracketsCount--}}else{angleBracketsCount--}if(angleBracketsCount===0){break}}else if(xmlData[i]==="["){hasBody=true}else{exp+=xmlData[i]}}if(angleBracketsCount!==0){throw new Error(`Unclosed DOCTYPE`)}}else{throw new Error(`Invalid Tag instead of DOCTYPE`)}return{entities,i}}readEntityExp(xmlData,i){i=skipWhitespace(xmlData,i);const startIndex=i;while(ithis.options.maxEntitySize){throw new Error(`Entity "${entityName}" size (${entityValue.length}) exceeds maximum allowed size (${this.options.maxEntitySize})`)}i--;return[entityName,entityValue,i]}readNotationExp(xmlData,i){i=skipWhitespace(xmlData,i);const startIndex=i;while(i{while(index=CHAR_0&&cc<=CHAR_9||cc===CHAR_MINUS)continue;if(cc=55296&&cc<=56319){if(i+1=56320&&low<=57343){const cp=65536+(cc-55296<<10)+(low-56320);if(HIGH_MAP.has(cp)){firstHit=i;break}}}continue}if(TABLE[cc-TABLE_OFFSET]!==NOT_DIGIT||MINUS_SET.has(cc)){firstHit=i;break}}if(firstHit===-1)return str;const chars=[];if(firstHit>0)chars.push(str.slice(0,firstHit));for(let i=firstHit;i=CHAR_0&&cc<=CHAR_9||cc===CHAR_MINUS){chars.push(str[i]);continue}if(cc=55296&&cc<=56319){if(i+1=56320&&low<=57343){const cp=65536+(cc-55296<<10)+(low-56320);const d2=HIGH_MAP.get(cp);if(d2!==void 0){chars.push(String.fromCharCode(d2+48));i++;continue}}}chars.push(str[i]);continue}if(MINUS_SET.has(cc)){chars.push("-");continue}const d=TABLE[cc-TABLE_OFFSET];chars.push(d!==NOT_DIGIT?String.fromCharCode(d+48):str[i])}return chars.join("")}var anynum_default=anynum;var hexRegex=/^[-+]?0x[a-fA-F0-9]+$/;var binRegex=/^0b[01]+$/;var octRegex=/^0o[0-7]+$/;var numRegex=/^([\-\+])?(0*)([0-9]*(\.[0-9]*)?)$/;var consider={hex:true,binary:false,octal:false,leadingZeros:true,decimalPoint:".",eNotation:true,infinity:"original",unicode:false};function toNumber(str,options={}){options=Object.assign({},consider,options);if(!str||typeof str!=="string")return str;let trimmedStr=str.trim();if(trimmedStr.length===0)return str;else if(options.skipLike!==void 0&&options.skipLike.test(trimmedStr))return str;else if(trimmedStr==="0")return 0;if(options.unicode){trimmedStr=anynum_default(trimmedStr);if(trimmedStr==="0")return 0}if(options.hex&&hexRegex.test(trimmedStr)){return parse_int(trimmedStr,16)}else if(options.binary&&binRegex.test(trimmedStr)){return parse_int(trimmedStr,2)}else if(options.octal&&octRegex.test(trimmedStr)){return parse_int(trimmedStr,8)}else if(!isFinite(trimmedStr)){return handleInfinity(str,Number(trimmedStr),options)}else if(trimmedStr.includes("e")||trimmedStr.includes("E")){return resolveEnotation(str,trimmedStr,options)}else{const match=numRegex.exec(trimmedStr);if(match){const sign=match[1]||"";const leadingZeros=match[2];let numTrimmedByZeros=trimZeros(match[3]);const decimalAdjacentToLeadingZeros=sign?str[leadingZeros.length+1]===".":str[leadingZeros.length]===".";if(!options.leadingZeros&&(leadingZeros.length>1||leadingZeros.length===1&&!decimalAdjacentToLeadingZeros)){return str}else{const num=Number(trimmedStr);const parsedStr=String(num);if(num===0)return num;if(parsedStr.search(/[eE]/)!==-1){if(options.eNotation)return num;else return str}else if(trimmedStr.indexOf(".")!==-1){if(parsedStr==="0")return num;else if(parsedStr===numTrimmedByZeros)return num;else if(parsedStr===`${sign}${numTrimmedByZeros}`)return num;else return str}let n=leadingZeros?numTrimmedByZeros:trimmedStr;if(leadingZeros){return n===parsedStr||sign+n===parsedStr?num:str}else{return n===parsedStr||n===sign+parsedStr?num:str}}}else{return str}}}var eNotationRegx=/^([-+])?(0*)(\d*(\.\d*)?[eE][-\+]?\d+)$/;function resolveEnotation(str,trimmedStr,options){if(!options.eNotation)return str;const notation=trimmedStr.match(eNotationRegx);if(notation){let sign=notation[1]||"";const eChar=notation[3].indexOf("e")===-1?"E":"e";const leadingZeros=notation[2];const eAdjacentToLeadingZeros=sign?str[leadingZeros.length+1]===eChar:str[leadingZeros.length]===eChar;if(leadingZeros.length>1&&eAdjacentToLeadingZeros)return str;else if(leadingZeros.length===1&&(notation[3].startsWith(`.${eChar}`)||notation[3][0]===eChar)){return Number(trimmedStr)}else if(leadingZeros.length>0){if(options.leadingZeros&&!eAdjacentToLeadingZeros){trimmedStr=(notation[1]||"")+notation[3];return Number(trimmedStr)}else return str}else{return Number(trimmedStr)}}else{return str}}function trimZeros(numStr){if(numStr&&numStr.indexOf(".")!==-1){numStr=numStr.replace(/0+$/,"");if(numStr===".")numStr="0";else if(numStr[0]===".")numStr="0"+numStr;else if(numStr[numStr.length-1]===".")numStr=numStr.substring(0,numStr.length-1);return numStr}return numStr}function parse_int(numStr,base){const str=numStr.trim();if(base===2||base===8)numStr=str.substring(2);if(parseInt)return parseInt(numStr,base);else if(Number.parseInt)return Number.parseInt(numStr,base);else if(window&&window.parseInt)return window.parseInt(numStr,base);else throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}function handleInfinity(str,num,options){const isPositive=num===Infinity;switch(options.infinity.toLowerCase()){case"null":return null;case"infinity":return num;case"string":return isPositive?"Infinity":"-Infinity";case"original":default:return str}}function getIgnoreAttributesFn(ignoreAttributes){if(typeof ignoreAttributes==="function"){return ignoreAttributes}if(Array.isArray(ignoreAttributes)){return attrName=>{for(const pattern of ignoreAttributes){if(typeof pattern==="string"&&attrName===pattern){return true}if(pattern instanceof RegExp&&pattern.test(attrName)){return true}}}}return()=>false}var Expression=class{constructor(pattern,options={},data){this.pattern=pattern;this.separator=options.separator||".";this.segments=this._parse(pattern);this.data=data;this._hasDeepWildcard=this.segments.some(seg=>seg.type==="deep-wildcard");this._hasAttributeCondition=this.segments.some(seg=>seg.attrName!==void 0);this._hasPositionSelector=this.segments.some(seg=>seg.position!==void 0)}_parse(pattern){const segments=[];let i=0;let currentPart="";while(i0?path[path.length-1].tag:void 0}getCurrentNamespace(){const path=this._matcher.path;return path.length>0?path[path.length-1].namespace:void 0}getAttrValue(attrName){const path=this._matcher.path;if(path.length===0)return void 0;return path[path.length-1].values?.[attrName]}hasAttr(attrName){const path=this._matcher.path;if(path.length===0)return false;const current=path[path.length-1];return current.values!==void 0&&attrName in current.values}getAnyParentAttr(attrName){return this._matcher.getAnyParentAttr(attrName)}hasAnyParentAttr(attrName){return this._matcher.hasAnyParentAttr(attrName)}getPosition(){const path=this._matcher.path;if(path.length===0)return-1;return path[path.length-1].position??0}getCounter(){const path=this._matcher.path;if(path.length===0)return-1;return path[path.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this._matcher.path.length}toString(separator,includeNamespace=true){return this._matcher.toString(separator,includeNamespace)}toArray(){return this._matcher.path.map(n=>n.tag)}matches(expression){return this._matcher.matches(expression)}matchesAny(exprSet){return exprSet.matchesAny(this._matcher)}};var Matcher=class{constructor(options={}){this.separator=options.separator||".";this.path=[];this.siblingStacks=[];this._pathStringCache=null;this._view=new MatcherView(this);this._keptAttrs=[]}push(tagName,attrValues=null,namespace=null,options=null){this._pathStringCache=null;if(this.path.length>0){this.path[this.path.length-1].values=void 0}const currentLevel=this.path.length;let level=this.siblingStacks[currentLevel];if(!level){level={counts:new Map,total:0};this.siblingStacks[currentLevel]=level}const siblingKey=namespace?`${namespace}:${tagName}`:tagName;const counter=level.counts.get(siblingKey)||0;const position=level.total;level.counts.set(siblingKey,counter+1);level.total++;const node={tag:tagName,position,counter};if(namespace!==null&&namespace!==void 0){node.namespace=namespace}if(attrValues!==null&&attrValues!==void 0){node.values=attrValues}this.path.push(node);const depth=this.path.length;const keep=options!==null?options.keep:null;if(keep!==null&&keep!==void 0&&keep.length>0&&attrValues){for(let i=0;ithis.path.length+1){this.siblingStacks.length=this.path.length+1}const poppedDepth=this.path.length+1;while(this._keptAttrs.length>0&&this._keptAttrs[this._keptAttrs.length-1].depth>=poppedDepth){this._keptAttrs.pop()}return node}updateCurrent(attrValues){if(this.path.length>0){const current=this.path[this.path.length-1];if(attrValues!==null&&attrValues!==void 0){current.values=attrValues}}}getCurrentTag(){return this.path.length>0?this.path[this.path.length-1].tag:void 0}getCurrentNamespace(){return this.path.length>0?this.path[this.path.length-1].namespace:void 0}getAttrValue(attrName){if(this.path.length===0)return void 0;return this.path[this.path.length-1].values?.[attrName]}hasAttr(attrName){if(this.path.length===0)return false;const current=this.path[this.path.length-1];return current.values!==void 0&&attrName in current.values}getAnyParentAttr(attrName){const kept=this._keptAttrs;for(let i=kept.length-1;i>=0;i--){if(kept[i].name===attrName)return kept[i].value}return void 0}hasAnyParentAttr(attrName){const kept=this._keptAttrs;for(let i=kept.length-1;i>=0;i--){if(kept[i].name===attrName)return true}return false}getPosition(){if(this.path.length===0)return-1;return this.path[this.path.length-1].position??0}getCounter(){if(this.path.length===0)return-1;return this.path[this.path.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this.path.length}toString(separator,includeNamespace=true){const sep2=separator||this.separator;const isDefault=sep2===this.separator&&includeNamespace===true;if(isDefault){if(this._pathStringCache!==null){return this._pathStringCache}const result=this.path.map(n=>n.namespace?`${n.namespace}:${n.tag}`:n.tag).join(sep2);this._pathStringCache=result;return result}return this.path.map(n=>includeNamespace&&n.namespace?`${n.namespace}:${n.tag}`:n.tag).join(sep2)}toArray(){return this.path.map(n=>n.tag)}reset(){this._pathStringCache=null;this.path=[];this.siblingStacks=[];this._keptAttrs=[]}matches(expression){const segments=expression.segments;if(segments.length===0){return false}if(expression.hasDeepWildcard()){return this._matchWithDeepWildcard(segments)}return this._matchSimple(segments)}_matchSimple(segments){if(this.path.length!==segments.length){return false}for(let i=0;i=0&&pathIdx>=0){const segment=segments[segIdx];if(segment.type==="deep-wildcard"){segIdx--;if(segIdx<0){return true}const nextSeg=segments[segIdx];let found=false;for(let i=pathIdx;i>=0;i--){if(this._matchSegment(nextSeg,this.path[i],i===this.path.length-1)){pathIdx=i-1;segIdx--;found=true;break}}if(!found){return false}}else{if(!this._matchSegment(segment,this.path[pathIdx],pathIdx===this.path.length-1)){return false}pathIdx--;segIdx--}}return segIdx<0}_matchSegment(segment,node,isCurrentNode){if(segment.tag!=="*"&&segment.tag!==node.tag){return false}if(segment.namespace!==void 0){if(segment.namespace!=="*"&&segment.namespace!==node.namespace){return false}}if(segment.attrName!==void 0){if(!isCurrentNode){return false}if(!node.values||!(segment.attrName in node.values)){return false}if(segment.attrValue!==void 0){if(String(node.values[segment.attrName])!==String(segment.attrValue)){return false}}}if(segment.position!==void 0){if(!isCurrentNode){return false}const counter=node.counter??0;if(segment.position==="first"&&counter!==0){return false}else if(segment.position==="odd"&&counter%2!==1){return false}else if(segment.position==="even"&&counter%2!==0){return false}else if(segment.position==="nth"&&counter!==segment.positionValue){return false}}return true}matchesAny(exprSet){return exprSet.matchesAny(this)}snapshot(){return{path:this.path.map(node=>({...node})),siblingStacks:this.siblingStacks.map(level=>level?{counts:new Map(level.counts),total:level.total}:level),keptAttrs:this._keptAttrs.map(entry=>({...entry}))}}restore(snapshot){this._pathStringCache=null;this.path=snapshot.path.map(node=>({...node}));this.siblingStacks=snapshot.siblingStacks.map(level=>level?{counts:new Map(level.counts),total:level.total}:level);this._keptAttrs=(snapshot.keptAttrs||[]).map(entry=>({...entry}))}readOnly(){return this._view}};var HTML_PATTERNS=[{id:"html-script-open",description:"]/i},{id:"html-javascript-protocol",description:"javascript: URI scheme (with optional whitespace/encoding)",pattern:/j[\t\n\r ]*a[\t\n\r ]*v[\t\n\r ]*a[\t\n\r ]*s[\t\n\r ]*c[\t\n\r ]*r[\t\n\r ]*i[\t\n\r ]*p[\t\n\r ]*t[\t\n\r ]*:/i},{id:"html-vbscript-protocol",description:"vbscript: URI scheme",pattern:/vbscript[\t\n\r ]*:/i},{id:"html-data-html",description:"data:text/html URI \u2014 can execute scripts in browsers",pattern:/data[\t\n\r ]*:[\t\n\r ]*text\/html/i},{id:"html-data-xhtml",description:"data:application/xhtml+xml URI",pattern:/data[\t\n\r ]*:[\t\n\r ]*application\/xhtml/i},{id:"html-data-svg",description:"data:image/svg+xml URI \u2014 can execute scripts",pattern:/data[\t\n\r ]*:[\t\n\r ]*image\/svg\+xml/i},{id:"html-inline-event-handler",description:"Inline event handler attributes: onclick=, onerror=, onload=, etc.",pattern:/\bon\w{1,30}\s*=/i},{id:"html-entity-obfuscated-script",description:"HTML-entity-encoded ]/i},{id:"html-javascript-protocol",description:"javascript: URI scheme (with optional whitespace/encoding)",pattern:/j[\t\n\r ]*a[\t\n\r ]*v[\t\n\r ]*a[\t\n\r ]*s[\t\n\r ]*c[\t\n\r ]*r[\t\n\r ]*i[\t\n\r ]*p[\t\n\r ]*t[\t\n\r ]*:/i},{id:"html-vbscript-protocol",description:"vbscript: URI scheme",pattern:/vbscript[\t\n\r ]*:/i},{id:"html-data-html",description:"data:text/html URI \u2014 can execute scripts in browsers",pattern:/data[\t\n\r ]*:[\t\n\r ]*text\/html/i},{id:"html-data-xhtml",description:"data:application/xhtml+xml URI",pattern:/data[\t\n\r ]*:[\t\n\r ]*application\/xhtml/i},{id:"html-data-svg",description:"data:image/svg+xml URI \u2014 can execute scripts",pattern:/data[\t\n\r ]*:[\t\n\r ]*image\/svg\+xml/i},{id:"html-inline-event-handler",description:"Inline event handler attributes: onclick=, onerror=, onload=, etc.",pattern:/\bon\w{1,30}\s*=/i},{id:"html-entity-obfuscated-script",description:"HTML-entity-encoded