From 3b3855ddbea144b28d73fcbd0564cfe0ff021fc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tymon=20J=C4=99dryczka?= Date: Tue, 7 Apr 2026 14:16:54 +0200 Subject: [PATCH 1/7] feat: start implementing PWA --- next.config.ts | 17 +++ public/manifest.json | 29 +++++ public/sw.js | 130 +++++++++++++++++++++ src/app/layout.tsx | 9 +- src/app/manifest.ts | 7 ++ src/app/offline/page.tsx | 35 ++++++ src/components/service-worker-register.tsx | 37 ++++++ src/proxy.ts | 2 +- tsconfig.json | 3 +- 9 files changed, 266 insertions(+), 3 deletions(-) create mode 100644 public/manifest.json create mode 100644 public/sw.js create mode 100644 src/app/offline/page.tsx create mode 100644 src/components/service-worker-register.tsx diff --git a/next.config.ts b/next.config.ts index 66b3b329..cefff68f 100644 --- a/next.config.ts +++ b/next.config.ts @@ -8,6 +8,23 @@ const nextConfig: NextConfig = { experimental: { viewTransition: true, }, + headers() { + return [ + { + source: "/sw.js", + headers: [ + { + key: "Cache-Control", + value: "no-cache, no-store, must-revalidate", + }, + { + key: "Service-Worker-Allowed", + value: "/", + }, + ], + }, + ]; + }, images: { dangerouslyAllowLocalIP: process.env.NODE_ENV === "development", remotePatterns: [ diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 00000000..a5b97d6e --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,29 @@ +{ + "display_override": ["window-controls-overlay"], + "protocol_handlers": [{ "protocol": "mailto", "url": "/newEmail?to=%s" }], + "name": "The name of your application", + "short_name": "This name will show in your Windows taskbar, in the start menu, and Android homescreen", + "start_url": "The URL that should be loaded when your application is opened", + "display": "standalone", + "description": "A description for your application", + "lang": " The default language of your application", + "dir": "auto", + "theme_color": "#000000", + "background_color": "#000000", + "orientation": "any", + "icons": [ + { + "src": "/icon-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/icon-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any" + } + ], + "prefer_related_applications": false +} diff --git a/public/sw.js b/public/sw.js new file mode 100644 index 00000000..74f40d8a --- /dev/null +++ b/public/sw.js @@ -0,0 +1,130 @@ +// Based off of https://github.com/pwa-builder/PWABuilder/blob/main/docs/sw.js + +const CACHE_NAME = "pwa-cache"; +const OFFLINE_URL = "/offline"; + +const HOSTNAME_WHITELIST = new Set([ + globalThis.location.hostname, + "fonts.gstatic.com", + "fonts.googleapis.com", + "cdn.jsdelivr.net", +]); + +const STATIC_EXTENSIONS = /\.(?:js|css|png|svg|webp|woff2|ico)$/i; +const SENSITIVE_PATH_PREFIXES = ["/api/", "/auth/"]; + +const isSensitiveRequest = (request) => { + if (request.method !== "GET") { + return true; + } + if (request.headers.has("Authorization")) { + return true; + } + + const url = new URL(request.url); + return SENSITIVE_PATH_PREFIXES.some((prefix) => + url.pathname.startsWith(prefix), + ); +}; + +const isCacheableStaticAsset = (request) => { + const url = new URL(request.url); + + if (url.pathname.startsWith("/_next/static/")) { + return true; + } + if (STATIC_EXTENSIONS.test(url.pathname)) { + return true; + } + if (/^\/icon-\d+/.test(url.pathname)) { + return true; + } + if (url.pathname === "/apple-touch-icon.png") { + return true; + } + + return false; +}; + +const offlineHtmlResponse = () => + new Response( + 'Brak połączenia

Brak połączenia z internetem.

', + { + headers: { "Content-Type": "text/html; charset=utf-8" }, + }, + ); + +const handleNavigate = async (request) => { + try { + return await fetch(request); + } catch { + const offlinePage = await caches.match(OFFLINE_URL); + return offlinePage ?? offlineHtmlResponse(); + } +}; + +const handleStaticAsset = async (request, event) => { + const cache = await caches.open(CACHE_NAME); + const cached = await cache.match(request); + + const networkFetch = fetch(request) + .then(async (response) => { + if (response.ok) { + await cache.put(request, response.clone()); + } + return response; + }) + .catch(() => null); + + if (cached) { + event.waitUntil(networkFetch); + return cached; + } + + const fetched = await networkFetch; + if (fetched) { + return fetched; + } + + if (cached) { + return cached; + } + + throw new Error("Network error"); +}; + +globalThis.addEventListener("install", (event) => { + globalThis.skipWaiting(); + event.waitUntil( + caches + .open(CACHE_NAME) + .then((cache) => cache.add(OFFLINE_URL)) + .catch(() => { + // Offline precache is optional; inline HTML fallback is used instead. + }), + ); +}); + +globalThis.addEventListener("activate", (event) => { + event.waitUntil(globalThis.clients.claim()); +}); + +globalThis.addEventListener("fetch", (event) => { + if (isSensitiveRequest(event.request)) { + return; + } + + const hostname = new URL(event.request.url).hostname; + if (!HOSTNAME_WHITELIST.has(hostname)) { + return; + } + + if (event.request.mode === "navigate") { + event.respondWith(handleNavigate(event.request)); + return; + } + + if (isCacheableStaticAsset(event.request)) { + event.respondWith(handleStaticAsset(event.request, event)); + } +}); diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 2c2bc9b6..0000590c 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,4 +1,4 @@ -import type { Metadata } from "next"; +import type { Metadata, Viewport } from "next"; import { Hanken_Grotesk } from "next/font/google"; import Script from "next/script"; import { Suspense } from "react"; @@ -8,6 +8,7 @@ import { AppFooter } from "@/components/app-footer"; import { ErrorHandler } from "@/components/error-handler"; import { GuestAlert } from "@/components/guest-alert"; import { Navbar } from "@/components/navbar"; +import { ServiceWorkerRegister } from "@/components/service-worker-register"; import { Toaster } from "@/components/ui/sonner"; import { env } from "@/env"; import { getServerCurrentUser } from "@/lib/auth/utils.server"; @@ -72,6 +73,11 @@ export const metadata: Metadata = { }, }; +export const viewport: Viewport = { + themeColor: "#1A2856", + colorScheme: "dark light", +}; + export default async function RootLayout({ children, }: Readonly<{ @@ -100,6 +106,7 @@ export default async function RootLayout({ /> +
+ + +
+

+ Brak połączenia z internetem +

+

+ Testownik wymaga połączenia z siecią. Sprawdź połączenie i spróbuj + ponownie. +

+
+ + + Spróbuj ponownie + +
+ + ); +} diff --git a/src/components/service-worker-register.tsx b/src/components/service-worker-register.tsx new file mode 100644 index 00000000..4ce15728 --- /dev/null +++ b/src/components/service-worker-register.tsx @@ -0,0 +1,37 @@ +"use client"; + +import { useEffect } from "react"; + +export function ServiceWorkerRegister() { + useEffect(() => { + if (process.env.NODE_ENV !== "production") { + return; + } + if (process.env.NEXT_PUBLIC_ENABLE_SW === "false") { + return; + } + if (!("serviceWorker" in navigator)) { + return; + } + + const registerServiceWorker = () => { + navigator.serviceWorker + .register("/sw.js", { updateViaCache: "none" }) + .catch((error: unknown) => { + console.error("Service Worker registration failed:", error); + }); + }; + + if (document.readyState === "complete") { + registerServiceWorker(); + return; + } + + window.addEventListener("load", registerServiceWorker); + return () => { + window.removeEventListener("load", registerServiceWorker); + }; + }, []); + + return null; +} diff --git a/src/proxy.ts b/src/proxy.ts index 6d39936f..7c48c755 100644 --- a/src/proxy.ts +++ b/src/proxy.ts @@ -96,6 +96,6 @@ export async function proxy(request: NextRequest) { export const config = { matcher: [ // eslint-disable-next-line unicorn/prefer-string-raw - "/((?!_next/static|_next/image|favicon.ico|.*\\.(?:svg|png|jpg|jpeg|gif|webp|ico|webmanifest|json)$).*)", + "/((?!_next/static|_next/image|favicon.ico|sw\\.js|manifest\\.json|manifest\\.webmanifest|.*\\.(?:svg|png|jpg|jpeg|gif|webp|ico|webmanifest|json)$).*)", ], }; diff --git a/tsconfig.json b/tsconfig.json index cf9c65d3..c7f4b26b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -28,7 +28,8 @@ "**/*.tsx", ".next/types/**/*.ts", ".next/dev/types/**/*.ts", - "**/*.mts" + "**/*.mts", + "public/sw.js" ], "exclude": ["node_modules"] } From b9abea79bf0fad960cd9a40e9b74c06299f5da33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tymon=20J=C4=99dryczka?= Date: Sun, 24 May 2026 16:25:41 +0200 Subject: [PATCH 2/7] feat: add Service Worker with offline mode and install popup --- .gitignore | 6 +- package.json | 6 +- pnpm-lock.yaml | 1112 +++++++++++++++++++- public/offline.html | 184 ++++ public/sw.js | 132 +-- serwist.config.js | 17 + src/app/layout.tsx | 4 +- src/app/offline/page.tsx | 5 + src/app/providers.tsx | 51 +- src/components/pwa-install-alert.tsx | 64 ++ src/components/pwa-install-prompt.tsx | 258 +++++ src/components/service-worker-register.tsx | 37 - src/hooks/use-is-pwa-install-target.ts | 34 + src/hooks/use-is-standalone.ts | 26 + src/lib/pwa/device.ts | 41 + src/sw-env.d.ts | 3 + src/sw.ts | 63 ++ tsconfig.json | 7 +- 18 files changed, 1855 insertions(+), 195 deletions(-) create mode 100644 public/offline.html create mode 100644 serwist.config.js create mode 100644 src/components/pwa-install-alert.tsx create mode 100644 src/components/pwa-install-prompt.tsx delete mode 100644 src/components/service-worker-register.tsx create mode 100644 src/hooks/use-is-pwa-install-target.ts create mode 100644 src/hooks/use-is-standalone.ts create mode 100644 src/lib/pwa/device.ts create mode 100644 src/sw-env.d.ts create mode 100644 src/sw.ts diff --git a/.gitignore b/.gitignore index 3946f4a2..a9034232 100644 --- a/.gitignore +++ b/.gitignore @@ -28,4 +28,8 @@ coverage .eslintcache /tsconfig.tsbuildinfo .env -next-env.d.ts \ No newline at end of file +next-env.d.ts + +# Serwist +public/sw* +public/swe-worker* \ No newline at end of file diff --git a/package.json b/package.json index 1544297b..0dbc6d88 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "private": true, "type": "module", "scripts": { - "build": "next build", + "build": "next build && serwist build", "dev": "next dev", "format": "prettier --cache --write .", "format:check": "prettier --cache --check .", @@ -35,6 +35,7 @@ "@iconify/react": "^6.0.2", "@lottiefiles/dotlottie-react": "^0.17.13", "@monaco-editor/react": "^4.7.0", + "@serwist/next": "^9.5.11", "@t3-oss/env-nextjs": "^0.13.10", "@tailwindcss/postcss": "^4.1.18", "@tanstack/react-pacer": "^0.19.3", @@ -89,6 +90,7 @@ "devDependencies": { "@commitlint/cli": "^21.0.1", "@next/eslint-plugin-next": "^16.1.1", + "@serwist/cli": "^9.5.11", "@solvro/config": "^2.3.3", "@tailwindcss/typography": "^0.5.19", "@testing-library/jest-dom": "^6.9.1", @@ -102,6 +104,7 @@ "@types/sharp": "^0.32.0", "@vitejs/plugin-react": "^5.1.2", "babel-plugin-react-compiler": "1.0.0", + "esbuild": "^0.28.0", "eslint": "^9", "husky": "^9.1.7", "jsdom": "^27.4.0", @@ -109,6 +112,7 @@ "msw": "^2.12.7", "prettier": "^3.7.4", "server-only": "^0.0.1", + "serwist": "^9.5.11", "shadcn": "^4.7.0", "tailwindcss": "^4.1.18", "tw-animate-css": "^1.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 74c4acaa..23cf2324 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,6 +44,9 @@ importers: '@monaco-editor/react': specifier: ^4.7.0 version: 4.7.0(monaco-editor@0.55.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@serwist/next': + specifier: ^9.5.11 + version: 9.5.11(@serwist/cli@9.5.11(@types/node@20.19.39)(browserslist@4.28.2)(esbuild@0.28.0)(typescript@5.9.3))(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5)(typescript@5.9.3) '@t3-oss/env-nextjs': specifier: ^0.13.10 version: 0.13.11(typescript@5.9.3)(zod@4.4.2) @@ -201,6 +204,9 @@ importers: '@next/eslint-plugin-next': specifier: ^16.1.1 version: 16.2.4 + '@serwist/cli': + specifier: ^9.5.11 + version: 9.5.11(@types/node@20.19.39)(browserslist@4.28.2)(esbuild@0.28.0)(typescript@5.9.3) '@solvro/config': specifier: ^2.3.3 version: 2.3.3(@next/eslint-plugin-next@16.2.4)(@typescript-eslint/parser@8.59.4(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(class-validator@0.15.1)(eslint@9.39.4(jiti@2.6.1))(prettier@3.8.3)(ts-declaration-location@1.0.7(typescript@5.9.3))(typescript@5.9.3) @@ -240,6 +246,9 @@ importers: babel-plugin-react-compiler: specifier: 1.0.0 version: 1.0.0 + esbuild: + specifier: ^0.28.0 + version: 0.28.0 eslint: specifier: ^9 version: 9.39.4(jiti@2.6.1) @@ -261,6 +270,9 @@ importers: server-only: specifier: ^0.0.1 version: 0.0.1 + serwist: + specifier: ^9.5.11 + version: 9.5.11(browserslist@4.28.2)(typescript@5.9.3) shadcn: specifier: ^4.7.0 version: 4.7.0(@types/node@20.19.39)(typescript@5.9.3) @@ -760,156 +772,312 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.28.0': + resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.27.7': resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.28.0': + resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.27.7': resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.28.0': + resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.27.7': resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.28.0': + resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.27.7': resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.28.0': + resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.27.7': resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.28.0': + resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.27.7': resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.28.0': + resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.27.7': resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.28.0': + resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.27.7': resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.28.0': + resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.27.7': resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.28.0': + resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.27.7': resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.28.0': + resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.27.7': resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.28.0': + resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.27.7': resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.28.0': + resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.27.7': resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.28.0': + resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.27.7': resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.28.0': + resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.27.7': resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.28.0': + resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.27.7': resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.28.0': + resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.27.7': resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.28.0': + resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.27.7': resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.28.0': + resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.27.7': resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.28.0': + resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.27.7': resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.28.0': + resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.27.7': resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.28.0': + resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.27.7': resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.28.0': + resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.27.7': resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.28.0': + resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.27.7': resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.28.0': + resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.27.7': resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.28.0': + resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-plugin-eslint-comments@4.7.1': resolution: {integrity: sha512-Ql2nJFwA8wUGpILYGOQaT1glPsmvEwE0d+a+l7AALLzQvInqdbXJdx7aSu0DpUX9dB1wMVBMhm99/++S3MdEtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1185,6 +1353,15 @@ packages: resolution: {integrity: sha512-doc2sWgJpbFQ64UflSVd17ibMGDuxO1yKgOgLMwavzESnXjFWJqUeG8saYosqKpHp4kWiM5x1nXvEjbpx90gzw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + '@inquirer/checkbox@5.1.5': + resolution: {integrity: sha512-Jmf9tgBHIEK5SAOB7swYfStqmtkZb00xOTpSQmkoGEpdxOTpJi9RS0A8bkfDPHTTItZRJrRdZrEMu25wyj0VfQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/confirm@6.0.12': resolution: {integrity: sha512-h9FgGun3QwVYNj5TWIZZ+slii73bMoBFjPfVIGtnFuL4t8gBiNDV9PcSfIzkuxvgquJKt9nr1QzszpBzTbH8Og==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -1194,6 +1371,15 @@ packages: '@types/node': optional: true + '@inquirer/core@11.1.10': + resolution: {integrity: sha512-a4Q5BXHQAHa9eO202sTaFCHFYVB3x5fauDuThEAdZ9gfn76pSxiKU7wWcEH0N1O0XmQvNfQNU6QXpiRxmYQx+A==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/core@11.1.9': resolution: {integrity: sha512-BDE4fG22uYh1bGSifcj7JSx119TVYNViMhMu85usp4Fswrzh6M0DV3yld64jA98uOAa2GSQ4Bg4bZRm2d2cwSg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -1203,10 +1389,100 @@ packages: '@types/node': optional: true + '@inquirer/editor@5.1.2': + resolution: {integrity: sha512-Y3Nor7S/DhIPo+8Ym/dSY4efwKI4BsflKDwXh0jNeXJsSF3dteS/3Yf+z4wkibVZDvYMyCgknSTQlNahfunGHg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/expand@5.0.14': + resolution: {integrity: sha512-qyY9zcIX2eKYwaAUiQo9zORd61Lc3sXeM72fVbeHkYnDkqfr8/armcRbmVAIrExeJhI2puk+uomeKtWrpUVUmQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/external-editor@3.0.0': + resolution: {integrity: sha512-lDSwMgg+M5rq6JKBYaJwSX6T9e/HK2qqZ1oxmOwn4AQoJE5D+7TumsxLGC02PWS//rkIVqbZv3XA3ejsc9FYvg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/figures@2.0.5': resolution: {integrity: sha512-NsSs4kzfm12lNetHwAn3GEuH317IzpwrMCbOuMIVytpjnJ90YYHNwdRgYGuKmVxwuIqSgqk3M5qqQt1cDk0tGQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + '@inquirer/input@5.0.13': + resolution: {integrity: sha512-0l0jCHlJnXIV8CTxwQC0C+5Ziq8WP22edWgmciW2xYvoeoSck4v5FvCS1ctKdqLLR0dUo93uAHgWHywgBSoRyw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/number@4.0.13': + resolution: {integrity: sha512-WHmkYnnJAou5gx7RgcvAfUggnHNM1zWfoh0dFPl3dxVssuqt+dK5rIbaOYQXNyOegvFnopbKupjnhw2O8gANNg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/password@5.0.13': + resolution: {integrity: sha512-XDGu64ROHZjOOXLAANvJN7iIxWKhOSCG5VakrZ5kaScVR+snVJCFglD/hL3/677awtWcu4pXoWa280CDIYcBeg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@8.4.2': + resolution: {integrity: sha512-XJmn/wY4AX56l1BRU+ZjDrFtg9+2uBEi4JvJQj82kwJDQKiPgSn4CEsbfGGygS4Gw6rkL4W18oATjfVfaqub2Q==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/rawlist@5.2.9': + resolution: {integrity: sha512-a1ErXEfgjfPYpyQ89dp+7n2IISjH9oQg3ygvF5adz8B7aHn4n2PjEgu1wpVTp69K3bj3lVLxP0qJ2b1clk1Whw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/search@4.1.9': + resolution: {integrity: sha512-ZlbM28Q9lmLkFPNAIv+ZuY530n5Km8U1WW48oYEvDhe9yc2uL3m3t+JSdRUkQlk5fuIuskgiIVjcb7czFzQpuA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/select@5.1.5': + resolution: {integrity: sha512-6SRg6kHfK/sjLXOsuqNebuir+sjwrf/iWuRUnXgB2slzEewppI1WfzeS16XxDcOQmXBruMmmB9Cgrz7wsAxqMg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/type@4.0.5': resolution: {integrity: sha512-aetVUNeKNc/VriqXlw1NRSW0zhMBB0W4bNbWRJgzRl/3d0QNDQFfk0GO5SDdtjMZVg6o8ZKEiadd7SCCzoOn5Q==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -1395,6 +1671,18 @@ packages: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@pnpm/config.env-replace@1.1.0': + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + + '@pnpm/network.ca-file@1.0.2': + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + + '@pnpm/npm-conf@3.0.2': + resolution: {integrity: sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==} + engines: {node: '>=12'} + '@radix-ui/number@1.1.1': resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} @@ -2274,6 +2562,67 @@ packages: '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@serwist/build@9.5.11': + resolution: {integrity: sha512-PQfW+LhADYFOOp0PhEnjlgJCyKor6cYa06d3rID1OpiKzkmCApJV1WYfdTBB96jXaWv6OWcWSbSV4tqDLxvaVA==} + engines: {node: '>=18.0.0'} + peerDependencies: + typescript: '>=5.0.0' + peerDependenciesMeta: + typescript: + optional: true + + '@serwist/cli@9.5.11': + resolution: {integrity: sha512-Uqd55IDAplgsUdUPQgeAcPCwNjzFQCLww35UtCe3Bcio9Mi/vU1g8TjorUUO9TOA2Nc3m10LV2RZQGeLP3ci2g==} + engines: {node: '>=18.0.0'} + hasBin: true + peerDependencies: + esbuild: '>=0.25.0 <1.0.0' + peerDependenciesMeta: + esbuild: + optional: true + + '@serwist/next@9.5.11': + resolution: {integrity: sha512-omT32H7U21ihCymSvOG9QeRJBuOEomJx4JdzKhUoqOW3DR10tH3m84VOHj3BvK0OcA7av3qj5FsyNFBB+f0n8A==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@serwist/cli': ^9.5.11 + next: '>=14.0.0' + react: '>=18.0.0' + typescript: '>=5.0.0' + peerDependenciesMeta: + '@serwist/cli': + optional: true + typescript: + optional: true + + '@serwist/utils@9.5.11': + resolution: {integrity: sha512-zqxmwuHqWA3OwN82Wo8gFZ9QBemygJP3cap5JWAOG4UyJZgUZfmBXAXj+IMaD4eKZ/6pqrxHHDZ9uSWZmJ1mXA==} + peerDependencies: + browserslist: '>=4' + peerDependenciesMeta: + browserslist: + optional: true + + '@serwist/webpack-plugin@9.5.11': + resolution: {integrity: sha512-SlvO3A1UMcc1htCzMtLCtPQK6yISCO7B859ixLv7EiY/yayXjVxGm9vHqkJYpQ768PWyjEZXRY/X6EGRMA6wJQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + typescript: '>=5.0.0' + webpack: 4.4.0 || ^5.9.0 + peerDependenciesMeta: + typescript: + optional: true + webpack: + optional: true + + '@serwist/window@9.5.11': + resolution: {integrity: sha512-OrH9srhmifUvY36NuukHSZby24XTEk4pHh3pfY0GBQzA9ouU1fYh+ORWhKxH7/wkVHRr3sc4YAhjtpfL14PjjQ==} + peerDependencies: + typescript: '>=5.0.0' + peerDependenciesMeta: + typescript: + optional: true + '@simple-libs/child-process-utils@1.0.2': resolution: {integrity: sha512-/4R8QKnd/8agJynkNdJmNw2MBxuFTRcNFnE5Sg/G+jkSsV8/UBgULMzhizWWW42p8L5H7flImV2ATi79Ove2Tw==} engines: {node: '>=18'} @@ -2883,6 +3232,9 @@ packages: ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-escapes@7.3.0: resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} engines: {node: '>=18'} @@ -2989,6 +3341,9 @@ packages: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} + atomically@2.1.1: + resolution: {integrity: sha512-P4w9o2dqARji6P7MHprklbfiArZAWvo07yW7qs3pdljb3BWr12FIB7W+p0zJiuiVsUpRO0iZn1kFFcpPegg0tQ==} + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -3038,6 +3393,10 @@ packages: resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} engines: {node: '>=18'} + boxen@8.0.1: + resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} + engines: {node: '>=18'} + brace-expansion@1.1.14: resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} @@ -3085,6 +3444,10 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + caniuse-lite@1.0.30001791: resolution: {integrity: sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==} @@ -3126,6 +3489,13 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + ci-info@4.4.0: resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} @@ -3143,6 +3513,10 @@ packages: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} engines: {node: '>=4'} + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} @@ -3218,6 +3592,10 @@ packages: resolution: {integrity: sha512-ObxuY6vnbWTN6Od72xfwN9DbzC7Y2vv8u1Soi9ahRKL37gb6y1qk6/dgjs+3JWuXJHWvsg3BXIwzd/rkmAwavg==} engines: {node: '>= 12.0.0'} + common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} @@ -3230,6 +3608,13 @@ packages: confbox@0.2.4: resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + configstore@7.1.0: + resolution: {integrity: sha512-N4oog6YJWbR9kGyXvS7jEykLDXIE2C0ILYqNBZBp9iwiJpoCBWYsuAdW6PPFn6w06jjnC+3JstVvWHO4cZqvRg==} + engines: {node: '>=18'} + content-disposition@1.1.0: resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} engines: {node: '>=18'} @@ -3251,6 +3636,10 @@ packages: engines: {node: '>=18'} hasBin: true + convert-hrtime@5.0.0: + resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} + engines: {node: '>=12'} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -3429,6 +3818,10 @@ packages: babel-plugin-macros: optional: true + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -3513,6 +3906,10 @@ packages: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} + dot-prop@9.0.0: + resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} + engines: {node: '>=18'} + dotenv@17.4.2: resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} engines: {node: '>=12'} @@ -3627,10 +4024,19 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.28.0: + resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-goat@4.0.0: + resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} + engines: {node: '>=12'} + escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -4009,6 +4415,10 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function-timeout@1.0.2: + resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} + engines: {node: '>=18'} + function.prototype.name@1.1.8: resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} @@ -4086,6 +4496,14 @@ packages: resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} engines: {node: 20 || >=22} + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} + + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + global-directory@5.0.0: resolution: {integrity: sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==} engines: {node: '>=20'} @@ -4117,6 +4535,9 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -4243,6 +4664,13 @@ packages: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} + idb@8.0.3: + resolution: {integrity: sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg==} + + identifier-regex@1.0.1: + resolution: {integrity: sha512-ZrYyM0sozNPZlvBvE7Oq9Bn44n0qKGrYu5sQ0JzMUnjIhpgWYE2JB6aBoFwEYdPjqj7jPyxXTMJiHDOxDfd8yw==} + engines: {node: '>=18'} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -4286,6 +4714,13 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ini@6.0.0: resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} engines: {node: ^20.17.0 || >=22.9.0} @@ -4395,6 +4830,15 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-identifier@1.0.1: + resolution: {integrity: sha512-HQ5v4rEJ7REUV54bCd2l5FaD299SGDEn2UPoVXaTHAyGviLq2menVUD2udi3trQ32uvB6LdAh/0ck2EuizrtpA==} + engines: {node: '>=18'} + + is-in-ci@1.0.0: + resolution: {integrity: sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg==} + engines: {node: '>=18'} + hasBin: true + is-in-ssh@1.0.0: resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} engines: {node: '>=20'} @@ -4404,6 +4848,10 @@ packages: engines: {node: '>=14.16'} hasBin: true + is-installed-globally@1.0.0: + resolution: {integrity: sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==} + engines: {node: '>=18'} + is-interactive@2.0.0: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} @@ -4419,6 +4867,10 @@ packages: is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + is-npm@6.1.0: + resolution: {integrity: sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -4435,6 +4887,10 @@ packages: resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} engines: {node: '>=12'} + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -4619,6 +5075,13 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + ky@1.14.3: + resolution: {integrity: sha512-9zy9lkjac+TR1c2tG+mkNSVlyOpInnWdSMiue4F+kq8TwJSgv6o8jhLRg8Ho6SnZ9wOYUq/yozts9qQCfk7bIw==} + engines: {node: '>=18'} + language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -4626,6 +5089,10 @@ packages: resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} engines: {node: '>=0.10'} + latest-version@9.0.0: + resolution: {integrity: sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA==} + engines: {node: '>=18'} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -4742,6 +5209,9 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + log-symbols@6.0.0: resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} engines: {node: '>=18'} @@ -4780,6 +5250,10 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + make-asynchronous@1.1.0: + resolution: {integrity: sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==} + engines: {node: '>=18'} + markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} @@ -4860,6 +5334,10 @@ packages: resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} engines: {node: '>=18'} + meow@14.1.0: + resolution: {integrity: sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==} + engines: {node: '>=20'} + merge-descriptors@2.0.0: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} @@ -5177,6 +5655,10 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + p-event@6.0.1: + resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} + engines: {node: '>=16.17'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -5185,6 +5667,14 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} + + package-json@10.0.1: + resolution: {integrity: sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==} + engines: {node: '>=18'} + package-manager-detector@1.6.0: resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} @@ -5393,6 +5883,10 @@ packages: engines: {node: '>=14'} hasBin: true + pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} + pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -5414,6 +5908,9 @@ packages: property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -5422,6 +5919,10 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + pupa@3.3.0: + resolution: {integrity: sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==} + engines: {node: '>=12.20'} + qs@6.15.1: resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==} engines: {node: '>=0.6'} @@ -5456,6 +5957,10 @@ packages: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + react-day-picker@10.0.0: resolution: {integrity: sha512-lrEXo5wFPsq5LTcayelM3BPueD00v7zbdipAY+EIdPcseVykYwkOWx4Ujn/EtbBvpnp8ZPUHol17HXH6kVbZoA==} engines: {node: '>=18'} @@ -5582,6 +6087,10 @@ packages: readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + recast@0.23.11: resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} engines: {node: '>= 4'} @@ -5621,6 +6130,14 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} + registry-auth-token@5.1.1: + resolution: {integrity: sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==} + engines: {node: '>=14'} + + registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + regjsparser@0.13.1: resolution: {integrity: sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==} hasBin: true @@ -5769,6 +6286,14 @@ packages: server-only@0.0.1: resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} + serwist@9.5.11: + resolution: {integrity: sha512-Bq6uwJFd4ET60BWI77v3VbazKHv6k7lECOiiCFwKyBu/slaCn0GHJ5L5RfsuJUKrnbD9lYUCDo6sqaKRM5M2vA==} + peerDependencies: + typescript: '>=5.0.0' + peerDependenciesMeta: + typescript: + optional: true + set-cookie-parser@3.1.0: resolution: {integrity: sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw==} @@ -5865,6 +6390,11 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions + space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -5959,6 +6489,10 @@ packages: resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} engines: {node: '>=14.16'} + stringify-object@6.0.0: + resolution: {integrity: sha512-6f94vIED6vmJJfh3lyVsVWxCYSfI5uM+16ntED/Ql37XIyV6kj0mRAAiTeMMc/QLYIaizC3bUprQ8pQnDDrKfA==} + engines: {node: '>=20'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -5987,10 +6521,20 @@ packages: resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} engines: {node: '>=12'} + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + stubborn-fs@2.0.0: + resolution: {integrity: sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==} + + stubborn-utils@1.0.2: + resolution: {integrity: sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==} + style-to-js@1.1.21: resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} @@ -6013,6 +6557,10 @@ packages: super-media-element@1.4.2: resolution: {integrity: sha512-9pP/CVNp4NF2MNlRzLwQkjiTgKKe9WYXrLh9+8QokWmMxz+zt2mf1utkWLco26IuA3AfVcTb//qtlTIjY3VHxA==} + super-regex@1.1.0: + resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==} + engines: {node: '>=18'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -6054,6 +6602,10 @@ packages: tiktok-video-element@0.1.2: resolution: {integrity: sha512-w6TboLm236XJKKiIXIhCbYCnUxbixBbaAoty0etaEAZ/2kHkVIdfZdv2oouMU/HGMsWCHI/VjQ3wU3MJ+s192Q==} + time-span@5.1.0: + resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} + engines: {node: '>=12'} + tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -6095,6 +6647,9 @@ packages: resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} engines: {node: '>=16'} + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tr46@6.0.0: resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} engines: {node: '>=20'} @@ -6264,6 +6819,10 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-notifier@7.3.1: + resolution: {integrity: sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA==} + engines: {node: '>=18'} + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -6464,6 +7023,12 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} + web-worker@1.5.0: + resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + webidl-conversions@8.0.1: resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} @@ -6484,6 +7049,12 @@ packages: resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==} engines: {node: '>=20'} + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + when-exit@2.1.5: + resolution: {integrity: sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==} + which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -6515,6 +7086,10 @@ packages: engines: {node: '>=8'} hasBin: true + widest-line@5.0.0: + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} + engines: {node: '>=18'} + wistia-video-element@1.3.6: resolution: {integrity: sha512-wPizIpXDaCs6fvDzhU3MBtEpxIqhgXlu00kSrKgmjPb5DRqZt927xZZjE1qm81Df40d445u4a/mRKX5I66zaYA==} @@ -6549,6 +7124,10 @@ packages: resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} engines: {node: '>=20'} + xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + xml-name-validator@5.0.0: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} @@ -6613,6 +7192,9 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.4.1: + resolution: {integrity: sha512-a6ENMBBGZBsnlSebQ/eKCguSBeGKSf4O7BPnqVPmYGtpBYI7VSqoVqw+QcB7kPRjbqPwhYTpFbVj/RqNz/CT0Q==} + zod@4.4.2: resolution: {integrity: sha512-IynmDyxsEsb9RKzO3J9+4SxXnl2FTFSzNBaKKaMV6tsSk0rw9gYw9gs+JFCq/qk2LCZ78KDwyj+Z289TijSkUw==} @@ -7258,81 +7840,159 @@ snapshots: '@esbuild/aix-ppc64@0.27.7': optional: true + '@esbuild/aix-ppc64@0.28.0': + optional: true + '@esbuild/android-arm64@0.27.7': optional: true + '@esbuild/android-arm64@0.28.0': + optional: true + '@esbuild/android-arm@0.27.7': optional: true + '@esbuild/android-arm@0.28.0': + optional: true + '@esbuild/android-x64@0.27.7': optional: true + '@esbuild/android-x64@0.28.0': + optional: true + '@esbuild/darwin-arm64@0.27.7': optional: true + '@esbuild/darwin-arm64@0.28.0': + optional: true + '@esbuild/darwin-x64@0.27.7': optional: true + '@esbuild/darwin-x64@0.28.0': + optional: true + '@esbuild/freebsd-arm64@0.27.7': optional: true + '@esbuild/freebsd-arm64@0.28.0': + optional: true + '@esbuild/freebsd-x64@0.27.7': optional: true + '@esbuild/freebsd-x64@0.28.0': + optional: true + '@esbuild/linux-arm64@0.27.7': optional: true + '@esbuild/linux-arm64@0.28.0': + optional: true + '@esbuild/linux-arm@0.27.7': optional: true + '@esbuild/linux-arm@0.28.0': + optional: true + '@esbuild/linux-ia32@0.27.7': optional: true + '@esbuild/linux-ia32@0.28.0': + optional: true + '@esbuild/linux-loong64@0.27.7': optional: true + '@esbuild/linux-loong64@0.28.0': + optional: true + '@esbuild/linux-mips64el@0.27.7': optional: true + '@esbuild/linux-mips64el@0.28.0': + optional: true + '@esbuild/linux-ppc64@0.27.7': optional: true + '@esbuild/linux-ppc64@0.28.0': + optional: true + '@esbuild/linux-riscv64@0.27.7': optional: true + '@esbuild/linux-riscv64@0.28.0': + optional: true + '@esbuild/linux-s390x@0.27.7': optional: true + '@esbuild/linux-s390x@0.28.0': + optional: true + '@esbuild/linux-x64@0.27.7': optional: true + '@esbuild/linux-x64@0.28.0': + optional: true + '@esbuild/netbsd-arm64@0.27.7': optional: true + '@esbuild/netbsd-arm64@0.28.0': + optional: true + '@esbuild/netbsd-x64@0.27.7': optional: true + '@esbuild/netbsd-x64@0.28.0': + optional: true + '@esbuild/openbsd-arm64@0.27.7': optional: true + '@esbuild/openbsd-arm64@0.28.0': + optional: true + '@esbuild/openbsd-x64@0.27.7': optional: true + '@esbuild/openbsd-x64@0.28.0': + optional: true + '@esbuild/openharmony-arm64@0.27.7': optional: true + '@esbuild/openharmony-arm64@0.28.0': + optional: true + '@esbuild/sunos-x64@0.27.7': optional: true + '@esbuild/sunos-x64@0.28.0': + optional: true + '@esbuild/win32-arm64@0.27.7': optional: true + '@esbuild/win32-arm64@0.28.0': + optional: true + '@esbuild/win32-ia32@0.27.7': optional: true + '@esbuild/win32-ia32@0.28.0': + optional: true + '@esbuild/win32-x64@0.27.7': optional: true + '@esbuild/win32-x64@0.28.0': + optional: true + '@eslint-community/eslint-plugin-eslint-comments@4.7.1(eslint@9.39.4(jiti@2.6.1))': dependencies: escape-string-regexp: 4.0.0 @@ -7543,6 +8203,15 @@ snapshots: '@inquirer/ansi@2.0.5': {} + '@inquirer/checkbox@5.1.5(@types/node@20.19.39)': + dependencies: + '@inquirer/ansi': 2.0.5 + '@inquirer/core': 11.1.10(@types/node@20.19.39) + '@inquirer/figures': 2.0.5 + '@inquirer/type': 4.0.5(@types/node@20.19.39) + optionalDependencies: + '@types/node': 20.19.39 + '@inquirer/confirm@6.0.12(@types/node@20.19.39)': dependencies: '@inquirer/core': 11.1.9(@types/node@20.19.39) @@ -7550,6 +8219,18 @@ snapshots: optionalDependencies: '@types/node': 20.19.39 + '@inquirer/core@11.1.10(@types/node@20.19.39)': + dependencies: + '@inquirer/ansi': 2.0.5 + '@inquirer/figures': 2.0.5 + '@inquirer/type': 4.0.5(@types/node@20.19.39) + cli-width: 4.1.0 + fast-wrap-ansi: 0.2.2 + mute-stream: 3.0.0 + signal-exit: 4.1.0 + optionalDependencies: + '@types/node': 20.19.39 + '@inquirer/core@11.1.9(@types/node@20.19.39)': dependencies: '@inquirer/ansi': 2.0.5 @@ -7562,8 +8243,91 @@ snapshots: optionalDependencies: '@types/node': 20.19.39 + '@inquirer/editor@5.1.2(@types/node@20.19.39)': + dependencies: + '@inquirer/core': 11.1.10(@types/node@20.19.39) + '@inquirer/external-editor': 3.0.0(@types/node@20.19.39) + '@inquirer/type': 4.0.5(@types/node@20.19.39) + optionalDependencies: + '@types/node': 20.19.39 + + '@inquirer/expand@5.0.14(@types/node@20.19.39)': + dependencies: + '@inquirer/core': 11.1.10(@types/node@20.19.39) + '@inquirer/type': 4.0.5(@types/node@20.19.39) + optionalDependencies: + '@types/node': 20.19.39 + + '@inquirer/external-editor@3.0.0(@types/node@20.19.39)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.2 + optionalDependencies: + '@types/node': 20.19.39 + '@inquirer/figures@2.0.5': {} + '@inquirer/input@5.0.13(@types/node@20.19.39)': + dependencies: + '@inquirer/core': 11.1.10(@types/node@20.19.39) + '@inquirer/type': 4.0.5(@types/node@20.19.39) + optionalDependencies: + '@types/node': 20.19.39 + + '@inquirer/number@4.0.13(@types/node@20.19.39)': + dependencies: + '@inquirer/core': 11.1.10(@types/node@20.19.39) + '@inquirer/type': 4.0.5(@types/node@20.19.39) + optionalDependencies: + '@types/node': 20.19.39 + + '@inquirer/password@5.0.13(@types/node@20.19.39)': + dependencies: + '@inquirer/ansi': 2.0.5 + '@inquirer/core': 11.1.10(@types/node@20.19.39) + '@inquirer/type': 4.0.5(@types/node@20.19.39) + optionalDependencies: + '@types/node': 20.19.39 + + '@inquirer/prompts@8.4.2(@types/node@20.19.39)': + dependencies: + '@inquirer/checkbox': 5.1.5(@types/node@20.19.39) + '@inquirer/confirm': 6.0.12(@types/node@20.19.39) + '@inquirer/editor': 5.1.2(@types/node@20.19.39) + '@inquirer/expand': 5.0.14(@types/node@20.19.39) + '@inquirer/input': 5.0.13(@types/node@20.19.39) + '@inquirer/number': 4.0.13(@types/node@20.19.39) + '@inquirer/password': 5.0.13(@types/node@20.19.39) + '@inquirer/rawlist': 5.2.9(@types/node@20.19.39) + '@inquirer/search': 4.1.9(@types/node@20.19.39) + '@inquirer/select': 5.1.5(@types/node@20.19.39) + optionalDependencies: + '@types/node': 20.19.39 + + '@inquirer/rawlist@5.2.9(@types/node@20.19.39)': + dependencies: + '@inquirer/core': 11.1.10(@types/node@20.19.39) + '@inquirer/type': 4.0.5(@types/node@20.19.39) + optionalDependencies: + '@types/node': 20.19.39 + + '@inquirer/search@4.1.9(@types/node@20.19.39)': + dependencies: + '@inquirer/core': 11.1.10(@types/node@20.19.39) + '@inquirer/figures': 2.0.5 + '@inquirer/type': 4.0.5(@types/node@20.19.39) + optionalDependencies: + '@types/node': 20.19.39 + + '@inquirer/select@5.1.5(@types/node@20.19.39)': + dependencies: + '@inquirer/ansi': 2.0.5 + '@inquirer/core': 11.1.10(@types/node@20.19.39) + '@inquirer/figures': 2.0.5 + '@inquirer/type': 4.0.5(@types/node@20.19.39) + optionalDependencies: + '@types/node': 20.19.39 + '@inquirer/type@4.0.5(@types/node@20.19.39)': optionalDependencies: '@types/node': 20.19.39 @@ -7740,6 +8504,18 @@ snapshots: '@pkgr/core@0.2.9': {} + '@pnpm/config.env-replace@1.1.0': {} + + '@pnpm/network.ca-file@1.0.2': + dependencies: + graceful-fs: 4.2.10 + + '@pnpm/npm-conf@3.0.2': + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + '@radix-ui/number@1.1.1': {} '@radix-ui/primitive@1.1.3': {} @@ -8602,6 +9378,85 @@ snapshots: '@sec-ant/readable-stream@0.4.1': {} + '@serwist/build@9.5.11(browserslist@4.28.2)(typescript@5.9.3)': + dependencies: + '@serwist/utils': 9.5.11(browserslist@4.28.2) + common-tags: 1.8.2 + glob: 13.0.6 + pretty-bytes: 6.1.1 + source-map: 0.8.0-beta.0 + type-fest: 5.6.0 + zod: 4.4.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - browserslist + + '@serwist/cli@9.5.11(@types/node@20.19.39)(browserslist@4.28.2)(esbuild@0.28.0)(typescript@5.9.3)': + dependencies: + '@inquirer/prompts': 8.4.2(@types/node@20.19.39) + '@serwist/build': 9.5.11(browserslist@4.28.2)(typescript@5.9.3) + '@serwist/utils': 9.5.11(browserslist@4.28.2) + chalk: 5.6.2 + chokidar: 5.0.0 + common-tags: 1.8.2 + glob: 13.0.6 + meow: 14.1.0 + pretty-bytes: 6.1.1 + stringify-object: 6.0.0 + update-notifier: 7.3.1 + zod: 4.4.1 + optionalDependencies: + esbuild: 0.28.0 + transitivePeerDependencies: + - '@types/node' + - browserslist + - typescript + + '@serwist/next@9.5.11(@serwist/cli@9.5.11(@types/node@20.19.39)(browserslist@4.28.2)(esbuild@0.28.0)(typescript@5.9.3))(next@16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5)(typescript@5.9.3)': + dependencies: + '@serwist/build': 9.5.11(browserslist@4.28.2)(typescript@5.9.3) + '@serwist/utils': 9.5.11(browserslist@4.28.2) + '@serwist/webpack-plugin': 9.5.11(browserslist@4.28.2)(typescript@5.9.3) + '@serwist/window': 9.5.11(browserslist@4.28.2)(typescript@5.9.3) + browserslist: 4.28.2 + glob: 13.0.6 + kolorist: 1.8.0 + next: 16.2.4(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + react: 19.2.5 + semver: 7.7.4 + serwist: 9.5.11(browserslist@4.28.2)(typescript@5.9.3) + zod: 4.4.1 + optionalDependencies: + '@serwist/cli': 9.5.11(@types/node@20.19.39)(browserslist@4.28.2)(esbuild@0.28.0)(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - webpack + + '@serwist/utils@9.5.11(browserslist@4.28.2)': + optionalDependencies: + browserslist: 4.28.2 + + '@serwist/webpack-plugin@9.5.11(browserslist@4.28.2)(typescript@5.9.3)': + dependencies: + '@serwist/build': 9.5.11(browserslist@4.28.2)(typescript@5.9.3) + '@serwist/utils': 9.5.11(browserslist@4.28.2) + pretty-bytes: 6.1.1 + zod: 4.4.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - browserslist + + '@serwist/window@9.5.11(browserslist@4.28.2)(typescript@5.9.3)': + dependencies: + '@types/trusted-types': 2.0.7 + serwist: 9.5.11(browserslist@4.28.2)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - browserslist + '@simple-libs/child-process-utils@1.0.2': dependencies: '@simple-libs/stream-utils': 1.2.0 @@ -9043,8 +9898,7 @@ snapshots: '@types/statuses@2.0.6': {} - '@types/trusted-types@2.0.7': - optional: true + '@types/trusted-types@2.0.7': {} '@types/unist@2.0.11': {} @@ -9249,6 +10103,10 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + ansi-escapes@7.3.0: dependencies: environment: 1.1.0 @@ -9371,6 +10229,11 @@ snapshots: async-function@1.0.0: {} + atomically@2.1.1: + dependencies: + stubborn-fs: 2.0.0 + when-exit: 2.1.5 + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 @@ -9424,6 +10287,17 @@ snapshots: transitivePeerDependencies: - supports-color + boxen@8.0.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 8.0.0 + chalk: 5.6.2 + cli-boxes: 3.0.0 + string-width: 7.2.0 + type-fest: 4.41.0 + widest-line: 5.0.0 + wrap-ansi: 9.0.2 + brace-expansion@1.1.14: dependencies: balanced-match: 1.0.2 @@ -9476,6 +10350,8 @@ snapshots: callsites@3.1.0: {} + camelcase@8.0.0: {} + caniuse-lite@1.0.30001791: {} castable-video@1.1.13: @@ -9507,6 +10383,12 @@ snapshots: character-reference-invalid@2.0.1: {} + chardet@2.1.1: {} + + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + ci-info@4.4.0: {} class-validator@0.15.1: @@ -9525,6 +10407,8 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 + cli-boxes@3.0.0: {} + cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 @@ -9590,6 +10474,8 @@ snapshots: comment-parser@1.4.6: {} + common-tags@1.8.2: {} + compare-func@2.0.0: dependencies: array-ify: 1.0.0 @@ -9601,6 +10487,18 @@ snapshots: confbox@0.2.4: {} + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + configstore@7.1.0: + dependencies: + atomically: 2.1.1 + dot-prop: 9.0.0 + graceful-fs: 4.2.11 + xdg-basedir: 5.1.0 + content-disposition@1.1.0: {} content-type@1.0.5: {} @@ -9618,6 +10516,8 @@ snapshots: '@simple-libs/stream-utils': 1.2.0 meow: 13.2.0 + convert-hrtime@5.0.0: {} + convert-source-map@2.0.0: {} cookie-signature@1.2.2: {} @@ -9797,6 +10697,8 @@ snapshots: dedent@1.7.2: {} + deep-extend@0.6.0: {} + deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -9864,6 +10766,10 @@ snapshots: dependencies: is-obj: 2.0.0 + dot-prop@9.0.0: + dependencies: + type-fest: 4.41.0 + dotenv@17.4.2: {} dunder-proto@1.0.1: @@ -10059,8 +10965,39 @@ snapshots: '@esbuild/win32-ia32': 0.27.7 '@esbuild/win32-x64': 0.27.7 + esbuild@0.28.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.0 + '@esbuild/android-arm': 0.28.0 + '@esbuild/android-arm64': 0.28.0 + '@esbuild/android-x64': 0.28.0 + '@esbuild/darwin-arm64': 0.28.0 + '@esbuild/darwin-x64': 0.28.0 + '@esbuild/freebsd-arm64': 0.28.0 + '@esbuild/freebsd-x64': 0.28.0 + '@esbuild/linux-arm': 0.28.0 + '@esbuild/linux-arm64': 0.28.0 + '@esbuild/linux-ia32': 0.28.0 + '@esbuild/linux-loong64': 0.28.0 + '@esbuild/linux-mips64el': 0.28.0 + '@esbuild/linux-ppc64': 0.28.0 + '@esbuild/linux-riscv64': 0.28.0 + '@esbuild/linux-s390x': 0.28.0 + '@esbuild/linux-x64': 0.28.0 + '@esbuild/netbsd-arm64': 0.28.0 + '@esbuild/netbsd-x64': 0.28.0 + '@esbuild/openbsd-arm64': 0.28.0 + '@esbuild/openbsd-x64': 0.28.0 + '@esbuild/openharmony-arm64': 0.28.0 + '@esbuild/sunos-x64': 0.28.0 + '@esbuild/win32-arm64': 0.28.0 + '@esbuild/win32-ia32': 0.28.0 + '@esbuild/win32-x64': 0.28.0 + escalade@3.2.0: {} + escape-goat@4.0.0: {} + escape-html@1.0.3: {} escape-string-regexp@1.0.5: {} @@ -10570,6 +11507,8 @@ snapshots: function-bind@1.1.2: {} + function-timeout@1.0.2: {} + function.prototype.name@1.1.8: dependencies: call-bind: 1.0.9 @@ -10654,6 +11593,16 @@ snapshots: minipass: 7.1.3 path-scurry: 2.0.2 + glob@13.0.6: + dependencies: + minimatch: 10.2.5 + minipass: 7.1.3 + path-scurry: 2.0.2 + + global-directory@4.0.1: + dependencies: + ini: 4.1.1 + global-directory@5.0.0: dependencies: ini: 6.0.0 @@ -10675,6 +11624,8 @@ snapshots: gopd@1.2.0: {} + graceful-fs@4.2.10: {} + graceful-fs@4.2.11: {} graphql@16.13.2: {} @@ -10848,6 +11799,12 @@ snapshots: dependencies: safer-buffer: 2.1.2 + idb@8.0.3: {} + + identifier-regex@1.0.1: + dependencies: + reserved-identifiers: 1.2.0 + ignore@5.3.2: {} ignore@7.0.5: {} @@ -10877,6 +11834,10 @@ snapshots: inherits@2.0.4: {} + ini@1.3.8: {} + + ini@4.1.1: {} + ini@6.0.0: {} inline-style-parser@0.2.7: {} @@ -10981,12 +11942,24 @@ snapshots: is-hexadecimal@2.0.1: {} + is-identifier@1.0.1: + dependencies: + identifier-regex: 1.0.1 + super-regex: 1.1.0 + + is-in-ci@1.0.0: {} + is-in-ssh@1.0.0: {} is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 + is-installed-globally@1.0.0: + dependencies: + global-directory: 4.0.1 + is-path-inside: 4.0.0 + is-interactive@2.0.0: {} is-map@2.0.3: {} @@ -10995,6 +11968,8 @@ snapshots: is-node-process@1.2.0: {} + is-npm@6.1.0: {} + is-number-object@1.1.1: dependencies: call-bound: 1.0.4 @@ -11006,6 +11981,8 @@ snapshots: is-obj@3.0.0: {} + is-path-inside@4.0.0: {} + is-plain-obj@4.1.0: {} is-potential-custom-element-name@1.0.1: {} @@ -11182,12 +12159,20 @@ snapshots: kleur@4.1.5: {} + kolorist@1.8.0: {} + + ky@1.14.3: {} + language-subtag-registry@0.3.23: {} language-tags@1.0.9: dependencies: language-subtag-registry: 0.3.23 + latest-version@9.0.0: + dependencies: + package-json: 10.0.1 + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -11290,6 +12275,8 @@ snapshots: lodash.merge@4.6.2: {} + lodash.sortby@4.7.0: {} + log-symbols@6.0.0: dependencies: chalk: 5.6.2 @@ -11327,6 +12314,12 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + make-asynchronous@1.1.0: + dependencies: + p-event: 6.0.1 + type-fest: 4.41.0 + web-worker: 1.5.0 + markdown-table@3.0.4: {} marked@14.0.0: {} @@ -11514,6 +12507,8 @@ snapshots: meow@13.2.0: {} + meow@14.1.0: {} + merge-descriptors@2.0.0: {} merge-stream@2.0.0: {} @@ -11972,6 +12967,10 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + p-event@6.0.1: + dependencies: + p-timeout: 6.1.4 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -11980,6 +12979,15 @@ snapshots: dependencies: p-limit: 3.1.0 + p-timeout@6.1.4: {} + + package-json@10.0.1: + dependencies: + ky: 1.14.3 + registry-auth-token: 5.1.1 + registry-url: 6.0.1 + semver: 7.8.1 + package-manager-detector@1.6.0: {} pako@1.0.11: {} @@ -12133,6 +13141,8 @@ snapshots: prettier@3.8.3: {} + pretty-bytes@6.1.1: {} + pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 @@ -12158,6 +13168,8 @@ snapshots: property-information@7.1.0: {} + proto-list@1.2.4: {} + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -12165,6 +13177,10 @@ snapshots: punycode@2.3.1: {} + pupa@3.3.0: + dependencies: + escape-goat: 4.0.0 + qs@6.15.1: dependencies: side-channel: 1.1.0 @@ -12247,6 +13263,13 @@ snapshots: iconv-lite: 0.7.2 unpipe: 1.0.0 + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + react-day-picker@10.0.0(react@19.2.5): dependencies: '@date-fns/tz': 1.4.1 @@ -12396,6 +13419,8 @@ snapshots: string_decoder: 1.1.1 util-deprecate: 1.0.2 + readdirp@5.0.0: {} + recast@0.23.11: dependencies: ast-types: 0.16.1 @@ -12459,6 +13484,14 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 + registry-auth-token@5.1.1: + dependencies: + '@pnpm/npm-conf': 3.0.2 + + registry-url@6.0.1: + dependencies: + rc: 1.2.8 + regjsparser@0.13.1: dependencies: jsesc: 3.1.0 @@ -12669,6 +13702,15 @@ snapshots: server-only@0.0.1: {} + serwist@9.5.11(browserslist@4.28.2)(typescript@5.9.3): + dependencies: + '@serwist/utils': 9.5.11(browserslist@4.28.2) + idb: 8.0.3 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - browserslist + set-cookie-parser@3.1.0: {} set-function-length@1.2.2: @@ -12844,6 +13886,10 @@ snapshots: source-map@0.6.1: {} + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + space-separated-tokens@2.0.2: {} spdx-correct@3.2.0: @@ -12968,6 +14014,13 @@ snapshots: is-obj: 3.0.0 is-regexp: 3.1.0 + stringify-object@6.0.0: + dependencies: + get-own-enumerable-keys: 1.0.0 + is-identifier: 1.0.1 + is-obj: 3.0.0 + is-regexp: 3.1.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -12988,8 +14041,16 @@ snapshots: strip-indent@4.1.1: {} + strip-json-comments@2.0.1: {} + strip-json-comments@3.1.1: {} + stubborn-fs@2.0.0: + dependencies: + stubborn-utils: 1.0.2 + + stubborn-utils@1.0.2: {} + style-to-js@1.1.21: dependencies: style-to-object: 1.0.14 @@ -13007,6 +14068,12 @@ snapshots: super-media-element@1.4.2: {} + super-regex@1.1.0: + dependencies: + function-timeout: 1.0.2 + make-asynchronous: 1.1.0 + time-span: 5.1.0 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -13037,6 +14104,10 @@ snapshots: tiktok-video-element@0.1.2: {} + time-span@5.1.0: + dependencies: + convert-hrtime: 5.0.0 + tiny-invariant@1.3.3: {} tinybench@2.9.0: {} @@ -13071,6 +14142,10 @@ snapshots: dependencies: tldts: 7.0.30 + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + tr46@6.0.0: dependencies: punycode: 2.3.1 @@ -13263,6 +14338,19 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + update-notifier@7.3.1: + dependencies: + boxen: 8.0.1 + chalk: 5.6.2 + configstore: 7.1.0 + is-in-ci: 1.0.0 + is-installed-globally: 1.0.0 + is-npm: 6.1.0 + latest-version: 9.0.0 + pupa: 3.3.0 + semver: 7.8.1 + xdg-basedir: 5.1.0 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -13432,6 +14520,10 @@ snapshots: web-streams-polyfill@3.3.3: {} + web-worker@1.5.0: {} + + webidl-conversions@4.0.2: {} + webidl-conversions@8.0.1: {} webrtc-adapter@9.0.5: @@ -13447,6 +14539,14 @@ snapshots: tr46: 6.0.0 webidl-conversions: 8.0.1 + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + when-exit@2.1.5: {} + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -13501,6 +14601,10 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + widest-line@5.0.0: + dependencies: + string-width: 7.2.0 + wistia-video-element@1.3.6: dependencies: super-media-element: 1.4.2 @@ -13528,6 +14632,8 @@ snapshots: is-wsl: 3.1.1 powershell-utils: 0.1.0 + xdg-basedir@5.1.0: {} + xml-name-validator@5.0.0: {} xmlchars@2.2.0: {} @@ -13583,6 +14689,8 @@ snapshots: zod@3.25.76: {} + zod@4.4.1: {} + zod@4.4.2: {} zod@4.4.3: {} diff --git a/public/offline.html b/public/offline.html new file mode 100644 index 00000000..749c757a --- /dev/null +++ b/public/offline.html @@ -0,0 +1,184 @@ + + + + + + + Brak połączenia - Testownik Solvro + + + +
+
+
+ +
+

Brak połączenia z internetem

+

+ Testownik wymaga połączenia z siecią. Sprawdź połączenie i spróbuj + ponownie. +

+
+ + + Spróbuj ponownie + +
+
+
+ + diff --git a/public/sw.js b/public/sw.js index 74f40d8a..1c9fecff 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1,130 +1,2 @@ -// Based off of https://github.com/pwa-builder/PWABuilder/blob/main/docs/sw.js - -const CACHE_NAME = "pwa-cache"; -const OFFLINE_URL = "/offline"; - -const HOSTNAME_WHITELIST = new Set([ - globalThis.location.hostname, - "fonts.gstatic.com", - "fonts.googleapis.com", - "cdn.jsdelivr.net", -]); - -const STATIC_EXTENSIONS = /\.(?:js|css|png|svg|webp|woff2|ico)$/i; -const SENSITIVE_PATH_PREFIXES = ["/api/", "/auth/"]; - -const isSensitiveRequest = (request) => { - if (request.method !== "GET") { - return true; - } - if (request.headers.has("Authorization")) { - return true; - } - - const url = new URL(request.url); - return SENSITIVE_PATH_PREFIXES.some((prefix) => - url.pathname.startsWith(prefix), - ); -}; - -const isCacheableStaticAsset = (request) => { - const url = new URL(request.url); - - if (url.pathname.startsWith("/_next/static/")) { - return true; - } - if (STATIC_EXTENSIONS.test(url.pathname)) { - return true; - } - if (/^\/icon-\d+/.test(url.pathname)) { - return true; - } - if (url.pathname === "/apple-touch-icon.png") { - return true; - } - - return false; -}; - -const offlineHtmlResponse = () => - new Response( - 'Brak połączenia

Brak połączenia z internetem.

', - { - headers: { "Content-Type": "text/html; charset=utf-8" }, - }, - ); - -const handleNavigate = async (request) => { - try { - return await fetch(request); - } catch { - const offlinePage = await caches.match(OFFLINE_URL); - return offlinePage ?? offlineHtmlResponse(); - } -}; - -const handleStaticAsset = async (request, event) => { - const cache = await caches.open(CACHE_NAME); - const cached = await cache.match(request); - - const networkFetch = fetch(request) - .then(async (response) => { - if (response.ok) { - await cache.put(request, response.clone()); - } - return response; - }) - .catch(() => null); - - if (cached) { - event.waitUntil(networkFetch); - return cached; - } - - const fetched = await networkFetch; - if (fetched) { - return fetched; - } - - if (cached) { - return cached; - } - - throw new Error("Network error"); -}; - -globalThis.addEventListener("install", (event) => { - globalThis.skipWaiting(); - event.waitUntil( - caches - .open(CACHE_NAME) - .then((cache) => cache.add(OFFLINE_URL)) - .catch(() => { - // Offline precache is optional; inline HTML fallback is used instead. - }), - ); -}); - -globalThis.addEventListener("activate", (event) => { - event.waitUntil(globalThis.clients.claim()); -}); - -globalThis.addEventListener("fetch", (event) => { - if (isSensitiveRequest(event.request)) { - return; - } - - const hostname = new URL(event.request.url).hostname; - if (!HOSTNAME_WHITELIST.has(hostname)) { - return; - } - - if (event.request.mode === "navigate") { - event.respondWith(handleNavigate(event.request)); - return; - } - - if (isCacheableStaticAsset(event.request)) { - event.respondWith(handleStaticAsset(event.request, event)); - } -}); +var w=[{revision:null,url:"/_next/static/media/opengraph-image.06uic5ht6.aff.png"},{revision:null,url:"/_next/static/media/logo.0wd2e_f.v-49o.svg"},{revision:null,url:"/_next/static/media/logo-dark.0_55--v62s08b.svg"},{revision:null,url:"/_next/static/media/favicon.0zsj~n962g272.ico"},{revision:null,url:"/_next/static/chunks/turbopack-0hxh7ku~ztpa6.js"},{revision:null,url:"/_next/static/chunks/172ivk05m2bo8.js"},{revision:null,url:"/_next/static/chunks/16rb85u~rg37f.js"},{revision:null,url:"/_next/static/chunks/15c992o_2p_ui.js"},{revision:null,url:"/_next/static/chunks/145o.lsi86g0w.css"},{revision:null,url:"/_next/static/chunks/13p-eg31hy4r9.js"},{revision:null,url:"/_next/static/chunks/1352oh6y39x4s.js"},{revision:null,url:"/_next/static/chunks/12_331qljvpz..js"},{revision:null,url:"/_next/static/chunks/123z3_c0bz0p9.js"},{revision:null,url:"/_next/static/chunks/11bfq3-h3gy4c.js"},{revision:null,url:"/_next/static/chunks/118a504enpyzu.js"},{revision:null,url:"/_next/static/chunks/10y.pwmxjjjqk.js"},{revision:null,url:"/_next/static/chunks/104l0fvx54wj-.js"},{revision:null,url:"/_next/static/chunks/0z~0882382gvy.js"},{revision:null,url:"/_next/static/chunks/0z97~83vjqptg.js"},{revision:null,url:"/_next/static/chunks/0y2l0xgouorae.css"},{revision:null,url:"/_next/static/chunks/0x9tlntlqq_d9.js"},{revision:null,url:"/_next/static/chunks/0wxb0ru_ff026.js"},{revision:null,url:"/_next/static/chunks/0wooikl-ul2kd.js"},{revision:null,url:"/_next/static/chunks/0v072dnk0fh1m.js"},{revision:null,url:"/_next/static/chunks/0uz4ru71rhm2b.js"},{revision:null,url:"/_next/static/chunks/0uds2c0vioouv.js"},{revision:null,url:"/_next/static/chunks/0u5h4hlrg0y8x.js"},{revision:null,url:"/_next/static/chunks/0typ-cp5k1ls6.js"},{revision:null,url:"/_next/static/chunks/0tv0r3c0gja~k.js"},{revision:null,url:"/_next/static/chunks/0tps_-qpifszc.js"},{revision:null,url:"/_next/static/chunks/0qc.7mj._qrn1.css"},{revision:null,url:"/_next/static/chunks/0ow8x71uqegil.js"},{revision:null,url:"/_next/static/chunks/0nj7_0z86yzc8.js"},{revision:null,url:"/_next/static/chunks/0n_bnncmioiff.js"},{revision:null,url:"/_next/static/chunks/0n7w3rz3jt5hr.js"},{revision:null,url:"/_next/static/chunks/0n3sitj-o8wrm.js"},{revision:null,url:"/_next/static/chunks/0n3ru1lp60s6l.css"},{revision:null,url:"/_next/static/chunks/0n02rcnt.xtjk.js"},{revision:null,url:"/_next/static/chunks/0mvw90h4_8bta.js"},{revision:null,url:"/_next/static/chunks/0mcgx~9nkb0-b.js"},{revision:null,url:"/_next/static/chunks/0k.m8w.7-a3xc.js"},{revision:null,url:"/_next/static/chunks/0jvjj2m6w3twt.js"},{revision:null,url:"/_next/static/chunks/0iet4xty.keb1.js"},{revision:null,url:"/_next/static/chunks/0i-112x7.uz1s.js"},{revision:null,url:"/_next/static/chunks/0hr2pnmeaaxa6.js"},{revision:null,url:"/_next/static/chunks/0h8-~mdn8_0en.js"},{revision:null,url:"/_next/static/chunks/0ge9cv96.8gn-.js"},{revision:null,url:"/_next/static/chunks/0f8pc_tcays4j.js"},{revision:null,url:"/_next/static/chunks/0exn7tuj~0h7d.js"},{revision:null,url:"/_next/static/chunks/0eiutdzyk1u-s.js"},{revision:null,url:"/_next/static/chunks/0ed~h.87czbyq.js"},{revision:null,url:"/_next/static/chunks/0ed59gpsfl1ie.js"},{revision:null,url:"/_next/static/chunks/0d6mfypvpyrhq.js"},{revision:null,url:"/_next/static/chunks/0cw_ryqsp~q7c.js"},{revision:null,url:"/_next/static/chunks/0cfxgxhsf390n.js"},{revision:null,url:"/_next/static/chunks/0c1jedyjrx~bm.js"},{revision:null,url:"/_next/static/chunks/0c.2wnkm67pd~.js"},{revision:null,url:"/_next/static/chunks/0aswkgju_dw97.js"},{revision:null,url:"/_next/static/chunks/0a.kre0dvja43.js"},{revision:null,url:"/_next/static/chunks/0_9gorbp-p8dg.js"},{revision:null,url:"/_next/static/chunks/0_7s0.hv.kwyg.js"},{revision:null,url:"/_next/static/chunks/09z5_hrd4ob0..js"},{revision:null,url:"/_next/static/chunks/09xcbed_1xh5s.js"},{revision:null,url:"/_next/static/chunks/0989ksawcjb7~.js"},{revision:null,url:"/_next/static/chunks/092dlyyoi5qhe.js"},{revision:null,url:"/_next/static/chunks/08fneonxyymto.js"},{revision:null,url:"/_next/static/chunks/07wjw_tjkv_4r.js"},{revision:null,url:"/_next/static/chunks/07bha-9k3if-r.js"},{revision:null,url:"/_next/static/chunks/072dgox8prfm..js"},{revision:null,url:"/_next/static/chunks/06j4yvl06fyum.js"},{revision:null,url:"/_next/static/chunks/03~yq9q893hmn.js"},{revision:null,url:"/_next/static/chunks/03t~un0cjpnpk.js"},{revision:null,url:"/_next/static/chunks/03o9w180mw2u4.js"},{revision:null,url:"/_next/static/chunks/033oyvauenvh8.js"},{revision:null,url:"/_next/static/chunks/00cyib-7p3-ay.js"},{revision:null,url:"/_next/static/chunks/0.s_0cx.5knjr.js"},{revision:null,url:"/_next/static/chunks/0.1go1yjh_33f.js"},{revision:null,url:"/_next/static/0TnsBP9D2s_HFJ358Oi0-/_ssgManifest.js"},{revision:null,url:"/_next/static/0TnsBP9D2s_HFJ358Oi0-/_clientMiddlewareManifest.js"},{revision:null,url:"/_next/static/0TnsBP9D2s_HFJ358Oi0-/_buildManifest.js"},{revision:"a0c506315efd4b8cf04cf7772e314248",url:"/solvro_mono.svg"},{revision:"415d9a545b0669f8399293a223f900ce",url:"/manifest.json"},{revision:"96933cc9517dbda7718eb0ccd146debf",url:"/icon-512.png"},{revision:"bd02d4a8132d37d4d81f307f99d0ddf8",url:"/icon-512-maskable.png"},{revision:"5cc689681d951eeaf7af6dd63d0658eb",url:"/icon-192.png"},{revision:"5aa2f65a080e13002b066c3c5563436f",url:"/icon-192-maskable.png"},{revision:"0ee5dfca21af7288f5b48c1e4cf59d91",url:"/favicon.svg"},{revision:"f2bc2ea7e0da5c43670c3c44232fec40",url:"/favicon-dark.svg"},{revision:"36b50630d6c0d82e0c3fc11a48a36611",url:"/apple-touch-icon.png"},{revision:"edc51dcf30745c34c2df5ebea40bdeb7",url:"/favicon/180x180.png"},{revision:"8d9b8ad559d71f09ac1c1b51068f98c2",url:"/banned-screen/mc-font.otf"},{revision:"e8a3307e5824d62b46878b5e7c99e979",url:"/banned-screen/dirt-background.webp"},{revision:"d4e23892be011bf99f5df6e0b1a946f3",url:"/offline"},{revision:"367690bf40ecbc1069f5c1acab3174f9",url:"/offline.html"}];var y={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"serwist",runtime:"runtime",suffix:typeof registration<"u"?registration.scope:""},L=e=>[y.prefix,e,y.suffix].filter(t=>t&&t.length>0).join("-"),Ke=e=>{for(let t of Object.keys(y))e(t)},N={updateDetails:e=>{Ke(t=>{let s=e[t];typeof s=="string"&&(y[t]=s)})},getGoogleAnalyticsName:e=>e||L(y.googleAnalytics),getPrecacheName:e=>e||L(y.precache),getPrefix:()=>y.prefix,getRuntimeName:e=>e||L(y.runtime),getSuffix:()=>y.suffix},D;function re(){if(D===void 0){let e=new Response("");if("body"in e)try{new Response(e.body),D=!0}catch{D=!1}D=!1}return D}var He=(e,...t)=>{let s=e;return t.length>0&&(s+=` :: ${JSON.stringify(t)}`),s};var Ge=He,l=class extends Error{details;constructor(e,t){let s=Ge(e,t);super(s),this.name=e,this.details=t}};var ne=e=>new URL(String(e),location.href).href.replace(new RegExp(`^${location.origin}`),"");function S(e){return new Promise(t=>setTimeout(t,e))}var F=new Set;function se(e,t){let s=new URL(e);for(let r of t)s.searchParams.delete(r);return s.href}async function ae(e,t,s,r){let n=se(t.url,s);if(t.url===n)return e.match(t,r);let a={...r,ignoreSearch:!0},o=await e.keys(t,a);for(let i of o)if(n===se(i.url,s))return e.match(i,r)}var oe=class{promise;resolve;reject;constructor(){this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t})}},ie=async()=>{for(let e of F)await e()},ze="-precache-",Qe=async(e,t=ze)=>{let s=(await self.caches.keys()).filter(r=>r.includes(t)&&r.includes(self.registration.scope)&&r!==e);return await Promise.all(s.map(r=>self.caches.delete(r))),s},ce=e=>{self.addEventListener("activate",t=>{t.waitUntil(Qe(N.getPrecacheName(e)).then(s=>{}))})},le=()=>{self.addEventListener("activate",()=>self.clients.claim())},V=(e,t)=>{let s=t();return e.waitUntil(s),s};var W=(e,t)=>t.some(s=>e instanceof s),ue,he;function Je(){return ue||(ue=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])}function Ye(){return he||(he=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])}var K=new WeakMap,M=new WeakMap,O=new WeakMap;function Xe(e){let t=new Promise((s,r)=>{let n=()=>{e.removeEventListener("success",a),e.removeEventListener("error",o)},a=()=>{s(v(e.result)),n()},o=()=>{r(e.error),n()};e.addEventListener("success",a),e.addEventListener("error",o)});return O.set(t,e),t}function Ze(e){if(K.has(e))return;let t=new Promise((s,r)=>{let n=()=>{e.removeEventListener("complete",a),e.removeEventListener("error",o),e.removeEventListener("abort",o)},a=()=>{s(),n()},o=()=>{r(e.error||new DOMException("AbortError","AbortError")),n()};e.addEventListener("complete",a),e.addEventListener("error",o),e.addEventListener("abort",o)});K.set(e,t)}var H={get(e,t,s){if(e instanceof IDBTransaction){if(t==="done")return K.get(e);if(t==="store")return s.objectStoreNames[1]?void 0:s.objectStore(s.objectStoreNames[0])}return v(e[t])},set(e,t,s){return e[t]=s,!0},has(e,t){return e instanceof IDBTransaction&&(t==="done"||t==="store")?!0:t in e}};function fe(e){H=e(H)}function et(e){return Ye().includes(e)?function(...t){return e.apply(G(this),t),v(this.request)}:function(...t){return v(e.apply(G(this),t))}}function tt(e){return typeof e=="function"?et(e):(e instanceof IDBTransaction&&Ze(e),W(e,Je())?new Proxy(e,H):e)}function v(e){if(e instanceof IDBRequest)return Xe(e);if(M.has(e))return M.get(e);let t=tt(e);return t!==e&&(M.set(e,t),O.set(t,e)),t}var G=e=>O.get(e);function P(e,t,{blocked:s,upgrade:r,blocking:n,terminated:a}={}){let o=indexedDB.open(e,t),i=v(o);return r&&o.addEventListener("upgradeneeded",c=>{r(v(o.result),c.oldVersion,c.newVersion,v(o.transaction),c)}),s&&o.addEventListener("blocked",c=>s(c.oldVersion,c.newVersion,c)),i.then(c=>{a&&c.addEventListener("close",()=>a()),n&&c.addEventListener("versionchange",u=>n(u.oldVersion,u.newVersion,u))}).catch(()=>{}),i}function me(e,{blocked:t}={}){let s=indexedDB.deleteDatabase(e);return t&&s.addEventListener("blocked",r=>t(r.oldVersion,r)),v(s).then(()=>{})}var st=["get","getKey","getAll","getAllKeys","count"],rt=["put","add","delete","clear"],B=new Map;function de(e,t){if(!(e instanceof IDBDatabase&&!(t in e)&&typeof t=="string"))return;if(B.get(t))return B.get(t);let s=t.replace(/FromIndex$/,""),r=t!==s,n=rt.includes(s);if(!(s in(r?IDBIndex:IDBObjectStore).prototype)||!(n||st.includes(s)))return;let a=async function(o,...i){let c=this.transaction(o,n?"readwrite":"readonly"),u=c.store;return r&&(u=u.index(i.shift())),(await Promise.all([u[s](...i),n&&c.done]))[0]};return B.set(t,a),a}fe(e=>({...e,get:(t,s,r)=>de(t,s)||e.get(t,s,r),has:(t,s)=>!!de(t,s)||e.has(t,s)}));var nt=["continue","continuePrimaryKey","advance"],pe={},z=new WeakMap,we=new WeakMap,at={get(e,t){if(!nt.includes(t))return e[t];let s=pe[t];return s||(s=pe[t]=function(...r){z.set(this,we.get(this)[t](...r))}),s}};async function*ot(...e){let t=this;if(t instanceof IDBCursor||(t=await t.openCursor(...e)),!t)return;t=t;let s=new Proxy(t,at);for(we.set(s,t),O.set(s,G(t));t;)yield s,t=await(z.get(s)||t.continue()),z.delete(s)}function ge(e,t){return t===Symbol.asyncIterator&&W(e,[IDBIndex,IDBObjectStore,IDBCursor])||t==="iterate"&&W(e,[IDBIndex,IDBObjectStore])}fe(e=>({...e,get(t,s,r){return ge(t,s)?ot:e.get(t,s,r)},has(t,s){return ge(t,s)||e.has(t,s)}}));var _e=async(e,t)=>{let s=null;if(e.url&&(s=new URL(e.url).origin),s!==self.location.origin)throw new l("cross-origin-copy-response",{origin:s});let r=e.clone(),n={headers:new Headers(r.headers),status:r.status,statusText:r.statusText},a=t?t(n):n,o=re()?r.body:await r.blob();return new Response(o,a)},ve=()=>{self.__WB_DISABLE_DEV_LOGS=!0},ye=3,it="serwist-background-sync",E="requests",q="queueName",ct=class{_db=null;async addEntry(e){let t=(await this.getDb()).transaction(E,"readwrite",{durability:"relaxed"});await t.store.add(e),await t.done}async getFirstEntryId(){return(await(await this.getDb()).transaction(E).store.openCursor())?.value.id}async getAllEntriesByQueueName(e){let t=await(await this.getDb()).getAllFromIndex(E,q,IDBKeyRange.only(e));return t||[]}async getEntryCountByQueueName(e){return(await this.getDb()).countFromIndex(E,q,IDBKeyRange.only(e))}async deleteEntry(e){await(await this.getDb()).delete(E,e)}async getFirstEntryByQueueName(e){return await this.getEndEntryFromIndex(IDBKeyRange.only(e),"next")}async getLastEntryByQueueName(e){return await this.getEndEntryFromIndex(IDBKeyRange.only(e),"prev")}async getEndEntryFromIndex(e,t){return(await(await this.getDb()).transaction(E).store.index(q).openCursor(e,t))?.value}async getDb(){return this._db||(this._db=await P(it,ye,{upgrade:this._upgradeDb})),this._db}_upgradeDb(e,t){t>0&&t{s.headers[n]=r});for(let r of lt)t[r]!==void 0&&(s[r]=t[r]);return new J(s)}constructor(t){t.mode==="navigate"&&(t.mode="same-origin"),this._requestData=t}toObject(){let t=Object.assign({},this._requestData);return t.headers=Object.assign({},this._requestData.headers),t.body&&(t.body=t.body.slice(0)),t}toRequest(){return new Request(this._requestData.url,this._requestData)}clone(){return new J(this.toObject())}},Ne="serwist-background-sync",ut=1440*7,Q=new Set,Ee=e=>{let t={request:new Y(e.requestData).toRequest(),timestamp:e.timestamp};return e.metadata&&(t.metadata=e.metadata),t},be=class{_name;_onSync;_maxRetentionTime;_queueStore;_forceSyncFallback;_syncInProgress=!1;_requestsAddedDuringSync=!1;constructor(e,{forceSyncFallback:t,onSync:s,maxRetentionTime:r}={}){if(Q.has(e))throw new l("duplicate-queue-name",{name:e});Q.add(e),this._name=e,this._onSync=s||this.replayRequests,this._maxRetentionTime=r||ut,this._forceSyncFallback=!!t,this._queueStore=new xe(this._name),this._addSyncListener()}get name(){return this._name}async pushRequest(e){await this._addRequest(e,"push")}async unshiftRequest(e){await this._addRequest(e,"unshift")}async popRequest(){return this._removeRequest("pop")}async shiftRequest(){return this._removeRequest("shift")}async getAll(){let e=await this._queueStore.getAll(),t=Date.now(),s=[];for(let r of e){let n=this._maxRetentionTime*60*1e3;t-r.timestamp>n?await this._queueStore.deleteEntry(r.id):s.push(Ee(r))}return s}async size(){return await this._queueStore.size()}async _addRequest({request:e,metadata:t,timestamp:s=Date.now()},r){let n={requestData:(await Y.fromRequest(e.clone())).toObject(),timestamp:s};switch(t&&(n.metadata=t),r){case"push":await this._queueStore.pushEntry(n);break;case"unshift":await this._queueStore.unshiftEntry(n);break}this._syncInProgress?this._requestsAddedDuringSync=!0:await this.registerSync()}async _removeRequest(e){let t=Date.now(),s;switch(e){case"pop":s=await this._queueStore.popEntry();break;case"shift":s=await this._queueStore.shiftEntry();break}if(s){let r=this._maxRetentionTime*60*1e3;return t-s.timestamp>r?this._removeRequest(e):Ee(s)}}async replayRequests(){let e;for(;e=await this.shiftRequest();)try{await fetch(e.request.clone())}catch{throw await this.unshiftRequest(e),new l("queue-replay-failed",{name:this._name})}}async registerSync(){if("sync"in self.registration&&!this._forceSyncFallback)try{await self.registration.sync.register(`${Ne}:${this._name}`)}catch{}}_addSyncListener(){"sync"in self.registration&&!this._forceSyncFallback?self.addEventListener("sync",e=>{if(e.tag===`${Ne}:${this._name}`){let t=async()=>{this._syncInProgress=!0;let s;try{await this._onSync({queue:this})}catch(r){if(r instanceof Error)throw s=r,s}finally{this._requestsAddedDuringSync&&!(s&&!e.lastChance)&&await this.registerSync(),this._syncInProgress=!1,this._requestsAddedDuringSync=!1}};e.waitUntil(t())}}):this._onSync({queue:this})}static get _queueNames(){return Q}},Re=class{_queue;constructor(e,t){this._queue=new be(e,t)}async fetchDidFail({request:e}){await this._queue.pushRequest({request:e})}},X={cacheWillUpdate:async({response:e})=>e.status===200||e.status===0?e:null};function U(e){return typeof e=="string"?new Request(e):e}var ke=class{event;request;url;params;_cacheKeys={};_strategy;_handlerDeferred;_extendLifetimePromises;_plugins;_pluginStateMap;constructor(e,t){this.event=t.event,this.request=t.request,t.url&&(this.url=t.url,this.params=t.params),this._strategy=e,this._handlerDeferred=new oe,this._extendLifetimePromises=[],this._plugins=[...e.plugins],this._pluginStateMap=new Map;for(let s of this._plugins)this._pluginStateMap.set(s,{});this.event.waitUntil(this._handlerDeferred.promise)}async fetch(e){let{event:t}=this,s=U(e),r=await this.getPreloadResponse();if(r)return r;let n=this.hasCallback("fetchDidFail")?s.clone():null;try{for(let o of this.iterateCallbacks("requestWillFetch"))s=await o({request:s.clone(),event:t})}catch(o){if(o instanceof Error)throw new l("plugin-error-request-will-fetch",{thrownErrorMessage:o.message})}let a=s.clone();try{let o;o=await fetch(s,s.mode==="navigate"?void 0:this._strategy.fetchOptions);for(let i of this.iterateCallbacks("fetchDidSucceed"))o=await i({event:t,request:a,response:o});return o}catch(o){throw n&&await this.runCallbacks("fetchDidFail",{error:o,event:t,originalRequest:n.clone(),request:a.clone()}),o}}async fetchAndCachePut(e){let t=await this.fetch(e),s=t.clone();return this.waitUntil(this.cachePut(e,s)),t}async cacheMatch(e){let t=U(e),s,{cacheName:r,matchOptions:n}=this._strategy,a=await this.getCacheKey(t,"read"),o={...n,cacheName:r};s=await caches.match(a,o);for(let i of this.iterateCallbacks("cachedResponseWillBeUsed"))s=await i({cacheName:r,matchOptions:n,cachedResponse:s,request:a,event:this.event})||void 0;return s}async cachePut(e,t){let s=U(e);await S(0);let r=await this.getCacheKey(s,"write");if(!t)throw new l("cache-put-with-no-response",{url:ne(r.url)});let n=await this._ensureResponseSafeToCache(t);if(!n)return!1;let{cacheName:a,matchOptions:o}=this._strategy,i=await self.caches.open(a),c=this.hasCallback("cacheDidUpdate"),u=c?await ae(i,r.clone(),["__WB_REVISION__"],o):null;try{await i.put(r,c?n.clone():n)}catch(d){if(d instanceof Error)throw d.name==="QuotaExceededError"&&await ie(),d}for(let d of this.iterateCallbacks("cacheDidUpdate"))await d({cacheName:a,oldResponse:u,newResponse:n.clone(),request:r,event:this.event});return!0}async getCacheKey(e,t){let s=`${e.url} | ${t}`;if(!this._cacheKeys[s]){let r=e;for(let n of this.iterateCallbacks("cacheKeyWillBeUsed"))r=U(await n({mode:t,request:r,event:this.event,params:this.params}));this._cacheKeys[s]=r}return this._cacheKeys[s]}hasCallback(e){for(let t of this._strategy.plugins)if(e in t)return!0;return!1}async runCallbacks(e,t){for(let s of this.iterateCallbacks(e))await s(t)}*iterateCallbacks(e){for(let t of this._strategy.plugins)if(typeof t[e]=="function"){let s=this._pluginStateMap.get(t);yield n=>{let a={...n,state:s};return t[e](a)}}}waitUntil(e){return this._extendLifetimePromises.push(e),e}async doneWaiting(){let e;for(;e=this._extendLifetimePromises.shift();)await e}destroy(){this._handlerDeferred.resolve(null)}async getPreloadResponse(){if(this.event instanceof FetchEvent&&this.event.request.mode==="navigate"&&"preloadResponse"in this.event)try{let e=await this.event.preloadResponse;if(e)return e}catch{return}}async _ensureResponseSafeToCache(e){let t=e,s=!1;for(let r of this.iterateCallbacks("cacheWillUpdate"))if(t=await r({request:this.request,response:t,event:this.event})||void 0,s=!0,!t)break;return s||t&&t.status!==200&&(t=void 0),t}},b=class{cacheName;plugins;fetchOptions;matchOptions;constructor(e={}){this.cacheName=N.getRuntimeName(e.cacheName),this.plugins=e.plugins||[],this.fetchOptions=e.fetchOptions,this.matchOptions=e.matchOptions}handle(e){let[t]=this.handleAll(e);return t}handleAll(e){e instanceof FetchEvent&&(e={event:e,request:e.request});let t=e.event,s=typeof e.request=="string"?new Request(e.request):e.request,r=new ke(this,e.url?{event:t,request:s,url:e.url,params:e.params}:{event:t,request:s}),n=this._getResponse(r,s,t);return[n,this._awaitComplete(n,r,s,t)]}async _getResponse(e,t,s){await e.runCallbacks("handlerWillStart",{event:s,request:t});let r;try{if(r=await this._handle(t,e),r===void 0||r.type==="error")throw new l("no-response",{url:t.url})}catch(n){if(n instanceof Error){for(let a of e.iterateCallbacks("handlerDidError"))if(r=await a({error:n,event:s,request:t}),r!==void 0)break}if(!r)throw n}for(let n of e.iterateCallbacks("handlerWillRespond"))r=await n({event:s,request:t,response:r});return r}async _awaitComplete(e,t,s,r){let n,a;try{n=await e}catch{}try{await t.runCallbacks("handlerDidRespond",{event:r,request:s,response:n}),await t.doneWaiting()}catch(o){o instanceof Error&&(a=o)}if(await t.runCallbacks("handlerDidComplete",{event:r,request:s,response:n,error:a}),t.destroy(),a)throw a}};var p=class extends b{_networkTimeoutSeconds;constructor(e={}){super(e),this.plugins.some(t=>"cacheWillUpdate"in t)||this.plugins.unshift(X),this._networkTimeoutSeconds=e.networkTimeoutSeconds||0}async _handle(e,t){let s=[],r=[],n;if(this._networkTimeoutSeconds){let{id:i,promise:c}=this._getTimeoutPromise({request:e,logs:s,handler:t});n=i,r.push(c)}let a=this._getNetworkPromise({timeoutId:n,request:e,logs:s,handler:t});r.push(a);let o=await t.waitUntil((async()=>await t.waitUntil(Promise.race(r))||await a)());if(!o)throw new l("no-response",{url:e.url});return o}_getTimeoutPromise({request:e,logs:t,handler:s}){let r;return{promise:new Promise(n=>{r=setTimeout(async()=>{n(await s.cacheMatch(e))},this._networkTimeoutSeconds*1e3)}),id:r}}async _getNetworkPromise({timeoutId:e,request:t,logs:s,handler:r}){let n,a;try{a=await r.fetchAndCachePut(t)}catch(o){o instanceof Error&&(n=o)}return e&&clearTimeout(e),(n||!a)&&(a=await r.cacheMatch(t)),a}},R=class extends b{_networkTimeoutSeconds;constructor(e={}){super(e),this._networkTimeoutSeconds=e.networkTimeoutSeconds||0}async _handle(e,t){let s,r;try{let n=[t.fetch(e)];if(this._networkTimeoutSeconds){let a=S(this._networkTimeoutSeconds*1e3);n.push(a)}if(r=await Promise.race(n),!r)throw new Error(`Timed out the network response after ${this._networkTimeoutSeconds} seconds.`)}catch(n){n instanceof Error&&(s=n)}if(!r)throw new l("no-response",{url:e.url,error:s});return r}};var C=e=>e&&typeof e=="object"?e:{handle:e},g=class{handler;match;method;catchHandler;constructor(e,t,s="GET"){this.handler=C(t),this.match=e,this.method=s}setCatchHandler(e){this.catchHandler=C(e)}},De=class T extends b{_fallbackToNetwork;static defaultPrecacheCacheabilityPlugin={async cacheWillUpdate({response:t}){return!t||t.status>=400?null:t}};static copyRedirectedCacheableResponsesPlugin={async cacheWillUpdate({response:t}){return t.redirected?await _e(t):t}};constructor(t={}){t.cacheName=N.getPrecacheName(t.cacheName),super(t),this._fallbackToNetwork=t.fallbackToNetwork!==!1,this.plugins.push(T.copyRedirectedCacheableResponsesPlugin)}async _handle(t,s){let r=await s.getPreloadResponse();if(r)return r;let n=await s.cacheMatch(t);return n||(s.event&&s.event.type==="install"?await this._handleInstall(t,s):await this._handleFetch(t,s))}async _handleFetch(t,s){let r,n=s.params||{};if(this._fallbackToNetwork){let a=n.integrity,o=t.integrity,i=!o||o===a;if(r=await s.fetch(new Request(t,{integrity:t.mode!=="no-cors"?o||a:void 0})),a&&i&&t.mode!=="no-cors"){this._useDefaultCacheabilityPluginIfNeeded();let c=await s.cachePut(t,r.clone())}}else throw new l("missing-precache-entry",{cacheName:this.cacheName,url:t.url});return r}async _handleInstall(t,s){this._useDefaultCacheabilityPluginIfNeeded();let r=await s.fetch(t);if(!await s.cachePut(t,r.clone()))throw new l("bad-precaching-response",{url:t.url,status:r.status});return r}_useDefaultCacheabilityPluginIfNeeded(){let t=null,s=0;for(let[r,n]of this.plugins.entries())n!==T.copyRedirectedCacheableResponsesPlugin&&(n===T.defaultPrecacheCacheabilityPlugin&&(t=r),n.cacheWillUpdate&&s++);s===0?this.plugins.push(T.defaultPrecacheCacheabilityPlugin):s>1&&t!==null&&this.plugins.splice(t,1)}},Se=class extends g{_allowlist;_denylist;constructor(e,{allowlist:t=[/./],denylist:s=[]}={}){super(r=>this._match(r),e),this._allowlist=t,this._denylist=s}_match({url:e,request:t}){if(t&&t.mode!=="navigate")return!1;let s=e.pathname+e.search;for(let r of this._denylist)if(r.test(s))return!1;return!!this._allowlist.some(r=>r.test(s))}},qe=()=>!!self.registration?.navigationPreload,Te=e=>{qe()&&self.addEventListener("activate",t=>{t.waitUntil(self.registration.navigationPreload.enable().then(()=>{e&&self.registration.navigationPreload.setHeaderValue(e)}))})};var ht=(e,t=[])=>{for(let s of[...e.searchParams.keys()])t.some(r=>r.test(s))&&e.searchParams.delete(s);return e};function*Ce(e,{directoryIndex:t="index.html",ignoreURLParametersMatching:s=[/^utm_/,/^fbclid$/],cleanURLs:r=!0,urlManipulation:n}={}){let a=new URL(e,location.href);a.hash="",yield a.href;let o=ht(a,s);if(yield o.href,t&&o.pathname.endsWith("/")){let i=new URL(o.href);i.pathname+=t,yield i.href}if(r){let i=new URL(o.href);i.pathname+=".html",yield i.href}if(n){let i=n({url:a});for(let c of i)yield c.href}}var Ae=class extends g{constructor(e,t,s){let r=({url:n})=>{let a=e.exec(n.href);if(a&&!(n.origin!==location.origin&&a.index!==0))return a.slice(1)};super(r,t,s)}},Oe=e=>{N.updateDetails(e)},dt="__WB_REVISION__",Pe=e=>{if(!e)throw new l("add-to-cache-list-unexpected-type",{entry:e});if(typeof e=="string"){let a=new URL(e,location.href);return{cacheKey:a.href,url:a.href}}let{revision:t,url:s}=e;if(!s)throw new l("add-to-cache-list-unexpected-type",{entry:e});if(!t){let a=new URL(s,location.href);return{cacheKey:a.href,url:a.href}}let r=new URL(s,location.href),n=new URL(s,location.href);return r.searchParams.set(dt,t),{cacheKey:r.href,url:n.href}},Ue=class{updatedURLs=[];notUpdatedURLs=[];handlerWillStart=async({request:e,state:t})=>{t&&(t.originalRequest=e)};cachedResponseWillBeUsed=async({event:e,state:t,cachedResponse:s})=>{if(e.type==="install"&&t?.originalRequest&&t.originalRequest instanceof Request){let r=t.originalRequest.url;s?this.notUpdatedURLs.push(r):this.updatedURLs.push(r)}return s}},$e=(e,t,s)=>{if(typeof e=="string"){let r=new URL(e,location.href),n=({url:a})=>a.href===r.href;return new g(n,t,s)}if(e instanceof RegExp)return new Ae(e,t,s);if(typeof e=="function")return new g(e,t,s);if(e instanceof g)return e;throw new l("unsupported-route-type",{moduleName:"serwist",funcName:"parseRoute",paramName:"capture"})};var Ie=async(e,t,s)=>{let r=t.map((o,i)=>({index:i,item:o})),n=async o=>{let i=[];for(;;){let c=r.pop();if(!c)return o(i);let u=await s(c.item);i.push({result:u,index:c.index})}},a=Array.from({length:e},()=>new Promise(n));return(await Promise.all(a)).flat().sort((o,i)=>o.indexo.result)};var xs=typeof navigator<"u"&&/^((?!chrome|android).)*safari/i.test(navigator.userAgent);var pt="serwist-expiration",$="cache-entries",je=e=>{let t=new URL(e,location.href);return t.hash="",t.href},gt=class{_cacheName;_db=null;constructor(e){this._cacheName=e}_getId(e){return`${this._cacheName}|${je(e)}`}_upgradeDb(e){let t=e.createObjectStore($,{keyPath:"id"});t.createIndex("cacheName","cacheName",{unique:!1}),t.createIndex("timestamp","timestamp",{unique:!1})}_upgradeDbAndDeleteOldDbs(e){this._upgradeDb(e),this._cacheName&&me(this._cacheName)}async setTimestamp(e,t){e=je(e);let s={id:this._getId(e),cacheName:this._cacheName,url:e,timestamp:t},r=(await this.getDb()).transaction($,"readwrite",{durability:"relaxed"});await r.store.put(s),await r.done}async getTimestamp(e){return(await(await this.getDb()).get($,this._getId(e)))?.timestamp}async expireEntries(e,t){let s=await(await this.getDb()).transaction($,"readwrite").store.index("timestamp").openCursor(null,"prev"),r=[],n=0;for(;s;){let a=s.value;a.cacheName===this._cacheName&&(e&&a.timestamp=t?(s.delete(),r.push(a.url)):n++),s=await s.continue()}return r}async getDb(){return this._db||(this._db=await P(pt,1,{upgrade:this._upgradeDbAndDeleteOldDbs.bind(this)})),this._db}},ft=class{_isRunning=!1;_rerunRequested=!1;_maxEntries;_maxAgeSeconds;_matchOptions;_cacheName;_timestampModel;constructor(e,t={}){this._maxEntries=t.maxEntries,this._maxAgeSeconds=t.maxAgeSeconds,this._matchOptions=t.matchOptions,this._cacheName=e,this._timestampModel=new gt(e)}async expireEntries(){if(this._isRunning){this._rerunRequested=!0;return}this._isRunning=!0;let e=this._maxAgeSeconds?Date.now()-this._maxAgeSeconds*1e3:0,t=await this._timestampModel.expireEntries(e,this._maxEntries),s=await self.caches.open(this._cacheName);for(let r of t)await s.delete(r,this._matchOptions);this._isRunning=!1,this._rerunRequested&&(this._rerunRequested=!1,this.expireEntries())}async updateTimestamp(e){await this._timestampModel.setTimestamp(e,Date.now())}async isURLExpired(e){if(!this._maxAgeSeconds)return!1;let t=await this._timestampModel.getTimestamp(e),s=Date.now()-this._maxAgeSeconds*1e3;return t!==void 0?t{F.add(e)},h=class{_config;_cacheExpirations;constructor(e={}){this._config=e,this._cacheExpirations=new Map,this._config.maxAgeFrom||(this._config.maxAgeFrom="last-fetched"),this._config.purgeOnQuotaError&&mt(()=>this.deleteCacheAndMetadata())}_getCacheExpiration(e){if(e===N.getRuntimeName())throw new l("expire-custom-caches-only");let t=this._cacheExpirations.get(e);return t||(t=new ft(e,this._config),this._cacheExpirations.set(e,t)),t}cachedResponseWillBeUsed({event:e,cacheName:t,request:s,cachedResponse:r}){if(!r)return null;let n=this._isResponseDateFresh(r),a=this._getCacheExpiration(t),o=this._config.maxAgeFrom==="last-used",i=(async()=>{o&&await a.updateTimestamp(s.url),await a.expireEntries()})();try{e.waitUntil(i)}catch{}return n?r:null}_isResponseDateFresh(e){if(this._config.maxAgeFrom==="last-used")return!0;let t=Date.now();if(!this._config.maxAgeSeconds)return!0;let s=this._getDateHeaderTimestamp(e);return s===null?!0:s>=t-this._config.maxAgeSeconds*1e3}_getDateHeaderTimestamp(e){if(!e.headers.has("date"))return null;let t=e.headers.get("date"),s=new Date(t).getTime();return Number.isNaN(s)?null:s}async cacheDidUpdate({cacheName:e,request:t}){let s=this._getCacheExpiration(e);await s.updateTimestamp(t.url),await s.expireEntries()}async deleteCacheAndMetadata(){for(let[e,t]of this._cacheExpirations)await self.caches.delete(e),await t.delete();this._cacheExpirations=new Map}},wt="serwist-google-analytics",yt=2880,Nt=/^\/(\w+\/)?collect/,Et=e=>async({queue:t})=>{let s;for(;s=await t.shiftRequest();){let{request:r,timestamp:n}=s,a=new URL(r.url);try{let o=r.method==="POST"?new URLSearchParams(await r.clone().text()):a.searchParams,i=n-(Number(o.get("qt"))||0),c=Date.now()-i;if(o.set("qt",String(c)),e.parameterOverrides)for(let u of Object.keys(e.parameterOverrides)){let d=e.parameterOverrides[u];o.set(u,d)}typeof e.hitFilter=="function"&&e.hitFilter.call(null,o),await fetch(new Request(a.origin+a.pathname,{body:o.toString(),method:"POST",mode:"cors",credentials:"omit",headers:{"Content-Type":"text/plain"}}))}catch(o){throw await t.unshiftRequest(s),o}}},_t=e=>{let t=({url:r})=>r.hostname==="www.google-analytics.com"&&Nt.test(r.pathname),s=new R({plugins:[e]});return[new g(t,s,"GET"),new g(t,s,"POST")]},vt=e=>{let t=({url:s})=>s.hostname==="www.google-analytics.com"&&s.pathname==="/analytics.js";return new g(t,new p({cacheName:e}),"GET")},xt=e=>{let t=({url:s})=>s.hostname==="www.googletagmanager.com"&&s.pathname==="/gtag/js";return new g(t,new p({cacheName:e}),"GET")},bt=e=>{let t=({url:s})=>s.hostname==="www.googletagmanager.com"&&s.pathname==="/gtm.js";return new g(t,new p({cacheName:e}),"GET")},Le=({serwist:e,cacheName:t,...s})=>{let r=N.getGoogleAnalyticsName(t),n=new Re(wt,{maxRetentionTime:yt,onSync:Et(s)}),a=[bt(r),vt(r),xt(r),..._t(n)];for(let o of a)e.registerRoute(o)},Rt=class{_fallbackUrls;_serwist;constructor({fallbackUrls:e,serwist:t}){this._fallbackUrls=e,this._serwist=t}async handlerDidError(e){for(let t of this._fallbackUrls)if(typeof t=="string"){let s=await this._serwist.matchPrecache(t);if(s!==void 0)return s}else if(t.matcher(e)){let s=await this._serwist.matchPrecache(t.url);if(s!==void 0)return s}}},kt=(e,t,s)=>{let r=e.size;if(s&&s>r||t&&t<0)throw new l("range-not-satisfiable",{size:r,end:s,start:t});let n,a;return t!==void 0&&s!==void 0?(n=t,a=s+1):t!==void 0&&s===void 0?(n=t,a=r):s!==void 0&&t===void 0&&(n=r-s,a=r),{start:n,end:a}},Dt=e=>{let t=e.trim().toLowerCase();if(!t.startsWith("bytes="))throw new l("unit-must-be-bytes",{normalizedRangeHeader:t});if(t.includes(","))throw new l("single-range-only",{normalizedRangeHeader:t});let s=/(\d*)-(\d*)/.exec(t);if(!s||!(s[1]||s[2]))throw new l("invalid-range-values",{normalizedRangeHeader:t});return{start:s[1]===""?void 0:Number(s[1]),end:s[2]===""?void 0:Number(s[2])}},St=async(e,t)=>{try{if(t.status===206)return t;let s=e.headers.get("range");if(!s)throw new l("no-range-header");let r=Dt(s),n=await t.blob(),a=kt(n,r.start,r.end),o=n.slice(a.start,a.end),i=o.size,c=new Response(o,{status:206,statusText:"Partial Content",headers:t.headers});return c.headers.set("Content-Length",String(i)),c.headers.set("Content-Range",`bytes ${a.start}-${a.end-1}/${n.size}`),c}catch{return new Response("",{status:416,statusText:"Range Not Satisfiable"})}},Z=class{cachedResponseWillBeUsed=async({request:e,cachedResponse:t})=>t&&e.headers.has("range")?await St(e,t):t},A=class extends b{async _handle(e,t){let s=[],r=await t.cacheMatch(e),n;if(!r)try{r=await t.fetchAndCachePut(e)}catch(a){a instanceof Error&&(n=a)}if(!r)throw new l("no-response",{url:e.url,error:n});return r}};var k=class extends b{constructor(e={}){super(e),this.plugins.some(t=>"cacheWillUpdate"in t)||this.plugins.unshift(X)}async _handle(e,t){let s=[],r=t.fetchAndCachePut(e).catch(()=>{});t.waitUntil(r);let n=await t.cacheMatch(e),a;if(!n)try{n=await r}catch(o){o instanceof Error&&(a=o)}if(!n)throw new l("no-response",{url:e.url,error:a});return n}},qt=class extends g{constructor(e,t){let s=({request:r})=>{let n=e.getUrlsToPrecacheKeys();for(let a of Ce(r.url,t)){let o=n.get(a);if(o)return{cacheKey:o,integrity:e.getIntegrityForPrecacheKey(o)}}};super(s,e.precacheStrategy)}},Tt=class{_precacheController;constructor({precacheController:e}){this._precacheController=e}cacheKeyWillBeUsed=async({request:e,params:t})=>{let s=t?.cacheKey||this._precacheController.getPrecacheKeyForUrl(e.url);return s?new Request(s,{headers:e.headers}):e}},Ct=(e,t={})=>{let{cacheName:s,plugins:r=[],fetchOptions:n,matchOptions:a,fallbackToNetwork:o,directoryIndex:i,ignoreURLParametersMatching:c,cleanURLs:u,urlManipulation:d,cleanupOutdatedCaches:m,concurrency:x=10,navigateFallback:I,navigateFallbackAllowlist:_,navigateFallbackDenylist:f}=t??{};return{precacheStrategyOptions:{cacheName:N.getPrecacheName(s),plugins:[...r,new Tt({precacheController:e})],fetchOptions:n,matchOptions:a,fallbackToNetwork:o},precacheRouteOptions:{directoryIndex:i,ignoreURLParametersMatching:c,cleanURLs:u,urlManipulation:d},precacheMiscOptions:{cleanupOutdatedCaches:m,concurrency:x,navigateFallback:I,navigateFallbackAllowlist:_,navigateFallbackDenylist:f}}},Fe=class{_urlsToCacheKeys=new Map;_urlsToCacheModes=new Map;_cacheKeysToIntegrities=new Map;_concurrentPrecaching;_precacheStrategy;_routes;_defaultHandlerMap;_catchHandler;_requestRules;constructor({precacheEntries:e,precacheOptions:t,skipWaiting:s=!1,importScripts:r,navigationPreload:n=!1,cacheId:a,clientsClaim:o=!1,runtimeCaching:i,offlineAnalyticsConfig:c,disableDevLogs:u=!1,fallbacks:d,requestRules:m}={}){let{precacheStrategyOptions:x,precacheRouteOptions:I,precacheMiscOptions:_}=Ct(this,t);if(this._concurrentPrecaching=_.concurrency,this._precacheStrategy=new De(x),this._routes=new Map,this._defaultHandlerMap=new Map,this._requestRules=m,this.handleInstall=this.handleInstall.bind(this),this.handleActivate=this.handleActivate.bind(this),this.handleFetch=this.handleFetch.bind(this),this.handleCache=this.handleCache.bind(this),r&&r.length>0&&self.importScripts(...r),n&&Te(),a!==void 0&&Oe({prefix:a}),s?self.skipWaiting():self.addEventListener("message",f=>{f.data&&f.data.type==="SKIP_WAITING"&&self.skipWaiting()}),o&&le(),e&&e.length>0&&this.addToPrecacheList(e),_.cleanupOutdatedCaches&&ce(x.cacheName),this.registerRoute(new qt(this,I)),_.navigateFallback&&this.registerRoute(new Se(this.createHandlerBoundToUrl(_.navigateFallback),{allowlist:_.navigateFallbackAllowlist,denylist:_.navigateFallbackDenylist})),c!==void 0&&(typeof c=="boolean"?c&&Le({serwist:this}):Le({...c,serwist:this})),i!==void 0){if(d!==void 0){let f=new Rt({fallbackUrls:d.entries,serwist:this});i.forEach(j=>{j.handler instanceof b&&!j.handler.plugins.some(Be=>"handlerDidError"in Be)&&j.handler.plugins.push(f)})}for(let f of i)this.registerCapture(f.matcher,f.handler,f.method)}u&&ve()}get precacheStrategy(){return this._precacheStrategy}get routes(){return this._routes}addEventListeners(){self.addEventListener("install",this.handleInstall),self.addEventListener("activate",this.handleActivate),self.addEventListener("fetch",this.handleFetch),self.addEventListener("message",this.handleCache)}addToPrecacheList(e){let t=[];for(let s of e){typeof s=="string"?t.push(s):s&&!s.integrity&&s.revision===void 0&&t.push(s.url);let{cacheKey:r,url:n}=Pe(s),a=typeof s!="string"&&s.revision?"reload":"default";if(this._urlsToCacheKeys.has(n)&&this._urlsToCacheKeys.get(n)!==r)throw new l("add-to-cache-list-conflicting-entries",{firstEntry:this._urlsToCacheKeys.get(n),secondEntry:r});if(typeof s!="string"&&s.integrity){if(this._cacheKeysToIntegrities.has(r)&&this._cacheKeysToIntegrities.get(r)!==s.integrity)throw new l("add-to-cache-list-conflicting-integrities",{url:n});this._cacheKeysToIntegrities.set(r,s.integrity)}this._urlsToCacheKeys.set(n,r),this._urlsToCacheModes.set(n,a)}if(t.length>0){let s=`Serwist is precaching URLs without revision info: ${t.join(", ")} +This is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(s)}}handleInstall(e){return this.registerRequestRules(e),V(e,async()=>{let t=new Ue;this.precacheStrategy.plugins.push(t),await Ie(this._concurrentPrecaching,Array.from(this._urlsToCacheKeys.entries()),async([n,a])=>{let o=this._cacheKeysToIntegrities.get(a),i=this._urlsToCacheModes.get(n),c=new Request(n,{integrity:o,cache:i,credentials:"same-origin"});await Promise.all(this.precacheStrategy.handleAll({event:e,request:c,url:new URL(c.url),params:{cacheKey:a}}))});let{updatedURLs:s,notUpdatedURLs:r}=t;return{updatedURLs:s,notUpdatedURLs:r}})}async registerRequestRules(e){if(this._requestRules&&e?.addRoutes)try{await e.addRoutes(this._requestRules),this._requestRules=void 0}catch(t){throw t}}handleActivate(e){return V(e,async()=>{let t=await self.caches.open(this.precacheStrategy.cacheName),s=await t.keys(),r=new Set(this._urlsToCacheKeys.values()),n=[];for(let a of s)r.has(a.url)||(await t.delete(a),n.push(a.url));return{deletedCacheRequests:n}})}handleFetch(e){let{request:t}=e,s=this.handleRequest({request:t,event:e});s&&e.respondWith(s)}handleCache(e){if(e.data&&e.data.type==="CACHE_URLS"){let{payload:t}=e.data,s=Promise.all(t.urlsToCache.map(r=>{let n;return typeof r=="string"?n=new Request(r):n=new Request(...r),this.handleRequest({request:n,event:e})}));e.waitUntil(s),e.ports?.[0]&&s.then(()=>e.ports[0].postMessage(!0))}}setDefaultHandler(e,t="GET"){this._defaultHandlerMap.set(t,C(e))}setCatchHandler(e){this._catchHandler=C(e)}registerCapture(e,t,s){let r=$e(e,t,s);return this.registerRoute(r),r}registerRoute(e){this._routes.has(e.method)||this._routes.set(e.method,[]),this._routes.get(e.method).push(e)}unregisterRoute(e){if(!this._routes.has(e.method))throw new l("unregister-route-but-not-found-with-method",{method:e.method});let t=this._routes.get(e.method).indexOf(e);if(t>-1)this._routes.get(e.method).splice(t,1);else throw new l("unregister-route-route-not-registered")}getUrlsToPrecacheKeys(){return this._urlsToCacheKeys}getPrecachedUrls(){return[...this._urlsToCacheKeys.keys()]}getPrecacheKeyForUrl(e){let t=new URL(e,location.href);return this._urlsToCacheKeys.get(t.href)}getIntegrityForPrecacheKey(e){return this._cacheKeysToIntegrities.get(e)}async matchPrecache(e){let t=e instanceof Request?e.url:e,s=this.getPrecacheKeyForUrl(t);if(s)return(await self.caches.open(this.precacheStrategy.cacheName)).match(s)}createHandlerBoundToUrl(e){let t=this.getPrecacheKeyForUrl(e);if(!t)throw new l("non-precached-url",{url:e});return s=>(s.request=new Request(e),s.params={cacheKey:t,...s.params},this.precacheStrategy.handle(s))}handleRequest({request:e,event:t}){let s=new URL(e.url,location.href);if(!s.protocol.startsWith("http"))return;let r=s.origin===location.origin,{params:n,route:a}=this.findMatchingRoute({event:t,request:e,sameOrigin:r,url:s}),o=a?.handler,i=[],c=e.method;if(!o&&this._defaultHandlerMap.has(c)&&(o=this._defaultHandlerMap.get(c)),!o)return;let u;try{u=o.handle({url:s,request:e,event:t,params:n})}catch(m){u=Promise.reject(m)}let d=a?.catchHandler;return u instanceof Promise&&(this._catchHandler||d)&&(u=u.catch(async m=>{if(d)try{return await d.handle({url:s,request:e,event:t,params:n})}catch(x){x instanceof Error&&(m=x)}if(this._catchHandler)return this._catchHandler.handle({url:s,request:e,event:t});throw m})),u}findMatchingRoute({url:e,sameOrigin:t,request:s,event:r}){let n=this._routes.get(s.method)||[];for(let a of n){let o,i=a.match({url:e,sameOrigin:t,request:s,event:r});if(i)return o=i,(Array.isArray(o)&&o.length===0||i.constructor===Object&&Object.keys(i).length===0||typeof i=="boolean")&&(o=void 0),{route:a,params:o}}return{}}};var ee={rscPrefetch:"pages-rsc-prefetch",rsc:"pages-rsc",html:"pages"},Ve=[{matcher:/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,handler:new A({cacheName:"google-fonts-webfonts",plugins:[new h({maxEntries:4,maxAgeSeconds:365*24*60*60,maxAgeFrom:"last-used"})]})},{matcher:/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,handler:new k({cacheName:"google-fonts-stylesheets",plugins:[new h({maxEntries:4,maxAgeSeconds:10080*60,maxAgeFrom:"last-used"})]})},{matcher:/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,handler:new k({cacheName:"static-font-assets",plugins:[new h({maxEntries:4,maxAgeSeconds:10080*60,maxAgeFrom:"last-used"})]})},{matcher:/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,handler:new k({cacheName:"static-image-assets",plugins:[new h({maxEntries:64,maxAgeSeconds:720*60*60,maxAgeFrom:"last-used"})]})},{matcher:/\/_next\/static.+\.js$/i,handler:new A({cacheName:"next-static-js-assets",plugins:[new h({maxEntries:64,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})]})},{matcher:/\/_next\/image\?url=.+$/i,handler:new k({cacheName:"next-image",plugins:[new h({maxEntries:64,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})]})},{matcher:/\.(?:mp3|wav|ogg)$/i,handler:new A({cacheName:"static-audio-assets",plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"}),new Z]})},{matcher:/\.(?:mp4|webm)$/i,handler:new A({cacheName:"static-video-assets",plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"}),new Z]})},{matcher:/\.(?:js)$/i,handler:new k({cacheName:"static-js-assets",plugins:[new h({maxEntries:48,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})]})},{matcher:/\.(?:css|less)$/i,handler:new k({cacheName:"static-style-assets",plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})]})},{matcher:/\/_next\/data\/.+\/.+\.json$/i,handler:new p({cacheName:"next-data",plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})]})},{matcher:/\.(?:json|xml|csv)$/i,handler:new p({cacheName:"static-data-assets",plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})]})},{matcher:/\/api\/auth\/.*/,handler:new R({networkTimeoutSeconds:10})},{matcher:({sameOrigin:e,url:{pathname:t}})=>e&&t.startsWith("/api/"),method:"GET",handler:new p({cacheName:"apis",plugins:[new h({maxEntries:16,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})],networkTimeoutSeconds:10})},{matcher:({request:e,url:{pathname:t},sameOrigin:s})=>e.headers.get("RSC")==="1"&&e.headers.get("Next-Router-Prefetch")==="1"&&s&&!t.startsWith("/api/"),handler:new p({cacheName:ee.rscPrefetch,plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60})]})},{matcher:({request:e,url:{pathname:t},sameOrigin:s})=>e.headers.get("RSC")==="1"&&s&&!t.startsWith("/api/"),handler:new p({cacheName:ee.rsc,plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60})]})},{matcher:({request:e,url:{pathname:t},sameOrigin:s})=>e.headers.get("Content-Type")?.includes("text/html")&&s&&!t.startsWith("/api/"),handler:new p({cacheName:ee.html,plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60})]})},{matcher:({url:{pathname:e},sameOrigin:t})=>t&&!e.startsWith("/api/"),handler:new p({cacheName:"others",plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60})]})},{matcher:({sameOrigin:e})=>!e,handler:new p({cacheName:"cross-origin",plugins:[new h({maxEntries:32,maxAgeSeconds:3600})],networkTimeoutSeconds:10})},{matcher:/.*/i,method:"GET",handler:new R}];var Me="/offline.html",At=["/api/","/auth/"],te=new Fe({precacheEntries:w,skipWaiting:!0,clientsClaim:!0,navigationPreload:!1,runtimeCaching:[{matcher({request:e,sameOrigin:t,url:s}){return t?e.method!=="GET"||e.headers.has("Authorization")?!0:At.some(r=>s.pathname.startsWith(r)):!1},handler:new R},...Ve]}),Ot=async()=>{let e=await te.matchPrecache(Me);return e||caches.match(Me,{ignoreSearch:!0})};te.setCatchHandler(async({request:e})=>{if(e.mode==="navigate"||e.destination==="document"){let t=await Ot();if(t)return t}return Response.error()});te.addEventListeners(); diff --git a/serwist.config.js b/serwist.config.js new file mode 100644 index 00000000..95bee323 --- /dev/null +++ b/serwist.config.js @@ -0,0 +1,17 @@ +import { serwist } from "@serwist/next/config"; +import { createHash } from "node:crypto"; +import { readFileSync } from "node:fs"; + +const offlineRevision = createHash("md5") + .update(readFileSync("public/offline.html", "utf8")) + .digest("hex"); + +export default serwist({ + swSrc: "src/sw.ts", + swDest: "public/sw.js", + // public/*.html is mapped to /public/* by Serwist manifestTransforms (404). + globIgnores: ["public/offline.html"], + additionalPrecacheEntries: [ + { url: "/offline.html", revision: offlineRevision }, + ], +}); diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 0000590c..11b78621 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -8,7 +8,7 @@ import { AppFooter } from "@/components/app-footer"; import { ErrorHandler } from "@/components/error-handler"; import { GuestAlert } from "@/components/guest-alert"; import { Navbar } from "@/components/navbar"; -import { ServiceWorkerRegister } from "@/components/service-worker-register"; +import { PwaInstallAlert } from "@/components/pwa-install-alert"; import { Toaster } from "@/components/ui/sonner"; import { env } from "@/env"; import { getServerCurrentUser } from "@/lib/auth/utils.server"; @@ -106,7 +106,6 @@ export default async function RootLayout({ /> -
+
{children}
diff --git a/src/app/offline/page.tsx b/src/app/offline/page.tsx index 335fd3db..6f8be518 100644 --- a/src/app/offline/page.tsx +++ b/src/app/offline/page.tsx @@ -4,10 +4,15 @@ import Link from "next/link"; import { Card, CardContent } from "@/components/ui/card"; +// Wersja online trasy /offline (pełny layout aplikacji). +// Service worker serwuje public/offline.html jako fallback offline. + export const metadata: Metadata = { title: "Brak połączenia", }; +export const dynamic = "force-static"; + export default function OfflinePage() { return ( diff --git a/src/app/providers.tsx b/src/app/providers.tsx index c37303ed..45902f6b 100644 --- a/src/app/providers.tsx +++ b/src/app/providers.tsx @@ -1,5 +1,6 @@ "use client"; +import { SerwistProvider } from "@serwist/next/react"; import { QueryClientProvider } from "@tanstack/react-query"; import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; import { Suspense } from "react"; @@ -11,6 +12,10 @@ import { TooltipProvider } from "@/components/ui/tooltip"; import type { JWTPayload } from "@/lib/auth/types"; import { getQueryClient } from "@/lib/query-client"; +const serwistDisabled = + process.env.NODE_ENV !== "production" || + process.env.NEXT_PUBLIC_ENABLE_SW === "false"; + export function Providers({ children, initialUser, @@ -20,23 +25,33 @@ export function Providers({ }) { const queryClient = getQueryClient(); return ( - - - - - - - - {children} - - - - - + + + + + + + + + {children} + + + + + + ); } diff --git a/src/components/pwa-install-alert.tsx b/src/components/pwa-install-alert.tsx new file mode 100644 index 00000000..4d5565b0 --- /dev/null +++ b/src/components/pwa-install-alert.tsx @@ -0,0 +1,64 @@ +"use client"; + +import { DownloadIcon, XIcon } from "lucide-react"; +import { useSearchParams } from "next/navigation"; +import { useState } from "react"; + +import { PwaInstallPrompt } from "@/components/pwa-install-prompt"; +import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; +import { Button } from "@/components/ui/button"; +import { useIsPwaInstallTarget } from "@/hooks/use-is-pwa-install-target"; +import { useIsStandalone } from "@/hooks/use-is-standalone"; + +const PWA_INSTALL_ALERT_DISMISSED_KEY = "pwa-install-alert-dismissed"; + +function readIsDismissed() { + if (typeof window === "undefined") { + return false; + } + return localStorage.getItem(PWA_INSTALL_ALERT_DISMISSED_KEY) === "true"; +} + +export function PwaInstallAlert() { + const [isDismissed, setIsDismissed] = useState(readIsDismissed); + const isInstallTarget = useIsPwaInstallTarget(); + const isStandalone = useIsStandalone(); + const searchParams = useSearchParams(); + const forceInstall = searchParams.get("install") === "true"; + + const handleDismiss = () => { + localStorage.setItem(PWA_INSTALL_ALERT_DISMISSED_KEY, "true"); + setIsDismissed(true); + }; + + if (isStandalone || (!forceInstall && (isDismissed || !isInstallTarget))) { + return null; + } + + return ( + + + + + Zainstaluj aplikację + + + + Miej Testownik zawsze pod ręką — także offline. + + + + ); +} diff --git a/src/components/pwa-install-prompt.tsx b/src/components/pwa-install-prompt.tsx new file mode 100644 index 00000000..49b12414 --- /dev/null +++ b/src/components/pwa-install-prompt.tsx @@ -0,0 +1,258 @@ +"use client"; + +import { ShareIcon } from "lucide-react"; +import { usePathname, useRouter, useSearchParams } from "next/navigation"; +import type { ReactNode } from "react"; +import { useCallback, useEffect, useRef, useState } from "react"; + +import { Button } from "@/components/ui/button"; +import { + Dialog, + DialogClose, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { useIsStandalone } from "@/hooks/use-is-standalone"; +import { getPwaPlatform, isIosDevice } from "@/lib/pwa/device"; + +interface BeforeInstallPromptEvent extends Event { + readonly platforms: string[]; + readonly userChoice: Promise<{ + outcome: "accepted" | "dismissed"; + platform: string; + }>; + prompt: () => Promise; +} + +interface PwaInstallPromptProps { + children: ReactNode; + onDismiss?: () => void; +} + +export function PwaInstallPrompt({ + children, + onDismiss, +}: PwaInstallPromptProps) { + const [installPromptEvent, setInstallPromptEvent] = + useState(null); + const [isInstructionsOpen, setIsInstructionsOpen] = useState(false); + const [isFallbackInstructionsOpen, setIsFallbackInstructionsOpen] = + useState(false); + const [isAutoInstallModalOpen, setIsAutoInstallModalOpen] = useState(false); + const installTriggered = useRef(false); + const router = useRouter(); + const pathname = usePathname(); + const searchParams = useSearchParams(); + const isStandalone = useIsStandalone(); + const [platform, setPlatform] = useState | null>(null); + + useEffect(() => { + setPlatform(getPwaPlatform()); + }, []); + + const isIos = platform?.isIos ?? isIosDevice(); + const isMacSafari = platform?.isMacSafari ?? false; + + useEffect(() => { + const handleBeforeInstallPrompt = (event: Event) => { + event.preventDefault(); + setInstallPromptEvent(event as BeforeInstallPromptEvent); + }; + + window.addEventListener("beforeinstallprompt", handleBeforeInstallPrompt); + + return () => { + window.removeEventListener( + "beforeinstallprompt", + handleBeforeInstallPrompt, + ); + }; + }, []); + + const clearInstallQuery = useCallback(() => { + if (searchParams.get("install") === "true") { + router.replace(pathname); + } + }, [pathname, router, searchParams]); + + const handleInstallClick = useCallback(async () => { + if (isStandalone) { + return; + } + + if (installPromptEvent) { + await installPromptEvent.prompt(); + clearInstallQuery(); + return; + } + + if (isIos || isMacSafari) { + setIsInstructionsOpen(true); + return; + } + + setIsFallbackInstructionsOpen(true); + }, [clearInstallQuery, installPromptEvent, isIos, isMacSafari, isStandalone]); + + const handleAutoInstall = async () => { + await handleInstallClick(); + setIsAutoInstallModalOpen(false); + onDismiss?.(); + clearInstallQuery(); + }; + + useEffect(() => { + if ( + searchParams.get("install") === "true" && + !installTriggered.current && + (installPromptEvent !== null || isIos || isMacSafari) + ) { + setIsAutoInstallModalOpen(true); + installTriggered.current = true; + } + }, [installPromptEvent, isIos, isMacSafari, searchParams]); + + const iosInstructions = ( +
    +
  1. + Naciśnij przycisk udostępniania{" "} + w pasku + nawigacyjnym Safari. +
  2. +
  3. Przewiń w dół i wybierz „Dodaj do ekranu początkowego”.
  4. +
  5. Potwierdź, naciskając „Dodaj” w prawym górnym rogu.
  6. +
+ ); + + const macSafariInstructions = ( +
    +
  1. + W Safari kliknij przycisk udostępniania{" "} + na pasku + narzędzi. +
  2. +
  3. Wybierz „Dodaj do Docka”.
  4. +
  5. Możesz zmienić nazwę aplikacji, a następnie kliknij „Dodaj”.
  6. +
+ ); + + const instructions = isIos ? iosInstructions : macSafariInstructions; + const instructionTitle = isIos ? "Instalacja na iOS" : "Instalacja na macOS"; + + const closeInstructions = () => { + setIsInstructionsOpen(false); + onDismiss?.(); + clearInstallQuery(); + }; + + const closeFallback = () => { + setIsFallbackInstructionsOpen(false); + onDismiss?.(); + clearInstallQuery(); + }; + + return ( + <> +
{ + void handleInstallClick(); + }} + onKeyDown={(event) => { + if (event.key === "Enter" || event.key === " ") { + event.preventDefault(); + void handleInstallClick(); + } + }} + role="button" + tabIndex={0} + > + {children} +
+ + { + setIsAutoInstallModalOpen(open); + if (!open) { + onDismiss?.(); + clearInstallQuery(); + } + }} + > + + + Zainstaluj Testownik + + Dodaj aplikację na urządzenie, aby mieć szybki dostęp i korzystać + z niej także offline. + + + + + }> + Anuluj + + + + + + {(isIos || isMacSafari) && ( + { + setIsInstructionsOpen(open); + if (!open) { + closeInstructions(); + } + }} + > + + + {instructionTitle} +
+ {instructions} +
+
+ + }> + Zamknij + + +
+
+ )} + + { + setIsFallbackInstructionsOpen(open); + if (!open) { + closeFallback(); + } + }} + > + + + Instalacja aplikacji + + Poszukaj opcji „Zainstaluj aplikację” lub „Dodaj do ekranu + początkowego” w menu przeglądarki. Jeśli aplikacja jest już + zainstalowana, otwórz ją z ekranu głównego lub paska aplikacji. + + + + }> + Zamknij + + + + + + ); +} diff --git a/src/components/service-worker-register.tsx b/src/components/service-worker-register.tsx deleted file mode 100644 index 4ce15728..00000000 --- a/src/components/service-worker-register.tsx +++ /dev/null @@ -1,37 +0,0 @@ -"use client"; - -import { useEffect } from "react"; - -export function ServiceWorkerRegister() { - useEffect(() => { - if (process.env.NODE_ENV !== "production") { - return; - } - if (process.env.NEXT_PUBLIC_ENABLE_SW === "false") { - return; - } - if (!("serviceWorker" in navigator)) { - return; - } - - const registerServiceWorker = () => { - navigator.serviceWorker - .register("/sw.js", { updateViaCache: "none" }) - .catch((error: unknown) => { - console.error("Service Worker registration failed:", error); - }); - }; - - if (document.readyState === "complete") { - registerServiceWorker(); - return; - } - - window.addEventListener("load", registerServiceWorker); - return () => { - window.removeEventListener("load", registerServiceWorker); - }; - }, []); - - return null; -} diff --git a/src/hooks/use-is-pwa-install-target.ts b/src/hooks/use-is-pwa-install-target.ts new file mode 100644 index 00000000..3eb280be --- /dev/null +++ b/src/hooks/use-is-pwa-install-target.ts @@ -0,0 +1,34 @@ +"use client"; + +import { useSyncExternalStore } from "react"; + +import { isMobileUserAgent } from "@/lib/pwa/device"; + +const MOBILE_VIEWPORT_QUERY = "(max-width: 767px)"; + +function subscribeViewport(callback: () => void) { + const mediaQuery = window.matchMedia(MOBILE_VIEWPORT_QUERY); + mediaQuery.addEventListener("change", callback); + return () => { + mediaQuery.removeEventListener("change", callback); + }; +} + +function getViewportSnapshot() { + return window.matchMedia(MOBILE_VIEWPORT_QUERY).matches; +} + +export function useIsPwaInstallTarget() { + const isNarrowViewport = useSyncExternalStore( + subscribeViewport, + getViewportSnapshot, + () => false, + ); + const isMobileUa = useSyncExternalStore( + () => () => {}, + isMobileUserAgent, + () => false, + ); + + return isNarrowViewport || isMobileUa; +} diff --git a/src/hooks/use-is-standalone.ts b/src/hooks/use-is-standalone.ts new file mode 100644 index 00000000..c7c96420 --- /dev/null +++ b/src/hooks/use-is-standalone.ts @@ -0,0 +1,26 @@ +"use client"; + +import { useSyncExternalStore } from "react"; + +const STANDALONE_QUERY = + "(display-mode: standalone), (display-mode: window-controls-overlay)"; + +function subscribe(callback: () => void) { + const mediaQuery = window.matchMedia(STANDALONE_QUERY); + mediaQuery.addEventListener("change", callback); + return () => { + mediaQuery.removeEventListener("change", callback); + }; +} + +function getSnapshot() { + return window.matchMedia(STANDALONE_QUERY).matches; +} + +function getServerSnapshot() { + return false; +} + +export function useIsStandalone() { + return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot); +} diff --git a/src/lib/pwa/device.ts b/src/lib/pwa/device.ts new file mode 100644 index 00000000..1978518b --- /dev/null +++ b/src/lib/pwa/device.ts @@ -0,0 +1,41 @@ +export interface PwaPlatform { + isIos: boolean; + isMacSafari: boolean; + isAndroid: boolean; +} + +export function isIosDevice(): boolean { + if (typeof navigator === "undefined") { + return false; + } + + return ( + /iPad|iPhone|iPod/.test(navigator.userAgent) || + (navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1) + ); +} + +export function isMobileUserAgent(): boolean { + if (typeof navigator === "undefined") { + return false; + } + + return isIosDevice() || /Android/i.test(navigator.userAgent); +} + +export function getPwaPlatform(): PwaPlatform { + if (typeof navigator === "undefined") { + return { isIos: false, isMacSafari: false, isAndroid: false }; + } + + const isIos = isIosDevice(); + const isMac = /Macintosh/.test(navigator.userAgent); + const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); + const isAndroid = /Android/i.test(navigator.userAgent); + + return { + isIos, + isMacSafari: isMac && isSafari, + isAndroid, + }; +} diff --git a/src/sw-env.d.ts b/src/sw-env.d.ts new file mode 100644 index 00000000..6384da39 --- /dev/null +++ b/src/sw-env.d.ts @@ -0,0 +1,3 @@ +/// + +export {}; diff --git a/src/sw.ts b/src/sw.ts new file mode 100644 index 00000000..83333b0c --- /dev/null +++ b/src/sw.ts @@ -0,0 +1,63 @@ +/// +/// +import { defaultCache } from "@serwist/next/worker"; +import type { PrecacheEntry, SerwistGlobalConfig } from "serwist"; +import { NetworkOnly, Serwist } from "serwist"; + +declare global { + interface WorkerGlobalScope extends SerwistGlobalConfig { + __SW_MANIFEST: (PrecacheEntry | string)[] | undefined; + } +} + +declare const self: ServiceWorkerGlobalScope; + +const OFFLINE_URL = "/offline.html"; +const SENSITIVE_PATH_PREFIXES = ["/api/", "/auth/"]; + +const serwist = new Serwist({ + precacheEntries: self.__SW_MANIFEST, + skipWaiting: true, + clientsClaim: true, + navigationPreload: false, + runtimeCaching: [ + { + matcher({ request, sameOrigin, url }) { + if (!sameOrigin) { + return false; + } + if (request.method !== "GET") { + return true; + } + if (request.headers.has("Authorization")) { + return true; + } + return SENSITIVE_PATH_PREFIXES.some((prefix) => + url.pathname.startsWith(prefix), + ); + }, + handler: new NetworkOnly(), + }, + ...defaultCache, + ], +}); + +const getOfflineResponse = async () => { + const fromPrecache = await serwist.matchPrecache(OFFLINE_URL); + if (fromPrecache) { + return fromPrecache; + } + return caches.match(OFFLINE_URL, { ignoreSearch: true }); +}; + +serwist.setCatchHandler(async ({ request }) => { + if (request.mode === "navigate" || request.destination === "document") { + const offlinePage = await getOfflineResponse(); + if (offlinePage) { + return offlinePage; + } + } + return Response.error(); +}); + +serwist.addEventListeners(); diff --git a/tsconfig.json b/tsconfig.json index c7f4b26b..a62f5c0c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "target": "ES2017", - "lib": ["dom", "dom.iterable", "esnext"], + "lib": ["dom", "dom.iterable", "esnext", "webworker"], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -28,8 +28,7 @@ "**/*.tsx", ".next/types/**/*.ts", ".next/dev/types/**/*.ts", - "**/*.mts", - "public/sw.js" + "**/*.mts" ], - "exclude": ["node_modules"] + "exclude": ["node_modules", "public/sw.js"] } From bf745928e525c89335a40219b2936c8439718e28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tymon=20J=C4=99dryczka?= Date: Sun, 24 May 2026 16:39:01 +0200 Subject: [PATCH 3/7] chore: changes in manifest --- public/manifest.json | 44 ++++++++++++++++++++++++++++---------------- public/sw.js | 2 +- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/public/manifest.json b/public/manifest.json index a5b97d6e..8dd46bd8 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -1,28 +1,40 @@ { - "display_override": ["window-controls-overlay"], - "protocol_handlers": [{ "protocol": "mailto", "url": "/newEmail?to=%s" }], - "name": "The name of your application", - "short_name": "This name will show in your Windows taskbar, in the start menu, and Android homescreen", - "start_url": "The URL that should be loaded when your application is opened", - "display": "standalone", - "description": "A description for your application", - "lang": " The default language of your application", - "dir": "auto", - "theme_color": "#000000", - "background_color": "#000000", + "id": "/", + "name": "Testownik Solvro", + "short_name": "Testownik", + "description": "Przygotuj się do sesji z Testownikiem Solvro! Twórz quizy, testuj się i dziel zestawy z innymi.", + "start_url": "/", + "scope": "/", + "lang": "pl", + "dir": "ltr", "orientation": "any", + "categories": ["education"], + "display": "standalone", + "display_override": ["standalone", "browser"], + "theme_color": "#1A2856", + "background_color": "#0b111c", "icons": [ { - "src": "/icon-512.png", - "sizes": "512x512", + "src": "/icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/icon-192-maskable.png", + "sizes": "192x192", "type": "image/png", "purpose": "maskable" }, { - "src": "/icon-192.png", - "sizes": "192x192", + "src": "/icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "/icon-512-maskable.png", + "sizes": "512x512", "type": "image/png", - "purpose": "any" + "purpose": "maskable" } ], "prefer_related_applications": false diff --git a/public/sw.js b/public/sw.js index 1c9fecff..5921aa64 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1,2 +1,2 @@ -var w=[{revision:null,url:"/_next/static/media/opengraph-image.06uic5ht6.aff.png"},{revision:null,url:"/_next/static/media/logo.0wd2e_f.v-49o.svg"},{revision:null,url:"/_next/static/media/logo-dark.0_55--v62s08b.svg"},{revision:null,url:"/_next/static/media/favicon.0zsj~n962g272.ico"},{revision:null,url:"/_next/static/chunks/turbopack-0hxh7ku~ztpa6.js"},{revision:null,url:"/_next/static/chunks/172ivk05m2bo8.js"},{revision:null,url:"/_next/static/chunks/16rb85u~rg37f.js"},{revision:null,url:"/_next/static/chunks/15c992o_2p_ui.js"},{revision:null,url:"/_next/static/chunks/145o.lsi86g0w.css"},{revision:null,url:"/_next/static/chunks/13p-eg31hy4r9.js"},{revision:null,url:"/_next/static/chunks/1352oh6y39x4s.js"},{revision:null,url:"/_next/static/chunks/12_331qljvpz..js"},{revision:null,url:"/_next/static/chunks/123z3_c0bz0p9.js"},{revision:null,url:"/_next/static/chunks/11bfq3-h3gy4c.js"},{revision:null,url:"/_next/static/chunks/118a504enpyzu.js"},{revision:null,url:"/_next/static/chunks/10y.pwmxjjjqk.js"},{revision:null,url:"/_next/static/chunks/104l0fvx54wj-.js"},{revision:null,url:"/_next/static/chunks/0z~0882382gvy.js"},{revision:null,url:"/_next/static/chunks/0z97~83vjqptg.js"},{revision:null,url:"/_next/static/chunks/0y2l0xgouorae.css"},{revision:null,url:"/_next/static/chunks/0x9tlntlqq_d9.js"},{revision:null,url:"/_next/static/chunks/0wxb0ru_ff026.js"},{revision:null,url:"/_next/static/chunks/0wooikl-ul2kd.js"},{revision:null,url:"/_next/static/chunks/0v072dnk0fh1m.js"},{revision:null,url:"/_next/static/chunks/0uz4ru71rhm2b.js"},{revision:null,url:"/_next/static/chunks/0uds2c0vioouv.js"},{revision:null,url:"/_next/static/chunks/0u5h4hlrg0y8x.js"},{revision:null,url:"/_next/static/chunks/0typ-cp5k1ls6.js"},{revision:null,url:"/_next/static/chunks/0tv0r3c0gja~k.js"},{revision:null,url:"/_next/static/chunks/0tps_-qpifszc.js"},{revision:null,url:"/_next/static/chunks/0qc.7mj._qrn1.css"},{revision:null,url:"/_next/static/chunks/0ow8x71uqegil.js"},{revision:null,url:"/_next/static/chunks/0nj7_0z86yzc8.js"},{revision:null,url:"/_next/static/chunks/0n_bnncmioiff.js"},{revision:null,url:"/_next/static/chunks/0n7w3rz3jt5hr.js"},{revision:null,url:"/_next/static/chunks/0n3sitj-o8wrm.js"},{revision:null,url:"/_next/static/chunks/0n3ru1lp60s6l.css"},{revision:null,url:"/_next/static/chunks/0n02rcnt.xtjk.js"},{revision:null,url:"/_next/static/chunks/0mvw90h4_8bta.js"},{revision:null,url:"/_next/static/chunks/0mcgx~9nkb0-b.js"},{revision:null,url:"/_next/static/chunks/0k.m8w.7-a3xc.js"},{revision:null,url:"/_next/static/chunks/0jvjj2m6w3twt.js"},{revision:null,url:"/_next/static/chunks/0iet4xty.keb1.js"},{revision:null,url:"/_next/static/chunks/0i-112x7.uz1s.js"},{revision:null,url:"/_next/static/chunks/0hr2pnmeaaxa6.js"},{revision:null,url:"/_next/static/chunks/0h8-~mdn8_0en.js"},{revision:null,url:"/_next/static/chunks/0ge9cv96.8gn-.js"},{revision:null,url:"/_next/static/chunks/0f8pc_tcays4j.js"},{revision:null,url:"/_next/static/chunks/0exn7tuj~0h7d.js"},{revision:null,url:"/_next/static/chunks/0eiutdzyk1u-s.js"},{revision:null,url:"/_next/static/chunks/0ed~h.87czbyq.js"},{revision:null,url:"/_next/static/chunks/0ed59gpsfl1ie.js"},{revision:null,url:"/_next/static/chunks/0d6mfypvpyrhq.js"},{revision:null,url:"/_next/static/chunks/0cw_ryqsp~q7c.js"},{revision:null,url:"/_next/static/chunks/0cfxgxhsf390n.js"},{revision:null,url:"/_next/static/chunks/0c1jedyjrx~bm.js"},{revision:null,url:"/_next/static/chunks/0c.2wnkm67pd~.js"},{revision:null,url:"/_next/static/chunks/0aswkgju_dw97.js"},{revision:null,url:"/_next/static/chunks/0a.kre0dvja43.js"},{revision:null,url:"/_next/static/chunks/0_9gorbp-p8dg.js"},{revision:null,url:"/_next/static/chunks/0_7s0.hv.kwyg.js"},{revision:null,url:"/_next/static/chunks/09z5_hrd4ob0..js"},{revision:null,url:"/_next/static/chunks/09xcbed_1xh5s.js"},{revision:null,url:"/_next/static/chunks/0989ksawcjb7~.js"},{revision:null,url:"/_next/static/chunks/092dlyyoi5qhe.js"},{revision:null,url:"/_next/static/chunks/08fneonxyymto.js"},{revision:null,url:"/_next/static/chunks/07wjw_tjkv_4r.js"},{revision:null,url:"/_next/static/chunks/07bha-9k3if-r.js"},{revision:null,url:"/_next/static/chunks/072dgox8prfm..js"},{revision:null,url:"/_next/static/chunks/06j4yvl06fyum.js"},{revision:null,url:"/_next/static/chunks/03~yq9q893hmn.js"},{revision:null,url:"/_next/static/chunks/03t~un0cjpnpk.js"},{revision:null,url:"/_next/static/chunks/03o9w180mw2u4.js"},{revision:null,url:"/_next/static/chunks/033oyvauenvh8.js"},{revision:null,url:"/_next/static/chunks/00cyib-7p3-ay.js"},{revision:null,url:"/_next/static/chunks/0.s_0cx.5knjr.js"},{revision:null,url:"/_next/static/chunks/0.1go1yjh_33f.js"},{revision:null,url:"/_next/static/0TnsBP9D2s_HFJ358Oi0-/_ssgManifest.js"},{revision:null,url:"/_next/static/0TnsBP9D2s_HFJ358Oi0-/_clientMiddlewareManifest.js"},{revision:null,url:"/_next/static/0TnsBP9D2s_HFJ358Oi0-/_buildManifest.js"},{revision:"a0c506315efd4b8cf04cf7772e314248",url:"/solvro_mono.svg"},{revision:"415d9a545b0669f8399293a223f900ce",url:"/manifest.json"},{revision:"96933cc9517dbda7718eb0ccd146debf",url:"/icon-512.png"},{revision:"bd02d4a8132d37d4d81f307f99d0ddf8",url:"/icon-512-maskable.png"},{revision:"5cc689681d951eeaf7af6dd63d0658eb",url:"/icon-192.png"},{revision:"5aa2f65a080e13002b066c3c5563436f",url:"/icon-192-maskable.png"},{revision:"0ee5dfca21af7288f5b48c1e4cf59d91",url:"/favicon.svg"},{revision:"f2bc2ea7e0da5c43670c3c44232fec40",url:"/favicon-dark.svg"},{revision:"36b50630d6c0d82e0c3fc11a48a36611",url:"/apple-touch-icon.png"},{revision:"edc51dcf30745c34c2df5ebea40bdeb7",url:"/favicon/180x180.png"},{revision:"8d9b8ad559d71f09ac1c1b51068f98c2",url:"/banned-screen/mc-font.otf"},{revision:"e8a3307e5824d62b46878b5e7c99e979",url:"/banned-screen/dirt-background.webp"},{revision:"d4e23892be011bf99f5df6e0b1a946f3",url:"/offline"},{revision:"367690bf40ecbc1069f5c1acab3174f9",url:"/offline.html"}];var y={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"serwist",runtime:"runtime",suffix:typeof registration<"u"?registration.scope:""},L=e=>[y.prefix,e,y.suffix].filter(t=>t&&t.length>0).join("-"),Ke=e=>{for(let t of Object.keys(y))e(t)},N={updateDetails:e=>{Ke(t=>{let s=e[t];typeof s=="string"&&(y[t]=s)})},getGoogleAnalyticsName:e=>e||L(y.googleAnalytics),getPrecacheName:e=>e||L(y.precache),getPrefix:()=>y.prefix,getRuntimeName:e=>e||L(y.runtime),getSuffix:()=>y.suffix},D;function re(){if(D===void 0){let e=new Response("");if("body"in e)try{new Response(e.body),D=!0}catch{D=!1}D=!1}return D}var He=(e,...t)=>{let s=e;return t.length>0&&(s+=` :: ${JSON.stringify(t)}`),s};var Ge=He,l=class extends Error{details;constructor(e,t){let s=Ge(e,t);super(s),this.name=e,this.details=t}};var ne=e=>new URL(String(e),location.href).href.replace(new RegExp(`^${location.origin}`),"");function S(e){return new Promise(t=>setTimeout(t,e))}var F=new Set;function se(e,t){let s=new URL(e);for(let r of t)s.searchParams.delete(r);return s.href}async function ae(e,t,s,r){let n=se(t.url,s);if(t.url===n)return e.match(t,r);let a={...r,ignoreSearch:!0},o=await e.keys(t,a);for(let i of o)if(n===se(i.url,s))return e.match(i,r)}var oe=class{promise;resolve;reject;constructor(){this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t})}},ie=async()=>{for(let e of F)await e()},ze="-precache-",Qe=async(e,t=ze)=>{let s=(await self.caches.keys()).filter(r=>r.includes(t)&&r.includes(self.registration.scope)&&r!==e);return await Promise.all(s.map(r=>self.caches.delete(r))),s},ce=e=>{self.addEventListener("activate",t=>{t.waitUntil(Qe(N.getPrecacheName(e)).then(s=>{}))})},le=()=>{self.addEventListener("activate",()=>self.clients.claim())},V=(e,t)=>{let s=t();return e.waitUntil(s),s};var W=(e,t)=>t.some(s=>e instanceof s),ue,he;function Je(){return ue||(ue=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])}function Ye(){return he||(he=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])}var K=new WeakMap,M=new WeakMap,O=new WeakMap;function Xe(e){let t=new Promise((s,r)=>{let n=()=>{e.removeEventListener("success",a),e.removeEventListener("error",o)},a=()=>{s(v(e.result)),n()},o=()=>{r(e.error),n()};e.addEventListener("success",a),e.addEventListener("error",o)});return O.set(t,e),t}function Ze(e){if(K.has(e))return;let t=new Promise((s,r)=>{let n=()=>{e.removeEventListener("complete",a),e.removeEventListener("error",o),e.removeEventListener("abort",o)},a=()=>{s(),n()},o=()=>{r(e.error||new DOMException("AbortError","AbortError")),n()};e.addEventListener("complete",a),e.addEventListener("error",o),e.addEventListener("abort",o)});K.set(e,t)}var H={get(e,t,s){if(e instanceof IDBTransaction){if(t==="done")return K.get(e);if(t==="store")return s.objectStoreNames[1]?void 0:s.objectStore(s.objectStoreNames[0])}return v(e[t])},set(e,t,s){return e[t]=s,!0},has(e,t){return e instanceof IDBTransaction&&(t==="done"||t==="store")?!0:t in e}};function fe(e){H=e(H)}function et(e){return Ye().includes(e)?function(...t){return e.apply(G(this),t),v(this.request)}:function(...t){return v(e.apply(G(this),t))}}function tt(e){return typeof e=="function"?et(e):(e instanceof IDBTransaction&&Ze(e),W(e,Je())?new Proxy(e,H):e)}function v(e){if(e instanceof IDBRequest)return Xe(e);if(M.has(e))return M.get(e);let t=tt(e);return t!==e&&(M.set(e,t),O.set(t,e)),t}var G=e=>O.get(e);function P(e,t,{blocked:s,upgrade:r,blocking:n,terminated:a}={}){let o=indexedDB.open(e,t),i=v(o);return r&&o.addEventListener("upgradeneeded",c=>{r(v(o.result),c.oldVersion,c.newVersion,v(o.transaction),c)}),s&&o.addEventListener("blocked",c=>s(c.oldVersion,c.newVersion,c)),i.then(c=>{a&&c.addEventListener("close",()=>a()),n&&c.addEventListener("versionchange",u=>n(u.oldVersion,u.newVersion,u))}).catch(()=>{}),i}function me(e,{blocked:t}={}){let s=indexedDB.deleteDatabase(e);return t&&s.addEventListener("blocked",r=>t(r.oldVersion,r)),v(s).then(()=>{})}var st=["get","getKey","getAll","getAllKeys","count"],rt=["put","add","delete","clear"],B=new Map;function de(e,t){if(!(e instanceof IDBDatabase&&!(t in e)&&typeof t=="string"))return;if(B.get(t))return B.get(t);let s=t.replace(/FromIndex$/,""),r=t!==s,n=rt.includes(s);if(!(s in(r?IDBIndex:IDBObjectStore).prototype)||!(n||st.includes(s)))return;let a=async function(o,...i){let c=this.transaction(o,n?"readwrite":"readonly"),u=c.store;return r&&(u=u.index(i.shift())),(await Promise.all([u[s](...i),n&&c.done]))[0]};return B.set(t,a),a}fe(e=>({...e,get:(t,s,r)=>de(t,s)||e.get(t,s,r),has:(t,s)=>!!de(t,s)||e.has(t,s)}));var nt=["continue","continuePrimaryKey","advance"],pe={},z=new WeakMap,we=new WeakMap,at={get(e,t){if(!nt.includes(t))return e[t];let s=pe[t];return s||(s=pe[t]=function(...r){z.set(this,we.get(this)[t](...r))}),s}};async function*ot(...e){let t=this;if(t instanceof IDBCursor||(t=await t.openCursor(...e)),!t)return;t=t;let s=new Proxy(t,at);for(we.set(s,t),O.set(s,G(t));t;)yield s,t=await(z.get(s)||t.continue()),z.delete(s)}function ge(e,t){return t===Symbol.asyncIterator&&W(e,[IDBIndex,IDBObjectStore,IDBCursor])||t==="iterate"&&W(e,[IDBIndex,IDBObjectStore])}fe(e=>({...e,get(t,s,r){return ge(t,s)?ot:e.get(t,s,r)},has(t,s){return ge(t,s)||e.has(t,s)}}));var _e=async(e,t)=>{let s=null;if(e.url&&(s=new URL(e.url).origin),s!==self.location.origin)throw new l("cross-origin-copy-response",{origin:s});let r=e.clone(),n={headers:new Headers(r.headers),status:r.status,statusText:r.statusText},a=t?t(n):n,o=re()?r.body:await r.blob();return new Response(o,a)},ve=()=>{self.__WB_DISABLE_DEV_LOGS=!0},ye=3,it="serwist-background-sync",E="requests",q="queueName",ct=class{_db=null;async addEntry(e){let t=(await this.getDb()).transaction(E,"readwrite",{durability:"relaxed"});await t.store.add(e),await t.done}async getFirstEntryId(){return(await(await this.getDb()).transaction(E).store.openCursor())?.value.id}async getAllEntriesByQueueName(e){let t=await(await this.getDb()).getAllFromIndex(E,q,IDBKeyRange.only(e));return t||[]}async getEntryCountByQueueName(e){return(await this.getDb()).countFromIndex(E,q,IDBKeyRange.only(e))}async deleteEntry(e){await(await this.getDb()).delete(E,e)}async getFirstEntryByQueueName(e){return await this.getEndEntryFromIndex(IDBKeyRange.only(e),"next")}async getLastEntryByQueueName(e){return await this.getEndEntryFromIndex(IDBKeyRange.only(e),"prev")}async getEndEntryFromIndex(e,t){return(await(await this.getDb()).transaction(E).store.index(q).openCursor(e,t))?.value}async getDb(){return this._db||(this._db=await P(it,ye,{upgrade:this._upgradeDb})),this._db}_upgradeDb(e,t){t>0&&t{s.headers[n]=r});for(let r of lt)t[r]!==void 0&&(s[r]=t[r]);return new J(s)}constructor(t){t.mode==="navigate"&&(t.mode="same-origin"),this._requestData=t}toObject(){let t=Object.assign({},this._requestData);return t.headers=Object.assign({},this._requestData.headers),t.body&&(t.body=t.body.slice(0)),t}toRequest(){return new Request(this._requestData.url,this._requestData)}clone(){return new J(this.toObject())}},Ne="serwist-background-sync",ut=1440*7,Q=new Set,Ee=e=>{let t={request:new Y(e.requestData).toRequest(),timestamp:e.timestamp};return e.metadata&&(t.metadata=e.metadata),t},be=class{_name;_onSync;_maxRetentionTime;_queueStore;_forceSyncFallback;_syncInProgress=!1;_requestsAddedDuringSync=!1;constructor(e,{forceSyncFallback:t,onSync:s,maxRetentionTime:r}={}){if(Q.has(e))throw new l("duplicate-queue-name",{name:e});Q.add(e),this._name=e,this._onSync=s||this.replayRequests,this._maxRetentionTime=r||ut,this._forceSyncFallback=!!t,this._queueStore=new xe(this._name),this._addSyncListener()}get name(){return this._name}async pushRequest(e){await this._addRequest(e,"push")}async unshiftRequest(e){await this._addRequest(e,"unshift")}async popRequest(){return this._removeRequest("pop")}async shiftRequest(){return this._removeRequest("shift")}async getAll(){let e=await this._queueStore.getAll(),t=Date.now(),s=[];for(let r of e){let n=this._maxRetentionTime*60*1e3;t-r.timestamp>n?await this._queueStore.deleteEntry(r.id):s.push(Ee(r))}return s}async size(){return await this._queueStore.size()}async _addRequest({request:e,metadata:t,timestamp:s=Date.now()},r){let n={requestData:(await Y.fromRequest(e.clone())).toObject(),timestamp:s};switch(t&&(n.metadata=t),r){case"push":await this._queueStore.pushEntry(n);break;case"unshift":await this._queueStore.unshiftEntry(n);break}this._syncInProgress?this._requestsAddedDuringSync=!0:await this.registerSync()}async _removeRequest(e){let t=Date.now(),s;switch(e){case"pop":s=await this._queueStore.popEntry();break;case"shift":s=await this._queueStore.shiftEntry();break}if(s){let r=this._maxRetentionTime*60*1e3;return t-s.timestamp>r?this._removeRequest(e):Ee(s)}}async replayRequests(){let e;for(;e=await this.shiftRequest();)try{await fetch(e.request.clone())}catch{throw await this.unshiftRequest(e),new l("queue-replay-failed",{name:this._name})}}async registerSync(){if("sync"in self.registration&&!this._forceSyncFallback)try{await self.registration.sync.register(`${Ne}:${this._name}`)}catch{}}_addSyncListener(){"sync"in self.registration&&!this._forceSyncFallback?self.addEventListener("sync",e=>{if(e.tag===`${Ne}:${this._name}`){let t=async()=>{this._syncInProgress=!0;let s;try{await this._onSync({queue:this})}catch(r){if(r instanceof Error)throw s=r,s}finally{this._requestsAddedDuringSync&&!(s&&!e.lastChance)&&await this.registerSync(),this._syncInProgress=!1,this._requestsAddedDuringSync=!1}};e.waitUntil(t())}}):this._onSync({queue:this})}static get _queueNames(){return Q}},Re=class{_queue;constructor(e,t){this._queue=new be(e,t)}async fetchDidFail({request:e}){await this._queue.pushRequest({request:e})}},X={cacheWillUpdate:async({response:e})=>e.status===200||e.status===0?e:null};function U(e){return typeof e=="string"?new Request(e):e}var ke=class{event;request;url;params;_cacheKeys={};_strategy;_handlerDeferred;_extendLifetimePromises;_plugins;_pluginStateMap;constructor(e,t){this.event=t.event,this.request=t.request,t.url&&(this.url=t.url,this.params=t.params),this._strategy=e,this._handlerDeferred=new oe,this._extendLifetimePromises=[],this._plugins=[...e.plugins],this._pluginStateMap=new Map;for(let s of this._plugins)this._pluginStateMap.set(s,{});this.event.waitUntil(this._handlerDeferred.promise)}async fetch(e){let{event:t}=this,s=U(e),r=await this.getPreloadResponse();if(r)return r;let n=this.hasCallback("fetchDidFail")?s.clone():null;try{for(let o of this.iterateCallbacks("requestWillFetch"))s=await o({request:s.clone(),event:t})}catch(o){if(o instanceof Error)throw new l("plugin-error-request-will-fetch",{thrownErrorMessage:o.message})}let a=s.clone();try{let o;o=await fetch(s,s.mode==="navigate"?void 0:this._strategy.fetchOptions);for(let i of this.iterateCallbacks("fetchDidSucceed"))o=await i({event:t,request:a,response:o});return o}catch(o){throw n&&await this.runCallbacks("fetchDidFail",{error:o,event:t,originalRequest:n.clone(),request:a.clone()}),o}}async fetchAndCachePut(e){let t=await this.fetch(e),s=t.clone();return this.waitUntil(this.cachePut(e,s)),t}async cacheMatch(e){let t=U(e),s,{cacheName:r,matchOptions:n}=this._strategy,a=await this.getCacheKey(t,"read"),o={...n,cacheName:r};s=await caches.match(a,o);for(let i of this.iterateCallbacks("cachedResponseWillBeUsed"))s=await i({cacheName:r,matchOptions:n,cachedResponse:s,request:a,event:this.event})||void 0;return s}async cachePut(e,t){let s=U(e);await S(0);let r=await this.getCacheKey(s,"write");if(!t)throw new l("cache-put-with-no-response",{url:ne(r.url)});let n=await this._ensureResponseSafeToCache(t);if(!n)return!1;let{cacheName:a,matchOptions:o}=this._strategy,i=await self.caches.open(a),c=this.hasCallback("cacheDidUpdate"),u=c?await ae(i,r.clone(),["__WB_REVISION__"],o):null;try{await i.put(r,c?n.clone():n)}catch(d){if(d instanceof Error)throw d.name==="QuotaExceededError"&&await ie(),d}for(let d of this.iterateCallbacks("cacheDidUpdate"))await d({cacheName:a,oldResponse:u,newResponse:n.clone(),request:r,event:this.event});return!0}async getCacheKey(e,t){let s=`${e.url} | ${t}`;if(!this._cacheKeys[s]){let r=e;for(let n of this.iterateCallbacks("cacheKeyWillBeUsed"))r=U(await n({mode:t,request:r,event:this.event,params:this.params}));this._cacheKeys[s]=r}return this._cacheKeys[s]}hasCallback(e){for(let t of this._strategy.plugins)if(e in t)return!0;return!1}async runCallbacks(e,t){for(let s of this.iterateCallbacks(e))await s(t)}*iterateCallbacks(e){for(let t of this._strategy.plugins)if(typeof t[e]=="function"){let s=this._pluginStateMap.get(t);yield n=>{let a={...n,state:s};return t[e](a)}}}waitUntil(e){return this._extendLifetimePromises.push(e),e}async doneWaiting(){let e;for(;e=this._extendLifetimePromises.shift();)await e}destroy(){this._handlerDeferred.resolve(null)}async getPreloadResponse(){if(this.event instanceof FetchEvent&&this.event.request.mode==="navigate"&&"preloadResponse"in this.event)try{let e=await this.event.preloadResponse;if(e)return e}catch{return}}async _ensureResponseSafeToCache(e){let t=e,s=!1;for(let r of this.iterateCallbacks("cacheWillUpdate"))if(t=await r({request:this.request,response:t,event:this.event})||void 0,s=!0,!t)break;return s||t&&t.status!==200&&(t=void 0),t}},b=class{cacheName;plugins;fetchOptions;matchOptions;constructor(e={}){this.cacheName=N.getRuntimeName(e.cacheName),this.plugins=e.plugins||[],this.fetchOptions=e.fetchOptions,this.matchOptions=e.matchOptions}handle(e){let[t]=this.handleAll(e);return t}handleAll(e){e instanceof FetchEvent&&(e={event:e,request:e.request});let t=e.event,s=typeof e.request=="string"?new Request(e.request):e.request,r=new ke(this,e.url?{event:t,request:s,url:e.url,params:e.params}:{event:t,request:s}),n=this._getResponse(r,s,t);return[n,this._awaitComplete(n,r,s,t)]}async _getResponse(e,t,s){await e.runCallbacks("handlerWillStart",{event:s,request:t});let r;try{if(r=await this._handle(t,e),r===void 0||r.type==="error")throw new l("no-response",{url:t.url})}catch(n){if(n instanceof Error){for(let a of e.iterateCallbacks("handlerDidError"))if(r=await a({error:n,event:s,request:t}),r!==void 0)break}if(!r)throw n}for(let n of e.iterateCallbacks("handlerWillRespond"))r=await n({event:s,request:t,response:r});return r}async _awaitComplete(e,t,s,r){let n,a;try{n=await e}catch{}try{await t.runCallbacks("handlerDidRespond",{event:r,request:s,response:n}),await t.doneWaiting()}catch(o){o instanceof Error&&(a=o)}if(await t.runCallbacks("handlerDidComplete",{event:r,request:s,response:n,error:a}),t.destroy(),a)throw a}};var p=class extends b{_networkTimeoutSeconds;constructor(e={}){super(e),this.plugins.some(t=>"cacheWillUpdate"in t)||this.plugins.unshift(X),this._networkTimeoutSeconds=e.networkTimeoutSeconds||0}async _handle(e,t){let s=[],r=[],n;if(this._networkTimeoutSeconds){let{id:i,promise:c}=this._getTimeoutPromise({request:e,logs:s,handler:t});n=i,r.push(c)}let a=this._getNetworkPromise({timeoutId:n,request:e,logs:s,handler:t});r.push(a);let o=await t.waitUntil((async()=>await t.waitUntil(Promise.race(r))||await a)());if(!o)throw new l("no-response",{url:e.url});return o}_getTimeoutPromise({request:e,logs:t,handler:s}){let r;return{promise:new Promise(n=>{r=setTimeout(async()=>{n(await s.cacheMatch(e))},this._networkTimeoutSeconds*1e3)}),id:r}}async _getNetworkPromise({timeoutId:e,request:t,logs:s,handler:r}){let n,a;try{a=await r.fetchAndCachePut(t)}catch(o){o instanceof Error&&(n=o)}return e&&clearTimeout(e),(n||!a)&&(a=await r.cacheMatch(t)),a}},R=class extends b{_networkTimeoutSeconds;constructor(e={}){super(e),this._networkTimeoutSeconds=e.networkTimeoutSeconds||0}async _handle(e,t){let s,r;try{let n=[t.fetch(e)];if(this._networkTimeoutSeconds){let a=S(this._networkTimeoutSeconds*1e3);n.push(a)}if(r=await Promise.race(n),!r)throw new Error(`Timed out the network response after ${this._networkTimeoutSeconds} seconds.`)}catch(n){n instanceof Error&&(s=n)}if(!r)throw new l("no-response",{url:e.url,error:s});return r}};var C=e=>e&&typeof e=="object"?e:{handle:e},g=class{handler;match;method;catchHandler;constructor(e,t,s="GET"){this.handler=C(t),this.match=e,this.method=s}setCatchHandler(e){this.catchHandler=C(e)}},De=class T extends b{_fallbackToNetwork;static defaultPrecacheCacheabilityPlugin={async cacheWillUpdate({response:t}){return!t||t.status>=400?null:t}};static copyRedirectedCacheableResponsesPlugin={async cacheWillUpdate({response:t}){return t.redirected?await _e(t):t}};constructor(t={}){t.cacheName=N.getPrecacheName(t.cacheName),super(t),this._fallbackToNetwork=t.fallbackToNetwork!==!1,this.plugins.push(T.copyRedirectedCacheableResponsesPlugin)}async _handle(t,s){let r=await s.getPreloadResponse();if(r)return r;let n=await s.cacheMatch(t);return n||(s.event&&s.event.type==="install"?await this._handleInstall(t,s):await this._handleFetch(t,s))}async _handleFetch(t,s){let r,n=s.params||{};if(this._fallbackToNetwork){let a=n.integrity,o=t.integrity,i=!o||o===a;if(r=await s.fetch(new Request(t,{integrity:t.mode!=="no-cors"?o||a:void 0})),a&&i&&t.mode!=="no-cors"){this._useDefaultCacheabilityPluginIfNeeded();let c=await s.cachePut(t,r.clone())}}else throw new l("missing-precache-entry",{cacheName:this.cacheName,url:t.url});return r}async _handleInstall(t,s){this._useDefaultCacheabilityPluginIfNeeded();let r=await s.fetch(t);if(!await s.cachePut(t,r.clone()))throw new l("bad-precaching-response",{url:t.url,status:r.status});return r}_useDefaultCacheabilityPluginIfNeeded(){let t=null,s=0;for(let[r,n]of this.plugins.entries())n!==T.copyRedirectedCacheableResponsesPlugin&&(n===T.defaultPrecacheCacheabilityPlugin&&(t=r),n.cacheWillUpdate&&s++);s===0?this.plugins.push(T.defaultPrecacheCacheabilityPlugin):s>1&&t!==null&&this.plugins.splice(t,1)}},Se=class extends g{_allowlist;_denylist;constructor(e,{allowlist:t=[/./],denylist:s=[]}={}){super(r=>this._match(r),e),this._allowlist=t,this._denylist=s}_match({url:e,request:t}){if(t&&t.mode!=="navigate")return!1;let s=e.pathname+e.search;for(let r of this._denylist)if(r.test(s))return!1;return!!this._allowlist.some(r=>r.test(s))}},qe=()=>!!self.registration?.navigationPreload,Te=e=>{qe()&&self.addEventListener("activate",t=>{t.waitUntil(self.registration.navigationPreload.enable().then(()=>{e&&self.registration.navigationPreload.setHeaderValue(e)}))})};var ht=(e,t=[])=>{for(let s of[...e.searchParams.keys()])t.some(r=>r.test(s))&&e.searchParams.delete(s);return e};function*Ce(e,{directoryIndex:t="index.html",ignoreURLParametersMatching:s=[/^utm_/,/^fbclid$/],cleanURLs:r=!0,urlManipulation:n}={}){let a=new URL(e,location.href);a.hash="",yield a.href;let o=ht(a,s);if(yield o.href,t&&o.pathname.endsWith("/")){let i=new URL(o.href);i.pathname+=t,yield i.href}if(r){let i=new URL(o.href);i.pathname+=".html",yield i.href}if(n){let i=n({url:a});for(let c of i)yield c.href}}var Ae=class extends g{constructor(e,t,s){let r=({url:n})=>{let a=e.exec(n.href);if(a&&!(n.origin!==location.origin&&a.index!==0))return a.slice(1)};super(r,t,s)}},Oe=e=>{N.updateDetails(e)},dt="__WB_REVISION__",Pe=e=>{if(!e)throw new l("add-to-cache-list-unexpected-type",{entry:e});if(typeof e=="string"){let a=new URL(e,location.href);return{cacheKey:a.href,url:a.href}}let{revision:t,url:s}=e;if(!s)throw new l("add-to-cache-list-unexpected-type",{entry:e});if(!t){let a=new URL(s,location.href);return{cacheKey:a.href,url:a.href}}let r=new URL(s,location.href),n=new URL(s,location.href);return r.searchParams.set(dt,t),{cacheKey:r.href,url:n.href}},Ue=class{updatedURLs=[];notUpdatedURLs=[];handlerWillStart=async({request:e,state:t})=>{t&&(t.originalRequest=e)};cachedResponseWillBeUsed=async({event:e,state:t,cachedResponse:s})=>{if(e.type==="install"&&t?.originalRequest&&t.originalRequest instanceof Request){let r=t.originalRequest.url;s?this.notUpdatedURLs.push(r):this.updatedURLs.push(r)}return s}},$e=(e,t,s)=>{if(typeof e=="string"){let r=new URL(e,location.href),n=({url:a})=>a.href===r.href;return new g(n,t,s)}if(e instanceof RegExp)return new Ae(e,t,s);if(typeof e=="function")return new g(e,t,s);if(e instanceof g)return e;throw new l("unsupported-route-type",{moduleName:"serwist",funcName:"parseRoute",paramName:"capture"})};var Ie=async(e,t,s)=>{let r=t.map((o,i)=>({index:i,item:o})),n=async o=>{let i=[];for(;;){let c=r.pop();if(!c)return o(i);let u=await s(c.item);i.push({result:u,index:c.index})}},a=Array.from({length:e},()=>new Promise(n));return(await Promise.all(a)).flat().sort((o,i)=>o.indexo.result)};var xs=typeof navigator<"u"&&/^((?!chrome|android).)*safari/i.test(navigator.userAgent);var pt="serwist-expiration",$="cache-entries",je=e=>{let t=new URL(e,location.href);return t.hash="",t.href},gt=class{_cacheName;_db=null;constructor(e){this._cacheName=e}_getId(e){return`${this._cacheName}|${je(e)}`}_upgradeDb(e){let t=e.createObjectStore($,{keyPath:"id"});t.createIndex("cacheName","cacheName",{unique:!1}),t.createIndex("timestamp","timestamp",{unique:!1})}_upgradeDbAndDeleteOldDbs(e){this._upgradeDb(e),this._cacheName&&me(this._cacheName)}async setTimestamp(e,t){e=je(e);let s={id:this._getId(e),cacheName:this._cacheName,url:e,timestamp:t},r=(await this.getDb()).transaction($,"readwrite",{durability:"relaxed"});await r.store.put(s),await r.done}async getTimestamp(e){return(await(await this.getDb()).get($,this._getId(e)))?.timestamp}async expireEntries(e,t){let s=await(await this.getDb()).transaction($,"readwrite").store.index("timestamp").openCursor(null,"prev"),r=[],n=0;for(;s;){let a=s.value;a.cacheName===this._cacheName&&(e&&a.timestamp=t?(s.delete(),r.push(a.url)):n++),s=await s.continue()}return r}async getDb(){return this._db||(this._db=await P(pt,1,{upgrade:this._upgradeDbAndDeleteOldDbs.bind(this)})),this._db}},ft=class{_isRunning=!1;_rerunRequested=!1;_maxEntries;_maxAgeSeconds;_matchOptions;_cacheName;_timestampModel;constructor(e,t={}){this._maxEntries=t.maxEntries,this._maxAgeSeconds=t.maxAgeSeconds,this._matchOptions=t.matchOptions,this._cacheName=e,this._timestampModel=new gt(e)}async expireEntries(){if(this._isRunning){this._rerunRequested=!0;return}this._isRunning=!0;let e=this._maxAgeSeconds?Date.now()-this._maxAgeSeconds*1e3:0,t=await this._timestampModel.expireEntries(e,this._maxEntries),s=await self.caches.open(this._cacheName);for(let r of t)await s.delete(r,this._matchOptions);this._isRunning=!1,this._rerunRequested&&(this._rerunRequested=!1,this.expireEntries())}async updateTimestamp(e){await this._timestampModel.setTimestamp(e,Date.now())}async isURLExpired(e){if(!this._maxAgeSeconds)return!1;let t=await this._timestampModel.getTimestamp(e),s=Date.now()-this._maxAgeSeconds*1e3;return t!==void 0?t{F.add(e)},h=class{_config;_cacheExpirations;constructor(e={}){this._config=e,this._cacheExpirations=new Map,this._config.maxAgeFrom||(this._config.maxAgeFrom="last-fetched"),this._config.purgeOnQuotaError&&mt(()=>this.deleteCacheAndMetadata())}_getCacheExpiration(e){if(e===N.getRuntimeName())throw new l("expire-custom-caches-only");let t=this._cacheExpirations.get(e);return t||(t=new ft(e,this._config),this._cacheExpirations.set(e,t)),t}cachedResponseWillBeUsed({event:e,cacheName:t,request:s,cachedResponse:r}){if(!r)return null;let n=this._isResponseDateFresh(r),a=this._getCacheExpiration(t),o=this._config.maxAgeFrom==="last-used",i=(async()=>{o&&await a.updateTimestamp(s.url),await a.expireEntries()})();try{e.waitUntil(i)}catch{}return n?r:null}_isResponseDateFresh(e){if(this._config.maxAgeFrom==="last-used")return!0;let t=Date.now();if(!this._config.maxAgeSeconds)return!0;let s=this._getDateHeaderTimestamp(e);return s===null?!0:s>=t-this._config.maxAgeSeconds*1e3}_getDateHeaderTimestamp(e){if(!e.headers.has("date"))return null;let t=e.headers.get("date"),s=new Date(t).getTime();return Number.isNaN(s)?null:s}async cacheDidUpdate({cacheName:e,request:t}){let s=this._getCacheExpiration(e);await s.updateTimestamp(t.url),await s.expireEntries()}async deleteCacheAndMetadata(){for(let[e,t]of this._cacheExpirations)await self.caches.delete(e),await t.delete();this._cacheExpirations=new Map}},wt="serwist-google-analytics",yt=2880,Nt=/^\/(\w+\/)?collect/,Et=e=>async({queue:t})=>{let s;for(;s=await t.shiftRequest();){let{request:r,timestamp:n}=s,a=new URL(r.url);try{let o=r.method==="POST"?new URLSearchParams(await r.clone().text()):a.searchParams,i=n-(Number(o.get("qt"))||0),c=Date.now()-i;if(o.set("qt",String(c)),e.parameterOverrides)for(let u of Object.keys(e.parameterOverrides)){let d=e.parameterOverrides[u];o.set(u,d)}typeof e.hitFilter=="function"&&e.hitFilter.call(null,o),await fetch(new Request(a.origin+a.pathname,{body:o.toString(),method:"POST",mode:"cors",credentials:"omit",headers:{"Content-Type":"text/plain"}}))}catch(o){throw await t.unshiftRequest(s),o}}},_t=e=>{let t=({url:r})=>r.hostname==="www.google-analytics.com"&&Nt.test(r.pathname),s=new R({plugins:[e]});return[new g(t,s,"GET"),new g(t,s,"POST")]},vt=e=>{let t=({url:s})=>s.hostname==="www.google-analytics.com"&&s.pathname==="/analytics.js";return new g(t,new p({cacheName:e}),"GET")},xt=e=>{let t=({url:s})=>s.hostname==="www.googletagmanager.com"&&s.pathname==="/gtag/js";return new g(t,new p({cacheName:e}),"GET")},bt=e=>{let t=({url:s})=>s.hostname==="www.googletagmanager.com"&&s.pathname==="/gtm.js";return new g(t,new p({cacheName:e}),"GET")},Le=({serwist:e,cacheName:t,...s})=>{let r=N.getGoogleAnalyticsName(t),n=new Re(wt,{maxRetentionTime:yt,onSync:Et(s)}),a=[bt(r),vt(r),xt(r),..._t(n)];for(let o of a)e.registerRoute(o)},Rt=class{_fallbackUrls;_serwist;constructor({fallbackUrls:e,serwist:t}){this._fallbackUrls=e,this._serwist=t}async handlerDidError(e){for(let t of this._fallbackUrls)if(typeof t=="string"){let s=await this._serwist.matchPrecache(t);if(s!==void 0)return s}else if(t.matcher(e)){let s=await this._serwist.matchPrecache(t.url);if(s!==void 0)return s}}},kt=(e,t,s)=>{let r=e.size;if(s&&s>r||t&&t<0)throw new l("range-not-satisfiable",{size:r,end:s,start:t});let n,a;return t!==void 0&&s!==void 0?(n=t,a=s+1):t!==void 0&&s===void 0?(n=t,a=r):s!==void 0&&t===void 0&&(n=r-s,a=r),{start:n,end:a}},Dt=e=>{let t=e.trim().toLowerCase();if(!t.startsWith("bytes="))throw new l("unit-must-be-bytes",{normalizedRangeHeader:t});if(t.includes(","))throw new l("single-range-only",{normalizedRangeHeader:t});let s=/(\d*)-(\d*)/.exec(t);if(!s||!(s[1]||s[2]))throw new l("invalid-range-values",{normalizedRangeHeader:t});return{start:s[1]===""?void 0:Number(s[1]),end:s[2]===""?void 0:Number(s[2])}},St=async(e,t)=>{try{if(t.status===206)return t;let s=e.headers.get("range");if(!s)throw new l("no-range-header");let r=Dt(s),n=await t.blob(),a=kt(n,r.start,r.end),o=n.slice(a.start,a.end),i=o.size,c=new Response(o,{status:206,statusText:"Partial Content",headers:t.headers});return c.headers.set("Content-Length",String(i)),c.headers.set("Content-Range",`bytes ${a.start}-${a.end-1}/${n.size}`),c}catch{return new Response("",{status:416,statusText:"Range Not Satisfiable"})}},Z=class{cachedResponseWillBeUsed=async({request:e,cachedResponse:t})=>t&&e.headers.has("range")?await St(e,t):t},A=class extends b{async _handle(e,t){let s=[],r=await t.cacheMatch(e),n;if(!r)try{r=await t.fetchAndCachePut(e)}catch(a){a instanceof Error&&(n=a)}if(!r)throw new l("no-response",{url:e.url,error:n});return r}};var k=class extends b{constructor(e={}){super(e),this.plugins.some(t=>"cacheWillUpdate"in t)||this.plugins.unshift(X)}async _handle(e,t){let s=[],r=t.fetchAndCachePut(e).catch(()=>{});t.waitUntil(r);let n=await t.cacheMatch(e),a;if(!n)try{n=await r}catch(o){o instanceof Error&&(a=o)}if(!n)throw new l("no-response",{url:e.url,error:a});return n}},qt=class extends g{constructor(e,t){let s=({request:r})=>{let n=e.getUrlsToPrecacheKeys();for(let a of Ce(r.url,t)){let o=n.get(a);if(o)return{cacheKey:o,integrity:e.getIntegrityForPrecacheKey(o)}}};super(s,e.precacheStrategy)}},Tt=class{_precacheController;constructor({precacheController:e}){this._precacheController=e}cacheKeyWillBeUsed=async({request:e,params:t})=>{let s=t?.cacheKey||this._precacheController.getPrecacheKeyForUrl(e.url);return s?new Request(s,{headers:e.headers}):e}},Ct=(e,t={})=>{let{cacheName:s,plugins:r=[],fetchOptions:n,matchOptions:a,fallbackToNetwork:o,directoryIndex:i,ignoreURLParametersMatching:c,cleanURLs:u,urlManipulation:d,cleanupOutdatedCaches:m,concurrency:x=10,navigateFallback:I,navigateFallbackAllowlist:_,navigateFallbackDenylist:f}=t??{};return{precacheStrategyOptions:{cacheName:N.getPrecacheName(s),plugins:[...r,new Tt({precacheController:e})],fetchOptions:n,matchOptions:a,fallbackToNetwork:o},precacheRouteOptions:{directoryIndex:i,ignoreURLParametersMatching:c,cleanURLs:u,urlManipulation:d},precacheMiscOptions:{cleanupOutdatedCaches:m,concurrency:x,navigateFallback:I,navigateFallbackAllowlist:_,navigateFallbackDenylist:f}}},Fe=class{_urlsToCacheKeys=new Map;_urlsToCacheModes=new Map;_cacheKeysToIntegrities=new Map;_concurrentPrecaching;_precacheStrategy;_routes;_defaultHandlerMap;_catchHandler;_requestRules;constructor({precacheEntries:e,precacheOptions:t,skipWaiting:s=!1,importScripts:r,navigationPreload:n=!1,cacheId:a,clientsClaim:o=!1,runtimeCaching:i,offlineAnalyticsConfig:c,disableDevLogs:u=!1,fallbacks:d,requestRules:m}={}){let{precacheStrategyOptions:x,precacheRouteOptions:I,precacheMiscOptions:_}=Ct(this,t);if(this._concurrentPrecaching=_.concurrency,this._precacheStrategy=new De(x),this._routes=new Map,this._defaultHandlerMap=new Map,this._requestRules=m,this.handleInstall=this.handleInstall.bind(this),this.handleActivate=this.handleActivate.bind(this),this.handleFetch=this.handleFetch.bind(this),this.handleCache=this.handleCache.bind(this),r&&r.length>0&&self.importScripts(...r),n&&Te(),a!==void 0&&Oe({prefix:a}),s?self.skipWaiting():self.addEventListener("message",f=>{f.data&&f.data.type==="SKIP_WAITING"&&self.skipWaiting()}),o&&le(),e&&e.length>0&&this.addToPrecacheList(e),_.cleanupOutdatedCaches&&ce(x.cacheName),this.registerRoute(new qt(this,I)),_.navigateFallback&&this.registerRoute(new Se(this.createHandlerBoundToUrl(_.navigateFallback),{allowlist:_.navigateFallbackAllowlist,denylist:_.navigateFallbackDenylist})),c!==void 0&&(typeof c=="boolean"?c&&Le({serwist:this}):Le({...c,serwist:this})),i!==void 0){if(d!==void 0){let f=new Rt({fallbackUrls:d.entries,serwist:this});i.forEach(j=>{j.handler instanceof b&&!j.handler.plugins.some(Be=>"handlerDidError"in Be)&&j.handler.plugins.push(f)})}for(let f of i)this.registerCapture(f.matcher,f.handler,f.method)}u&&ve()}get precacheStrategy(){return this._precacheStrategy}get routes(){return this._routes}addEventListeners(){self.addEventListener("install",this.handleInstall),self.addEventListener("activate",this.handleActivate),self.addEventListener("fetch",this.handleFetch),self.addEventListener("message",this.handleCache)}addToPrecacheList(e){let t=[];for(let s of e){typeof s=="string"?t.push(s):s&&!s.integrity&&s.revision===void 0&&t.push(s.url);let{cacheKey:r,url:n}=Pe(s),a=typeof s!="string"&&s.revision?"reload":"default";if(this._urlsToCacheKeys.has(n)&&this._urlsToCacheKeys.get(n)!==r)throw new l("add-to-cache-list-conflicting-entries",{firstEntry:this._urlsToCacheKeys.get(n),secondEntry:r});if(typeof s!="string"&&s.integrity){if(this._cacheKeysToIntegrities.has(r)&&this._cacheKeysToIntegrities.get(r)!==s.integrity)throw new l("add-to-cache-list-conflicting-integrities",{url:n});this._cacheKeysToIntegrities.set(r,s.integrity)}this._urlsToCacheKeys.set(n,r),this._urlsToCacheModes.set(n,a)}if(t.length>0){let s=`Serwist is precaching URLs without revision info: ${t.join(", ")} +var w=[{revision:null,url:"/_next/static/media/opengraph-image.06uic5ht6.aff.png"},{revision:null,url:"/_next/static/media/logo.0wd2e_f.v-49o.svg"},{revision:null,url:"/_next/static/media/logo-dark.0_55--v62s08b.svg"},{revision:null,url:"/_next/static/media/favicon.0zsj~n962g272.ico"},{revision:null,url:"/_next/static/l0iKdMw8X290IfMFcxkTi/_ssgManifest.js"},{revision:null,url:"/_next/static/l0iKdMw8X290IfMFcxkTi/_clientMiddlewareManifest.js"},{revision:null,url:"/_next/static/l0iKdMw8X290IfMFcxkTi/_buildManifest.js"},{revision:null,url:"/_next/static/chunks/turbopack-0hxh7ku~ztpa6.js"},{revision:null,url:"/_next/static/chunks/172ivk05m2bo8.js"},{revision:null,url:"/_next/static/chunks/16rb85u~rg37f.js"},{revision:null,url:"/_next/static/chunks/14u0pvu28enmo.js"},{revision:null,url:"/_next/static/chunks/145o.lsi86g0w.css"},{revision:null,url:"/_next/static/chunks/13p-eg31hy4r9.js"},{revision:null,url:"/_next/static/chunks/1352oh6y39x4s.js"},{revision:null,url:"/_next/static/chunks/12_331qljvpz..js"},{revision:null,url:"/_next/static/chunks/123z3_c0bz0p9.js"},{revision:null,url:"/_next/static/chunks/11bfq3-h3gy4c.js"},{revision:null,url:"/_next/static/chunks/118a504enpyzu.js"},{revision:null,url:"/_next/static/chunks/10y.pwmxjjjqk.js"},{revision:null,url:"/_next/static/chunks/104l0fvx54wj-.js"},{revision:null,url:"/_next/static/chunks/0z~0882382gvy.js"},{revision:null,url:"/_next/static/chunks/0z97~83vjqptg.js"},{revision:null,url:"/_next/static/chunks/0y2l0xgouorae.css"},{revision:null,url:"/_next/static/chunks/0x9tlntlqq_d9.js"},{revision:null,url:"/_next/static/chunks/0wxb0ru_ff026.js"},{revision:null,url:"/_next/static/chunks/0wpa4ig.eotgk.js"},{revision:null,url:"/_next/static/chunks/0wooikl-ul2kd.js"},{revision:null,url:"/_next/static/chunks/0w_ca~l54g3fw.js"},{revision:null,url:"/_next/static/chunks/0v072dnk0fh1m.js"},{revision:null,url:"/_next/static/chunks/0uz4ru71rhm2b.js"},{revision:null,url:"/_next/static/chunks/0uds2c0vioouv.js"},{revision:null,url:"/_next/static/chunks/0u5h4hlrg0y8x.js"},{revision:null,url:"/_next/static/chunks/0typ-cp5k1ls6.js"},{revision:null,url:"/_next/static/chunks/0tps_-qpifszc.js"},{revision:null,url:"/_next/static/chunks/0qc.7mj._qrn1.css"},{revision:null,url:"/_next/static/chunks/0ow8x71uqegil.js"},{revision:null,url:"/_next/static/chunks/0nj7_0z86yzc8.js"},{revision:null,url:"/_next/static/chunks/0n_bnncmioiff.js"},{revision:null,url:"/_next/static/chunks/0n7w3rz3jt5hr.js"},{revision:null,url:"/_next/static/chunks/0n3ru1lp60s6l.css"},{revision:null,url:"/_next/static/chunks/0n02rcnt.xtjk.js"},{revision:null,url:"/_next/static/chunks/0mvw90h4_8bta.js"},{revision:null,url:"/_next/static/chunks/0mcgx~9nkb0-b.js"},{revision:null,url:"/_next/static/chunks/0k.m8w.7-a3xc.js"},{revision:null,url:"/_next/static/chunks/0jvjj2m6w3twt.js"},{revision:null,url:"/_next/static/chunks/0iet4xty.keb1.js"},{revision:null,url:"/_next/static/chunks/0i-112x7.uz1s.js"},{revision:null,url:"/_next/static/chunks/0hr2pnmeaaxa6.js"},{revision:null,url:"/_next/static/chunks/0h9pbatd_byvf.js"},{revision:null,url:"/_next/static/chunks/0h8-~mdn8_0en.js"},{revision:null,url:"/_next/static/chunks/0ge9cv96.8gn-.js"},{revision:null,url:"/_next/static/chunks/0f8pc_tcays4j.js"},{revision:null,url:"/_next/static/chunks/0exn7tuj~0h7d.js"},{revision:null,url:"/_next/static/chunks/0eiutdzyk1u-s.js"},{revision:null,url:"/_next/static/chunks/0ed~h.87czbyq.js"},{revision:null,url:"/_next/static/chunks/0ed59gpsfl1ie.js"},{revision:null,url:"/_next/static/chunks/0d6mfypvpyrhq.js"},{revision:null,url:"/_next/static/chunks/0cw_ryqsp~q7c.js"},{revision:null,url:"/_next/static/chunks/0cfxgxhsf390n.js"},{revision:null,url:"/_next/static/chunks/0c1jedyjrx~bm.js"},{revision:null,url:"/_next/static/chunks/0c.2wnkm67pd~.js"},{revision:null,url:"/_next/static/chunks/0aswkgju_dw97.js"},{revision:null,url:"/_next/static/chunks/0a.kre0dvja43.js"},{revision:null,url:"/_next/static/chunks/0_9gorbp-p8dg.js"},{revision:null,url:"/_next/static/chunks/0_7s0.hv.kwyg.js"},{revision:null,url:"/_next/static/chunks/09xcbed_1xh5s.js"},{revision:null,url:"/_next/static/chunks/0989ksawcjb7~.js"},{revision:null,url:"/_next/static/chunks/092dlyyoi5qhe.js"},{revision:null,url:"/_next/static/chunks/07bha-9k3if-r.js"},{revision:null,url:"/_next/static/chunks/072dgox8prfm..js"},{revision:null,url:"/_next/static/chunks/06j4yvl06fyum.js"},{revision:null,url:"/_next/static/chunks/04gcxva48dgyd.js"},{revision:null,url:"/_next/static/chunks/03~yq9q893hmn.js"},{revision:null,url:"/_next/static/chunks/03o9w180mw2u4.js"},{revision:null,url:"/_next/static/chunks/033oyvauenvh8.js"},{revision:null,url:"/_next/static/chunks/00hyyb8mgibk1.js"},{revision:null,url:"/_next/static/chunks/00cyib-7p3-ay.js"},{revision:null,url:"/_next/static/chunks/0.s_0cx.5knjr.js"},{revision:null,url:"/_next/static/chunks/0.1go1yjh_33f.js"},{revision:null,url:"/_next/static/chunks/0-17qcfub5_tb.js"},{revision:"a0c506315efd4b8cf04cf7772e314248",url:"/solvro_mono.svg"},{revision:"415d9a545b0669f8399293a223f900ce",url:"/manifest.json"},{revision:"96933cc9517dbda7718eb0ccd146debf",url:"/icon-512.png"},{revision:"bd02d4a8132d37d4d81f307f99d0ddf8",url:"/icon-512-maskable.png"},{revision:"5cc689681d951eeaf7af6dd63d0658eb",url:"/icon-192.png"},{revision:"5aa2f65a080e13002b066c3c5563436f",url:"/icon-192-maskable.png"},{revision:"0ee5dfca21af7288f5b48c1e4cf59d91",url:"/favicon.svg"},{revision:"f2bc2ea7e0da5c43670c3c44232fec40",url:"/favicon-dark.svg"},{revision:"36b50630d6c0d82e0c3fc11a48a36611",url:"/apple-touch-icon.png"},{revision:"edc51dcf30745c34c2df5ebea40bdeb7",url:"/favicon/180x180.png"},{revision:"8d9b8ad559d71f09ac1c1b51068f98c2",url:"/banned-screen/mc-font.otf"},{revision:"e8a3307e5824d62b46878b5e7c99e979",url:"/banned-screen/dirt-background.webp"},{revision:"46518d07730b02b60fcd29aa950a4c04",url:"/offline"},{revision:"c6092feffed734936c09d24e63c257ca",url:"/offline.html"}];var y={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"serwist",runtime:"runtime",suffix:typeof registration<"u"?registration.scope:""},L=e=>[y.prefix,e,y.suffix].filter(t=>t&&t.length>0).join("-"),Ke=e=>{for(let t of Object.keys(y))e(t)},N={updateDetails:e=>{Ke(t=>{let s=e[t];typeof s=="string"&&(y[t]=s)})},getGoogleAnalyticsName:e=>e||L(y.googleAnalytics),getPrecacheName:e=>e||L(y.precache),getPrefix:()=>y.prefix,getRuntimeName:e=>e||L(y.runtime),getSuffix:()=>y.suffix},S;function re(){if(S===void 0){let e=new Response("");if("body"in e)try{new Response(e.body),S=!0}catch{S=!1}S=!1}return S}var He=(e,...t)=>{let s=e;return t.length>0&&(s+=` :: ${JSON.stringify(t)}`),s};var Ge=He,l=class extends Error{details;constructor(e,t){let s=Ge(e,t);super(s),this.name=e,this.details=t}};var ne=e=>new URL(String(e),location.href).href.replace(new RegExp(`^${location.origin}`),"");function D(e){return new Promise(t=>setTimeout(t,e))}var F=new Set;function se(e,t){let s=new URL(e);for(let r of t)s.searchParams.delete(r);return s.href}async function ae(e,t,s,r){let n=se(t.url,s);if(t.url===n)return e.match(t,r);let a={...r,ignoreSearch:!0},o=await e.keys(t,a);for(let i of o)if(n===se(i.url,s))return e.match(i,r)}var oe=class{promise;resolve;reject;constructor(){this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t})}},ie=async()=>{for(let e of F)await e()},ze="-precache-",Qe=async(e,t=ze)=>{let s=(await self.caches.keys()).filter(r=>r.includes(t)&&r.includes(self.registration.scope)&&r!==e);return await Promise.all(s.map(r=>self.caches.delete(r))),s},ce=e=>{self.addEventListener("activate",t=>{t.waitUntil(Qe(N.getPrecacheName(e)).then(s=>{}))})},le=()=>{self.addEventListener("activate",()=>self.clients.claim())},V=(e,t)=>{let s=t();return e.waitUntil(s),s};var W=(e,t)=>t.some(s=>e instanceof s),ue,he;function Je(){return ue||(ue=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])}function Ye(){return he||(he=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])}var K=new WeakMap,M=new WeakMap,O=new WeakMap;function Xe(e){let t=new Promise((s,r)=>{let n=()=>{e.removeEventListener("success",a),e.removeEventListener("error",o)},a=()=>{s(v(e.result)),n()},o=()=>{r(e.error),n()};e.addEventListener("success",a),e.addEventListener("error",o)});return O.set(t,e),t}function Ze(e){if(K.has(e))return;let t=new Promise((s,r)=>{let n=()=>{e.removeEventListener("complete",a),e.removeEventListener("error",o),e.removeEventListener("abort",o)},a=()=>{s(),n()},o=()=>{r(e.error||new DOMException("AbortError","AbortError")),n()};e.addEventListener("complete",a),e.addEventListener("error",o),e.addEventListener("abort",o)});K.set(e,t)}var H={get(e,t,s){if(e instanceof IDBTransaction){if(t==="done")return K.get(e);if(t==="store")return s.objectStoreNames[1]?void 0:s.objectStore(s.objectStoreNames[0])}return v(e[t])},set(e,t,s){return e[t]=s,!0},has(e,t){return e instanceof IDBTransaction&&(t==="done"||t==="store")?!0:t in e}};function fe(e){H=e(H)}function et(e){return Ye().includes(e)?function(...t){return e.apply(G(this),t),v(this.request)}:function(...t){return v(e.apply(G(this),t))}}function tt(e){return typeof e=="function"?et(e):(e instanceof IDBTransaction&&Ze(e),W(e,Je())?new Proxy(e,H):e)}function v(e){if(e instanceof IDBRequest)return Xe(e);if(M.has(e))return M.get(e);let t=tt(e);return t!==e&&(M.set(e,t),O.set(t,e)),t}var G=e=>O.get(e);function P(e,t,{blocked:s,upgrade:r,blocking:n,terminated:a}={}){let o=indexedDB.open(e,t),i=v(o);return r&&o.addEventListener("upgradeneeded",c=>{r(v(o.result),c.oldVersion,c.newVersion,v(o.transaction),c)}),s&&o.addEventListener("blocked",c=>s(c.oldVersion,c.newVersion,c)),i.then(c=>{a&&c.addEventListener("close",()=>a()),n&&c.addEventListener("versionchange",u=>n(u.oldVersion,u.newVersion,u))}).catch(()=>{}),i}function me(e,{blocked:t}={}){let s=indexedDB.deleteDatabase(e);return t&&s.addEventListener("blocked",r=>t(r.oldVersion,r)),v(s).then(()=>{})}var st=["get","getKey","getAll","getAllKeys","count"],rt=["put","add","delete","clear"],B=new Map;function de(e,t){if(!(e instanceof IDBDatabase&&!(t in e)&&typeof t=="string"))return;if(B.get(t))return B.get(t);let s=t.replace(/FromIndex$/,""),r=t!==s,n=rt.includes(s);if(!(s in(r?IDBIndex:IDBObjectStore).prototype)||!(n||st.includes(s)))return;let a=async function(o,...i){let c=this.transaction(o,n?"readwrite":"readonly"),u=c.store;return r&&(u=u.index(i.shift())),(await Promise.all([u[s](...i),n&&c.done]))[0]};return B.set(t,a),a}fe(e=>({...e,get:(t,s,r)=>de(t,s)||e.get(t,s,r),has:(t,s)=>!!de(t,s)||e.has(t,s)}));var nt=["continue","continuePrimaryKey","advance"],pe={},z=new WeakMap,we=new WeakMap,at={get(e,t){if(!nt.includes(t))return e[t];let s=pe[t];return s||(s=pe[t]=function(...r){z.set(this,we.get(this)[t](...r))}),s}};async function*ot(...e){let t=this;if(t instanceof IDBCursor||(t=await t.openCursor(...e)),!t)return;t=t;let s=new Proxy(t,at);for(we.set(s,t),O.set(s,G(t));t;)yield s,t=await(z.get(s)||t.continue()),z.delete(s)}function ge(e,t){return t===Symbol.asyncIterator&&W(e,[IDBIndex,IDBObjectStore,IDBCursor])||t==="iterate"&&W(e,[IDBIndex,IDBObjectStore])}fe(e=>({...e,get(t,s,r){return ge(t,s)?ot:e.get(t,s,r)},has(t,s){return ge(t,s)||e.has(t,s)}}));var _e=async(e,t)=>{let s=null;if(e.url&&(s=new URL(e.url).origin),s!==self.location.origin)throw new l("cross-origin-copy-response",{origin:s});let r=e.clone(),n={headers:new Headers(r.headers),status:r.status,statusText:r.statusText},a=t?t(n):n,o=re()?r.body:await r.blob();return new Response(o,a)},ve=()=>{self.__WB_DISABLE_DEV_LOGS=!0},ye=3,it="serwist-background-sync",E="requests",q="queueName",ct=class{_db=null;async addEntry(e){let t=(await this.getDb()).transaction(E,"readwrite",{durability:"relaxed"});await t.store.add(e),await t.done}async getFirstEntryId(){return(await(await this.getDb()).transaction(E).store.openCursor())?.value.id}async getAllEntriesByQueueName(e){let t=await(await this.getDb()).getAllFromIndex(E,q,IDBKeyRange.only(e));return t||[]}async getEntryCountByQueueName(e){return(await this.getDb()).countFromIndex(E,q,IDBKeyRange.only(e))}async deleteEntry(e){await(await this.getDb()).delete(E,e)}async getFirstEntryByQueueName(e){return await this.getEndEntryFromIndex(IDBKeyRange.only(e),"next")}async getLastEntryByQueueName(e){return await this.getEndEntryFromIndex(IDBKeyRange.only(e),"prev")}async getEndEntryFromIndex(e,t){return(await(await this.getDb()).transaction(E).store.index(q).openCursor(e,t))?.value}async getDb(){return this._db||(this._db=await P(it,ye,{upgrade:this._upgradeDb})),this._db}_upgradeDb(e,t){t>0&&t{s.headers[n]=r});for(let r of lt)t[r]!==void 0&&(s[r]=t[r]);return new J(s)}constructor(t){t.mode==="navigate"&&(t.mode="same-origin"),this._requestData=t}toObject(){let t=Object.assign({},this._requestData);return t.headers=Object.assign({},this._requestData.headers),t.body&&(t.body=t.body.slice(0)),t}toRequest(){return new Request(this._requestData.url,this._requestData)}clone(){return new J(this.toObject())}},Ne="serwist-background-sync",ut=1440*7,Q=new Set,Ee=e=>{let t={request:new Y(e.requestData).toRequest(),timestamp:e.timestamp};return e.metadata&&(t.metadata=e.metadata),t},be=class{_name;_onSync;_maxRetentionTime;_queueStore;_forceSyncFallback;_syncInProgress=!1;_requestsAddedDuringSync=!1;constructor(e,{forceSyncFallback:t,onSync:s,maxRetentionTime:r}={}){if(Q.has(e))throw new l("duplicate-queue-name",{name:e});Q.add(e),this._name=e,this._onSync=s||this.replayRequests,this._maxRetentionTime=r||ut,this._forceSyncFallback=!!t,this._queueStore=new xe(this._name),this._addSyncListener()}get name(){return this._name}async pushRequest(e){await this._addRequest(e,"push")}async unshiftRequest(e){await this._addRequest(e,"unshift")}async popRequest(){return this._removeRequest("pop")}async shiftRequest(){return this._removeRequest("shift")}async getAll(){let e=await this._queueStore.getAll(),t=Date.now(),s=[];for(let r of e){let n=this._maxRetentionTime*60*1e3;t-r.timestamp>n?await this._queueStore.deleteEntry(r.id):s.push(Ee(r))}return s}async size(){return await this._queueStore.size()}async _addRequest({request:e,metadata:t,timestamp:s=Date.now()},r){let n={requestData:(await Y.fromRequest(e.clone())).toObject(),timestamp:s};switch(t&&(n.metadata=t),r){case"push":await this._queueStore.pushEntry(n);break;case"unshift":await this._queueStore.unshiftEntry(n);break}this._syncInProgress?this._requestsAddedDuringSync=!0:await this.registerSync()}async _removeRequest(e){let t=Date.now(),s;switch(e){case"pop":s=await this._queueStore.popEntry();break;case"shift":s=await this._queueStore.shiftEntry();break}if(s){let r=this._maxRetentionTime*60*1e3;return t-s.timestamp>r?this._removeRequest(e):Ee(s)}}async replayRequests(){let e;for(;e=await this.shiftRequest();)try{await fetch(e.request.clone())}catch{throw await this.unshiftRequest(e),new l("queue-replay-failed",{name:this._name})}}async registerSync(){if("sync"in self.registration&&!this._forceSyncFallback)try{await self.registration.sync.register(`${Ne}:${this._name}`)}catch{}}_addSyncListener(){"sync"in self.registration&&!this._forceSyncFallback?self.addEventListener("sync",e=>{if(e.tag===`${Ne}:${this._name}`){let t=async()=>{this._syncInProgress=!0;let s;try{await this._onSync({queue:this})}catch(r){if(r instanceof Error)throw s=r,s}finally{this._requestsAddedDuringSync&&!(s&&!e.lastChance)&&await this.registerSync(),this._syncInProgress=!1,this._requestsAddedDuringSync=!1}};e.waitUntil(t())}}):this._onSync({queue:this})}static get _queueNames(){return Q}},Re=class{_queue;constructor(e,t){this._queue=new be(e,t)}async fetchDidFail({request:e}){await this._queue.pushRequest({request:e})}},X={cacheWillUpdate:async({response:e})=>e.status===200||e.status===0?e:null};function U(e){return typeof e=="string"?new Request(e):e}var ke=class{event;request;url;params;_cacheKeys={};_strategy;_handlerDeferred;_extendLifetimePromises;_plugins;_pluginStateMap;constructor(e,t){this.event=t.event,this.request=t.request,t.url&&(this.url=t.url,this.params=t.params),this._strategy=e,this._handlerDeferred=new oe,this._extendLifetimePromises=[],this._plugins=[...e.plugins],this._pluginStateMap=new Map;for(let s of this._plugins)this._pluginStateMap.set(s,{});this.event.waitUntil(this._handlerDeferred.promise)}async fetch(e){let{event:t}=this,s=U(e),r=await this.getPreloadResponse();if(r)return r;let n=this.hasCallback("fetchDidFail")?s.clone():null;try{for(let o of this.iterateCallbacks("requestWillFetch"))s=await o({request:s.clone(),event:t})}catch(o){if(o instanceof Error)throw new l("plugin-error-request-will-fetch",{thrownErrorMessage:o.message})}let a=s.clone();try{let o;o=await fetch(s,s.mode==="navigate"?void 0:this._strategy.fetchOptions);for(let i of this.iterateCallbacks("fetchDidSucceed"))o=await i({event:t,request:a,response:o});return o}catch(o){throw n&&await this.runCallbacks("fetchDidFail",{error:o,event:t,originalRequest:n.clone(),request:a.clone()}),o}}async fetchAndCachePut(e){let t=await this.fetch(e),s=t.clone();return this.waitUntil(this.cachePut(e,s)),t}async cacheMatch(e){let t=U(e),s,{cacheName:r,matchOptions:n}=this._strategy,a=await this.getCacheKey(t,"read"),o={...n,cacheName:r};s=await caches.match(a,o);for(let i of this.iterateCallbacks("cachedResponseWillBeUsed"))s=await i({cacheName:r,matchOptions:n,cachedResponse:s,request:a,event:this.event})||void 0;return s}async cachePut(e,t){let s=U(e);await D(0);let r=await this.getCacheKey(s,"write");if(!t)throw new l("cache-put-with-no-response",{url:ne(r.url)});let n=await this._ensureResponseSafeToCache(t);if(!n)return!1;let{cacheName:a,matchOptions:o}=this._strategy,i=await self.caches.open(a),c=this.hasCallback("cacheDidUpdate"),u=c?await ae(i,r.clone(),["__WB_REVISION__"],o):null;try{await i.put(r,c?n.clone():n)}catch(d){if(d instanceof Error)throw d.name==="QuotaExceededError"&&await ie(),d}for(let d of this.iterateCallbacks("cacheDidUpdate"))await d({cacheName:a,oldResponse:u,newResponse:n.clone(),request:r,event:this.event});return!0}async getCacheKey(e,t){let s=`${e.url} | ${t}`;if(!this._cacheKeys[s]){let r=e;for(let n of this.iterateCallbacks("cacheKeyWillBeUsed"))r=U(await n({mode:t,request:r,event:this.event,params:this.params}));this._cacheKeys[s]=r}return this._cacheKeys[s]}hasCallback(e){for(let t of this._strategy.plugins)if(e in t)return!0;return!1}async runCallbacks(e,t){for(let s of this.iterateCallbacks(e))await s(t)}*iterateCallbacks(e){for(let t of this._strategy.plugins)if(typeof t[e]=="function"){let s=this._pluginStateMap.get(t);yield n=>{let a={...n,state:s};return t[e](a)}}}waitUntil(e){return this._extendLifetimePromises.push(e),e}async doneWaiting(){let e;for(;e=this._extendLifetimePromises.shift();)await e}destroy(){this._handlerDeferred.resolve(null)}async getPreloadResponse(){if(this.event instanceof FetchEvent&&this.event.request.mode==="navigate"&&"preloadResponse"in this.event)try{let e=await this.event.preloadResponse;if(e)return e}catch{return}}async _ensureResponseSafeToCache(e){let t=e,s=!1;for(let r of this.iterateCallbacks("cacheWillUpdate"))if(t=await r({request:this.request,response:t,event:this.event})||void 0,s=!0,!t)break;return s||t&&t.status!==200&&(t=void 0),t}},b=class{cacheName;plugins;fetchOptions;matchOptions;constructor(e={}){this.cacheName=N.getRuntimeName(e.cacheName),this.plugins=e.plugins||[],this.fetchOptions=e.fetchOptions,this.matchOptions=e.matchOptions}handle(e){let[t]=this.handleAll(e);return t}handleAll(e){e instanceof FetchEvent&&(e={event:e,request:e.request});let t=e.event,s=typeof e.request=="string"?new Request(e.request):e.request,r=new ke(this,e.url?{event:t,request:s,url:e.url,params:e.params}:{event:t,request:s}),n=this._getResponse(r,s,t);return[n,this._awaitComplete(n,r,s,t)]}async _getResponse(e,t,s){await e.runCallbacks("handlerWillStart",{event:s,request:t});let r;try{if(r=await this._handle(t,e),r===void 0||r.type==="error")throw new l("no-response",{url:t.url})}catch(n){if(n instanceof Error){for(let a of e.iterateCallbacks("handlerDidError"))if(r=await a({error:n,event:s,request:t}),r!==void 0)break}if(!r)throw n}for(let n of e.iterateCallbacks("handlerWillRespond"))r=await n({event:s,request:t,response:r});return r}async _awaitComplete(e,t,s,r){let n,a;try{n=await e}catch{}try{await t.runCallbacks("handlerDidRespond",{event:r,request:s,response:n}),await t.doneWaiting()}catch(o){o instanceof Error&&(a=o)}if(await t.runCallbacks("handlerDidComplete",{event:r,request:s,response:n,error:a}),t.destroy(),a)throw a}};var p=class extends b{_networkTimeoutSeconds;constructor(e={}){super(e),this.plugins.some(t=>"cacheWillUpdate"in t)||this.plugins.unshift(X),this._networkTimeoutSeconds=e.networkTimeoutSeconds||0}async _handle(e,t){let s=[],r=[],n;if(this._networkTimeoutSeconds){let{id:i,promise:c}=this._getTimeoutPromise({request:e,logs:s,handler:t});n=i,r.push(c)}let a=this._getNetworkPromise({timeoutId:n,request:e,logs:s,handler:t});r.push(a);let o=await t.waitUntil((async()=>await t.waitUntil(Promise.race(r))||await a)());if(!o)throw new l("no-response",{url:e.url});return o}_getTimeoutPromise({request:e,logs:t,handler:s}){let r;return{promise:new Promise(n=>{r=setTimeout(async()=>{n(await s.cacheMatch(e))},this._networkTimeoutSeconds*1e3)}),id:r}}async _getNetworkPromise({timeoutId:e,request:t,logs:s,handler:r}){let n,a;try{a=await r.fetchAndCachePut(t)}catch(o){o instanceof Error&&(n=o)}return e&&clearTimeout(e),(n||!a)&&(a=await r.cacheMatch(t)),a}},R=class extends b{_networkTimeoutSeconds;constructor(e={}){super(e),this._networkTimeoutSeconds=e.networkTimeoutSeconds||0}async _handle(e,t){let s,r;try{let n=[t.fetch(e)];if(this._networkTimeoutSeconds){let a=D(this._networkTimeoutSeconds*1e3);n.push(a)}if(r=await Promise.race(n),!r)throw new Error(`Timed out the network response after ${this._networkTimeoutSeconds} seconds.`)}catch(n){n instanceof Error&&(s=n)}if(!r)throw new l("no-response",{url:e.url,error:s});return r}};var C=e=>e&&typeof e=="object"?e:{handle:e},g=class{handler;match;method;catchHandler;constructor(e,t,s="GET"){this.handler=C(t),this.match=e,this.method=s}setCatchHandler(e){this.catchHandler=C(e)}},Se=class T extends b{_fallbackToNetwork;static defaultPrecacheCacheabilityPlugin={async cacheWillUpdate({response:t}){return!t||t.status>=400?null:t}};static copyRedirectedCacheableResponsesPlugin={async cacheWillUpdate({response:t}){return t.redirected?await _e(t):t}};constructor(t={}){t.cacheName=N.getPrecacheName(t.cacheName),super(t),this._fallbackToNetwork=t.fallbackToNetwork!==!1,this.plugins.push(T.copyRedirectedCacheableResponsesPlugin)}async _handle(t,s){let r=await s.getPreloadResponse();if(r)return r;let n=await s.cacheMatch(t);return n||(s.event&&s.event.type==="install"?await this._handleInstall(t,s):await this._handleFetch(t,s))}async _handleFetch(t,s){let r,n=s.params||{};if(this._fallbackToNetwork){let a=n.integrity,o=t.integrity,i=!o||o===a;if(r=await s.fetch(new Request(t,{integrity:t.mode!=="no-cors"?o||a:void 0})),a&&i&&t.mode!=="no-cors"){this._useDefaultCacheabilityPluginIfNeeded();let c=await s.cachePut(t,r.clone())}}else throw new l("missing-precache-entry",{cacheName:this.cacheName,url:t.url});return r}async _handleInstall(t,s){this._useDefaultCacheabilityPluginIfNeeded();let r=await s.fetch(t);if(!await s.cachePut(t,r.clone()))throw new l("bad-precaching-response",{url:t.url,status:r.status});return r}_useDefaultCacheabilityPluginIfNeeded(){let t=null,s=0;for(let[r,n]of this.plugins.entries())n!==T.copyRedirectedCacheableResponsesPlugin&&(n===T.defaultPrecacheCacheabilityPlugin&&(t=r),n.cacheWillUpdate&&s++);s===0?this.plugins.push(T.defaultPrecacheCacheabilityPlugin):s>1&&t!==null&&this.plugins.splice(t,1)}},De=class extends g{_allowlist;_denylist;constructor(e,{allowlist:t=[/./],denylist:s=[]}={}){super(r=>this._match(r),e),this._allowlist=t,this._denylist=s}_match({url:e,request:t}){if(t&&t.mode!=="navigate")return!1;let s=e.pathname+e.search;for(let r of this._denylist)if(r.test(s))return!1;return!!this._allowlist.some(r=>r.test(s))}},qe=()=>!!self.registration?.navigationPreload,Te=e=>{qe()&&self.addEventListener("activate",t=>{t.waitUntil(self.registration.navigationPreload.enable().then(()=>{e&&self.registration.navigationPreload.setHeaderValue(e)}))})};var ht=(e,t=[])=>{for(let s of[...e.searchParams.keys()])t.some(r=>r.test(s))&&e.searchParams.delete(s);return e};function*Ce(e,{directoryIndex:t="index.html",ignoreURLParametersMatching:s=[/^utm_/,/^fbclid$/],cleanURLs:r=!0,urlManipulation:n}={}){let a=new URL(e,location.href);a.hash="",yield a.href;let o=ht(a,s);if(yield o.href,t&&o.pathname.endsWith("/")){let i=new URL(o.href);i.pathname+=t,yield i.href}if(r){let i=new URL(o.href);i.pathname+=".html",yield i.href}if(n){let i=n({url:a});for(let c of i)yield c.href}}var Ae=class extends g{constructor(e,t,s){let r=({url:n})=>{let a=e.exec(n.href);if(a&&!(n.origin!==location.origin&&a.index!==0))return a.slice(1)};super(r,t,s)}},Oe=e=>{N.updateDetails(e)},dt="__WB_REVISION__",Pe=e=>{if(!e)throw new l("add-to-cache-list-unexpected-type",{entry:e});if(typeof e=="string"){let a=new URL(e,location.href);return{cacheKey:a.href,url:a.href}}let{revision:t,url:s}=e;if(!s)throw new l("add-to-cache-list-unexpected-type",{entry:e});if(!t){let a=new URL(s,location.href);return{cacheKey:a.href,url:a.href}}let r=new URL(s,location.href),n=new URL(s,location.href);return r.searchParams.set(dt,t),{cacheKey:r.href,url:n.href}},Ue=class{updatedURLs=[];notUpdatedURLs=[];handlerWillStart=async({request:e,state:t})=>{t&&(t.originalRequest=e)};cachedResponseWillBeUsed=async({event:e,state:t,cachedResponse:s})=>{if(e.type==="install"&&t?.originalRequest&&t.originalRequest instanceof Request){let r=t.originalRequest.url;s?this.notUpdatedURLs.push(r):this.updatedURLs.push(r)}return s}},$e=(e,t,s)=>{if(typeof e=="string"){let r=new URL(e,location.href),n=({url:a})=>a.href===r.href;return new g(n,t,s)}if(e instanceof RegExp)return new Ae(e,t,s);if(typeof e=="function")return new g(e,t,s);if(e instanceof g)return e;throw new l("unsupported-route-type",{moduleName:"serwist",funcName:"parseRoute",paramName:"capture"})};var Ie=async(e,t,s)=>{let r=t.map((o,i)=>({index:i,item:o})),n=async o=>{let i=[];for(;;){let c=r.pop();if(!c)return o(i);let u=await s(c.item);i.push({result:u,index:c.index})}},a=Array.from({length:e},()=>new Promise(n));return(await Promise.all(a)).flat().sort((o,i)=>o.indexo.result)};var xs=typeof navigator<"u"&&/^((?!chrome|android).)*safari/i.test(navigator.userAgent);var pt="serwist-expiration",$="cache-entries",je=e=>{let t=new URL(e,location.href);return t.hash="",t.href},gt=class{_cacheName;_db=null;constructor(e){this._cacheName=e}_getId(e){return`${this._cacheName}|${je(e)}`}_upgradeDb(e){let t=e.createObjectStore($,{keyPath:"id"});t.createIndex("cacheName","cacheName",{unique:!1}),t.createIndex("timestamp","timestamp",{unique:!1})}_upgradeDbAndDeleteOldDbs(e){this._upgradeDb(e),this._cacheName&&me(this._cacheName)}async setTimestamp(e,t){e=je(e);let s={id:this._getId(e),cacheName:this._cacheName,url:e,timestamp:t},r=(await this.getDb()).transaction($,"readwrite",{durability:"relaxed"});await r.store.put(s),await r.done}async getTimestamp(e){return(await(await this.getDb()).get($,this._getId(e)))?.timestamp}async expireEntries(e,t){let s=await(await this.getDb()).transaction($,"readwrite").store.index("timestamp").openCursor(null,"prev"),r=[],n=0;for(;s;){let a=s.value;a.cacheName===this._cacheName&&(e&&a.timestamp=t?(s.delete(),r.push(a.url)):n++),s=await s.continue()}return r}async getDb(){return this._db||(this._db=await P(pt,1,{upgrade:this._upgradeDbAndDeleteOldDbs.bind(this)})),this._db}},ft=class{_isRunning=!1;_rerunRequested=!1;_maxEntries;_maxAgeSeconds;_matchOptions;_cacheName;_timestampModel;constructor(e,t={}){this._maxEntries=t.maxEntries,this._maxAgeSeconds=t.maxAgeSeconds,this._matchOptions=t.matchOptions,this._cacheName=e,this._timestampModel=new gt(e)}async expireEntries(){if(this._isRunning){this._rerunRequested=!0;return}this._isRunning=!0;let e=this._maxAgeSeconds?Date.now()-this._maxAgeSeconds*1e3:0,t=await this._timestampModel.expireEntries(e,this._maxEntries),s=await self.caches.open(this._cacheName);for(let r of t)await s.delete(r,this._matchOptions);this._isRunning=!1,this._rerunRequested&&(this._rerunRequested=!1,this.expireEntries())}async updateTimestamp(e){await this._timestampModel.setTimestamp(e,Date.now())}async isURLExpired(e){if(!this._maxAgeSeconds)return!1;let t=await this._timestampModel.getTimestamp(e),s=Date.now()-this._maxAgeSeconds*1e3;return t!==void 0?t{F.add(e)},h=class{_config;_cacheExpirations;constructor(e={}){this._config=e,this._cacheExpirations=new Map,this._config.maxAgeFrom||(this._config.maxAgeFrom="last-fetched"),this._config.purgeOnQuotaError&&mt(()=>this.deleteCacheAndMetadata())}_getCacheExpiration(e){if(e===N.getRuntimeName())throw new l("expire-custom-caches-only");let t=this._cacheExpirations.get(e);return t||(t=new ft(e,this._config),this._cacheExpirations.set(e,t)),t}cachedResponseWillBeUsed({event:e,cacheName:t,request:s,cachedResponse:r}){if(!r)return null;let n=this._isResponseDateFresh(r),a=this._getCacheExpiration(t),o=this._config.maxAgeFrom==="last-used",i=(async()=>{o&&await a.updateTimestamp(s.url),await a.expireEntries()})();try{e.waitUntil(i)}catch{}return n?r:null}_isResponseDateFresh(e){if(this._config.maxAgeFrom==="last-used")return!0;let t=Date.now();if(!this._config.maxAgeSeconds)return!0;let s=this._getDateHeaderTimestamp(e);return s===null?!0:s>=t-this._config.maxAgeSeconds*1e3}_getDateHeaderTimestamp(e){if(!e.headers.has("date"))return null;let t=e.headers.get("date"),s=new Date(t).getTime();return Number.isNaN(s)?null:s}async cacheDidUpdate({cacheName:e,request:t}){let s=this._getCacheExpiration(e);await s.updateTimestamp(t.url),await s.expireEntries()}async deleteCacheAndMetadata(){for(let[e,t]of this._cacheExpirations)await self.caches.delete(e),await t.delete();this._cacheExpirations=new Map}},wt="serwist-google-analytics",yt=2880,Nt=/^\/(\w+\/)?collect/,Et=e=>async({queue:t})=>{let s;for(;s=await t.shiftRequest();){let{request:r,timestamp:n}=s,a=new URL(r.url);try{let o=r.method==="POST"?new URLSearchParams(await r.clone().text()):a.searchParams,i=n-(Number(o.get("qt"))||0),c=Date.now()-i;if(o.set("qt",String(c)),e.parameterOverrides)for(let u of Object.keys(e.parameterOverrides)){let d=e.parameterOverrides[u];o.set(u,d)}typeof e.hitFilter=="function"&&e.hitFilter.call(null,o),await fetch(new Request(a.origin+a.pathname,{body:o.toString(),method:"POST",mode:"cors",credentials:"omit",headers:{"Content-Type":"text/plain"}}))}catch(o){throw await t.unshiftRequest(s),o}}},_t=e=>{let t=({url:r})=>r.hostname==="www.google-analytics.com"&&Nt.test(r.pathname),s=new R({plugins:[e]});return[new g(t,s,"GET"),new g(t,s,"POST")]},vt=e=>{let t=({url:s})=>s.hostname==="www.google-analytics.com"&&s.pathname==="/analytics.js";return new g(t,new p({cacheName:e}),"GET")},xt=e=>{let t=({url:s})=>s.hostname==="www.googletagmanager.com"&&s.pathname==="/gtag/js";return new g(t,new p({cacheName:e}),"GET")},bt=e=>{let t=({url:s})=>s.hostname==="www.googletagmanager.com"&&s.pathname==="/gtm.js";return new g(t,new p({cacheName:e}),"GET")},Le=({serwist:e,cacheName:t,...s})=>{let r=N.getGoogleAnalyticsName(t),n=new Re(wt,{maxRetentionTime:yt,onSync:Et(s)}),a=[bt(r),vt(r),xt(r),..._t(n)];for(let o of a)e.registerRoute(o)},Rt=class{_fallbackUrls;_serwist;constructor({fallbackUrls:e,serwist:t}){this._fallbackUrls=e,this._serwist=t}async handlerDidError(e){for(let t of this._fallbackUrls)if(typeof t=="string"){let s=await this._serwist.matchPrecache(t);if(s!==void 0)return s}else if(t.matcher(e)){let s=await this._serwist.matchPrecache(t.url);if(s!==void 0)return s}}},kt=(e,t,s)=>{let r=e.size;if(s&&s>r||t&&t<0)throw new l("range-not-satisfiable",{size:r,end:s,start:t});let n,a;return t!==void 0&&s!==void 0?(n=t,a=s+1):t!==void 0&&s===void 0?(n=t,a=r):s!==void 0&&t===void 0&&(n=r-s,a=r),{start:n,end:a}},St=e=>{let t=e.trim().toLowerCase();if(!t.startsWith("bytes="))throw new l("unit-must-be-bytes",{normalizedRangeHeader:t});if(t.includes(","))throw new l("single-range-only",{normalizedRangeHeader:t});let s=/(\d*)-(\d*)/.exec(t);if(!s||!(s[1]||s[2]))throw new l("invalid-range-values",{normalizedRangeHeader:t});return{start:s[1]===""?void 0:Number(s[1]),end:s[2]===""?void 0:Number(s[2])}},Dt=async(e,t)=>{try{if(t.status===206)return t;let s=e.headers.get("range");if(!s)throw new l("no-range-header");let r=St(s),n=await t.blob(),a=kt(n,r.start,r.end),o=n.slice(a.start,a.end),i=o.size,c=new Response(o,{status:206,statusText:"Partial Content",headers:t.headers});return c.headers.set("Content-Length",String(i)),c.headers.set("Content-Range",`bytes ${a.start}-${a.end-1}/${n.size}`),c}catch{return new Response("",{status:416,statusText:"Range Not Satisfiable"})}},Z=class{cachedResponseWillBeUsed=async({request:e,cachedResponse:t})=>t&&e.headers.has("range")?await Dt(e,t):t},A=class extends b{async _handle(e,t){let s=[],r=await t.cacheMatch(e),n;if(!r)try{r=await t.fetchAndCachePut(e)}catch(a){a instanceof Error&&(n=a)}if(!r)throw new l("no-response",{url:e.url,error:n});return r}};var k=class extends b{constructor(e={}){super(e),this.plugins.some(t=>"cacheWillUpdate"in t)||this.plugins.unshift(X)}async _handle(e,t){let s=[],r=t.fetchAndCachePut(e).catch(()=>{});t.waitUntil(r);let n=await t.cacheMatch(e),a;if(!n)try{n=await r}catch(o){o instanceof Error&&(a=o)}if(!n)throw new l("no-response",{url:e.url,error:a});return n}},qt=class extends g{constructor(e,t){let s=({request:r})=>{let n=e.getUrlsToPrecacheKeys();for(let a of Ce(r.url,t)){let o=n.get(a);if(o)return{cacheKey:o,integrity:e.getIntegrityForPrecacheKey(o)}}};super(s,e.precacheStrategy)}},Tt=class{_precacheController;constructor({precacheController:e}){this._precacheController=e}cacheKeyWillBeUsed=async({request:e,params:t})=>{let s=t?.cacheKey||this._precacheController.getPrecacheKeyForUrl(e.url);return s?new Request(s,{headers:e.headers}):e}},Ct=(e,t={})=>{let{cacheName:s,plugins:r=[],fetchOptions:n,matchOptions:a,fallbackToNetwork:o,directoryIndex:i,ignoreURLParametersMatching:c,cleanURLs:u,urlManipulation:d,cleanupOutdatedCaches:m,concurrency:x=10,navigateFallback:I,navigateFallbackAllowlist:_,navigateFallbackDenylist:f}=t??{};return{precacheStrategyOptions:{cacheName:N.getPrecacheName(s),plugins:[...r,new Tt({precacheController:e})],fetchOptions:n,matchOptions:a,fallbackToNetwork:o},precacheRouteOptions:{directoryIndex:i,ignoreURLParametersMatching:c,cleanURLs:u,urlManipulation:d},precacheMiscOptions:{cleanupOutdatedCaches:m,concurrency:x,navigateFallback:I,navigateFallbackAllowlist:_,navigateFallbackDenylist:f}}},Fe=class{_urlsToCacheKeys=new Map;_urlsToCacheModes=new Map;_cacheKeysToIntegrities=new Map;_concurrentPrecaching;_precacheStrategy;_routes;_defaultHandlerMap;_catchHandler;_requestRules;constructor({precacheEntries:e,precacheOptions:t,skipWaiting:s=!1,importScripts:r,navigationPreload:n=!1,cacheId:a,clientsClaim:o=!1,runtimeCaching:i,offlineAnalyticsConfig:c,disableDevLogs:u=!1,fallbacks:d,requestRules:m}={}){let{precacheStrategyOptions:x,precacheRouteOptions:I,precacheMiscOptions:_}=Ct(this,t);if(this._concurrentPrecaching=_.concurrency,this._precacheStrategy=new Se(x),this._routes=new Map,this._defaultHandlerMap=new Map,this._requestRules=m,this.handleInstall=this.handleInstall.bind(this),this.handleActivate=this.handleActivate.bind(this),this.handleFetch=this.handleFetch.bind(this),this.handleCache=this.handleCache.bind(this),r&&r.length>0&&self.importScripts(...r),n&&Te(),a!==void 0&&Oe({prefix:a}),s?self.skipWaiting():self.addEventListener("message",f=>{f.data&&f.data.type==="SKIP_WAITING"&&self.skipWaiting()}),o&&le(),e&&e.length>0&&this.addToPrecacheList(e),_.cleanupOutdatedCaches&&ce(x.cacheName),this.registerRoute(new qt(this,I)),_.navigateFallback&&this.registerRoute(new De(this.createHandlerBoundToUrl(_.navigateFallback),{allowlist:_.navigateFallbackAllowlist,denylist:_.navigateFallbackDenylist})),c!==void 0&&(typeof c=="boolean"?c&&Le({serwist:this}):Le({...c,serwist:this})),i!==void 0){if(d!==void 0){let f=new Rt({fallbackUrls:d.entries,serwist:this});i.forEach(j=>{j.handler instanceof b&&!j.handler.plugins.some(Be=>"handlerDidError"in Be)&&j.handler.plugins.push(f)})}for(let f of i)this.registerCapture(f.matcher,f.handler,f.method)}u&&ve()}get precacheStrategy(){return this._precacheStrategy}get routes(){return this._routes}addEventListeners(){self.addEventListener("install",this.handleInstall),self.addEventListener("activate",this.handleActivate),self.addEventListener("fetch",this.handleFetch),self.addEventListener("message",this.handleCache)}addToPrecacheList(e){let t=[];for(let s of e){typeof s=="string"?t.push(s):s&&!s.integrity&&s.revision===void 0&&t.push(s.url);let{cacheKey:r,url:n}=Pe(s),a=typeof s!="string"&&s.revision?"reload":"default";if(this._urlsToCacheKeys.has(n)&&this._urlsToCacheKeys.get(n)!==r)throw new l("add-to-cache-list-conflicting-entries",{firstEntry:this._urlsToCacheKeys.get(n),secondEntry:r});if(typeof s!="string"&&s.integrity){if(this._cacheKeysToIntegrities.has(r)&&this._cacheKeysToIntegrities.get(r)!==s.integrity)throw new l("add-to-cache-list-conflicting-integrities",{url:n});this._cacheKeysToIntegrities.set(r,s.integrity)}this._urlsToCacheKeys.set(n,r),this._urlsToCacheModes.set(n,a)}if(t.length>0){let s=`Serwist is precaching URLs without revision info: ${t.join(", ")} This is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(s)}}handleInstall(e){return this.registerRequestRules(e),V(e,async()=>{let t=new Ue;this.precacheStrategy.plugins.push(t),await Ie(this._concurrentPrecaching,Array.from(this._urlsToCacheKeys.entries()),async([n,a])=>{let o=this._cacheKeysToIntegrities.get(a),i=this._urlsToCacheModes.get(n),c=new Request(n,{integrity:o,cache:i,credentials:"same-origin"});await Promise.all(this.precacheStrategy.handleAll({event:e,request:c,url:new URL(c.url),params:{cacheKey:a}}))});let{updatedURLs:s,notUpdatedURLs:r}=t;return{updatedURLs:s,notUpdatedURLs:r}})}async registerRequestRules(e){if(this._requestRules&&e?.addRoutes)try{await e.addRoutes(this._requestRules),this._requestRules=void 0}catch(t){throw t}}handleActivate(e){return V(e,async()=>{let t=await self.caches.open(this.precacheStrategy.cacheName),s=await t.keys(),r=new Set(this._urlsToCacheKeys.values()),n=[];for(let a of s)r.has(a.url)||(await t.delete(a),n.push(a.url));return{deletedCacheRequests:n}})}handleFetch(e){let{request:t}=e,s=this.handleRequest({request:t,event:e});s&&e.respondWith(s)}handleCache(e){if(e.data&&e.data.type==="CACHE_URLS"){let{payload:t}=e.data,s=Promise.all(t.urlsToCache.map(r=>{let n;return typeof r=="string"?n=new Request(r):n=new Request(...r),this.handleRequest({request:n,event:e})}));e.waitUntil(s),e.ports?.[0]&&s.then(()=>e.ports[0].postMessage(!0))}}setDefaultHandler(e,t="GET"){this._defaultHandlerMap.set(t,C(e))}setCatchHandler(e){this._catchHandler=C(e)}registerCapture(e,t,s){let r=$e(e,t,s);return this.registerRoute(r),r}registerRoute(e){this._routes.has(e.method)||this._routes.set(e.method,[]),this._routes.get(e.method).push(e)}unregisterRoute(e){if(!this._routes.has(e.method))throw new l("unregister-route-but-not-found-with-method",{method:e.method});let t=this._routes.get(e.method).indexOf(e);if(t>-1)this._routes.get(e.method).splice(t,1);else throw new l("unregister-route-route-not-registered")}getUrlsToPrecacheKeys(){return this._urlsToCacheKeys}getPrecachedUrls(){return[...this._urlsToCacheKeys.keys()]}getPrecacheKeyForUrl(e){let t=new URL(e,location.href);return this._urlsToCacheKeys.get(t.href)}getIntegrityForPrecacheKey(e){return this._cacheKeysToIntegrities.get(e)}async matchPrecache(e){let t=e instanceof Request?e.url:e,s=this.getPrecacheKeyForUrl(t);if(s)return(await self.caches.open(this.precacheStrategy.cacheName)).match(s)}createHandlerBoundToUrl(e){let t=this.getPrecacheKeyForUrl(e);if(!t)throw new l("non-precached-url",{url:e});return s=>(s.request=new Request(e),s.params={cacheKey:t,...s.params},this.precacheStrategy.handle(s))}handleRequest({request:e,event:t}){let s=new URL(e.url,location.href);if(!s.protocol.startsWith("http"))return;let r=s.origin===location.origin,{params:n,route:a}=this.findMatchingRoute({event:t,request:e,sameOrigin:r,url:s}),o=a?.handler,i=[],c=e.method;if(!o&&this._defaultHandlerMap.has(c)&&(o=this._defaultHandlerMap.get(c)),!o)return;let u;try{u=o.handle({url:s,request:e,event:t,params:n})}catch(m){u=Promise.reject(m)}let d=a?.catchHandler;return u instanceof Promise&&(this._catchHandler||d)&&(u=u.catch(async m=>{if(d)try{return await d.handle({url:s,request:e,event:t,params:n})}catch(x){x instanceof Error&&(m=x)}if(this._catchHandler)return this._catchHandler.handle({url:s,request:e,event:t});throw m})),u}findMatchingRoute({url:e,sameOrigin:t,request:s,event:r}){let n=this._routes.get(s.method)||[];for(let a of n){let o,i=a.match({url:e,sameOrigin:t,request:s,event:r});if(i)return o=i,(Array.isArray(o)&&o.length===0||i.constructor===Object&&Object.keys(i).length===0||typeof i=="boolean")&&(o=void 0),{route:a,params:o}}return{}}};var ee={rscPrefetch:"pages-rsc-prefetch",rsc:"pages-rsc",html:"pages"},Ve=[{matcher:/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,handler:new A({cacheName:"google-fonts-webfonts",plugins:[new h({maxEntries:4,maxAgeSeconds:365*24*60*60,maxAgeFrom:"last-used"})]})},{matcher:/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,handler:new k({cacheName:"google-fonts-stylesheets",plugins:[new h({maxEntries:4,maxAgeSeconds:10080*60,maxAgeFrom:"last-used"})]})},{matcher:/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,handler:new k({cacheName:"static-font-assets",plugins:[new h({maxEntries:4,maxAgeSeconds:10080*60,maxAgeFrom:"last-used"})]})},{matcher:/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,handler:new k({cacheName:"static-image-assets",plugins:[new h({maxEntries:64,maxAgeSeconds:720*60*60,maxAgeFrom:"last-used"})]})},{matcher:/\/_next\/static.+\.js$/i,handler:new A({cacheName:"next-static-js-assets",plugins:[new h({maxEntries:64,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})]})},{matcher:/\/_next\/image\?url=.+$/i,handler:new k({cacheName:"next-image",plugins:[new h({maxEntries:64,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})]})},{matcher:/\.(?:mp3|wav|ogg)$/i,handler:new A({cacheName:"static-audio-assets",plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"}),new Z]})},{matcher:/\.(?:mp4|webm)$/i,handler:new A({cacheName:"static-video-assets",plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"}),new Z]})},{matcher:/\.(?:js)$/i,handler:new k({cacheName:"static-js-assets",plugins:[new h({maxEntries:48,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})]})},{matcher:/\.(?:css|less)$/i,handler:new k({cacheName:"static-style-assets",plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})]})},{matcher:/\/_next\/data\/.+\/.+\.json$/i,handler:new p({cacheName:"next-data",plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})]})},{matcher:/\.(?:json|xml|csv)$/i,handler:new p({cacheName:"static-data-assets",plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})]})},{matcher:/\/api\/auth\/.*/,handler:new R({networkTimeoutSeconds:10})},{matcher:({sameOrigin:e,url:{pathname:t}})=>e&&t.startsWith("/api/"),method:"GET",handler:new p({cacheName:"apis",plugins:[new h({maxEntries:16,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})],networkTimeoutSeconds:10})},{matcher:({request:e,url:{pathname:t},sameOrigin:s})=>e.headers.get("RSC")==="1"&&e.headers.get("Next-Router-Prefetch")==="1"&&s&&!t.startsWith("/api/"),handler:new p({cacheName:ee.rscPrefetch,plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60})]})},{matcher:({request:e,url:{pathname:t},sameOrigin:s})=>e.headers.get("RSC")==="1"&&s&&!t.startsWith("/api/"),handler:new p({cacheName:ee.rsc,plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60})]})},{matcher:({request:e,url:{pathname:t},sameOrigin:s})=>e.headers.get("Content-Type")?.includes("text/html")&&s&&!t.startsWith("/api/"),handler:new p({cacheName:ee.html,plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60})]})},{matcher:({url:{pathname:e},sameOrigin:t})=>t&&!e.startsWith("/api/"),handler:new p({cacheName:"others",plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60})]})},{matcher:({sameOrigin:e})=>!e,handler:new p({cacheName:"cross-origin",plugins:[new h({maxEntries:32,maxAgeSeconds:3600})],networkTimeoutSeconds:10})},{matcher:/.*/i,method:"GET",handler:new R}];var Me="/offline.html",At=["/api/","/auth/"],te=new Fe({precacheEntries:w,skipWaiting:!0,clientsClaim:!0,navigationPreload:!1,runtimeCaching:[{matcher({request:e,sameOrigin:t,url:s}){return t?e.method!=="GET"||e.headers.has("Authorization")?!0:At.some(r=>s.pathname.startsWith(r)):!1},handler:new R},...Ve]}),Ot=async()=>{let e=await te.matchPrecache(Me);return e||caches.match(Me,{ignoreSearch:!0})};te.setCatchHandler(async({request:e})=>{if(e.mode==="navigate"||e.destination==="document"){let t=await Ot();if(t)return t}return Response.error()});te.addEventListeners(); From bf4e4a83a55686c370ee1c1d079e6646b693192a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tymon=20J=C4=99dryczka?= Date: Sun, 24 May 2026 17:15:44 +0200 Subject: [PATCH 4/7] fix: linter errors --- serwist.config.js | 2 +- src/components/pwa-install-alert.tsx | 4 ++-- src/components/pwa-install-prompt.tsx | 16 ++++++++-------- src/hooks/use-is-pwa-install-target.ts | 13 ++++++++++++- src/lib/pwa/device.ts | 16 +++++++++++----- src/sw-env.d.ts | 2 -- src/sw.ts | 4 ++-- 7 files changed, 36 insertions(+), 21 deletions(-) diff --git a/serwist.config.js b/serwist.config.js index 95bee323..4a797e2c 100644 --- a/serwist.config.js +++ b/serwist.config.js @@ -6,7 +6,7 @@ const offlineRevision = createHash("md5") .update(readFileSync("public/offline.html", "utf8")) .digest("hex"); -export default serwist({ +export const serwistConfig = serwist({ swSrc: "src/sw.ts", swDest: "public/sw.js", // public/*.html is mapped to /public/* by Serwist manifestTransforms (404). diff --git a/src/components/pwa-install-alert.tsx b/src/components/pwa-install-alert.tsx index 4d5565b0..68271610 100644 --- a/src/components/pwa-install-alert.tsx +++ b/src/components/pwa-install-alert.tsx @@ -23,8 +23,8 @@ export function PwaInstallAlert() { const [isDismissed, setIsDismissed] = useState(readIsDismissed); const isInstallTarget = useIsPwaInstallTarget(); const isStandalone = useIsStandalone(); - const searchParams = useSearchParams(); - const forceInstall = searchParams.get("install") === "true"; + const searchParameters = useSearchParams(); + const forceInstall = searchParameters.get("install") === "true"; const handleDismiss = () => { localStorage.setItem(PWA_INSTALL_ALERT_DISMISSED_KEY, "true"); diff --git a/src/components/pwa-install-prompt.tsx b/src/components/pwa-install-prompt.tsx index 49b12414..e76ddcdf 100644 --- a/src/components/pwa-install-prompt.tsx +++ b/src/components/pwa-install-prompt.tsx @@ -45,7 +45,7 @@ export function PwaInstallPrompt({ const installTriggered = useRef(false); const router = useRouter(); const pathname = usePathname(); - const searchParams = useSearchParams(); + const searchParameters = useSearchParams(); const isStandalone = useIsStandalone(); const [platform, setPlatform] = useState { - if (searchParams.get("install") === "true") { + if (searchParameters.get("install") === "true") { router.replace(pathname); } - }, [pathname, router, searchParams]); + }, [pathname, router, searchParameters]); const handleInstallClick = useCallback(async () => { if (isStandalone) { return; } - if (installPromptEvent) { + if (installPromptEvent !== null) { await installPromptEvent.prompt(); clearInstallQuery(); return; @@ -108,14 +108,14 @@ export function PwaInstallPrompt({ useEffect(() => { if ( - searchParams.get("install") === "true" && + searchParameters.get("install") === "true" && !installTriggered.current && (installPromptEvent !== null || isIos || isMacSafari) ) { setIsAutoInstallModalOpen(true); installTriggered.current = true; } - }, [installPromptEvent, isIos, isMacSafari, searchParams]); + }, [installPromptEvent, isIos, isMacSafari, searchParameters]); const iosInstructions = (
    @@ -202,7 +202,7 @@ export function PwaInstallPrompt({ - {(isIos || isMacSafari) && ( + {isIos || isMacSafari ? ( { @@ -226,7 +226,7 @@ export function PwaInstallPrompt({ - )} + ) : null} { + // No-op unsubscribe function required by subscribeMobileUa +}; + +const subscribeMobileUa = (_callback: () => void) => { + // User agent string does not change at runtime + return noopUnsubscribe; +}; + function subscribeViewport(callback: () => void) { const mediaQuery = window.matchMedia(MOBILE_VIEWPORT_QUERY); mediaQuery.addEventListener("change", callback); @@ -24,8 +34,9 @@ export function useIsPwaInstallTarget() { getViewportSnapshot, () => false, ); + const isMobileUa = useSyncExternalStore( - () => () => {}, + subscribeMobileUa, isMobileUserAgent, () => false, ); diff --git a/src/lib/pwa/device.ts b/src/lib/pwa/device.ts index 1978518b..ae348cca 100644 --- a/src/lib/pwa/device.ts +++ b/src/lib/pwa/device.ts @@ -9,10 +9,16 @@ export function isIosDevice(): boolean { return false; } - return ( - /iPad|iPhone|iPod/.test(navigator.userAgent) || - (navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1) - ); + // Primary check for iOS devices + if (/iPad|iPhone|iPod/.test(navigator.userAgent)) { + return true; + } + + // Modern iPadOS (as of iOS 13+) may present as Mac, so we infer by touch support and user agent + const isMacIntelWithTouch = + navigator.userAgent.includes("Macintosh") && navigator.maxTouchPoints > 1; + + return isMacIntelWithTouch; } export function isMobileUserAgent(): boolean { @@ -29,7 +35,7 @@ export function getPwaPlatform(): PwaPlatform { } const isIos = isIosDevice(); - const isMac = /Macintosh/.test(navigator.userAgent); + const isMac = navigator.userAgent.includes("Macintosh"); const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); const isAndroid = /Android/i.test(navigator.userAgent); diff --git a/src/sw-env.d.ts b/src/sw-env.d.ts index 6384da39..e2d1bb99 100644 --- a/src/sw-env.d.ts +++ b/src/sw-env.d.ts @@ -1,3 +1 @@ /// - -export {}; diff --git a/src/sw.ts b/src/sw.ts index 83333b0c..2144ba75 100644 --- a/src/sw.ts +++ b/src/sw.ts @@ -44,7 +44,7 @@ const serwist = new Serwist({ const getOfflineResponse = async () => { const fromPrecache = await serwist.matchPrecache(OFFLINE_URL); - if (fromPrecache) { + if (fromPrecache != null) { return fromPrecache; } return caches.match(OFFLINE_URL, { ignoreSearch: true }); @@ -53,7 +53,7 @@ const getOfflineResponse = async () => { serwist.setCatchHandler(async ({ request }) => { if (request.mode === "navigate" || request.destination === "document") { const offlinePage = await getOfflineResponse(); - if (offlinePage) { + if (offlinePage != null) { return offlinePage; } } From 7d6d22826dbe906e25c7231306029548e2475461 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tymon=20J=C4=99dryczka?= Date: Sun, 24 May 2026 17:22:36 +0200 Subject: [PATCH 5/7] fix: linter errors --- eslint.config.js | 41 +++++++++++++++++++++++++---------------- public/sw.js | 4 ++-- serwist.config.js | 3 +-- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index 0df745e9..c163b0b7 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,19 +1,28 @@ import { solvro } from "@solvro/config/eslint"; -export default await solvro({ - rules: { - "react-refresh/only-export-components": [ - "warn", - { - allowExportNames: [ - "metadata", - "generateMetadata", - "viewport", - "size", - "contentType", - ], - }, - ], - "react/no-unknown-property": ["error", { ignore: ["tw"] }], +export default await solvro( + { + rules: { + "react-refresh/only-export-components": [ + "warn", + { + allowExportNames: [ + "metadata", + "generateMetadata", + "viewport", + "size", + "contentType", + ], + }, + ], + "react/no-unknown-property": ["error", { ignore: ["tw"] }], + }, }, -}); + { + files: ["serwist.config.js"], + rules: { + // @serwist/cli loads config via default export — named export breaks the build. + "import/no-default-export": "off", + }, + }, +); diff --git a/public/sw.js b/public/sw.js index 5921aa64..06ad40b8 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1,2 +1,2 @@ -var w=[{revision:null,url:"/_next/static/media/opengraph-image.06uic5ht6.aff.png"},{revision:null,url:"/_next/static/media/logo.0wd2e_f.v-49o.svg"},{revision:null,url:"/_next/static/media/logo-dark.0_55--v62s08b.svg"},{revision:null,url:"/_next/static/media/favicon.0zsj~n962g272.ico"},{revision:null,url:"/_next/static/l0iKdMw8X290IfMFcxkTi/_ssgManifest.js"},{revision:null,url:"/_next/static/l0iKdMw8X290IfMFcxkTi/_clientMiddlewareManifest.js"},{revision:null,url:"/_next/static/l0iKdMw8X290IfMFcxkTi/_buildManifest.js"},{revision:null,url:"/_next/static/chunks/turbopack-0hxh7ku~ztpa6.js"},{revision:null,url:"/_next/static/chunks/172ivk05m2bo8.js"},{revision:null,url:"/_next/static/chunks/16rb85u~rg37f.js"},{revision:null,url:"/_next/static/chunks/14u0pvu28enmo.js"},{revision:null,url:"/_next/static/chunks/145o.lsi86g0w.css"},{revision:null,url:"/_next/static/chunks/13p-eg31hy4r9.js"},{revision:null,url:"/_next/static/chunks/1352oh6y39x4s.js"},{revision:null,url:"/_next/static/chunks/12_331qljvpz..js"},{revision:null,url:"/_next/static/chunks/123z3_c0bz0p9.js"},{revision:null,url:"/_next/static/chunks/11bfq3-h3gy4c.js"},{revision:null,url:"/_next/static/chunks/118a504enpyzu.js"},{revision:null,url:"/_next/static/chunks/10y.pwmxjjjqk.js"},{revision:null,url:"/_next/static/chunks/104l0fvx54wj-.js"},{revision:null,url:"/_next/static/chunks/0z~0882382gvy.js"},{revision:null,url:"/_next/static/chunks/0z97~83vjqptg.js"},{revision:null,url:"/_next/static/chunks/0y2l0xgouorae.css"},{revision:null,url:"/_next/static/chunks/0x9tlntlqq_d9.js"},{revision:null,url:"/_next/static/chunks/0wxb0ru_ff026.js"},{revision:null,url:"/_next/static/chunks/0wpa4ig.eotgk.js"},{revision:null,url:"/_next/static/chunks/0wooikl-ul2kd.js"},{revision:null,url:"/_next/static/chunks/0w_ca~l54g3fw.js"},{revision:null,url:"/_next/static/chunks/0v072dnk0fh1m.js"},{revision:null,url:"/_next/static/chunks/0uz4ru71rhm2b.js"},{revision:null,url:"/_next/static/chunks/0uds2c0vioouv.js"},{revision:null,url:"/_next/static/chunks/0u5h4hlrg0y8x.js"},{revision:null,url:"/_next/static/chunks/0typ-cp5k1ls6.js"},{revision:null,url:"/_next/static/chunks/0tps_-qpifszc.js"},{revision:null,url:"/_next/static/chunks/0qc.7mj._qrn1.css"},{revision:null,url:"/_next/static/chunks/0ow8x71uqegil.js"},{revision:null,url:"/_next/static/chunks/0nj7_0z86yzc8.js"},{revision:null,url:"/_next/static/chunks/0n_bnncmioiff.js"},{revision:null,url:"/_next/static/chunks/0n7w3rz3jt5hr.js"},{revision:null,url:"/_next/static/chunks/0n3ru1lp60s6l.css"},{revision:null,url:"/_next/static/chunks/0n02rcnt.xtjk.js"},{revision:null,url:"/_next/static/chunks/0mvw90h4_8bta.js"},{revision:null,url:"/_next/static/chunks/0mcgx~9nkb0-b.js"},{revision:null,url:"/_next/static/chunks/0k.m8w.7-a3xc.js"},{revision:null,url:"/_next/static/chunks/0jvjj2m6w3twt.js"},{revision:null,url:"/_next/static/chunks/0iet4xty.keb1.js"},{revision:null,url:"/_next/static/chunks/0i-112x7.uz1s.js"},{revision:null,url:"/_next/static/chunks/0hr2pnmeaaxa6.js"},{revision:null,url:"/_next/static/chunks/0h9pbatd_byvf.js"},{revision:null,url:"/_next/static/chunks/0h8-~mdn8_0en.js"},{revision:null,url:"/_next/static/chunks/0ge9cv96.8gn-.js"},{revision:null,url:"/_next/static/chunks/0f8pc_tcays4j.js"},{revision:null,url:"/_next/static/chunks/0exn7tuj~0h7d.js"},{revision:null,url:"/_next/static/chunks/0eiutdzyk1u-s.js"},{revision:null,url:"/_next/static/chunks/0ed~h.87czbyq.js"},{revision:null,url:"/_next/static/chunks/0ed59gpsfl1ie.js"},{revision:null,url:"/_next/static/chunks/0d6mfypvpyrhq.js"},{revision:null,url:"/_next/static/chunks/0cw_ryqsp~q7c.js"},{revision:null,url:"/_next/static/chunks/0cfxgxhsf390n.js"},{revision:null,url:"/_next/static/chunks/0c1jedyjrx~bm.js"},{revision:null,url:"/_next/static/chunks/0c.2wnkm67pd~.js"},{revision:null,url:"/_next/static/chunks/0aswkgju_dw97.js"},{revision:null,url:"/_next/static/chunks/0a.kre0dvja43.js"},{revision:null,url:"/_next/static/chunks/0_9gorbp-p8dg.js"},{revision:null,url:"/_next/static/chunks/0_7s0.hv.kwyg.js"},{revision:null,url:"/_next/static/chunks/09xcbed_1xh5s.js"},{revision:null,url:"/_next/static/chunks/0989ksawcjb7~.js"},{revision:null,url:"/_next/static/chunks/092dlyyoi5qhe.js"},{revision:null,url:"/_next/static/chunks/07bha-9k3if-r.js"},{revision:null,url:"/_next/static/chunks/072dgox8prfm..js"},{revision:null,url:"/_next/static/chunks/06j4yvl06fyum.js"},{revision:null,url:"/_next/static/chunks/04gcxva48dgyd.js"},{revision:null,url:"/_next/static/chunks/03~yq9q893hmn.js"},{revision:null,url:"/_next/static/chunks/03o9w180mw2u4.js"},{revision:null,url:"/_next/static/chunks/033oyvauenvh8.js"},{revision:null,url:"/_next/static/chunks/00hyyb8mgibk1.js"},{revision:null,url:"/_next/static/chunks/00cyib-7p3-ay.js"},{revision:null,url:"/_next/static/chunks/0.s_0cx.5knjr.js"},{revision:null,url:"/_next/static/chunks/0.1go1yjh_33f.js"},{revision:null,url:"/_next/static/chunks/0-17qcfub5_tb.js"},{revision:"a0c506315efd4b8cf04cf7772e314248",url:"/solvro_mono.svg"},{revision:"415d9a545b0669f8399293a223f900ce",url:"/manifest.json"},{revision:"96933cc9517dbda7718eb0ccd146debf",url:"/icon-512.png"},{revision:"bd02d4a8132d37d4d81f307f99d0ddf8",url:"/icon-512-maskable.png"},{revision:"5cc689681d951eeaf7af6dd63d0658eb",url:"/icon-192.png"},{revision:"5aa2f65a080e13002b066c3c5563436f",url:"/icon-192-maskable.png"},{revision:"0ee5dfca21af7288f5b48c1e4cf59d91",url:"/favicon.svg"},{revision:"f2bc2ea7e0da5c43670c3c44232fec40",url:"/favicon-dark.svg"},{revision:"36b50630d6c0d82e0c3fc11a48a36611",url:"/apple-touch-icon.png"},{revision:"edc51dcf30745c34c2df5ebea40bdeb7",url:"/favicon/180x180.png"},{revision:"8d9b8ad559d71f09ac1c1b51068f98c2",url:"/banned-screen/mc-font.otf"},{revision:"e8a3307e5824d62b46878b5e7c99e979",url:"/banned-screen/dirt-background.webp"},{revision:"46518d07730b02b60fcd29aa950a4c04",url:"/offline"},{revision:"c6092feffed734936c09d24e63c257ca",url:"/offline.html"}];var y={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"serwist",runtime:"runtime",suffix:typeof registration<"u"?registration.scope:""},L=e=>[y.prefix,e,y.suffix].filter(t=>t&&t.length>0).join("-"),Ke=e=>{for(let t of Object.keys(y))e(t)},N={updateDetails:e=>{Ke(t=>{let s=e[t];typeof s=="string"&&(y[t]=s)})},getGoogleAnalyticsName:e=>e||L(y.googleAnalytics),getPrecacheName:e=>e||L(y.precache),getPrefix:()=>y.prefix,getRuntimeName:e=>e||L(y.runtime),getSuffix:()=>y.suffix},S;function re(){if(S===void 0){let e=new Response("");if("body"in e)try{new Response(e.body),S=!0}catch{S=!1}S=!1}return S}var He=(e,...t)=>{let s=e;return t.length>0&&(s+=` :: ${JSON.stringify(t)}`),s};var Ge=He,l=class extends Error{details;constructor(e,t){let s=Ge(e,t);super(s),this.name=e,this.details=t}};var ne=e=>new URL(String(e),location.href).href.replace(new RegExp(`^${location.origin}`),"");function D(e){return new Promise(t=>setTimeout(t,e))}var F=new Set;function se(e,t){let s=new URL(e);for(let r of t)s.searchParams.delete(r);return s.href}async function ae(e,t,s,r){let n=se(t.url,s);if(t.url===n)return e.match(t,r);let a={...r,ignoreSearch:!0},o=await e.keys(t,a);for(let i of o)if(n===se(i.url,s))return e.match(i,r)}var oe=class{promise;resolve;reject;constructor(){this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t})}},ie=async()=>{for(let e of F)await e()},ze="-precache-",Qe=async(e,t=ze)=>{let s=(await self.caches.keys()).filter(r=>r.includes(t)&&r.includes(self.registration.scope)&&r!==e);return await Promise.all(s.map(r=>self.caches.delete(r))),s},ce=e=>{self.addEventListener("activate",t=>{t.waitUntil(Qe(N.getPrecacheName(e)).then(s=>{}))})},le=()=>{self.addEventListener("activate",()=>self.clients.claim())},V=(e,t)=>{let s=t();return e.waitUntil(s),s};var W=(e,t)=>t.some(s=>e instanceof s),ue,he;function Je(){return ue||(ue=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])}function Ye(){return he||(he=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])}var K=new WeakMap,M=new WeakMap,O=new WeakMap;function Xe(e){let t=new Promise((s,r)=>{let n=()=>{e.removeEventListener("success",a),e.removeEventListener("error",o)},a=()=>{s(v(e.result)),n()},o=()=>{r(e.error),n()};e.addEventListener("success",a),e.addEventListener("error",o)});return O.set(t,e),t}function Ze(e){if(K.has(e))return;let t=new Promise((s,r)=>{let n=()=>{e.removeEventListener("complete",a),e.removeEventListener("error",o),e.removeEventListener("abort",o)},a=()=>{s(),n()},o=()=>{r(e.error||new DOMException("AbortError","AbortError")),n()};e.addEventListener("complete",a),e.addEventListener("error",o),e.addEventListener("abort",o)});K.set(e,t)}var H={get(e,t,s){if(e instanceof IDBTransaction){if(t==="done")return K.get(e);if(t==="store")return s.objectStoreNames[1]?void 0:s.objectStore(s.objectStoreNames[0])}return v(e[t])},set(e,t,s){return e[t]=s,!0},has(e,t){return e instanceof IDBTransaction&&(t==="done"||t==="store")?!0:t in e}};function fe(e){H=e(H)}function et(e){return Ye().includes(e)?function(...t){return e.apply(G(this),t),v(this.request)}:function(...t){return v(e.apply(G(this),t))}}function tt(e){return typeof e=="function"?et(e):(e instanceof IDBTransaction&&Ze(e),W(e,Je())?new Proxy(e,H):e)}function v(e){if(e instanceof IDBRequest)return Xe(e);if(M.has(e))return M.get(e);let t=tt(e);return t!==e&&(M.set(e,t),O.set(t,e)),t}var G=e=>O.get(e);function P(e,t,{blocked:s,upgrade:r,blocking:n,terminated:a}={}){let o=indexedDB.open(e,t),i=v(o);return r&&o.addEventListener("upgradeneeded",c=>{r(v(o.result),c.oldVersion,c.newVersion,v(o.transaction),c)}),s&&o.addEventListener("blocked",c=>s(c.oldVersion,c.newVersion,c)),i.then(c=>{a&&c.addEventListener("close",()=>a()),n&&c.addEventListener("versionchange",u=>n(u.oldVersion,u.newVersion,u))}).catch(()=>{}),i}function me(e,{blocked:t}={}){let s=indexedDB.deleteDatabase(e);return t&&s.addEventListener("blocked",r=>t(r.oldVersion,r)),v(s).then(()=>{})}var st=["get","getKey","getAll","getAllKeys","count"],rt=["put","add","delete","clear"],B=new Map;function de(e,t){if(!(e instanceof IDBDatabase&&!(t in e)&&typeof t=="string"))return;if(B.get(t))return B.get(t);let s=t.replace(/FromIndex$/,""),r=t!==s,n=rt.includes(s);if(!(s in(r?IDBIndex:IDBObjectStore).prototype)||!(n||st.includes(s)))return;let a=async function(o,...i){let c=this.transaction(o,n?"readwrite":"readonly"),u=c.store;return r&&(u=u.index(i.shift())),(await Promise.all([u[s](...i),n&&c.done]))[0]};return B.set(t,a),a}fe(e=>({...e,get:(t,s,r)=>de(t,s)||e.get(t,s,r),has:(t,s)=>!!de(t,s)||e.has(t,s)}));var nt=["continue","continuePrimaryKey","advance"],pe={},z=new WeakMap,we=new WeakMap,at={get(e,t){if(!nt.includes(t))return e[t];let s=pe[t];return s||(s=pe[t]=function(...r){z.set(this,we.get(this)[t](...r))}),s}};async function*ot(...e){let t=this;if(t instanceof IDBCursor||(t=await t.openCursor(...e)),!t)return;t=t;let s=new Proxy(t,at);for(we.set(s,t),O.set(s,G(t));t;)yield s,t=await(z.get(s)||t.continue()),z.delete(s)}function ge(e,t){return t===Symbol.asyncIterator&&W(e,[IDBIndex,IDBObjectStore,IDBCursor])||t==="iterate"&&W(e,[IDBIndex,IDBObjectStore])}fe(e=>({...e,get(t,s,r){return ge(t,s)?ot:e.get(t,s,r)},has(t,s){return ge(t,s)||e.has(t,s)}}));var _e=async(e,t)=>{let s=null;if(e.url&&(s=new URL(e.url).origin),s!==self.location.origin)throw new l("cross-origin-copy-response",{origin:s});let r=e.clone(),n={headers:new Headers(r.headers),status:r.status,statusText:r.statusText},a=t?t(n):n,o=re()?r.body:await r.blob();return new Response(o,a)},ve=()=>{self.__WB_DISABLE_DEV_LOGS=!0},ye=3,it="serwist-background-sync",E="requests",q="queueName",ct=class{_db=null;async addEntry(e){let t=(await this.getDb()).transaction(E,"readwrite",{durability:"relaxed"});await t.store.add(e),await t.done}async getFirstEntryId(){return(await(await this.getDb()).transaction(E).store.openCursor())?.value.id}async getAllEntriesByQueueName(e){let t=await(await this.getDb()).getAllFromIndex(E,q,IDBKeyRange.only(e));return t||[]}async getEntryCountByQueueName(e){return(await this.getDb()).countFromIndex(E,q,IDBKeyRange.only(e))}async deleteEntry(e){await(await this.getDb()).delete(E,e)}async getFirstEntryByQueueName(e){return await this.getEndEntryFromIndex(IDBKeyRange.only(e),"next")}async getLastEntryByQueueName(e){return await this.getEndEntryFromIndex(IDBKeyRange.only(e),"prev")}async getEndEntryFromIndex(e,t){return(await(await this.getDb()).transaction(E).store.index(q).openCursor(e,t))?.value}async getDb(){return this._db||(this._db=await P(it,ye,{upgrade:this._upgradeDb})),this._db}_upgradeDb(e,t){t>0&&t{s.headers[n]=r});for(let r of lt)t[r]!==void 0&&(s[r]=t[r]);return new J(s)}constructor(t){t.mode==="navigate"&&(t.mode="same-origin"),this._requestData=t}toObject(){let t=Object.assign({},this._requestData);return t.headers=Object.assign({},this._requestData.headers),t.body&&(t.body=t.body.slice(0)),t}toRequest(){return new Request(this._requestData.url,this._requestData)}clone(){return new J(this.toObject())}},Ne="serwist-background-sync",ut=1440*7,Q=new Set,Ee=e=>{let t={request:new Y(e.requestData).toRequest(),timestamp:e.timestamp};return e.metadata&&(t.metadata=e.metadata),t},be=class{_name;_onSync;_maxRetentionTime;_queueStore;_forceSyncFallback;_syncInProgress=!1;_requestsAddedDuringSync=!1;constructor(e,{forceSyncFallback:t,onSync:s,maxRetentionTime:r}={}){if(Q.has(e))throw new l("duplicate-queue-name",{name:e});Q.add(e),this._name=e,this._onSync=s||this.replayRequests,this._maxRetentionTime=r||ut,this._forceSyncFallback=!!t,this._queueStore=new xe(this._name),this._addSyncListener()}get name(){return this._name}async pushRequest(e){await this._addRequest(e,"push")}async unshiftRequest(e){await this._addRequest(e,"unshift")}async popRequest(){return this._removeRequest("pop")}async shiftRequest(){return this._removeRequest("shift")}async getAll(){let e=await this._queueStore.getAll(),t=Date.now(),s=[];for(let r of e){let n=this._maxRetentionTime*60*1e3;t-r.timestamp>n?await this._queueStore.deleteEntry(r.id):s.push(Ee(r))}return s}async size(){return await this._queueStore.size()}async _addRequest({request:e,metadata:t,timestamp:s=Date.now()},r){let n={requestData:(await Y.fromRequest(e.clone())).toObject(),timestamp:s};switch(t&&(n.metadata=t),r){case"push":await this._queueStore.pushEntry(n);break;case"unshift":await this._queueStore.unshiftEntry(n);break}this._syncInProgress?this._requestsAddedDuringSync=!0:await this.registerSync()}async _removeRequest(e){let t=Date.now(),s;switch(e){case"pop":s=await this._queueStore.popEntry();break;case"shift":s=await this._queueStore.shiftEntry();break}if(s){let r=this._maxRetentionTime*60*1e3;return t-s.timestamp>r?this._removeRequest(e):Ee(s)}}async replayRequests(){let e;for(;e=await this.shiftRequest();)try{await fetch(e.request.clone())}catch{throw await this.unshiftRequest(e),new l("queue-replay-failed",{name:this._name})}}async registerSync(){if("sync"in self.registration&&!this._forceSyncFallback)try{await self.registration.sync.register(`${Ne}:${this._name}`)}catch{}}_addSyncListener(){"sync"in self.registration&&!this._forceSyncFallback?self.addEventListener("sync",e=>{if(e.tag===`${Ne}:${this._name}`){let t=async()=>{this._syncInProgress=!0;let s;try{await this._onSync({queue:this})}catch(r){if(r instanceof Error)throw s=r,s}finally{this._requestsAddedDuringSync&&!(s&&!e.lastChance)&&await this.registerSync(),this._syncInProgress=!1,this._requestsAddedDuringSync=!1}};e.waitUntil(t())}}):this._onSync({queue:this})}static get _queueNames(){return Q}},Re=class{_queue;constructor(e,t){this._queue=new be(e,t)}async fetchDidFail({request:e}){await this._queue.pushRequest({request:e})}},X={cacheWillUpdate:async({response:e})=>e.status===200||e.status===0?e:null};function U(e){return typeof e=="string"?new Request(e):e}var ke=class{event;request;url;params;_cacheKeys={};_strategy;_handlerDeferred;_extendLifetimePromises;_plugins;_pluginStateMap;constructor(e,t){this.event=t.event,this.request=t.request,t.url&&(this.url=t.url,this.params=t.params),this._strategy=e,this._handlerDeferred=new oe,this._extendLifetimePromises=[],this._plugins=[...e.plugins],this._pluginStateMap=new Map;for(let s of this._plugins)this._pluginStateMap.set(s,{});this.event.waitUntil(this._handlerDeferred.promise)}async fetch(e){let{event:t}=this,s=U(e),r=await this.getPreloadResponse();if(r)return r;let n=this.hasCallback("fetchDidFail")?s.clone():null;try{for(let o of this.iterateCallbacks("requestWillFetch"))s=await o({request:s.clone(),event:t})}catch(o){if(o instanceof Error)throw new l("plugin-error-request-will-fetch",{thrownErrorMessage:o.message})}let a=s.clone();try{let o;o=await fetch(s,s.mode==="navigate"?void 0:this._strategy.fetchOptions);for(let i of this.iterateCallbacks("fetchDidSucceed"))o=await i({event:t,request:a,response:o});return o}catch(o){throw n&&await this.runCallbacks("fetchDidFail",{error:o,event:t,originalRequest:n.clone(),request:a.clone()}),o}}async fetchAndCachePut(e){let t=await this.fetch(e),s=t.clone();return this.waitUntil(this.cachePut(e,s)),t}async cacheMatch(e){let t=U(e),s,{cacheName:r,matchOptions:n}=this._strategy,a=await this.getCacheKey(t,"read"),o={...n,cacheName:r};s=await caches.match(a,o);for(let i of this.iterateCallbacks("cachedResponseWillBeUsed"))s=await i({cacheName:r,matchOptions:n,cachedResponse:s,request:a,event:this.event})||void 0;return s}async cachePut(e,t){let s=U(e);await D(0);let r=await this.getCacheKey(s,"write");if(!t)throw new l("cache-put-with-no-response",{url:ne(r.url)});let n=await this._ensureResponseSafeToCache(t);if(!n)return!1;let{cacheName:a,matchOptions:o}=this._strategy,i=await self.caches.open(a),c=this.hasCallback("cacheDidUpdate"),u=c?await ae(i,r.clone(),["__WB_REVISION__"],o):null;try{await i.put(r,c?n.clone():n)}catch(d){if(d instanceof Error)throw d.name==="QuotaExceededError"&&await ie(),d}for(let d of this.iterateCallbacks("cacheDidUpdate"))await d({cacheName:a,oldResponse:u,newResponse:n.clone(),request:r,event:this.event});return!0}async getCacheKey(e,t){let s=`${e.url} | ${t}`;if(!this._cacheKeys[s]){let r=e;for(let n of this.iterateCallbacks("cacheKeyWillBeUsed"))r=U(await n({mode:t,request:r,event:this.event,params:this.params}));this._cacheKeys[s]=r}return this._cacheKeys[s]}hasCallback(e){for(let t of this._strategy.plugins)if(e in t)return!0;return!1}async runCallbacks(e,t){for(let s of this.iterateCallbacks(e))await s(t)}*iterateCallbacks(e){for(let t of this._strategy.plugins)if(typeof t[e]=="function"){let s=this._pluginStateMap.get(t);yield n=>{let a={...n,state:s};return t[e](a)}}}waitUntil(e){return this._extendLifetimePromises.push(e),e}async doneWaiting(){let e;for(;e=this._extendLifetimePromises.shift();)await e}destroy(){this._handlerDeferred.resolve(null)}async getPreloadResponse(){if(this.event instanceof FetchEvent&&this.event.request.mode==="navigate"&&"preloadResponse"in this.event)try{let e=await this.event.preloadResponse;if(e)return e}catch{return}}async _ensureResponseSafeToCache(e){let t=e,s=!1;for(let r of this.iterateCallbacks("cacheWillUpdate"))if(t=await r({request:this.request,response:t,event:this.event})||void 0,s=!0,!t)break;return s||t&&t.status!==200&&(t=void 0),t}},b=class{cacheName;plugins;fetchOptions;matchOptions;constructor(e={}){this.cacheName=N.getRuntimeName(e.cacheName),this.plugins=e.plugins||[],this.fetchOptions=e.fetchOptions,this.matchOptions=e.matchOptions}handle(e){let[t]=this.handleAll(e);return t}handleAll(e){e instanceof FetchEvent&&(e={event:e,request:e.request});let t=e.event,s=typeof e.request=="string"?new Request(e.request):e.request,r=new ke(this,e.url?{event:t,request:s,url:e.url,params:e.params}:{event:t,request:s}),n=this._getResponse(r,s,t);return[n,this._awaitComplete(n,r,s,t)]}async _getResponse(e,t,s){await e.runCallbacks("handlerWillStart",{event:s,request:t});let r;try{if(r=await this._handle(t,e),r===void 0||r.type==="error")throw new l("no-response",{url:t.url})}catch(n){if(n instanceof Error){for(let a of e.iterateCallbacks("handlerDidError"))if(r=await a({error:n,event:s,request:t}),r!==void 0)break}if(!r)throw n}for(let n of e.iterateCallbacks("handlerWillRespond"))r=await n({event:s,request:t,response:r});return r}async _awaitComplete(e,t,s,r){let n,a;try{n=await e}catch{}try{await t.runCallbacks("handlerDidRespond",{event:r,request:s,response:n}),await t.doneWaiting()}catch(o){o instanceof Error&&(a=o)}if(await t.runCallbacks("handlerDidComplete",{event:r,request:s,response:n,error:a}),t.destroy(),a)throw a}};var p=class extends b{_networkTimeoutSeconds;constructor(e={}){super(e),this.plugins.some(t=>"cacheWillUpdate"in t)||this.plugins.unshift(X),this._networkTimeoutSeconds=e.networkTimeoutSeconds||0}async _handle(e,t){let s=[],r=[],n;if(this._networkTimeoutSeconds){let{id:i,promise:c}=this._getTimeoutPromise({request:e,logs:s,handler:t});n=i,r.push(c)}let a=this._getNetworkPromise({timeoutId:n,request:e,logs:s,handler:t});r.push(a);let o=await t.waitUntil((async()=>await t.waitUntil(Promise.race(r))||await a)());if(!o)throw new l("no-response",{url:e.url});return o}_getTimeoutPromise({request:e,logs:t,handler:s}){let r;return{promise:new Promise(n=>{r=setTimeout(async()=>{n(await s.cacheMatch(e))},this._networkTimeoutSeconds*1e3)}),id:r}}async _getNetworkPromise({timeoutId:e,request:t,logs:s,handler:r}){let n,a;try{a=await r.fetchAndCachePut(t)}catch(o){o instanceof Error&&(n=o)}return e&&clearTimeout(e),(n||!a)&&(a=await r.cacheMatch(t)),a}},R=class extends b{_networkTimeoutSeconds;constructor(e={}){super(e),this._networkTimeoutSeconds=e.networkTimeoutSeconds||0}async _handle(e,t){let s,r;try{let n=[t.fetch(e)];if(this._networkTimeoutSeconds){let a=D(this._networkTimeoutSeconds*1e3);n.push(a)}if(r=await Promise.race(n),!r)throw new Error(`Timed out the network response after ${this._networkTimeoutSeconds} seconds.`)}catch(n){n instanceof Error&&(s=n)}if(!r)throw new l("no-response",{url:e.url,error:s});return r}};var C=e=>e&&typeof e=="object"?e:{handle:e},g=class{handler;match;method;catchHandler;constructor(e,t,s="GET"){this.handler=C(t),this.match=e,this.method=s}setCatchHandler(e){this.catchHandler=C(e)}},Se=class T extends b{_fallbackToNetwork;static defaultPrecacheCacheabilityPlugin={async cacheWillUpdate({response:t}){return!t||t.status>=400?null:t}};static copyRedirectedCacheableResponsesPlugin={async cacheWillUpdate({response:t}){return t.redirected?await _e(t):t}};constructor(t={}){t.cacheName=N.getPrecacheName(t.cacheName),super(t),this._fallbackToNetwork=t.fallbackToNetwork!==!1,this.plugins.push(T.copyRedirectedCacheableResponsesPlugin)}async _handle(t,s){let r=await s.getPreloadResponse();if(r)return r;let n=await s.cacheMatch(t);return n||(s.event&&s.event.type==="install"?await this._handleInstall(t,s):await this._handleFetch(t,s))}async _handleFetch(t,s){let r,n=s.params||{};if(this._fallbackToNetwork){let a=n.integrity,o=t.integrity,i=!o||o===a;if(r=await s.fetch(new Request(t,{integrity:t.mode!=="no-cors"?o||a:void 0})),a&&i&&t.mode!=="no-cors"){this._useDefaultCacheabilityPluginIfNeeded();let c=await s.cachePut(t,r.clone())}}else throw new l("missing-precache-entry",{cacheName:this.cacheName,url:t.url});return r}async _handleInstall(t,s){this._useDefaultCacheabilityPluginIfNeeded();let r=await s.fetch(t);if(!await s.cachePut(t,r.clone()))throw new l("bad-precaching-response",{url:t.url,status:r.status});return r}_useDefaultCacheabilityPluginIfNeeded(){let t=null,s=0;for(let[r,n]of this.plugins.entries())n!==T.copyRedirectedCacheableResponsesPlugin&&(n===T.defaultPrecacheCacheabilityPlugin&&(t=r),n.cacheWillUpdate&&s++);s===0?this.plugins.push(T.defaultPrecacheCacheabilityPlugin):s>1&&t!==null&&this.plugins.splice(t,1)}},De=class extends g{_allowlist;_denylist;constructor(e,{allowlist:t=[/./],denylist:s=[]}={}){super(r=>this._match(r),e),this._allowlist=t,this._denylist=s}_match({url:e,request:t}){if(t&&t.mode!=="navigate")return!1;let s=e.pathname+e.search;for(let r of this._denylist)if(r.test(s))return!1;return!!this._allowlist.some(r=>r.test(s))}},qe=()=>!!self.registration?.navigationPreload,Te=e=>{qe()&&self.addEventListener("activate",t=>{t.waitUntil(self.registration.navigationPreload.enable().then(()=>{e&&self.registration.navigationPreload.setHeaderValue(e)}))})};var ht=(e,t=[])=>{for(let s of[...e.searchParams.keys()])t.some(r=>r.test(s))&&e.searchParams.delete(s);return e};function*Ce(e,{directoryIndex:t="index.html",ignoreURLParametersMatching:s=[/^utm_/,/^fbclid$/],cleanURLs:r=!0,urlManipulation:n}={}){let a=new URL(e,location.href);a.hash="",yield a.href;let o=ht(a,s);if(yield o.href,t&&o.pathname.endsWith("/")){let i=new URL(o.href);i.pathname+=t,yield i.href}if(r){let i=new URL(o.href);i.pathname+=".html",yield i.href}if(n){let i=n({url:a});for(let c of i)yield c.href}}var Ae=class extends g{constructor(e,t,s){let r=({url:n})=>{let a=e.exec(n.href);if(a&&!(n.origin!==location.origin&&a.index!==0))return a.slice(1)};super(r,t,s)}},Oe=e=>{N.updateDetails(e)},dt="__WB_REVISION__",Pe=e=>{if(!e)throw new l("add-to-cache-list-unexpected-type",{entry:e});if(typeof e=="string"){let a=new URL(e,location.href);return{cacheKey:a.href,url:a.href}}let{revision:t,url:s}=e;if(!s)throw new l("add-to-cache-list-unexpected-type",{entry:e});if(!t){let a=new URL(s,location.href);return{cacheKey:a.href,url:a.href}}let r=new URL(s,location.href),n=new URL(s,location.href);return r.searchParams.set(dt,t),{cacheKey:r.href,url:n.href}},Ue=class{updatedURLs=[];notUpdatedURLs=[];handlerWillStart=async({request:e,state:t})=>{t&&(t.originalRequest=e)};cachedResponseWillBeUsed=async({event:e,state:t,cachedResponse:s})=>{if(e.type==="install"&&t?.originalRequest&&t.originalRequest instanceof Request){let r=t.originalRequest.url;s?this.notUpdatedURLs.push(r):this.updatedURLs.push(r)}return s}},$e=(e,t,s)=>{if(typeof e=="string"){let r=new URL(e,location.href),n=({url:a})=>a.href===r.href;return new g(n,t,s)}if(e instanceof RegExp)return new Ae(e,t,s);if(typeof e=="function")return new g(e,t,s);if(e instanceof g)return e;throw new l("unsupported-route-type",{moduleName:"serwist",funcName:"parseRoute",paramName:"capture"})};var Ie=async(e,t,s)=>{let r=t.map((o,i)=>({index:i,item:o})),n=async o=>{let i=[];for(;;){let c=r.pop();if(!c)return o(i);let u=await s(c.item);i.push({result:u,index:c.index})}},a=Array.from({length:e},()=>new Promise(n));return(await Promise.all(a)).flat().sort((o,i)=>o.indexo.result)};var xs=typeof navigator<"u"&&/^((?!chrome|android).)*safari/i.test(navigator.userAgent);var pt="serwist-expiration",$="cache-entries",je=e=>{let t=new URL(e,location.href);return t.hash="",t.href},gt=class{_cacheName;_db=null;constructor(e){this._cacheName=e}_getId(e){return`${this._cacheName}|${je(e)}`}_upgradeDb(e){let t=e.createObjectStore($,{keyPath:"id"});t.createIndex("cacheName","cacheName",{unique:!1}),t.createIndex("timestamp","timestamp",{unique:!1})}_upgradeDbAndDeleteOldDbs(e){this._upgradeDb(e),this._cacheName&&me(this._cacheName)}async setTimestamp(e,t){e=je(e);let s={id:this._getId(e),cacheName:this._cacheName,url:e,timestamp:t},r=(await this.getDb()).transaction($,"readwrite",{durability:"relaxed"});await r.store.put(s),await r.done}async getTimestamp(e){return(await(await this.getDb()).get($,this._getId(e)))?.timestamp}async expireEntries(e,t){let s=await(await this.getDb()).transaction($,"readwrite").store.index("timestamp").openCursor(null,"prev"),r=[],n=0;for(;s;){let a=s.value;a.cacheName===this._cacheName&&(e&&a.timestamp=t?(s.delete(),r.push(a.url)):n++),s=await s.continue()}return r}async getDb(){return this._db||(this._db=await P(pt,1,{upgrade:this._upgradeDbAndDeleteOldDbs.bind(this)})),this._db}},ft=class{_isRunning=!1;_rerunRequested=!1;_maxEntries;_maxAgeSeconds;_matchOptions;_cacheName;_timestampModel;constructor(e,t={}){this._maxEntries=t.maxEntries,this._maxAgeSeconds=t.maxAgeSeconds,this._matchOptions=t.matchOptions,this._cacheName=e,this._timestampModel=new gt(e)}async expireEntries(){if(this._isRunning){this._rerunRequested=!0;return}this._isRunning=!0;let e=this._maxAgeSeconds?Date.now()-this._maxAgeSeconds*1e3:0,t=await this._timestampModel.expireEntries(e,this._maxEntries),s=await self.caches.open(this._cacheName);for(let r of t)await s.delete(r,this._matchOptions);this._isRunning=!1,this._rerunRequested&&(this._rerunRequested=!1,this.expireEntries())}async updateTimestamp(e){await this._timestampModel.setTimestamp(e,Date.now())}async isURLExpired(e){if(!this._maxAgeSeconds)return!1;let t=await this._timestampModel.getTimestamp(e),s=Date.now()-this._maxAgeSeconds*1e3;return t!==void 0?t{F.add(e)},h=class{_config;_cacheExpirations;constructor(e={}){this._config=e,this._cacheExpirations=new Map,this._config.maxAgeFrom||(this._config.maxAgeFrom="last-fetched"),this._config.purgeOnQuotaError&&mt(()=>this.deleteCacheAndMetadata())}_getCacheExpiration(e){if(e===N.getRuntimeName())throw new l("expire-custom-caches-only");let t=this._cacheExpirations.get(e);return t||(t=new ft(e,this._config),this._cacheExpirations.set(e,t)),t}cachedResponseWillBeUsed({event:e,cacheName:t,request:s,cachedResponse:r}){if(!r)return null;let n=this._isResponseDateFresh(r),a=this._getCacheExpiration(t),o=this._config.maxAgeFrom==="last-used",i=(async()=>{o&&await a.updateTimestamp(s.url),await a.expireEntries()})();try{e.waitUntil(i)}catch{}return n?r:null}_isResponseDateFresh(e){if(this._config.maxAgeFrom==="last-used")return!0;let t=Date.now();if(!this._config.maxAgeSeconds)return!0;let s=this._getDateHeaderTimestamp(e);return s===null?!0:s>=t-this._config.maxAgeSeconds*1e3}_getDateHeaderTimestamp(e){if(!e.headers.has("date"))return null;let t=e.headers.get("date"),s=new Date(t).getTime();return Number.isNaN(s)?null:s}async cacheDidUpdate({cacheName:e,request:t}){let s=this._getCacheExpiration(e);await s.updateTimestamp(t.url),await s.expireEntries()}async deleteCacheAndMetadata(){for(let[e,t]of this._cacheExpirations)await self.caches.delete(e),await t.delete();this._cacheExpirations=new Map}},wt="serwist-google-analytics",yt=2880,Nt=/^\/(\w+\/)?collect/,Et=e=>async({queue:t})=>{let s;for(;s=await t.shiftRequest();){let{request:r,timestamp:n}=s,a=new URL(r.url);try{let o=r.method==="POST"?new URLSearchParams(await r.clone().text()):a.searchParams,i=n-(Number(o.get("qt"))||0),c=Date.now()-i;if(o.set("qt",String(c)),e.parameterOverrides)for(let u of Object.keys(e.parameterOverrides)){let d=e.parameterOverrides[u];o.set(u,d)}typeof e.hitFilter=="function"&&e.hitFilter.call(null,o),await fetch(new Request(a.origin+a.pathname,{body:o.toString(),method:"POST",mode:"cors",credentials:"omit",headers:{"Content-Type":"text/plain"}}))}catch(o){throw await t.unshiftRequest(s),o}}},_t=e=>{let t=({url:r})=>r.hostname==="www.google-analytics.com"&&Nt.test(r.pathname),s=new R({plugins:[e]});return[new g(t,s,"GET"),new g(t,s,"POST")]},vt=e=>{let t=({url:s})=>s.hostname==="www.google-analytics.com"&&s.pathname==="/analytics.js";return new g(t,new p({cacheName:e}),"GET")},xt=e=>{let t=({url:s})=>s.hostname==="www.googletagmanager.com"&&s.pathname==="/gtag/js";return new g(t,new p({cacheName:e}),"GET")},bt=e=>{let t=({url:s})=>s.hostname==="www.googletagmanager.com"&&s.pathname==="/gtm.js";return new g(t,new p({cacheName:e}),"GET")},Le=({serwist:e,cacheName:t,...s})=>{let r=N.getGoogleAnalyticsName(t),n=new Re(wt,{maxRetentionTime:yt,onSync:Et(s)}),a=[bt(r),vt(r),xt(r),..._t(n)];for(let o of a)e.registerRoute(o)},Rt=class{_fallbackUrls;_serwist;constructor({fallbackUrls:e,serwist:t}){this._fallbackUrls=e,this._serwist=t}async handlerDidError(e){for(let t of this._fallbackUrls)if(typeof t=="string"){let s=await this._serwist.matchPrecache(t);if(s!==void 0)return s}else if(t.matcher(e)){let s=await this._serwist.matchPrecache(t.url);if(s!==void 0)return s}}},kt=(e,t,s)=>{let r=e.size;if(s&&s>r||t&&t<0)throw new l("range-not-satisfiable",{size:r,end:s,start:t});let n,a;return t!==void 0&&s!==void 0?(n=t,a=s+1):t!==void 0&&s===void 0?(n=t,a=r):s!==void 0&&t===void 0&&(n=r-s,a=r),{start:n,end:a}},St=e=>{let t=e.trim().toLowerCase();if(!t.startsWith("bytes="))throw new l("unit-must-be-bytes",{normalizedRangeHeader:t});if(t.includes(","))throw new l("single-range-only",{normalizedRangeHeader:t});let s=/(\d*)-(\d*)/.exec(t);if(!s||!(s[1]||s[2]))throw new l("invalid-range-values",{normalizedRangeHeader:t});return{start:s[1]===""?void 0:Number(s[1]),end:s[2]===""?void 0:Number(s[2])}},Dt=async(e,t)=>{try{if(t.status===206)return t;let s=e.headers.get("range");if(!s)throw new l("no-range-header");let r=St(s),n=await t.blob(),a=kt(n,r.start,r.end),o=n.slice(a.start,a.end),i=o.size,c=new Response(o,{status:206,statusText:"Partial Content",headers:t.headers});return c.headers.set("Content-Length",String(i)),c.headers.set("Content-Range",`bytes ${a.start}-${a.end-1}/${n.size}`),c}catch{return new Response("",{status:416,statusText:"Range Not Satisfiable"})}},Z=class{cachedResponseWillBeUsed=async({request:e,cachedResponse:t})=>t&&e.headers.has("range")?await Dt(e,t):t},A=class extends b{async _handle(e,t){let s=[],r=await t.cacheMatch(e),n;if(!r)try{r=await t.fetchAndCachePut(e)}catch(a){a instanceof Error&&(n=a)}if(!r)throw new l("no-response",{url:e.url,error:n});return r}};var k=class extends b{constructor(e={}){super(e),this.plugins.some(t=>"cacheWillUpdate"in t)||this.plugins.unshift(X)}async _handle(e,t){let s=[],r=t.fetchAndCachePut(e).catch(()=>{});t.waitUntil(r);let n=await t.cacheMatch(e),a;if(!n)try{n=await r}catch(o){o instanceof Error&&(a=o)}if(!n)throw new l("no-response",{url:e.url,error:a});return n}},qt=class extends g{constructor(e,t){let s=({request:r})=>{let n=e.getUrlsToPrecacheKeys();for(let a of Ce(r.url,t)){let o=n.get(a);if(o)return{cacheKey:o,integrity:e.getIntegrityForPrecacheKey(o)}}};super(s,e.precacheStrategy)}},Tt=class{_precacheController;constructor({precacheController:e}){this._precacheController=e}cacheKeyWillBeUsed=async({request:e,params:t})=>{let s=t?.cacheKey||this._precacheController.getPrecacheKeyForUrl(e.url);return s?new Request(s,{headers:e.headers}):e}},Ct=(e,t={})=>{let{cacheName:s,plugins:r=[],fetchOptions:n,matchOptions:a,fallbackToNetwork:o,directoryIndex:i,ignoreURLParametersMatching:c,cleanURLs:u,urlManipulation:d,cleanupOutdatedCaches:m,concurrency:x=10,navigateFallback:I,navigateFallbackAllowlist:_,navigateFallbackDenylist:f}=t??{};return{precacheStrategyOptions:{cacheName:N.getPrecacheName(s),plugins:[...r,new Tt({precacheController:e})],fetchOptions:n,matchOptions:a,fallbackToNetwork:o},precacheRouteOptions:{directoryIndex:i,ignoreURLParametersMatching:c,cleanURLs:u,urlManipulation:d},precacheMiscOptions:{cleanupOutdatedCaches:m,concurrency:x,navigateFallback:I,navigateFallbackAllowlist:_,navigateFallbackDenylist:f}}},Fe=class{_urlsToCacheKeys=new Map;_urlsToCacheModes=new Map;_cacheKeysToIntegrities=new Map;_concurrentPrecaching;_precacheStrategy;_routes;_defaultHandlerMap;_catchHandler;_requestRules;constructor({precacheEntries:e,precacheOptions:t,skipWaiting:s=!1,importScripts:r,navigationPreload:n=!1,cacheId:a,clientsClaim:o=!1,runtimeCaching:i,offlineAnalyticsConfig:c,disableDevLogs:u=!1,fallbacks:d,requestRules:m}={}){let{precacheStrategyOptions:x,precacheRouteOptions:I,precacheMiscOptions:_}=Ct(this,t);if(this._concurrentPrecaching=_.concurrency,this._precacheStrategy=new Se(x),this._routes=new Map,this._defaultHandlerMap=new Map,this._requestRules=m,this.handleInstall=this.handleInstall.bind(this),this.handleActivate=this.handleActivate.bind(this),this.handleFetch=this.handleFetch.bind(this),this.handleCache=this.handleCache.bind(this),r&&r.length>0&&self.importScripts(...r),n&&Te(),a!==void 0&&Oe({prefix:a}),s?self.skipWaiting():self.addEventListener("message",f=>{f.data&&f.data.type==="SKIP_WAITING"&&self.skipWaiting()}),o&&le(),e&&e.length>0&&this.addToPrecacheList(e),_.cleanupOutdatedCaches&&ce(x.cacheName),this.registerRoute(new qt(this,I)),_.navigateFallback&&this.registerRoute(new De(this.createHandlerBoundToUrl(_.navigateFallback),{allowlist:_.navigateFallbackAllowlist,denylist:_.navigateFallbackDenylist})),c!==void 0&&(typeof c=="boolean"?c&&Le({serwist:this}):Le({...c,serwist:this})),i!==void 0){if(d!==void 0){let f=new Rt({fallbackUrls:d.entries,serwist:this});i.forEach(j=>{j.handler instanceof b&&!j.handler.plugins.some(Be=>"handlerDidError"in Be)&&j.handler.plugins.push(f)})}for(let f of i)this.registerCapture(f.matcher,f.handler,f.method)}u&&ve()}get precacheStrategy(){return this._precacheStrategy}get routes(){return this._routes}addEventListeners(){self.addEventListener("install",this.handleInstall),self.addEventListener("activate",this.handleActivate),self.addEventListener("fetch",this.handleFetch),self.addEventListener("message",this.handleCache)}addToPrecacheList(e){let t=[];for(let s of e){typeof s=="string"?t.push(s):s&&!s.integrity&&s.revision===void 0&&t.push(s.url);let{cacheKey:r,url:n}=Pe(s),a=typeof s!="string"&&s.revision?"reload":"default";if(this._urlsToCacheKeys.has(n)&&this._urlsToCacheKeys.get(n)!==r)throw new l("add-to-cache-list-conflicting-entries",{firstEntry:this._urlsToCacheKeys.get(n),secondEntry:r});if(typeof s!="string"&&s.integrity){if(this._cacheKeysToIntegrities.has(r)&&this._cacheKeysToIntegrities.get(r)!==s.integrity)throw new l("add-to-cache-list-conflicting-integrities",{url:n});this._cacheKeysToIntegrities.set(r,s.integrity)}this._urlsToCacheKeys.set(n,r),this._urlsToCacheModes.set(n,a)}if(t.length>0){let s=`Serwist is precaching URLs without revision info: ${t.join(", ")} -This is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(s)}}handleInstall(e){return this.registerRequestRules(e),V(e,async()=>{let t=new Ue;this.precacheStrategy.plugins.push(t),await Ie(this._concurrentPrecaching,Array.from(this._urlsToCacheKeys.entries()),async([n,a])=>{let o=this._cacheKeysToIntegrities.get(a),i=this._urlsToCacheModes.get(n),c=new Request(n,{integrity:o,cache:i,credentials:"same-origin"});await Promise.all(this.precacheStrategy.handleAll({event:e,request:c,url:new URL(c.url),params:{cacheKey:a}}))});let{updatedURLs:s,notUpdatedURLs:r}=t;return{updatedURLs:s,notUpdatedURLs:r}})}async registerRequestRules(e){if(this._requestRules&&e?.addRoutes)try{await e.addRoutes(this._requestRules),this._requestRules=void 0}catch(t){throw t}}handleActivate(e){return V(e,async()=>{let t=await self.caches.open(this.precacheStrategy.cacheName),s=await t.keys(),r=new Set(this._urlsToCacheKeys.values()),n=[];for(let a of s)r.has(a.url)||(await t.delete(a),n.push(a.url));return{deletedCacheRequests:n}})}handleFetch(e){let{request:t}=e,s=this.handleRequest({request:t,event:e});s&&e.respondWith(s)}handleCache(e){if(e.data&&e.data.type==="CACHE_URLS"){let{payload:t}=e.data,s=Promise.all(t.urlsToCache.map(r=>{let n;return typeof r=="string"?n=new Request(r):n=new Request(...r),this.handleRequest({request:n,event:e})}));e.waitUntil(s),e.ports?.[0]&&s.then(()=>e.ports[0].postMessage(!0))}}setDefaultHandler(e,t="GET"){this._defaultHandlerMap.set(t,C(e))}setCatchHandler(e){this._catchHandler=C(e)}registerCapture(e,t,s){let r=$e(e,t,s);return this.registerRoute(r),r}registerRoute(e){this._routes.has(e.method)||this._routes.set(e.method,[]),this._routes.get(e.method).push(e)}unregisterRoute(e){if(!this._routes.has(e.method))throw new l("unregister-route-but-not-found-with-method",{method:e.method});let t=this._routes.get(e.method).indexOf(e);if(t>-1)this._routes.get(e.method).splice(t,1);else throw new l("unregister-route-route-not-registered")}getUrlsToPrecacheKeys(){return this._urlsToCacheKeys}getPrecachedUrls(){return[...this._urlsToCacheKeys.keys()]}getPrecacheKeyForUrl(e){let t=new URL(e,location.href);return this._urlsToCacheKeys.get(t.href)}getIntegrityForPrecacheKey(e){return this._cacheKeysToIntegrities.get(e)}async matchPrecache(e){let t=e instanceof Request?e.url:e,s=this.getPrecacheKeyForUrl(t);if(s)return(await self.caches.open(this.precacheStrategy.cacheName)).match(s)}createHandlerBoundToUrl(e){let t=this.getPrecacheKeyForUrl(e);if(!t)throw new l("non-precached-url",{url:e});return s=>(s.request=new Request(e),s.params={cacheKey:t,...s.params},this.precacheStrategy.handle(s))}handleRequest({request:e,event:t}){let s=new URL(e.url,location.href);if(!s.protocol.startsWith("http"))return;let r=s.origin===location.origin,{params:n,route:a}=this.findMatchingRoute({event:t,request:e,sameOrigin:r,url:s}),o=a?.handler,i=[],c=e.method;if(!o&&this._defaultHandlerMap.has(c)&&(o=this._defaultHandlerMap.get(c)),!o)return;let u;try{u=o.handle({url:s,request:e,event:t,params:n})}catch(m){u=Promise.reject(m)}let d=a?.catchHandler;return u instanceof Promise&&(this._catchHandler||d)&&(u=u.catch(async m=>{if(d)try{return await d.handle({url:s,request:e,event:t,params:n})}catch(x){x instanceof Error&&(m=x)}if(this._catchHandler)return this._catchHandler.handle({url:s,request:e,event:t});throw m})),u}findMatchingRoute({url:e,sameOrigin:t,request:s,event:r}){let n=this._routes.get(s.method)||[];for(let a of n){let o,i=a.match({url:e,sameOrigin:t,request:s,event:r});if(i)return o=i,(Array.isArray(o)&&o.length===0||i.constructor===Object&&Object.keys(i).length===0||typeof i=="boolean")&&(o=void 0),{route:a,params:o}}return{}}};var ee={rscPrefetch:"pages-rsc-prefetch",rsc:"pages-rsc",html:"pages"},Ve=[{matcher:/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,handler:new A({cacheName:"google-fonts-webfonts",plugins:[new h({maxEntries:4,maxAgeSeconds:365*24*60*60,maxAgeFrom:"last-used"})]})},{matcher:/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,handler:new k({cacheName:"google-fonts-stylesheets",plugins:[new h({maxEntries:4,maxAgeSeconds:10080*60,maxAgeFrom:"last-used"})]})},{matcher:/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,handler:new k({cacheName:"static-font-assets",plugins:[new h({maxEntries:4,maxAgeSeconds:10080*60,maxAgeFrom:"last-used"})]})},{matcher:/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,handler:new k({cacheName:"static-image-assets",plugins:[new h({maxEntries:64,maxAgeSeconds:720*60*60,maxAgeFrom:"last-used"})]})},{matcher:/\/_next\/static.+\.js$/i,handler:new A({cacheName:"next-static-js-assets",plugins:[new h({maxEntries:64,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})]})},{matcher:/\/_next\/image\?url=.+$/i,handler:new k({cacheName:"next-image",plugins:[new h({maxEntries:64,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})]})},{matcher:/\.(?:mp3|wav|ogg)$/i,handler:new A({cacheName:"static-audio-assets",plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"}),new Z]})},{matcher:/\.(?:mp4|webm)$/i,handler:new A({cacheName:"static-video-assets",plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"}),new Z]})},{matcher:/\.(?:js)$/i,handler:new k({cacheName:"static-js-assets",plugins:[new h({maxEntries:48,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})]})},{matcher:/\.(?:css|less)$/i,handler:new k({cacheName:"static-style-assets",plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})]})},{matcher:/\/_next\/data\/.+\/.+\.json$/i,handler:new p({cacheName:"next-data",plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})]})},{matcher:/\.(?:json|xml|csv)$/i,handler:new p({cacheName:"static-data-assets",plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})]})},{matcher:/\/api\/auth\/.*/,handler:new R({networkTimeoutSeconds:10})},{matcher:({sameOrigin:e,url:{pathname:t}})=>e&&t.startsWith("/api/"),method:"GET",handler:new p({cacheName:"apis",plugins:[new h({maxEntries:16,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})],networkTimeoutSeconds:10})},{matcher:({request:e,url:{pathname:t},sameOrigin:s})=>e.headers.get("RSC")==="1"&&e.headers.get("Next-Router-Prefetch")==="1"&&s&&!t.startsWith("/api/"),handler:new p({cacheName:ee.rscPrefetch,plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60})]})},{matcher:({request:e,url:{pathname:t},sameOrigin:s})=>e.headers.get("RSC")==="1"&&s&&!t.startsWith("/api/"),handler:new p({cacheName:ee.rsc,plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60})]})},{matcher:({request:e,url:{pathname:t},sameOrigin:s})=>e.headers.get("Content-Type")?.includes("text/html")&&s&&!t.startsWith("/api/"),handler:new p({cacheName:ee.html,plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60})]})},{matcher:({url:{pathname:e},sameOrigin:t})=>t&&!e.startsWith("/api/"),handler:new p({cacheName:"others",plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60})]})},{matcher:({sameOrigin:e})=>!e,handler:new p({cacheName:"cross-origin",plugins:[new h({maxEntries:32,maxAgeSeconds:3600})],networkTimeoutSeconds:10})},{matcher:/.*/i,method:"GET",handler:new R}];var Me="/offline.html",At=["/api/","/auth/"],te=new Fe({precacheEntries:w,skipWaiting:!0,clientsClaim:!0,navigationPreload:!1,runtimeCaching:[{matcher({request:e,sameOrigin:t,url:s}){return t?e.method!=="GET"||e.headers.has("Authorization")?!0:At.some(r=>s.pathname.startsWith(r)):!1},handler:new R},...Ve]}),Ot=async()=>{let e=await te.matchPrecache(Me);return e||caches.match(Me,{ignoreSearch:!0})};te.setCatchHandler(async({request:e})=>{if(e.mode==="navigate"||e.destination==="document"){let t=await Ot();if(t)return t}return Response.error()});te.addEventListeners(); +var w=[{revision:null,url:"/_next/static/media/opengraph-image.06uic5ht6.aff.png"},{revision:null,url:"/_next/static/media/logo.0wd2e_f.v-49o.svg"},{revision:null,url:"/_next/static/media/logo-dark.0_55--v62s08b.svg"},{revision:null,url:"/_next/static/media/favicon.0zsj~n962g272.ico"},{revision:null,url:"/_next/static/lFD51ZFC2Qlx8Oo7glBcH/_ssgManifest.js"},{revision:null,url:"/_next/static/lFD51ZFC2Qlx8Oo7glBcH/_clientMiddlewareManifest.js"},{revision:null,url:"/_next/static/lFD51ZFC2Qlx8Oo7glBcH/_buildManifest.js"},{revision:null,url:"/_next/static/chunks/turbopack-0hxh7ku~ztpa6.js"},{revision:null,url:"/_next/static/chunks/172ivk05m2bo8.js"},{revision:null,url:"/_next/static/chunks/16rb85u~rg37f.js"},{revision:null,url:"/_next/static/chunks/14vnrfzlo.-k2.js"},{revision:null,url:"/_next/static/chunks/14u0pvu28enmo.js"},{revision:null,url:"/_next/static/chunks/145o.lsi86g0w.css"},{revision:null,url:"/_next/static/chunks/13p-eg31hy4r9.js"},{revision:null,url:"/_next/static/chunks/1352oh6y39x4s.js"},{revision:null,url:"/_next/static/chunks/12_331qljvpz..js"},{revision:null,url:"/_next/static/chunks/123z3_c0bz0p9.js"},{revision:null,url:"/_next/static/chunks/11bfq3-h3gy4c.js"},{revision:null,url:"/_next/static/chunks/118a504enpyzu.js"},{revision:null,url:"/_next/static/chunks/10y.pwmxjjjqk.js"},{revision:null,url:"/_next/static/chunks/104l0fvx54wj-.js"},{revision:null,url:"/_next/static/chunks/0z~0882382gvy.js"},{revision:null,url:"/_next/static/chunks/0z97~83vjqptg.js"},{revision:null,url:"/_next/static/chunks/0y2l0xgouorae.css"},{revision:null,url:"/_next/static/chunks/0x9tlntlqq_d9.js"},{revision:null,url:"/_next/static/chunks/0wxb0ru_ff026.js"},{revision:null,url:"/_next/static/chunks/0wpa4ig.eotgk.js"},{revision:null,url:"/_next/static/chunks/0wooikl-ul2kd.js"},{revision:null,url:"/_next/static/chunks/0w_ca~l54g3fw.js"},{revision:null,url:"/_next/static/chunks/0v072dnk0fh1m.js"},{revision:null,url:"/_next/static/chunks/0uz4ru71rhm2b.js"},{revision:null,url:"/_next/static/chunks/0uds2c0vioouv.js"},{revision:null,url:"/_next/static/chunks/0u5h4hlrg0y8x.js"},{revision:null,url:"/_next/static/chunks/0typ-cp5k1ls6.js"},{revision:null,url:"/_next/static/chunks/0tps_-qpifszc.js"},{revision:null,url:"/_next/static/chunks/0qc.7mj._qrn1.css"},{revision:null,url:"/_next/static/chunks/0ow8x71uqegil.js"},{revision:null,url:"/_next/static/chunks/0nj7_0z86yzc8.js"},{revision:null,url:"/_next/static/chunks/0n_bnncmioiff.js"},{revision:null,url:"/_next/static/chunks/0n7w3rz3jt5hr.js"},{revision:null,url:"/_next/static/chunks/0n3ru1lp60s6l.css"},{revision:null,url:"/_next/static/chunks/0n02rcnt.xtjk.js"},{revision:null,url:"/_next/static/chunks/0mvw90h4_8bta.js"},{revision:null,url:"/_next/static/chunks/0mcgx~9nkb0-b.js"},{revision:null,url:"/_next/static/chunks/0k.m8w.7-a3xc.js"},{revision:null,url:"/_next/static/chunks/0jvjj2m6w3twt.js"},{revision:null,url:"/_next/static/chunks/0iet4xty.keb1.js"},{revision:null,url:"/_next/static/chunks/0i-112x7.uz1s.js"},{revision:null,url:"/_next/static/chunks/0hr2pnmeaaxa6.js"},{revision:null,url:"/_next/static/chunks/0h8-~mdn8_0en.js"},{revision:null,url:"/_next/static/chunks/0ge9cv96.8gn-.js"},{revision:null,url:"/_next/static/chunks/0f8pc_tcays4j.js"},{revision:null,url:"/_next/static/chunks/0exn7tuj~0h7d.js"},{revision:null,url:"/_next/static/chunks/0eiutdzyk1u-s.js"},{revision:null,url:"/_next/static/chunks/0ed~h.87czbyq.js"},{revision:null,url:"/_next/static/chunks/0ed59gpsfl1ie.js"},{revision:null,url:"/_next/static/chunks/0d6mfypvpyrhq.js"},{revision:null,url:"/_next/static/chunks/0cw_ryqsp~q7c.js"},{revision:null,url:"/_next/static/chunks/0cfxgxhsf390n.js"},{revision:null,url:"/_next/static/chunks/0c1jedyjrx~bm.js"},{revision:null,url:"/_next/static/chunks/0c.2wnkm67pd~.js"},{revision:null,url:"/_next/static/chunks/0aswkgju_dw97.js"},{revision:null,url:"/_next/static/chunks/0a.kre0dvja43.js"},{revision:null,url:"/_next/static/chunks/0_9gorbp-p8dg.js"},{revision:null,url:"/_next/static/chunks/0_7s0.hv.kwyg.js"},{revision:null,url:"/_next/static/chunks/09xcbed_1xh5s.js"},{revision:null,url:"/_next/static/chunks/0989ksawcjb7~.js"},{revision:null,url:"/_next/static/chunks/092dlyyoi5qhe.js"},{revision:null,url:"/_next/static/chunks/07bha-9k3if-r.js"},{revision:null,url:"/_next/static/chunks/072dgox8prfm..js"},{revision:null,url:"/_next/static/chunks/06j4yvl06fyum.js"},{revision:null,url:"/_next/static/chunks/04gcxva48dgyd.js"},{revision:null,url:"/_next/static/chunks/03~yq9q893hmn.js"},{revision:null,url:"/_next/static/chunks/03o9w180mw2u4.js"},{revision:null,url:"/_next/static/chunks/033oyvauenvh8.js"},{revision:null,url:"/_next/static/chunks/00hyyb8mgibk1.js"},{revision:null,url:"/_next/static/chunks/00cyib-7p3-ay.js"},{revision:null,url:"/_next/static/chunks/0.s_0cx.5knjr.js"},{revision:null,url:"/_next/static/chunks/0.1go1yjh_33f.js"},{revision:null,url:"/_next/static/chunks/0-17qcfub5_tb.js"},{revision:"a0c506315efd4b8cf04cf7772e314248",url:"/solvro_mono.svg"},{revision:"fb7b4a04529879c15d7ab902fc5b36a4",url:"/manifest.json"},{revision:"96933cc9517dbda7718eb0ccd146debf",url:"/icon-512.png"},{revision:"bd02d4a8132d37d4d81f307f99d0ddf8",url:"/icon-512-maskable.png"},{revision:"5cc689681d951eeaf7af6dd63d0658eb",url:"/icon-192.png"},{revision:"5aa2f65a080e13002b066c3c5563436f",url:"/icon-192-maskable.png"},{revision:"0ee5dfca21af7288f5b48c1e4cf59d91",url:"/favicon.svg"},{revision:"f2bc2ea7e0da5c43670c3c44232fec40",url:"/favicon-dark.svg"},{revision:"36b50630d6c0d82e0c3fc11a48a36611",url:"/apple-touch-icon.png"},{revision:"edc51dcf30745c34c2df5ebea40bdeb7",url:"/favicon/180x180.png"},{revision:"8d9b8ad559d71f09ac1c1b51068f98c2",url:"/banned-screen/mc-font.otf"},{revision:"e8a3307e5824d62b46878b5e7c99e979",url:"/banned-screen/dirt-background.webp"},{revision:"ce626769b7fe733154bc0e0d507fe751",url:"/offline"},{revision:"c6092feffed734936c09d24e63c257ca",url:"/offline.html"}];var y={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"serwist",runtime:"runtime",suffix:typeof registration<"u"?registration.scope:""},L=e=>[y.prefix,e,y.suffix].filter(t=>t&&t.length>0).join("-"),Ke=e=>{for(let t of Object.keys(y))e(t)},N={updateDetails:e=>{Ke(t=>{let s=e[t];typeof s=="string"&&(y[t]=s)})},getGoogleAnalyticsName:e=>e||L(y.googleAnalytics),getPrecacheName:e=>e||L(y.precache),getPrefix:()=>y.prefix,getRuntimeName:e=>e||L(y.runtime),getSuffix:()=>y.suffix},D;function re(){if(D===void 0){let e=new Response("");if("body"in e)try{new Response(e.body),D=!0}catch{D=!1}D=!1}return D}var He=(e,...t)=>{let s=e;return t.length>0&&(s+=` :: ${JSON.stringify(t)}`),s};var Ge=He,l=class extends Error{details;constructor(e,t){let s=Ge(e,t);super(s),this.name=e,this.details=t}};var ne=e=>new URL(String(e),location.href).href.replace(new RegExp(`^${location.origin}`),"");function S(e){return new Promise(t=>setTimeout(t,e))}var F=new Set;function se(e,t){let s=new URL(e);for(let r of t)s.searchParams.delete(r);return s.href}async function ae(e,t,s,r){let n=se(t.url,s);if(t.url===n)return e.match(t,r);let a={...r,ignoreSearch:!0},o=await e.keys(t,a);for(let i of o)if(n===se(i.url,s))return e.match(i,r)}var oe=class{promise;resolve;reject;constructor(){this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t})}},ie=async()=>{for(let e of F)await e()},Qe="-precache-",ze=async(e,t=Qe)=>{let s=(await self.caches.keys()).filter(r=>r.includes(t)&&r.includes(self.registration.scope)&&r!==e);return await Promise.all(s.map(r=>self.caches.delete(r))),s},ce=e=>{self.addEventListener("activate",t=>{t.waitUntil(ze(N.getPrecacheName(e)).then(s=>{}))})},le=()=>{self.addEventListener("activate",()=>self.clients.claim())},V=(e,t)=>{let s=t();return e.waitUntil(s),s};var W=(e,t)=>t.some(s=>e instanceof s),ue,he;function Je(){return ue||(ue=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])}function Ye(){return he||(he=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])}var K=new WeakMap,M=new WeakMap,O=new WeakMap;function Xe(e){let t=new Promise((s,r)=>{let n=()=>{e.removeEventListener("success",a),e.removeEventListener("error",o)},a=()=>{s(v(e.result)),n()},o=()=>{r(e.error),n()};e.addEventListener("success",a),e.addEventListener("error",o)});return O.set(t,e),t}function Ze(e){if(K.has(e))return;let t=new Promise((s,r)=>{let n=()=>{e.removeEventListener("complete",a),e.removeEventListener("error",o),e.removeEventListener("abort",o)},a=()=>{s(),n()},o=()=>{r(e.error||new DOMException("AbortError","AbortError")),n()};e.addEventListener("complete",a),e.addEventListener("error",o),e.addEventListener("abort",o)});K.set(e,t)}var H={get(e,t,s){if(e instanceof IDBTransaction){if(t==="done")return K.get(e);if(t==="store")return s.objectStoreNames[1]?void 0:s.objectStore(s.objectStoreNames[0])}return v(e[t])},set(e,t,s){return e[t]=s,!0},has(e,t){return e instanceof IDBTransaction&&(t==="done"||t==="store")?!0:t in e}};function fe(e){H=e(H)}function et(e){return Ye().includes(e)?function(...t){return e.apply(G(this),t),v(this.request)}:function(...t){return v(e.apply(G(this),t))}}function tt(e){return typeof e=="function"?et(e):(e instanceof IDBTransaction&&Ze(e),W(e,Je())?new Proxy(e,H):e)}function v(e){if(e instanceof IDBRequest)return Xe(e);if(M.has(e))return M.get(e);let t=tt(e);return t!==e&&(M.set(e,t),O.set(t,e)),t}var G=e=>O.get(e);function P(e,t,{blocked:s,upgrade:r,blocking:n,terminated:a}={}){let o=indexedDB.open(e,t),i=v(o);return r&&o.addEventListener("upgradeneeded",c=>{r(v(o.result),c.oldVersion,c.newVersion,v(o.transaction),c)}),s&&o.addEventListener("blocked",c=>s(c.oldVersion,c.newVersion,c)),i.then(c=>{a&&c.addEventListener("close",()=>a()),n&&c.addEventListener("versionchange",u=>n(u.oldVersion,u.newVersion,u))}).catch(()=>{}),i}function me(e,{blocked:t}={}){let s=indexedDB.deleteDatabase(e);return t&&s.addEventListener("blocked",r=>t(r.oldVersion,r)),v(s).then(()=>{})}var st=["get","getKey","getAll","getAllKeys","count"],rt=["put","add","delete","clear"],B=new Map;function de(e,t){if(!(e instanceof IDBDatabase&&!(t in e)&&typeof t=="string"))return;if(B.get(t))return B.get(t);let s=t.replace(/FromIndex$/,""),r=t!==s,n=rt.includes(s);if(!(s in(r?IDBIndex:IDBObjectStore).prototype)||!(n||st.includes(s)))return;let a=async function(o,...i){let c=this.transaction(o,n?"readwrite":"readonly"),u=c.store;return r&&(u=u.index(i.shift())),(await Promise.all([u[s](...i),n&&c.done]))[0]};return B.set(t,a),a}fe(e=>({...e,get:(t,s,r)=>de(t,s)||e.get(t,s,r),has:(t,s)=>!!de(t,s)||e.has(t,s)}));var nt=["continue","continuePrimaryKey","advance"],pe={},Q=new WeakMap,we=new WeakMap,at={get(e,t){if(!nt.includes(t))return e[t];let s=pe[t];return s||(s=pe[t]=function(...r){Q.set(this,we.get(this)[t](...r))}),s}};async function*ot(...e){let t=this;if(t instanceof IDBCursor||(t=await t.openCursor(...e)),!t)return;t=t;let s=new Proxy(t,at);for(we.set(s,t),O.set(s,G(t));t;)yield s,t=await(Q.get(s)||t.continue()),Q.delete(s)}function ge(e,t){return t===Symbol.asyncIterator&&W(e,[IDBIndex,IDBObjectStore,IDBCursor])||t==="iterate"&&W(e,[IDBIndex,IDBObjectStore])}fe(e=>({...e,get(t,s,r){return ge(t,s)?ot:e.get(t,s,r)},has(t,s){return ge(t,s)||e.has(t,s)}}));var _e=async(e,t)=>{let s=null;if(e.url&&(s=new URL(e.url).origin),s!==self.location.origin)throw new l("cross-origin-copy-response",{origin:s});let r=e.clone(),n={headers:new Headers(r.headers),status:r.status,statusText:r.statusText},a=t?t(n):n,o=re()?r.body:await r.blob();return new Response(o,a)},ve=()=>{self.__WB_DISABLE_DEV_LOGS=!0},ye=3,it="serwist-background-sync",E="requests",q="queueName",ct=class{_db=null;async addEntry(e){let t=(await this.getDb()).transaction(E,"readwrite",{durability:"relaxed"});await t.store.add(e),await t.done}async getFirstEntryId(){return(await(await this.getDb()).transaction(E).store.openCursor())?.value.id}async getAllEntriesByQueueName(e){let t=await(await this.getDb()).getAllFromIndex(E,q,IDBKeyRange.only(e));return t||[]}async getEntryCountByQueueName(e){return(await this.getDb()).countFromIndex(E,q,IDBKeyRange.only(e))}async deleteEntry(e){await(await this.getDb()).delete(E,e)}async getFirstEntryByQueueName(e){return await this.getEndEntryFromIndex(IDBKeyRange.only(e),"next")}async getLastEntryByQueueName(e){return await this.getEndEntryFromIndex(IDBKeyRange.only(e),"prev")}async getEndEntryFromIndex(e,t){return(await(await this.getDb()).transaction(E).store.index(q).openCursor(e,t))?.value}async getDb(){return this._db||(this._db=await P(it,ye,{upgrade:this._upgradeDb})),this._db}_upgradeDb(e,t){t>0&&t{s.headers[n]=r});for(let r of lt)t[r]!==void 0&&(s[r]=t[r]);return new J(s)}constructor(t){t.mode==="navigate"&&(t.mode="same-origin"),this._requestData=t}toObject(){let t=Object.assign({},this._requestData);return t.headers=Object.assign({},this._requestData.headers),t.body&&(t.body=t.body.slice(0)),t}toRequest(){return new Request(this._requestData.url,this._requestData)}clone(){return new J(this.toObject())}},Ne="serwist-background-sync",ut=1440*7,z=new Set,Ee=e=>{let t={request:new Y(e.requestData).toRequest(),timestamp:e.timestamp};return e.metadata&&(t.metadata=e.metadata),t},be=class{_name;_onSync;_maxRetentionTime;_queueStore;_forceSyncFallback;_syncInProgress=!1;_requestsAddedDuringSync=!1;constructor(e,{forceSyncFallback:t,onSync:s,maxRetentionTime:r}={}){if(z.has(e))throw new l("duplicate-queue-name",{name:e});z.add(e),this._name=e,this._onSync=s||this.replayRequests,this._maxRetentionTime=r||ut,this._forceSyncFallback=!!t,this._queueStore=new xe(this._name),this._addSyncListener()}get name(){return this._name}async pushRequest(e){await this._addRequest(e,"push")}async unshiftRequest(e){await this._addRequest(e,"unshift")}async popRequest(){return this._removeRequest("pop")}async shiftRequest(){return this._removeRequest("shift")}async getAll(){let e=await this._queueStore.getAll(),t=Date.now(),s=[];for(let r of e){let n=this._maxRetentionTime*60*1e3;t-r.timestamp>n?await this._queueStore.deleteEntry(r.id):s.push(Ee(r))}return s}async size(){return await this._queueStore.size()}async _addRequest({request:e,metadata:t,timestamp:s=Date.now()},r){let n={requestData:(await Y.fromRequest(e.clone())).toObject(),timestamp:s};switch(t&&(n.metadata=t),r){case"push":await this._queueStore.pushEntry(n);break;case"unshift":await this._queueStore.unshiftEntry(n);break}this._syncInProgress?this._requestsAddedDuringSync=!0:await this.registerSync()}async _removeRequest(e){let t=Date.now(),s;switch(e){case"pop":s=await this._queueStore.popEntry();break;case"shift":s=await this._queueStore.shiftEntry();break}if(s){let r=this._maxRetentionTime*60*1e3;return t-s.timestamp>r?this._removeRequest(e):Ee(s)}}async replayRequests(){let e;for(;e=await this.shiftRequest();)try{await fetch(e.request.clone())}catch{throw await this.unshiftRequest(e),new l("queue-replay-failed",{name:this._name})}}async registerSync(){if("sync"in self.registration&&!this._forceSyncFallback)try{await self.registration.sync.register(`${Ne}:${this._name}`)}catch{}}_addSyncListener(){"sync"in self.registration&&!this._forceSyncFallback?self.addEventListener("sync",e=>{if(e.tag===`${Ne}:${this._name}`){let t=async()=>{this._syncInProgress=!0;let s;try{await this._onSync({queue:this})}catch(r){if(r instanceof Error)throw s=r,s}finally{this._requestsAddedDuringSync&&!(s&&!e.lastChance)&&await this.registerSync(),this._syncInProgress=!1,this._requestsAddedDuringSync=!1}};e.waitUntil(t())}}):this._onSync({queue:this})}static get _queueNames(){return z}},Re=class{_queue;constructor(e,t){this._queue=new be(e,t)}async fetchDidFail({request:e}){await this._queue.pushRequest({request:e})}},X={cacheWillUpdate:async({response:e})=>e.status===200||e.status===0?e:null};function U(e){return typeof e=="string"?new Request(e):e}var ke=class{event;request;url;params;_cacheKeys={};_strategy;_handlerDeferred;_extendLifetimePromises;_plugins;_pluginStateMap;constructor(e,t){this.event=t.event,this.request=t.request,t.url&&(this.url=t.url,this.params=t.params),this._strategy=e,this._handlerDeferred=new oe,this._extendLifetimePromises=[],this._plugins=[...e.plugins],this._pluginStateMap=new Map;for(let s of this._plugins)this._pluginStateMap.set(s,{});this.event.waitUntil(this._handlerDeferred.promise)}async fetch(e){let{event:t}=this,s=U(e),r=await this.getPreloadResponse();if(r)return r;let n=this.hasCallback("fetchDidFail")?s.clone():null;try{for(let o of this.iterateCallbacks("requestWillFetch"))s=await o({request:s.clone(),event:t})}catch(o){if(o instanceof Error)throw new l("plugin-error-request-will-fetch",{thrownErrorMessage:o.message})}let a=s.clone();try{let o;o=await fetch(s,s.mode==="navigate"?void 0:this._strategy.fetchOptions);for(let i of this.iterateCallbacks("fetchDidSucceed"))o=await i({event:t,request:a,response:o});return o}catch(o){throw n&&await this.runCallbacks("fetchDidFail",{error:o,event:t,originalRequest:n.clone(),request:a.clone()}),o}}async fetchAndCachePut(e){let t=await this.fetch(e),s=t.clone();return this.waitUntil(this.cachePut(e,s)),t}async cacheMatch(e){let t=U(e),s,{cacheName:r,matchOptions:n}=this._strategy,a=await this.getCacheKey(t,"read"),o={...n,cacheName:r};s=await caches.match(a,o);for(let i of this.iterateCallbacks("cachedResponseWillBeUsed"))s=await i({cacheName:r,matchOptions:n,cachedResponse:s,request:a,event:this.event})||void 0;return s}async cachePut(e,t){let s=U(e);await S(0);let r=await this.getCacheKey(s,"write");if(!t)throw new l("cache-put-with-no-response",{url:ne(r.url)});let n=await this._ensureResponseSafeToCache(t);if(!n)return!1;let{cacheName:a,matchOptions:o}=this._strategy,i=await self.caches.open(a),c=this.hasCallback("cacheDidUpdate"),u=c?await ae(i,r.clone(),["__WB_REVISION__"],o):null;try{await i.put(r,c?n.clone():n)}catch(d){if(d instanceof Error)throw d.name==="QuotaExceededError"&&await ie(),d}for(let d of this.iterateCallbacks("cacheDidUpdate"))await d({cacheName:a,oldResponse:u,newResponse:n.clone(),request:r,event:this.event});return!0}async getCacheKey(e,t){let s=`${e.url} | ${t}`;if(!this._cacheKeys[s]){let r=e;for(let n of this.iterateCallbacks("cacheKeyWillBeUsed"))r=U(await n({mode:t,request:r,event:this.event,params:this.params}));this._cacheKeys[s]=r}return this._cacheKeys[s]}hasCallback(e){for(let t of this._strategy.plugins)if(e in t)return!0;return!1}async runCallbacks(e,t){for(let s of this.iterateCallbacks(e))await s(t)}*iterateCallbacks(e){for(let t of this._strategy.plugins)if(typeof t[e]=="function"){let s=this._pluginStateMap.get(t);yield n=>{let a={...n,state:s};return t[e](a)}}}waitUntil(e){return this._extendLifetimePromises.push(e),e}async doneWaiting(){let e;for(;e=this._extendLifetimePromises.shift();)await e}destroy(){this._handlerDeferred.resolve(null)}async getPreloadResponse(){if(this.event instanceof FetchEvent&&this.event.request.mode==="navigate"&&"preloadResponse"in this.event)try{let e=await this.event.preloadResponse;if(e)return e}catch{return}}async _ensureResponseSafeToCache(e){let t=e,s=!1;for(let r of this.iterateCallbacks("cacheWillUpdate"))if(t=await r({request:this.request,response:t,event:this.event})||void 0,s=!0,!t)break;return s||t&&t.status!==200&&(t=void 0),t}},b=class{cacheName;plugins;fetchOptions;matchOptions;constructor(e={}){this.cacheName=N.getRuntimeName(e.cacheName),this.plugins=e.plugins||[],this.fetchOptions=e.fetchOptions,this.matchOptions=e.matchOptions}handle(e){let[t]=this.handleAll(e);return t}handleAll(e){e instanceof FetchEvent&&(e={event:e,request:e.request});let t=e.event,s=typeof e.request=="string"?new Request(e.request):e.request,r=new ke(this,e.url?{event:t,request:s,url:e.url,params:e.params}:{event:t,request:s}),n=this._getResponse(r,s,t);return[n,this._awaitComplete(n,r,s,t)]}async _getResponse(e,t,s){await e.runCallbacks("handlerWillStart",{event:s,request:t});let r;try{if(r=await this._handle(t,e),r===void 0||r.type==="error")throw new l("no-response",{url:t.url})}catch(n){if(n instanceof Error){for(let a of e.iterateCallbacks("handlerDidError"))if(r=await a({error:n,event:s,request:t}),r!==void 0)break}if(!r)throw n}for(let n of e.iterateCallbacks("handlerWillRespond"))r=await n({event:s,request:t,response:r});return r}async _awaitComplete(e,t,s,r){let n,a;try{n=await e}catch{}try{await t.runCallbacks("handlerDidRespond",{event:r,request:s,response:n}),await t.doneWaiting()}catch(o){o instanceof Error&&(a=o)}if(await t.runCallbacks("handlerDidComplete",{event:r,request:s,response:n,error:a}),t.destroy(),a)throw a}};var p=class extends b{_networkTimeoutSeconds;constructor(e={}){super(e),this.plugins.some(t=>"cacheWillUpdate"in t)||this.plugins.unshift(X),this._networkTimeoutSeconds=e.networkTimeoutSeconds||0}async _handle(e,t){let s=[],r=[],n;if(this._networkTimeoutSeconds){let{id:i,promise:c}=this._getTimeoutPromise({request:e,logs:s,handler:t});n=i,r.push(c)}let a=this._getNetworkPromise({timeoutId:n,request:e,logs:s,handler:t});r.push(a);let o=await t.waitUntil((async()=>await t.waitUntil(Promise.race(r))||await a)());if(!o)throw new l("no-response",{url:e.url});return o}_getTimeoutPromise({request:e,logs:t,handler:s}){let r;return{promise:new Promise(n=>{r=setTimeout(async()=>{n(await s.cacheMatch(e))},this._networkTimeoutSeconds*1e3)}),id:r}}async _getNetworkPromise({timeoutId:e,request:t,logs:s,handler:r}){let n,a;try{a=await r.fetchAndCachePut(t)}catch(o){o instanceof Error&&(n=o)}return e&&clearTimeout(e),(n||!a)&&(a=await r.cacheMatch(t)),a}},R=class extends b{_networkTimeoutSeconds;constructor(e={}){super(e),this._networkTimeoutSeconds=e.networkTimeoutSeconds||0}async _handle(e,t){let s,r;try{let n=[t.fetch(e)];if(this._networkTimeoutSeconds){let a=S(this._networkTimeoutSeconds*1e3);n.push(a)}if(r=await Promise.race(n),!r)throw new Error(`Timed out the network response after ${this._networkTimeoutSeconds} seconds.`)}catch(n){n instanceof Error&&(s=n)}if(!r)throw new l("no-response",{url:e.url,error:s});return r}};var T=e=>e&&typeof e=="object"?e:{handle:e},g=class{handler;match;method;catchHandler;constructor(e,t,s="GET"){this.handler=T(t),this.match=e,this.method=s}setCatchHandler(e){this.catchHandler=T(e)}},De=class C extends b{_fallbackToNetwork;static defaultPrecacheCacheabilityPlugin={async cacheWillUpdate({response:t}){return!t||t.status>=400?null:t}};static copyRedirectedCacheableResponsesPlugin={async cacheWillUpdate({response:t}){return t.redirected?await _e(t):t}};constructor(t={}){t.cacheName=N.getPrecacheName(t.cacheName),super(t),this._fallbackToNetwork=t.fallbackToNetwork!==!1,this.plugins.push(C.copyRedirectedCacheableResponsesPlugin)}async _handle(t,s){let r=await s.getPreloadResponse();if(r)return r;let n=await s.cacheMatch(t);return n||(s.event&&s.event.type==="install"?await this._handleInstall(t,s):await this._handleFetch(t,s))}async _handleFetch(t,s){let r,n=s.params||{};if(this._fallbackToNetwork){let a=n.integrity,o=t.integrity,i=!o||o===a;if(r=await s.fetch(new Request(t,{integrity:t.mode!=="no-cors"?o||a:void 0})),a&&i&&t.mode!=="no-cors"){this._useDefaultCacheabilityPluginIfNeeded();let c=await s.cachePut(t,r.clone())}}else throw new l("missing-precache-entry",{cacheName:this.cacheName,url:t.url});return r}async _handleInstall(t,s){this._useDefaultCacheabilityPluginIfNeeded();let r=await s.fetch(t);if(!await s.cachePut(t,r.clone()))throw new l("bad-precaching-response",{url:t.url,status:r.status});return r}_useDefaultCacheabilityPluginIfNeeded(){let t=null,s=0;for(let[r,n]of this.plugins.entries())n!==C.copyRedirectedCacheableResponsesPlugin&&(n===C.defaultPrecacheCacheabilityPlugin&&(t=r),n.cacheWillUpdate&&s++);s===0?this.plugins.push(C.defaultPrecacheCacheabilityPlugin):s>1&&t!==null&&this.plugins.splice(t,1)}},Se=class extends g{_allowlist;_denylist;constructor(e,{allowlist:t=[/./],denylist:s=[]}={}){super(r=>this._match(r),e),this._allowlist=t,this._denylist=s}_match({url:e,request:t}){if(t&&t.mode!=="navigate")return!1;let s=e.pathname+e.search;for(let r of this._denylist)if(r.test(s))return!1;return!!this._allowlist.some(r=>r.test(s))}},qe=()=>!!self.registration?.navigationPreload,Ce=e=>{qe()&&self.addEventListener("activate",t=>{t.waitUntil(self.registration.navigationPreload.enable().then(()=>{e&&self.registration.navigationPreload.setHeaderValue(e)}))})};var ht=(e,t=[])=>{for(let s of[...e.searchParams.keys()])t.some(r=>r.test(s))&&e.searchParams.delete(s);return e};function*Te(e,{directoryIndex:t="index.html",ignoreURLParametersMatching:s=[/^utm_/,/^fbclid$/],cleanURLs:r=!0,urlManipulation:n}={}){let a=new URL(e,location.href);a.hash="",yield a.href;let o=ht(a,s);if(yield o.href,t&&o.pathname.endsWith("/")){let i=new URL(o.href);i.pathname+=t,yield i.href}if(r){let i=new URL(o.href);i.pathname+=".html",yield i.href}if(n){let i=n({url:a});for(let c of i)yield c.href}}var Ae=class extends g{constructor(e,t,s){let r=({url:n})=>{let a=e.exec(n.href);if(a&&!(n.origin!==location.origin&&a.index!==0))return a.slice(1)};super(r,t,s)}},Oe=e=>{N.updateDetails(e)},dt="__WB_REVISION__",Pe=e=>{if(!e)throw new l("add-to-cache-list-unexpected-type",{entry:e});if(typeof e=="string"){let a=new URL(e,location.href);return{cacheKey:a.href,url:a.href}}let{revision:t,url:s}=e;if(!s)throw new l("add-to-cache-list-unexpected-type",{entry:e});if(!t){let a=new URL(s,location.href);return{cacheKey:a.href,url:a.href}}let r=new URL(s,location.href),n=new URL(s,location.href);return r.searchParams.set(dt,t),{cacheKey:r.href,url:n.href}},Ue=class{updatedURLs=[];notUpdatedURLs=[];handlerWillStart=async({request:e,state:t})=>{t&&(t.originalRequest=e)};cachedResponseWillBeUsed=async({event:e,state:t,cachedResponse:s})=>{if(e.type==="install"&&t?.originalRequest&&t.originalRequest instanceof Request){let r=t.originalRequest.url;s?this.notUpdatedURLs.push(r):this.updatedURLs.push(r)}return s}},$e=(e,t,s)=>{if(typeof e=="string"){let r=new URL(e,location.href),n=({url:a})=>a.href===r.href;return new g(n,t,s)}if(e instanceof RegExp)return new Ae(e,t,s);if(typeof e=="function")return new g(e,t,s);if(e instanceof g)return e;throw new l("unsupported-route-type",{moduleName:"serwist",funcName:"parseRoute",paramName:"capture"})};var Ie=async(e,t,s)=>{let r=t.map((o,i)=>({index:i,item:o})),n=async o=>{let i=[];for(;;){let c=r.pop();if(!c)return o(i);let u=await s(c.item);i.push({result:u,index:c.index})}},a=Array.from({length:e},()=>new Promise(n));return(await Promise.all(a)).flat().sort((o,i)=>o.indexo.result)};var xs=typeof navigator<"u"&&/^((?!chrome|android).)*safari/i.test(navigator.userAgent);var pt="serwist-expiration",$="cache-entries",je=e=>{let t=new URL(e,location.href);return t.hash="",t.href},gt=class{_cacheName;_db=null;constructor(e){this._cacheName=e}_getId(e){return`${this._cacheName}|${je(e)}`}_upgradeDb(e){let t=e.createObjectStore($,{keyPath:"id"});t.createIndex("cacheName","cacheName",{unique:!1}),t.createIndex("timestamp","timestamp",{unique:!1})}_upgradeDbAndDeleteOldDbs(e){this._upgradeDb(e),this._cacheName&&me(this._cacheName)}async setTimestamp(e,t){e=je(e);let s={id:this._getId(e),cacheName:this._cacheName,url:e,timestamp:t},r=(await this.getDb()).transaction($,"readwrite",{durability:"relaxed"});await r.store.put(s),await r.done}async getTimestamp(e){return(await(await this.getDb()).get($,this._getId(e)))?.timestamp}async expireEntries(e,t){let s=await(await this.getDb()).transaction($,"readwrite").store.index("timestamp").openCursor(null,"prev"),r=[],n=0;for(;s;){let a=s.value;a.cacheName===this._cacheName&&(e&&a.timestamp=t?(s.delete(),r.push(a.url)):n++),s=await s.continue()}return r}async getDb(){return this._db||(this._db=await P(pt,1,{upgrade:this._upgradeDbAndDeleteOldDbs.bind(this)})),this._db}},ft=class{_isRunning=!1;_rerunRequested=!1;_maxEntries;_maxAgeSeconds;_matchOptions;_cacheName;_timestampModel;constructor(e,t={}){this._maxEntries=t.maxEntries,this._maxAgeSeconds=t.maxAgeSeconds,this._matchOptions=t.matchOptions,this._cacheName=e,this._timestampModel=new gt(e)}async expireEntries(){if(this._isRunning){this._rerunRequested=!0;return}this._isRunning=!0;let e=this._maxAgeSeconds?Date.now()-this._maxAgeSeconds*1e3:0,t=await this._timestampModel.expireEntries(e,this._maxEntries),s=await self.caches.open(this._cacheName);for(let r of t)await s.delete(r,this._matchOptions);this._isRunning=!1,this._rerunRequested&&(this._rerunRequested=!1,this.expireEntries())}async updateTimestamp(e){await this._timestampModel.setTimestamp(e,Date.now())}async isURLExpired(e){if(!this._maxAgeSeconds)return!1;let t=await this._timestampModel.getTimestamp(e),s=Date.now()-this._maxAgeSeconds*1e3;return t!==void 0?t{F.add(e)},h=class{_config;_cacheExpirations;constructor(e={}){this._config=e,this._cacheExpirations=new Map,this._config.maxAgeFrom||(this._config.maxAgeFrom="last-fetched"),this._config.purgeOnQuotaError&&mt(()=>this.deleteCacheAndMetadata())}_getCacheExpiration(e){if(e===N.getRuntimeName())throw new l("expire-custom-caches-only");let t=this._cacheExpirations.get(e);return t||(t=new ft(e,this._config),this._cacheExpirations.set(e,t)),t}cachedResponseWillBeUsed({event:e,cacheName:t,request:s,cachedResponse:r}){if(!r)return null;let n=this._isResponseDateFresh(r),a=this._getCacheExpiration(t),o=this._config.maxAgeFrom==="last-used",i=(async()=>{o&&await a.updateTimestamp(s.url),await a.expireEntries()})();try{e.waitUntil(i)}catch{}return n?r:null}_isResponseDateFresh(e){if(this._config.maxAgeFrom==="last-used")return!0;let t=Date.now();if(!this._config.maxAgeSeconds)return!0;let s=this._getDateHeaderTimestamp(e);return s===null?!0:s>=t-this._config.maxAgeSeconds*1e3}_getDateHeaderTimestamp(e){if(!e.headers.has("date"))return null;let t=e.headers.get("date"),s=new Date(t).getTime();return Number.isNaN(s)?null:s}async cacheDidUpdate({cacheName:e,request:t}){let s=this._getCacheExpiration(e);await s.updateTimestamp(t.url),await s.expireEntries()}async deleteCacheAndMetadata(){for(let[e,t]of this._cacheExpirations)await self.caches.delete(e),await t.delete();this._cacheExpirations=new Map}},wt="serwist-google-analytics",yt=2880,Nt=/^\/(\w+\/)?collect/,Et=e=>async({queue:t})=>{let s;for(;s=await t.shiftRequest();){let{request:r,timestamp:n}=s,a=new URL(r.url);try{let o=r.method==="POST"?new URLSearchParams(await r.clone().text()):a.searchParams,i=n-(Number(o.get("qt"))||0),c=Date.now()-i;if(o.set("qt",String(c)),e.parameterOverrides)for(let u of Object.keys(e.parameterOverrides)){let d=e.parameterOverrides[u];o.set(u,d)}typeof e.hitFilter=="function"&&e.hitFilter.call(null,o),await fetch(new Request(a.origin+a.pathname,{body:o.toString(),method:"POST",mode:"cors",credentials:"omit",headers:{"Content-Type":"text/plain"}}))}catch(o){throw await t.unshiftRequest(s),o}}},_t=e=>{let t=({url:r})=>r.hostname==="www.google-analytics.com"&&Nt.test(r.pathname),s=new R({plugins:[e]});return[new g(t,s,"GET"),new g(t,s,"POST")]},vt=e=>{let t=({url:s})=>s.hostname==="www.google-analytics.com"&&s.pathname==="/analytics.js";return new g(t,new p({cacheName:e}),"GET")},xt=e=>{let t=({url:s})=>s.hostname==="www.googletagmanager.com"&&s.pathname==="/gtag/js";return new g(t,new p({cacheName:e}),"GET")},bt=e=>{let t=({url:s})=>s.hostname==="www.googletagmanager.com"&&s.pathname==="/gtm.js";return new g(t,new p({cacheName:e}),"GET")},Le=({serwist:e,cacheName:t,...s})=>{let r=N.getGoogleAnalyticsName(t),n=new Re(wt,{maxRetentionTime:yt,onSync:Et(s)}),a=[bt(r),vt(r),xt(r),..._t(n)];for(let o of a)e.registerRoute(o)},Rt=class{_fallbackUrls;_serwist;constructor({fallbackUrls:e,serwist:t}){this._fallbackUrls=e,this._serwist=t}async handlerDidError(e){for(let t of this._fallbackUrls)if(typeof t=="string"){let s=await this._serwist.matchPrecache(t);if(s!==void 0)return s}else if(t.matcher(e)){let s=await this._serwist.matchPrecache(t.url);if(s!==void 0)return s}}},kt=(e,t,s)=>{let r=e.size;if(s&&s>r||t&&t<0)throw new l("range-not-satisfiable",{size:r,end:s,start:t});let n,a;return t!==void 0&&s!==void 0?(n=t,a=s+1):t!==void 0&&s===void 0?(n=t,a=r):s!==void 0&&t===void 0&&(n=r-s,a=r),{start:n,end:a}},Dt=e=>{let t=e.trim().toLowerCase();if(!t.startsWith("bytes="))throw new l("unit-must-be-bytes",{normalizedRangeHeader:t});if(t.includes(","))throw new l("single-range-only",{normalizedRangeHeader:t});let s=/(\d*)-(\d*)/.exec(t);if(!s||!(s[1]||s[2]))throw new l("invalid-range-values",{normalizedRangeHeader:t});return{start:s[1]===""?void 0:Number(s[1]),end:s[2]===""?void 0:Number(s[2])}},St=async(e,t)=>{try{if(t.status===206)return t;let s=e.headers.get("range");if(!s)throw new l("no-range-header");let r=Dt(s),n=await t.blob(),a=kt(n,r.start,r.end),o=n.slice(a.start,a.end),i=o.size,c=new Response(o,{status:206,statusText:"Partial Content",headers:t.headers});return c.headers.set("Content-Length",String(i)),c.headers.set("Content-Range",`bytes ${a.start}-${a.end-1}/${n.size}`),c}catch{return new Response("",{status:416,statusText:"Range Not Satisfiable"})}},Z=class{cachedResponseWillBeUsed=async({request:e,cachedResponse:t})=>t&&e.headers.has("range")?await St(e,t):t},A=class extends b{async _handle(e,t){let s=[],r=await t.cacheMatch(e),n;if(!r)try{r=await t.fetchAndCachePut(e)}catch(a){a instanceof Error&&(n=a)}if(!r)throw new l("no-response",{url:e.url,error:n});return r}};var k=class extends b{constructor(e={}){super(e),this.plugins.some(t=>"cacheWillUpdate"in t)||this.plugins.unshift(X)}async _handle(e,t){let s=[],r=t.fetchAndCachePut(e).catch(()=>{});t.waitUntil(r);let n=await t.cacheMatch(e),a;if(!n)try{n=await r}catch(o){o instanceof Error&&(a=o)}if(!n)throw new l("no-response",{url:e.url,error:a});return n}},qt=class extends g{constructor(e,t){let s=({request:r})=>{let n=e.getUrlsToPrecacheKeys();for(let a of Te(r.url,t)){let o=n.get(a);if(o)return{cacheKey:o,integrity:e.getIntegrityForPrecacheKey(o)}}};super(s,e.precacheStrategy)}},Ct=class{_precacheController;constructor({precacheController:e}){this._precacheController=e}cacheKeyWillBeUsed=async({request:e,params:t})=>{let s=t?.cacheKey||this._precacheController.getPrecacheKeyForUrl(e.url);return s?new Request(s,{headers:e.headers}):e}},Tt=(e,t={})=>{let{cacheName:s,plugins:r=[],fetchOptions:n,matchOptions:a,fallbackToNetwork:o,directoryIndex:i,ignoreURLParametersMatching:c,cleanURLs:u,urlManipulation:d,cleanupOutdatedCaches:m,concurrency:x=10,navigateFallback:I,navigateFallbackAllowlist:_,navigateFallbackDenylist:f}=t??{};return{precacheStrategyOptions:{cacheName:N.getPrecacheName(s),plugins:[...r,new Ct({precacheController:e})],fetchOptions:n,matchOptions:a,fallbackToNetwork:o},precacheRouteOptions:{directoryIndex:i,ignoreURLParametersMatching:c,cleanURLs:u,urlManipulation:d},precacheMiscOptions:{cleanupOutdatedCaches:m,concurrency:x,navigateFallback:I,navigateFallbackAllowlist:_,navigateFallbackDenylist:f}}},Fe=class{_urlsToCacheKeys=new Map;_urlsToCacheModes=new Map;_cacheKeysToIntegrities=new Map;_concurrentPrecaching;_precacheStrategy;_routes;_defaultHandlerMap;_catchHandler;_requestRules;constructor({precacheEntries:e,precacheOptions:t,skipWaiting:s=!1,importScripts:r,navigationPreload:n=!1,cacheId:a,clientsClaim:o=!1,runtimeCaching:i,offlineAnalyticsConfig:c,disableDevLogs:u=!1,fallbacks:d,requestRules:m}={}){let{precacheStrategyOptions:x,precacheRouteOptions:I,precacheMiscOptions:_}=Tt(this,t);if(this._concurrentPrecaching=_.concurrency,this._precacheStrategy=new De(x),this._routes=new Map,this._defaultHandlerMap=new Map,this._requestRules=m,this.handleInstall=this.handleInstall.bind(this),this.handleActivate=this.handleActivate.bind(this),this.handleFetch=this.handleFetch.bind(this),this.handleCache=this.handleCache.bind(this),r&&r.length>0&&self.importScripts(...r),n&&Ce(),a!==void 0&&Oe({prefix:a}),s?self.skipWaiting():self.addEventListener("message",f=>{f.data&&f.data.type==="SKIP_WAITING"&&self.skipWaiting()}),o&&le(),e&&e.length>0&&this.addToPrecacheList(e),_.cleanupOutdatedCaches&&ce(x.cacheName),this.registerRoute(new qt(this,I)),_.navigateFallback&&this.registerRoute(new Se(this.createHandlerBoundToUrl(_.navigateFallback),{allowlist:_.navigateFallbackAllowlist,denylist:_.navigateFallbackDenylist})),c!==void 0&&(typeof c=="boolean"?c&&Le({serwist:this}):Le({...c,serwist:this})),i!==void 0){if(d!==void 0){let f=new Rt({fallbackUrls:d.entries,serwist:this});i.forEach(j=>{j.handler instanceof b&&!j.handler.plugins.some(Be=>"handlerDidError"in Be)&&j.handler.plugins.push(f)})}for(let f of i)this.registerCapture(f.matcher,f.handler,f.method)}u&&ve()}get precacheStrategy(){return this._precacheStrategy}get routes(){return this._routes}addEventListeners(){self.addEventListener("install",this.handleInstall),self.addEventListener("activate",this.handleActivate),self.addEventListener("fetch",this.handleFetch),self.addEventListener("message",this.handleCache)}addToPrecacheList(e){let t=[];for(let s of e){typeof s=="string"?t.push(s):s&&!s.integrity&&s.revision===void 0&&t.push(s.url);let{cacheKey:r,url:n}=Pe(s),a=typeof s!="string"&&s.revision?"reload":"default";if(this._urlsToCacheKeys.has(n)&&this._urlsToCacheKeys.get(n)!==r)throw new l("add-to-cache-list-conflicting-entries",{firstEntry:this._urlsToCacheKeys.get(n),secondEntry:r});if(typeof s!="string"&&s.integrity){if(this._cacheKeysToIntegrities.has(r)&&this._cacheKeysToIntegrities.get(r)!==s.integrity)throw new l("add-to-cache-list-conflicting-integrities",{url:n});this._cacheKeysToIntegrities.set(r,s.integrity)}this._urlsToCacheKeys.set(n,r),this._urlsToCacheModes.set(n,a)}if(t.length>0){let s=`Serwist is precaching URLs without revision info: ${t.join(", ")} +This is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(s)}}handleInstall(e){return this.registerRequestRules(e),V(e,async()=>{let t=new Ue;this.precacheStrategy.plugins.push(t),await Ie(this._concurrentPrecaching,Array.from(this._urlsToCacheKeys.entries()),async([n,a])=>{let o=this._cacheKeysToIntegrities.get(a),i=this._urlsToCacheModes.get(n),c=new Request(n,{integrity:o,cache:i,credentials:"same-origin"});await Promise.all(this.precacheStrategy.handleAll({event:e,request:c,url:new URL(c.url),params:{cacheKey:a}}))});let{updatedURLs:s,notUpdatedURLs:r}=t;return{updatedURLs:s,notUpdatedURLs:r}})}async registerRequestRules(e){if(this._requestRules&&e?.addRoutes)try{await e.addRoutes(this._requestRules),this._requestRules=void 0}catch(t){throw t}}handleActivate(e){return V(e,async()=>{let t=await self.caches.open(this.precacheStrategy.cacheName),s=await t.keys(),r=new Set(this._urlsToCacheKeys.values()),n=[];for(let a of s)r.has(a.url)||(await t.delete(a),n.push(a.url));return{deletedCacheRequests:n}})}handleFetch(e){let{request:t}=e,s=this.handleRequest({request:t,event:e});s&&e.respondWith(s)}handleCache(e){if(e.data&&e.data.type==="CACHE_URLS"){let{payload:t}=e.data,s=Promise.all(t.urlsToCache.map(r=>{let n;return typeof r=="string"?n=new Request(r):n=new Request(...r),this.handleRequest({request:n,event:e})}));e.waitUntil(s),e.ports?.[0]&&s.then(()=>e.ports[0].postMessage(!0))}}setDefaultHandler(e,t="GET"){this._defaultHandlerMap.set(t,T(e))}setCatchHandler(e){this._catchHandler=T(e)}registerCapture(e,t,s){let r=$e(e,t,s);return this.registerRoute(r),r}registerRoute(e){this._routes.has(e.method)||this._routes.set(e.method,[]),this._routes.get(e.method).push(e)}unregisterRoute(e){if(!this._routes.has(e.method))throw new l("unregister-route-but-not-found-with-method",{method:e.method});let t=this._routes.get(e.method).indexOf(e);if(t>-1)this._routes.get(e.method).splice(t,1);else throw new l("unregister-route-route-not-registered")}getUrlsToPrecacheKeys(){return this._urlsToCacheKeys}getPrecachedUrls(){return[...this._urlsToCacheKeys.keys()]}getPrecacheKeyForUrl(e){let t=new URL(e,location.href);return this._urlsToCacheKeys.get(t.href)}getIntegrityForPrecacheKey(e){return this._cacheKeysToIntegrities.get(e)}async matchPrecache(e){let t=e instanceof Request?e.url:e,s=this.getPrecacheKeyForUrl(t);if(s)return(await self.caches.open(this.precacheStrategy.cacheName)).match(s)}createHandlerBoundToUrl(e){let t=this.getPrecacheKeyForUrl(e);if(!t)throw new l("non-precached-url",{url:e});return s=>(s.request=new Request(e),s.params={cacheKey:t,...s.params},this.precacheStrategy.handle(s))}handleRequest({request:e,event:t}){let s=new URL(e.url,location.href);if(!s.protocol.startsWith("http"))return;let r=s.origin===location.origin,{params:n,route:a}=this.findMatchingRoute({event:t,request:e,sameOrigin:r,url:s}),o=a?.handler,i=[],c=e.method;if(!o&&this._defaultHandlerMap.has(c)&&(o=this._defaultHandlerMap.get(c)),!o)return;let u;try{u=o.handle({url:s,request:e,event:t,params:n})}catch(m){u=Promise.reject(m)}let d=a?.catchHandler;return u instanceof Promise&&(this._catchHandler||d)&&(u=u.catch(async m=>{if(d)try{return await d.handle({url:s,request:e,event:t,params:n})}catch(x){x instanceof Error&&(m=x)}if(this._catchHandler)return this._catchHandler.handle({url:s,request:e,event:t});throw m})),u}findMatchingRoute({url:e,sameOrigin:t,request:s,event:r}){let n=this._routes.get(s.method)||[];for(let a of n){let o,i=a.match({url:e,sameOrigin:t,request:s,event:r});if(i)return o=i,(Array.isArray(o)&&o.length===0||i.constructor===Object&&Object.keys(i).length===0||typeof i=="boolean")&&(o=void 0),{route:a,params:o}}return{}}};var ee={rscPrefetch:"pages-rsc-prefetch",rsc:"pages-rsc",html:"pages"},Ve=[{matcher:/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,handler:new A({cacheName:"google-fonts-webfonts",plugins:[new h({maxEntries:4,maxAgeSeconds:365*24*60*60,maxAgeFrom:"last-used"})]})},{matcher:/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,handler:new k({cacheName:"google-fonts-stylesheets",plugins:[new h({maxEntries:4,maxAgeSeconds:10080*60,maxAgeFrom:"last-used"})]})},{matcher:/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,handler:new k({cacheName:"static-font-assets",plugins:[new h({maxEntries:4,maxAgeSeconds:10080*60,maxAgeFrom:"last-used"})]})},{matcher:/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,handler:new k({cacheName:"static-image-assets",plugins:[new h({maxEntries:64,maxAgeSeconds:720*60*60,maxAgeFrom:"last-used"})]})},{matcher:/\/_next\/static.+\.js$/i,handler:new A({cacheName:"next-static-js-assets",plugins:[new h({maxEntries:64,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})]})},{matcher:/\/_next\/image\?url=.+$/i,handler:new k({cacheName:"next-image",plugins:[new h({maxEntries:64,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})]})},{matcher:/\.(?:mp3|wav|ogg)$/i,handler:new A({cacheName:"static-audio-assets",plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"}),new Z]})},{matcher:/\.(?:mp4|webm)$/i,handler:new A({cacheName:"static-video-assets",plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"}),new Z]})},{matcher:/\.(?:js)$/i,handler:new k({cacheName:"static-js-assets",plugins:[new h({maxEntries:48,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})]})},{matcher:/\.(?:css|less)$/i,handler:new k({cacheName:"static-style-assets",plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})]})},{matcher:/\/_next\/data\/.+\/.+\.json$/i,handler:new p({cacheName:"next-data",plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})]})},{matcher:/\.(?:json|xml|csv)$/i,handler:new p({cacheName:"static-data-assets",plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})]})},{matcher:/\/api\/auth\/.*/,handler:new R({networkTimeoutSeconds:10})},{matcher:({sameOrigin:e,url:{pathname:t}})=>e&&t.startsWith("/api/"),method:"GET",handler:new p({cacheName:"apis",plugins:[new h({maxEntries:16,maxAgeSeconds:1440*60,maxAgeFrom:"last-used"})],networkTimeoutSeconds:10})},{matcher:({request:e,url:{pathname:t},sameOrigin:s})=>e.headers.get("RSC")==="1"&&e.headers.get("Next-Router-Prefetch")==="1"&&s&&!t.startsWith("/api/"),handler:new p({cacheName:ee.rscPrefetch,plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60})]})},{matcher:({request:e,url:{pathname:t},sameOrigin:s})=>e.headers.get("RSC")==="1"&&s&&!t.startsWith("/api/"),handler:new p({cacheName:ee.rsc,plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60})]})},{matcher:({request:e,url:{pathname:t},sameOrigin:s})=>e.headers.get("Content-Type")?.includes("text/html")&&s&&!t.startsWith("/api/"),handler:new p({cacheName:ee.html,plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60})]})},{matcher:({url:{pathname:e},sameOrigin:t})=>t&&!e.startsWith("/api/"),handler:new p({cacheName:"others",plugins:[new h({maxEntries:32,maxAgeSeconds:1440*60})]})},{matcher:({sameOrigin:e})=>!e,handler:new p({cacheName:"cross-origin",plugins:[new h({maxEntries:32,maxAgeSeconds:3600})],networkTimeoutSeconds:10})},{matcher:/.*/i,method:"GET",handler:new R}];var Me="/offline.html",At=["/api/","/auth/"],te=new Fe({precacheEntries:w,skipWaiting:!0,clientsClaim:!0,navigationPreload:!1,runtimeCaching:[{matcher({request:e,sameOrigin:t,url:s}){return t?e.method!=="GET"||e.headers.has("Authorization")?!0:At.some(r=>s.pathname.startsWith(r)):!1},handler:new R},...Ve]}),Ot=async()=>{let e=await te.matchPrecache(Me);return e??caches.match(Me,{ignoreSearch:!0})};te.setCatchHandler(async({request:e})=>{if(e.mode==="navigate"||e.destination==="document"){let t=await Ot();if(t!=null)return t}return Response.error()});te.addEventListeners(); diff --git a/serwist.config.js b/serwist.config.js index 4a797e2c..55bd18d9 100644 --- a/serwist.config.js +++ b/serwist.config.js @@ -6,10 +6,9 @@ const offlineRevision = createHash("md5") .update(readFileSync("public/offline.html", "utf8")) .digest("hex"); -export const serwistConfig = serwist({ +export default serwist({ swSrc: "src/sw.ts", swDest: "public/sw.js", - // public/*.html is mapped to /public/* by Serwist manifestTransforms (404). globIgnores: ["public/offline.html"], additionalPrecacheEntries: [ { url: "/offline.html", revision: offlineRevision }, From f23bf3b01c8fc1cdfc95e4eb02714c39f75eab66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tymon=20J=C4=99dryczka?= <65811982+jedryczkatymon@users.noreply.github.com> Date: Thu, 11 Jun 2026 20:52:44 +0200 Subject: [PATCH 6/7] fix: potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/components/pwa-install-prompt.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/components/pwa-install-prompt.tsx b/src/components/pwa-install-prompt.tsx index e76ddcdf..e955d0f4 100644 --- a/src/components/pwa-install-prompt.tsx +++ b/src/components/pwa-install-prompt.tsx @@ -75,9 +75,17 @@ export function PwaInstallPrompt({ }, []); const clearInstallQuery = useCallback(() => { - if (searchParameters.get("install") === "true") { - router.replace(pathname); + if (searchParameters.get("install") !== "true") { + return; } + + const nextParams = new URLSearchParams(searchParameters.toString()); + nextParams.delete("install"); + + const nextUrl = + nextParams.size > 0 ? `${pathname}?${nextParams.toString()}` : pathname; + + router.replace(nextUrl); }, [pathname, router, searchParameters]); const handleInstallClick = useCallback(async () => { From 0611e4f2a2d26c3e2ee5d2110f16c88d79d6a7cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tymon=20J=C4=99dryczka?= Date: Thu, 11 Jun 2026 21:16:44 +0200 Subject: [PATCH 7/7] fix: linter error --- src/components/pwa-install-prompt.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/pwa-install-prompt.tsx b/src/components/pwa-install-prompt.tsx index e955d0f4..cd27e033 100644 --- a/src/components/pwa-install-prompt.tsx +++ b/src/components/pwa-install-prompt.tsx @@ -79,11 +79,13 @@ export function PwaInstallPrompt({ return; } - const nextParams = new URLSearchParams(searchParameters.toString()); - nextParams.delete("install"); + const nextParameters = new URLSearchParams(searchParameters.toString()); + nextParameters.delete("install"); const nextUrl = - nextParams.size > 0 ? `${pathname}?${nextParams.toString()}` : pathname; + nextParameters.size > 0 + ? `${pathname}?${nextParameters.toString()}` + : pathname; router.replace(nextUrl); }, [pathname, router, searchParameters]);