@tagadapay/plugin-sdk 3.1.11 → 3.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1129 -1129
- package/build-cdn.js +113 -228
- package/dist/external-tracker.js +2 -3
- package/dist/external-tracker.min.js +2 -2
- package/dist/external-tracker.min.js.map +3 -3
- package/dist/react/hooks/useShippingRates.d.ts +6 -0
- package/dist/react/hooks/useShippingRates.js +38 -0
- package/dist/react/providers/TagadaProvider.js +5 -5
- package/dist/react/services/apiService.d.ts +21 -0
- package/dist/react/services/apiService.js +10 -0
- package/dist/v2/core/funnelClient.d.ts +14 -15
- package/dist/v2/core/funnelClient.js +1 -1
- package/dist/v2/core/resources/shippingRates.d.ts +15 -0
- package/dist/v2/core/resources/shippingRates.js +11 -0
- package/dist/v2/core/utils/currency.d.ts +0 -14
- package/dist/v2/core/utils/currency.js +0 -40
- package/dist/v2/core/utils/index.d.ts +0 -1
- package/dist/v2/core/utils/index.js +0 -2
- package/dist/v2/core/utils/pluginConfig.d.ts +0 -8
- package/dist/v2/core/utils/pluginConfig.js +0 -28
- package/dist/v2/core/utils/previewModeIndicator.js +101 -101
- package/dist/v2/index.d.ts +1 -1
- package/dist/v2/react/components/ApplePayButton.js +13 -4
- package/dist/v2/react/components/FunnelScriptInjector.js +30 -30
- package/dist/v2/react/hooks/useFunnel.d.ts +1 -2
- package/dist/v2/react/hooks/useGoogleAutocomplete.js +82 -33
- package/dist/v2/react/hooks/usePixelTracking.d.ts +5 -0
- package/dist/v2/react/hooks/usePixelTracking.js +108 -0
- package/dist/v2/react/hooks/useShippingRatesQuery.d.ts +6 -0
- package/dist/v2/react/hooks/useShippingRatesQuery.js +36 -1
- package/dist/v2/react/hooks/useStepConfig.d.ts +2 -8
- package/dist/v2/react/hooks/useStepConfig.js +1 -1
- package/dist/v2/react/providers/TagadaProvider.js +5 -5
- package/dist/v2/standalone/index.js +1 -1
- package/package.json +112 -112
- package/dist/tagada-sdk.js +0 -10166
- package/dist/tagada-sdk.min.js +0 -48
- package/dist/tagada-sdk.min.js.map +0 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/v2/core/config/environment.ts", "../src/v2/core/resources/funnel.ts", "../src/v2/core/utils/eventDispatcher.ts", "../src/v2/core/utils/tokenStorage.ts", "../src/v2/core/utils/sessionStorage.ts", "../src/v2/core/utils/previewMode.ts", "../src/v2/core/utils/previewModeIndicator.ts", "../src/v2/core/funnelClient.ts", "../src/v2/standalone/external-tracker.ts", "../src/v2/core/client.ts", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/bind.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/utils.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/core/AxiosError.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/null.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/toFormData.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/AxiosURLSearchParams.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/buildURL.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/core/InterceptorManager.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/defaults/transitional.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/platform/browser/classes/URLSearchParams.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/platform/browser/classes/FormData.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/platform/browser/classes/Blob.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/platform/browser/index.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/platform/common/utils.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/platform/index.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/toURLEncodedForm.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/formDataToJSON.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/defaults/index.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/parseHeaders.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/core/AxiosHeaders.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/core/transformData.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/cancel/isCancel.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/cancel/CanceledError.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/core/settle.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/parseProtocol.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/speedometer.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/throttle.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/progressEventReducer.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/isURLSameOrigin.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/cookies.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/isAbsoluteURL.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/combineURLs.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/core/buildFullPath.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/core/mergeConfig.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/resolveConfig.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/adapters/xhr.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/composeSignals.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/trackStream.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/adapters/fetch.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/adapters/adapters.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/core/dispatchRequest.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/env/data.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/validator.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/core/Axios.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/cancel/CancelToken.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/spread.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/isAxiosError.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/helpers/HttpStatusCode.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/lib/axios.js", "../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/index.js", "../src/v2/core/resources/apiClient.ts", "../../../node_modules/.pnpm/@ua-parser-js+pro-enterprise@2.0.6/node_modules/@ua-parser-js/pro-enterprise/src/main/ua-parser.mjs", "../../../node_modules/.pnpm/@ua-parser-js+pro-enterprise@2.0.6/node_modules/@ua-parser-js/pro-enterprise/src/enums/ua-parser-enums.mjs", "../../../node_modules/.pnpm/@ua-parser-js+pro-enterprise@2.0.6/node_modules/@ua-parser-js/pro-enterprise/src/extensions/ua-parser-extensions.mjs", "../../../node_modules/.pnpm/detect-europe-js@0.1.2/node_modules/detect-europe-js/dist/esm/index.js", "../../../node_modules/.pnpm/is-standalone-pwa@0.1.1/node_modules/is-standalone-pwa/dist/esm/index.js", "../../../node_modules/.pnpm/@ua-parser-js+pro-enterprise@2.0.6/node_modules/@ua-parser-js/pro-enterprise/src/helpers/ua-parser-helpers.mjs", "../src/v2/core/utils/deviceInfo.ts", "../src/v2/core/utils/eventBus.ts", "../src/v2/core/utils/jwtDecoder.ts", "../src/v2/core/utils/pluginConfig.ts", "../src/v2/core/utils/env.ts", "../src/v2/core/utils/authHandoff.ts", "../src/v2/standalone/index.ts", "../src/v2/core/utils/index.ts"],
|
|
4
|
-
"sourcesContent": ["import { ApiConfig, Environment, EnvironmentConfig } from '../types';\n\n/**\n * Get cookie value by name\n */\nfunction getCookie(name: string): string | null {\n if (typeof document === 'undefined') return null;\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n if (parts.length === 2) return parts.pop()?.split(';').shift() || null;\n return null;\n}\n\n/**\n * \u26A0\uFE0F IMPORTANT: Runtime Environment Detection\n * \n * This SDK uses RUNTIME hostname detection, NOT build-time environment variables.\n * This ensures the SDK always connects to the correct API based on where it's deployed.\n * \n * Environment detection priority (highest to lowest):\n * 1. **tagadaClientEnv** - Explicit override via URL param, localStorage, or cookie\n * Example: ?tagadaClientEnv=production\n * 2. **Production domains** \u2192 production API (app.tagadapay.com)\n * 3. **Dev/staging domains** \u2192 development API (app.tagadapay.dev, vercel.app, etc.)\n * 4. **Localhost/local IPs** \u2192 local API (localhost, 127.0.0.1, etc.)\n * - Can be overridden via window.__TAGADA_ENV__.TAGADA_ENVIRONMENT\n * 5. **Default fallback** \u2192 production API (safest for unknown domains)\n * \n * Build-time .env variables (VITE_*, REACT_APP_*, NEXT_PUBLIC_*) are IGNORED\n * to prevent incorrect API connections when plugins are deployed to different environments.\n */\n\n/**\n * Environment configurations for different deployment environments\n */\nexport const ENVIRONMENT_CONFIGS: Record<Environment, ApiConfig> = {\n production: {\n baseUrl: 'https://app.tagadapay.com',\n endpoints: {\n checkout: {\n sessionInit: '/api/v1/checkout/session/init',\n sessionInitAsync: '/api/v1/checkout/session/init-async',\n sessionStatus: '/api/v1/checkout/session/status',\n asyncStatus: '/api/public/v1/checkout/async-status',\n },\n customer: {\n profile: '/api/v1/customer/profile',\n session: '/api/v1/customer/session',\n },\n store: {\n config: '/api/v1/store/config',\n },\n },\n },\n development: {\n baseUrl: 'https://app.tagadapay.dev',\n endpoints: {\n checkout: {\n sessionInit: '/api/v1/checkout/session/init',\n sessionInitAsync: '/api/v1/checkout/session/init-async',\n sessionStatus: '/api/v1/checkout/session/status',\n asyncStatus: '/api/public/v1/checkout/async-status',\n },\n customer: {\n profile: '/api/v1/customer/profile',\n session: '/api/v1/customer/session',\n },\n store: {\n config: '/api/v1/store/config',\n },\n },\n },\n local: {\n baseUrl: 'http://app.localhost:3000',\n endpoints: {\n checkout: {\n sessionInit: '/api/v1/checkout/session/init',\n sessionInitAsync: '/api/v1/checkout/session/init-async',\n sessionStatus: '/api/v1/checkout/session/status',\n asyncStatus: '/api/public/v1/checkout/async-status',\n },\n customer: {\n profile: '/api/v1/customer/profile',\n session: '/api/v1/customer/session',\n },\n store: {\n config: '/api/v1/store/config',\n },\n },\n },\n};\n\n/**\n * Get the environment configuration based on the current environment\n * \n * Checks for custom base URL override via tagadaClientBaseUrl parameter\n */\nexport function getEnvironmentConfig(environment: Environment = 'local'): EnvironmentConfig {\n const apiConfig = ENVIRONMENT_CONFIGS[environment];\n\n if (!apiConfig) {\n console.warn(`Unknown environment: ${environment}. Falling back to local.`);\n return {\n environment: 'local',\n apiConfig: ENVIRONMENT_CONFIGS.local,\n };\n }\n\n // \uD83C\uDFAF Check for custom base URL override (URL > localStorage > cookie)\n let customBaseUrl: string | null = null;\n\n if (typeof window !== 'undefined') {\n const urlParams = new URLSearchParams(window.location.search);\n customBaseUrl = urlParams.get('tagadaClientBaseUrl');\n\n if (!customBaseUrl) {\n try {\n customBaseUrl = localStorage.getItem('tgd_client_base_url') || getCookie('tgd_client_base_url');\n } catch {\n // Storage not available\n }\n }\n }\n\n // If custom base URL is set, override the apiConfig.baseUrl\n if (customBaseUrl) {\n console.log(`[SDK] Using custom API base URL override: ${customBaseUrl}`);\n return {\n environment,\n apiConfig: {\n ...apiConfig,\n baseUrl: customBaseUrl,\n },\n };\n }\n\n return {\n environment,\n apiConfig,\n };\n}\n\n/**\n * Build a complete API URL from environment config and endpoint path\n */\nexport function buildApiUrl(config: EnvironmentConfig, endpointPath: string): string {\n return `${config.apiConfig.baseUrl}${endpointPath}`;\n}\n\n/**\n * Get a specific endpoint URL\n */\nexport function getEndpointUrl(\n config: EnvironmentConfig,\n category: keyof ApiConfig['endpoints'],\n endpoint: string,\n): string {\n const categoryEndpoints = config.apiConfig.endpoints[category] as Record<string, string>;\n const endpointPath = categoryEndpoints[endpoint];\n\n if (!endpointPath) {\n throw new Error(`Endpoint not found: ${category}.${endpoint}`);\n }\n\n return buildApiUrl(config, endpointPath);\n}\n\n/**\n * Auto-detect environment based on hostname and URL patterns at RUNTIME\n * \u26A0\uFE0F IMPORTANT: Ignores build-time .env variables to ensure correct detection in all environments\n * .env variables are ONLY used for local development via window.__TAGADA_ENV__\n * \n * Priority (highest to lowest):\n * 1. tagadaClientEnv - Explicit override via URL/localStorage/cookie\n * 2. __TAGADA_ENV__ - Local development override\n * 3. Hostname-based detection - Production/staging domains\n * 4. Default fallback - Production (safest)\n */\nexport function detectEnvironment(): Environment {\n console.log('[SDK] detectEnvironment() called');\n // Check if we're in browser\n if (typeof window === 'undefined') {\n return 'local'; // SSR fallback\n }\n\n // \uD83C\uDFAF PRIORITY 1: Check for explicit tagadaClientEnv override (URL > localStorage > cookie)\n // This allows forcing environment regardless of hostname\n const urlParams = new URLSearchParams(window.location.search);\n const urlEnv = urlParams.get('tagadaClientEnv');\n if (urlEnv && (urlEnv === 'production' || urlEnv === 'development' || urlEnv === 'local')) {\n console.log(`[SDK] Using explicit environment override: ${urlEnv}`);\n return urlEnv as Environment;\n }\n\n // Check localStorage/cookie for persisted override\n try {\n const storageEnv = localStorage.getItem('tgd_client_env') || getCookie('tgd_client_env');\n if (storageEnv && (storageEnv === 'production' || storageEnv === 'development' || storageEnv === 'local')) {\n console.log(`[SDK] Using persisted environment override: ${storageEnv}`);\n return storageEnv as Environment;\n }\n } catch {\n // Storage not available\n }\n\n const hostname = window.location.hostname;\n const href = window.location.href;\n\n console.log(`[SDK] detectEnvironment() - hostname: \"${hostname}\"`);\n\n // 1. Check for LOCAL environment first (highest priority for dev)\n // Local: localhost, local IPs, local domains, or ngrok tunnels (used for local dev)\n if (\n hostname === 'localhost' ||\n hostname.startsWith('127.') ||\n hostname.startsWith('192.168.') ||\n hostname.startsWith('10.') ||\n hostname.includes('.local') ||\n hostname === '' ||\n hostname === '0.0.0.0' ||\n hostname.includes('ngrok-free.dev') ||\n hostname.includes('ngrok-free.app') ||\n hostname.includes('ngrok.io') ||\n hostname.includes('ngrok.app')\n ) {\n console.log('[SDK] detectEnvironment() - returning LOCAL');\n // For local development, allow override via window.__TAGADA_ENV__ (injected by dev server)\n if (typeof window !== 'undefined' && (window as any)?.__TAGADA_ENV__?.TAGADA_ENVIRONMENT) {\n const override = (window as any).__TAGADA_ENV__.TAGADA_ENVIRONMENT.toLowerCase();\n if (override === 'production' || override === 'development' || override === 'local') {\n console.log(`[SDK] Local override detected: ${override}`);\n return override as Environment;\n }\n }\n return 'local';\n }\n\n // 2. Production: deployed to production domains\n if (\n hostname === 'app.tagadapay.com' ||\n hostname.includes('tagadapay.com') ||\n hostname.includes('yourproductiondomain.com')\n ) {\n return 'production';\n }\n\n // 3. Development: deployed to staging/dev domains or has dev indicators\n if (\n hostname === 'app.tagadapay.dev' ||\n hostname.includes('tagadapay.dev') ||\n hostname.includes('vercel.app') ||\n hostname.includes('netlify.app') ||\n hostname.includes('surge.sh') ||\n hostname.includes('github.io') ||\n hostname.includes('herokuapp.com') ||\n hostname.includes('railway.app') ||\n href.includes('?env=dev') ||\n href.includes('?dev=true') ||\n href.includes('#dev')\n ) {\n return 'development';\n }\n\n // 4. Default fallback for unknown domains (production is safest)\n console.warn(`[SDK] Unknown domain: ${hostname}, defaulting to production`);\n return 'production';\n}\n\n/**\n * Check if we're running in local development environment\n * Uses centralized detectEnvironment() for consistency\n * \n * @param excludeCdn - If true, excludes CDN subdomains (e.g., instance-id.cdn.localhost)\n * @returns true if in local environment (excluding CDN if specified)\n */\nexport function isLocalEnvironment(excludeCdn = false): boolean {\n const env = detectEnvironment();\n\n if (env !== 'local') {\n return false;\n }\n\n // If we need to exclude CDN subdomains\n if (excludeCdn && typeof window !== 'undefined') {\n return !window.location.hostname.includes('.cdn.');\n }\n\n return true;\n}\n\n", "/**\n * Funnel Resource - API client for funnel navigation and session management\n */\n\nimport { ApiClient } from './apiClient';\n\n/**\n * Funnel action types enum\n * \n * Special types:\n * - DIRECT_NAVIGATION: Bypasses step conditions, navigates directly to targetStepId\n * - BACK_NAVIGATION: Similar to direct_navigation, used for backward navigation\n * \n * Common types (for logging/tracking):\n * - These are commonly used action types that align with funnel orchestrator conditions\n * - Navigation logic is based on step conditions.from, action types are primarily for analytics\n */\nexport enum FunnelActionType {\n // Special navigation types (bypass step conditions)\n DIRECT_NAVIGATION = 'direct_navigation',\n BACK_NAVIGATION = 'back_navigation',\n\n // User interaction types\n CONTINUE_CLICKED = 'continue_clicked',\n BUTTON_CLICK = 'button_click',\n FORM_SUBMIT = 'form_submit',\n\n // Payment actions\n PAYMENT_SUCCESS = 'payment_success',\n PAYMENT_FAILED = 'payment_failed',\n\n // Offer actions\n OFFER_ACCEPTED = 'offer_accepted',\n OFFER_DECLINED = 'offer_declined',\n\n // Cart actions\n CART_UPDATED = 'cart_updated',\n CART_ITEM_ADDED = 'cart_item_added',\n\n // Generic/custom actions\n CUSTOM = 'custom'\n}\n\n/**\n * Data structures for specific action types\n */\n\nexport type NextAction<T> = T & { [key: string]: any };\n\n// ============================================================================\n// SCALABLE RESOURCE SYSTEM\n// ============================================================================\n\n/**\n * Base resource data type - all resources must have an id and optional metadata\n */\nexport interface FunnelResourceData {\n id: string;\n [key: string]: any;\n}\n\n/**\n * Resource metadata for tracking, versioning, and relationships\n */\nexport interface ResourceMetadata {\n /** Plugin that created this resource */\n source?: string;\n /** Schema version for this resource */\n version?: string;\n /** Timestamp when resource was created */\n timestamp?: number;\n /** Scope: how long should this resource persist */\n scope?: 'global' | 'session' | 'step' | 'ephemeral';\n /** Tags for categorization and filtering */\n tags?: string[];\n /** Related resource IDs (for relationships) */\n relatedTo?: string[];\n /** Custom metadata */\n [key: string]: any;\n}\n\n/**\n * Wrapped resource with metadata\n */\nexport interface ResourceWithMetadata<T extends FunnelResourceData = FunnelResourceData> {\n data: T;\n meta: ResourceMetadata;\n}\n\n/**\n * Standard resource types for e-commerce (provides IntelliSense)\n * These are SUGGESTIONS, not limitations - any key is allowed via index signature\n */\nexport interface StandardResourceKeys {\n // Core commerce entities (hot context)\n order?: FunnelResourceData;\n customer?: FunnelResourceData;\n payment?: FunnelResourceData;\n checkout?: FunnelResourceData;\n cart?: FunnelResourceData;\n subscription?: FunnelResourceData;\n product?: FunnelResourceData;\n variant?: FunnelResourceData;\n\n // Named resources (persistent reference)\n mainOrder?: FunnelResourceData;\n upsellOrder?: FunnelResourceData;\n downsellOrder?: FunnelResourceData;\n\n // Collections (array support for multiple instances)\n orders?: FunnelResourceData[];\n customers?: FunnelResourceData[];\n payments?: FunnelResourceData[];\n}\n\n/**\n * Flexible resource map supporting:\n * 1. Single resources (order)\n * 2. Collections (orders[])\n * 3. Wrapped resources with metadata\n * 4. Completely custom keys\n * \n * @example Simple usage (backward compatible)\n * ```typescript\n * resources: {\n * order: { id: '123', amount: 100 }\n * }\n * ```\n * \n * @example Multiple instances via collections\n * ```typescript\n * resources: {\n * order: { id: 'main' }, // Hot context\n * orders: [ // Full collection\n * { id: 'main', type: 'initial' },\n * { id: 'upsell1', type: 'addon' }\n * ]\n * }\n * ```\n * \n * @example With metadata (opt-in)\n * ```typescript\n * resources: {\n * order: {\n * data: { id: '123', amount: 100 },\n * meta: { source: 'checkout-plugin', version: '2.0' }\n * }\n * }\n * ```\n * \n * @example Typed resources (opt-in strict typing)\n * ```typescript\n * interface MyResources {\n * order: Order; // Your typed Order interface\n * customer: Customer;\n * }\n * \n * const result = await funnel.next<MyResources>({\n * type: 'payment_success',\n * data: {\n * resources: {\n * order: { id: '123', amount: 100 } // \u2705 Type-checked!\n * }\n * }\n * });\n * ```\n */\nexport type FunnelResourceMap<TCustom = {}> = StandardResourceKeys & {\n /**\n * Fully extensible - any key allowed\n * Value can be:\n * - Single resource: { id: '...' }\n * - Collection: [{ id: '...' }, ...]\n * - Wrapped: { data: {...}, meta: {...} }\n */\n [key: string]:\n | FunnelResourceData\n | FunnelResourceData[]\n | ResourceWithMetadata\n | ResourceWithMetadata[]\n | undefined;\n} & TCustom;\n\n/**\n * Typed resources structure for funnel actions\n * \n * \uD83D\uDCA1 RESOURCE PROTOCOL: Flexible & Scalable\n * \n * The system supports multiple patterns for maximum flexibility:\n * \n * 1. **Simple Pattern** (Default - Backward Compatible):\n * ```typescript\n * resources: { order: { id: '123' } }\n * ```\n * \n * 2. **Aliasing Pattern** (For Hot + Named Context):\n * ```typescript\n * resources: {\n * order: { id: '123' }, // Hot context (latest)\n * mainOrder: { id: '123' } // Named (persistent)\n * }\n * ```\n * \n * 3. **Collection Pattern** (For Multiple Instances):\n * ```typescript\n * resources: {\n * orders: [\n * { id: 'main', label: 'Initial Order' },\n * { id: 'upsell1', label: 'Upsell #1' }\n * ]\n * }\n * ```\n * \n * 4. **Metadata Pattern** (For Versioning/Tracking):\n * ```typescript\n * resources: {\n * order: {\n * data: { id: '123', amount: 100 },\n * meta: { version: '2.0', source: 'checkout' }\n * }\n * }\n * ```\n * \n * 5. **Namespaced Pattern** (For Collision Prevention):\n * ```typescript\n * resources: {\n * 'checkout:order': { id: '123' },\n * 'subscription:order': { id: '456' }\n * }\n * ```\n * \n * 6. **Typed Pattern** (For Strict Type Safety):\n * ```typescript\n * interface StrictResources {\n * order: Order; // Your interface\n * customer: Customer;\n * }\n * funnel.next<StrictResources>({ ... })\n * ```\n * \n * All patterns work together - choose what fits your use case!\n */\nexport interface FunnelActionResources<TCustom = {}> {\n /**\n * Resource map - infinitely extensible\n * - Standard keys provide IntelliSense\n * - Custom keys allowed via index signature\n * - Supports single resources, collections, and metadata\n * - Optional: pass generic for strict typing\n */\n resources?: FunnelResourceMap<TCustom>;\n /**\n * Legacy top-level data (backward compatible)\n * Will be automatically migrated to resources by orchestrator\n */\n [key: string]: any;\n}\n\nexport interface DirectNavigationActionData extends FunnelActionResources {\n targetStepId: string;\n}\n\nexport interface BackNavigationActionData extends FunnelActionResources {\n targetStepId: string;\n}\n\nexport interface PaymentSuccessActionData extends FunnelActionResources {\n payment: {\n id: string;\n status: string;\n transactionId?: string;\n timestamp?: string;\n [key: string]: any;\n };\n order: {\n id: string;\n amount: number;\n currency: string;\n [key: string]: any;\n };\n}\n\nexport interface PaymentFailedActionData extends FunnelActionResources {\n payment: {\n id: string;\n status: string;\n error?: string;\n [key: string]: any;\n };\n}\n\nexport interface OfferAcceptedActionData extends FunnelActionResources {\n offer: {\n accepted: boolean;\n offerId?: string;\n [key: string]: any;\n };\n}\n\nexport interface OfferDeclinedActionData extends FunnelActionResources {\n offer: {\n declined: boolean;\n offerId?: string;\n [key: string]: any;\n };\n}\n\nexport interface CartUpdatedActionData extends FunnelActionResources {\n cart: {\n hasSpecificItem?: boolean;\n itemIds?: string[];\n variantIds?: string[];\n total?: number;\n [key: string]: any;\n };\n}\n\nexport interface FormSubmitActionData extends FunnelActionResources {\n form?: {\n [key: string]: any;\n };\n}\n\n/**\n * Base properties shared by all FunnelAction types\n */\ninterface BaseFunnelAction {\n /**\n * Action timestamp (ISO string format)\n */\n timestamp?: string;\n /**\n * Current URL for session synchronization (browser back/forward handling)\n * If not provided, SDK will automatically use window.location.href\n * @example '/checkout', 'https://store.com/payment'\n */\n currentUrl?: string;\n}\n\n/**\n * Discriminated union for FunnelAction based on action type\n */\nexport type FunnelAction =\n BaseFunnelAction & (({\n type: FunnelActionType.DIRECT_NAVIGATION;\n data: NextAction<DirectNavigationActionData>;\n })\n | ({\n type: FunnelActionType.BACK_NAVIGATION;\n data: NextAction<BackNavigationActionData>;\n })\n | ({\n type: FunnelActionType.CONTINUE_CLICKED;\n data: NextAction<any>;\n })\n | ({\n type: FunnelActionType.BUTTON_CLICK;\n data: NextAction<any>;\n })\n | ({\n type: FunnelActionType.FORM_SUBMIT;\n data: NextAction<FormSubmitActionData>;\n })\n | ({\n type: FunnelActionType.PAYMENT_SUCCESS;\n data: NextAction<PaymentSuccessActionData>;\n })\n | ({\n type: FunnelActionType.PAYMENT_FAILED;\n data: NextAction<PaymentFailedActionData>;\n })\n | ({\n type: FunnelActionType.OFFER_ACCEPTED;\n data: NextAction<OfferAcceptedActionData>;\n })\n | ({\n type: FunnelActionType.OFFER_DECLINED;\n data: NextAction<OfferDeclinedActionData>;\n })\n | ({\n type: FunnelActionType.CART_UPDATED;\n data: NextAction<CartUpdatedActionData>;\n })\n | ({\n type: FunnelActionType.CART_ITEM_ADDED;\n data: NextAction<CartUpdatedActionData>;\n })\n | ({\n type: FunnelActionType.CUSTOM;\n data: NextAction<FunnelActionResources>;\n })\n | ({\n type: string;\n data?: NextAction<FunnelActionResources>;\n }));\n\nexport interface FunnelNavigationAction {\n type: 'redirect' | 'replace' | 'push' | 'external' | 'none';\n url?: string;\n data?: any;\n}\n\nexport interface FunnelNavigationResult {\n stepId?: string; // Optional for fire-and-forget mode\n url?: string; // URL to redirect to after navigation (if step has a URL configured)\n action?: FunnelNavigationAction; // Optional for fire-and-forget mode\n context?: SimpleFunnelContext; // Optional for fire-and-forget mode\n tracking?: {\n from: string;\n to: string;\n event: string;\n timestamp: string;\n };\n /**\n * Fire-and-forget response: indicates navigation was queued\n * When true, stepId, url, action, and context will be undefined\n */\n queued?: boolean;\n /**\n * Session ID (may be different if session was recovered)\n */\n sessionId?: string;\n}\n\n/**\n * Funnel context available to plugins\n * Contains current state, resources, and metadata about the funnel session\n * \n * @example Basic usage\n * ```typescript\n * const context = await funnel.getContext();\n * const orderId = context.resources?.order?.id;\n * ```\n * \n * @example Typed usage (opt-in strict typing)\n * ```typescript\n * interface MyResources {\n * order: Order;\n * customer: Customer;\n * }\n * const context = await funnel.getContext<MyResources>();\n * const total = context.resources?.order.amount; // \u2705 Type-safe!\n * ```\n * \n * @example Collection access\n * ```typescript\n * const allOrders = context.resources?.orders; // FunnelResourceData[]\n * const mainOrder = allOrders?.find(o => o.id === 'main');\n * ```\n */\nexport interface SimpleFunnelContext<TCustom = {}> {\n customerId: string;\n storeId: string;\n sessionId: string;\n funnelId: string;\n currentStepId: string;\n previousStepId?: string;\n /**\n * Furthest step reached in the funnel (for progress tracking in cyclic funnels)\n * Only moves forward, never backward - used for analytics\n */\n furthestStepId?: string;\n /**\n * \u2705 Environment context (staging or production)\n * - Determined at session initialization based on entry URL\n * - Ensures all navigation stays in the same environment\n * - 'staging': Uses funnel.config (alias domains like funnel--store.cdn.tagadapay.com)\n * - 'production': Uses funnel.productionConfig (custom domains)\n */\n environment?: 'staging' | 'production';\n startedAt: number;\n lastActivityAt: number;\n\n /**\n * Typed resources map - infinitely extensible\n * - Single resources, collections, or wrapped with metadata\n * - Pass generic for strict typing: SimpleFunnelContext<MyResources>\n * - Standard keys provide IntelliSense, custom keys always allowed\n */\n resources?: FunnelResourceMap<TCustom>;\n\n /**\n * Static resources from plugin manifest (type: \"static\")\n * - Configured in funnel editor's Static Resources tab\n * - Available at runtime as context.static\n * - Example: context.static.offer.id for statically configured offers\n */\n static?: Record<string, any>;\n\n /**\n * Legacy/Custom metadata\n * For backward compatibility and flexible unstructured data\n */\n metadata?: Record<string, any>;\n\n script?: string;\n}\n\nexport interface FunnelInitializeRequest {\n cmsSession: {\n customerId: string;\n storeId: string;\n sessionId: string;\n accountId: string;\n };\n funnelId?: string;\n entryStepId?: string;\n existingSessionId?: string;\n /**\n * Current URL for session synchronization (browser back/forward handling)\n * If not provided, SDK will automatically use window.location.href\n * @example '/checkout', 'https://store.com/payment'\n */\n currentUrl?: string;\n /**\n * A/B test variant ID extracted from injected HTML\n * Used to track which variant the user is seeing in an A/B test\n * @example 'step_1765015842897_variant_1'\n */\n funnelVariantId?: string;\n /**\n * Funnel step ID extracted from injected HTML\n * Used to track which step the user is on\n * @example 'step_1765015842897'\n */\n funnelStepId?: string;\n /**\n * \uD83C\uDFAF Draft/preview mode flag (explicit from SDK, more robust than URL parsing)\n * When true, uses draft/staging data instead of production data\n */\n draft?: boolean;\n /**\n * \uD83C\uDFAF Funnel tracking enable/disable flag (explicit from SDK, more robust than URL parsing)\n * When false, disables all funnel tracking events (useful for iframed previews in config editor)\n */\n funnelTracking?: boolean;\n /**\n * \uD83C\uDFAF Funnel environment override ('staging' | 'production')\n * Determines which funnel config to use\n */\n funnelEnv?: 'staging' | 'production';\n /**\n * \uD83C\uDFAF Tagada client environment override ('production' | 'development' | 'local')\n * Forces specific API environment\n */\n tagadaClientEnv?: 'production' | 'development' | 'local';\n /**\n * \uD83C\uDFAF Tagada client base URL override\n * Forces custom API base URL (e.g., for local development with ngrok)\n */\n tagadaClientBaseUrl?: string;\n /**\n * \uD83C\uDF0D Display currency override (e.g., 'USD', 'EUR')\n * Forces specific currency for display purposes\n */\n currency?: string;\n /**\n * \uD83C\uDF0D Display locale override (e.g., 'en', 'fr')\n * Forces specific locale for display purposes\n */\n locale?: string;\n}\n\nexport interface FunnelInitializeResponse {\n success: boolean;\n context?: SimpleFunnelContext;\n error?: string;\n}\n\nexport interface FunnelNavigateRequest {\n sessionId: string;\n event: FunnelAction;\n contextUpdates?: Partial<SimpleFunnelContext>;\n /**\n * Current URL for URL-to-Step mapping (browser back/forward sync)\n * Automatically extracted from event.currentUrl or window.location.href\n */\n currentUrl?: string;\n /**\n * Funnel ID for session recovery when session expires\n * If session is not found and funnelId is provided, a new session will be created\n */\n funnelId?: string;\n /**\n * Funnel step ID (from SDK injection/URL params)\n * Used to sync session state before navigation\n */\n funnelStepId?: string;\n /**\n * Funnel variant ID (from SDK injection/URL params for A/B testing)\n * Used to sync session state before navigation\n */\n funnelVariantId?: string;\n /**\n * Fire and forget mode - queues navigation to QStash and returns immediately\n * No response data needed, just acknowledgment that request was queued\n * When true, result will only contain queued status and sessionId (no URL or stepId)\n */\n fireAndForget?: boolean;\n /**\n * \u2705 Customer tags to set (merged with existing customer tags)\n * @example ['segment:vip', 'cart_value:high']\n */\n customerTags?: string[];\n /**\n * \u2705 Device ID for geo/device tag enrichment (optional)\n * @example 'dev_abc123xyz'\n */\n deviceId?: string;\n}\n\nexport interface FunnelNavigateResponse {\n success: boolean;\n result?: {\n stepId?: string;\n url?: string;\n /**\n * New session ID if session was recovered (expired/removed)\n * SDK should update its sessionId if this is present\n */\n sessionId?: string;\n tracking?: {\n from: string;\n to: string;\n event: string;\n timestamp: string;\n };\n /**\n * Fire-and-forget response: indicates navigation was queued\n * When present, stepId and url will be undefined\n */\n queued?: boolean;\n };\n error?: string;\n}\n\nexport interface FunnelContextUpdateRequest {\n contextUpdates: Partial<SimpleFunnelContext>;\n}\n\nexport interface FunnelContextUpdateResponse {\n success: boolean;\n error?: string;\n}\n\nexport class FunnelResource {\n constructor(private apiClient: ApiClient) { }\n\n /**\n * Initialize a funnel session\n */\n async initialize(request: FunnelInitializeRequest): Promise<FunnelInitializeResponse> {\n return this.apiClient.post('/api/v1/funnel/initialize', request);\n }\n\n /**\n * Navigate to next step in funnel\n */\n async navigate(request: FunnelNavigateRequest): Promise<FunnelNavigateResponse> {\n return this.apiClient.post('/api/v1/funnel/navigate', request);\n }\n\n /**\n * Update funnel context\n */\n async updateContext(sessionId: string, request: FunnelContextUpdateRequest): Promise<FunnelContextUpdateResponse> {\n return this.apiClient.patch(`/api/v1/funnel/context/${sessionId}`, request);\n }\n\n /**\n * End funnel session\n */\n async endSession(sessionId: string): Promise<{ success: boolean; error?: string }> {\n return this.apiClient.delete(`/api/v1/funnel/session/${sessionId}`);\n }\n\n /**\n * Get funnel session by ID\n * @param sessionId - The session ID to fetch\n * @param currentUrl - Optional current URL for session synchronization on page load\n */\n async getSession(sessionId: string, currentUrl?: string, includeDebugData?: boolean): Promise<{ success: boolean; context?: SimpleFunnelContext; debugData?: any; error?: string }> {\n const params = new URLSearchParams();\n if (currentUrl) {\n params.append('currentUrl', currentUrl);\n }\n if (includeDebugData) {\n params.append('includeDebugData', 'true');\n }\n const url = `/api/v1/funnel/session/${sessionId}${params.toString() ? `?${params}` : ''}`;\n return this.apiClient.get(url);\n }\n}\n\n", "/**\n * Simple event dispatcher for handling state changes in the SDK\n */\nexport type Listener<T> = (data: T) => void;\n\nexport class EventDispatcher<T> {\n private listeners: Set<Listener<T>> = new Set();\n\n subscribe(listener: Listener<T>): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n notify(data: T): void {\n this.listeners.forEach((listener) => {\n try {\n listener(data);\n } catch (error) {\n console.error('Error in event listener:', error);\n }\n });\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n\n", "/**\n * Client-side token storage utilities\n */\n\nconst TOKEN_KEY = 'cms_token';\n\n/**\n * Set the CMS token in localStorage\n * \n * IMPORTANT: Browser's native 'storage' event ONLY fires for changes in OTHER tabs/windows.\n * For same-tab updates to trigger storage listeners, we must manually dispatch the event.\n * We only dispatch if the token actually changed to minimize unnecessary events.\n */\nexport function setClientToken(token: string): void {\n if (typeof window !== 'undefined') {\n try {\n // Check if token actually changed to avoid unnecessary events and potential loops\n const currentToken = localStorage.getItem(TOKEN_KEY);\n const tokenChanged = currentToken !== token;\n\n localStorage.setItem(TOKEN_KEY, token);\n\n // Only dispatch if token actually changed\n // The storage event listeners have guards to prevent infinite loops:\n // - They check if token hasn't changed (client.ts line 261)\n // - They check if initialization is in progress (client.ts line 269)\n // - They check retry limits (client.ts line 277)\n if (tokenChanged) {\n window.dispatchEvent(new Event('storage'));\n }\n } catch (error) {\n console.error('Failed to save token to localStorage:', error);\n }\n }\n}\n\n/**\n * Get the CMS token from localStorage\n */\nexport function getClientToken(): string | null {\n if (typeof window !== 'undefined') {\n try {\n return localStorage.getItem(TOKEN_KEY);\n } catch (error) {\n console.error('Failed to get token from localStorage:', error);\n return null;\n }\n }\n return null;\n}\n\n/**\n * Clear the CMS token from localStorage\n */\nexport function clearClientToken(): void {\n if (typeof window !== 'undefined') {\n try {\n localStorage.removeItem(TOKEN_KEY);\n } catch (error) {\n console.error('Failed to clear token from localStorage:', error);\n }\n }\n}\n\n/**\n * Check if a token exists in localStorage\n */\nexport function hasClientToken(): boolean {\n return !!getClientToken();\n}\n\n", "/**\n * Session Storage Utilities - Core SDK (Framework-agnostic)\n * Handles session persistence using browser cookies\n */\n\nconst FUNNEL_SESSION_COOKIE_NAME = 'tgd-funnel-session-id';\nconst STICKY_SESSION_COOKIE_NAME = 'tgd-session-id';\nconst SESSION_MAX_AGE = 30 * 24 * 60 * 60; // 30 days\n\n/**\n * Save funnel session ID to browser cookie\n */\nexport function setFunnelSessionCookie(sessionId: string): void {\n if (typeof document === 'undefined') return;\n\n document.cookie = `${FUNNEL_SESSION_COOKIE_NAME}=${sessionId}; path=/; max-age=${SESSION_MAX_AGE}; SameSite=Lax`;\n}\n\n/**\n * Retrieve funnel session ID from browser cookie\n */\nexport function getFunnelSessionCookie(): string | undefined {\n if (typeof document === 'undefined') return undefined;\n\n const cookie = document.cookie\n .split('; ')\n .find((row) => row.startsWith(`${FUNNEL_SESSION_COOKIE_NAME}=`));\n\n return cookie ? cookie.split('=')[1] : undefined;\n}\n\n/**\n * Clear funnel session cookie\n */\nexport function clearFunnelSessionCookie(): void {\n if (typeof document === 'undefined') return;\n\n document.cookie = `${FUNNEL_SESSION_COOKIE_NAME}=; path=/; max-age=0`;\n}\n\n/**\n * Check if a funnel session cookie exists\n */\nexport function hasFunnelSessionCookie(): boolean {\n return !!getFunnelSessionCookie();\n}\n\n/**\n * Retrieve funnel variant ID from sticky session (for A/B tracking)\n * The variant ID is stored in the sticky session metadata by plugin-routing\n */\nexport function getFunnelVariantId(): string | undefined {\n if (typeof document === 'undefined') return undefined;\n\n try {\n const cookie = document.cookie\n .split('; ')\n .find((row) => row.startsWith(`${STICKY_SESSION_COOKIE_NAME}=`));\n\n if (!cookie) return undefined;\n\n const sessionData = JSON.parse(decodeURIComponent(cookie.split('=')[1]));\n return sessionData?.metadata?.funnelVariantId;\n } catch (error) {\n console.warn('Failed to parse sticky session for variant ID:', error);\n return undefined;\n }\n}\n\n\n", "/**\n * SDK Override Parameters\n * \n * Centralized parameter management for SDK behavior overrides.\n * Parameters can come from URL query params, localStorage, or cookies.\n * \n * Key concepts:\n * - forceReset: Clears all stored state (localStorage, cookies) - simulates hard refresh\n * - draft: Marks customers/sessions as draft (for staging/preview/testing)\n * - funnelTracking: Controls whether funnel events are tracked\n * - tagadaClientEnv: Forces specific environment (production/development/local) - overrides auto-detection\n * - tagadaClientBaseUrl: Forces custom API base URL - overrides environment-based URL\n * - token: Authentication token (URL > localStorage)\n * - funnelSessionId: Active funnel session (URL > cookie)\n * \n * \u26A0\uFE0F Note: authCode is NOT handled here - it has highest priority and is handled\n * separately in client.ts before all other initialization logic.\n * \n * Usage examples:\n * - Force production API: ?tagadaClientEnv=production\n * - Force development API: ?tagadaClientEnv=development\n * - Force local API: ?tagadaClientEnv=local\n * - Custom API URL: ?tagadaClientBaseUrl=https://tagada.loclx.io\n * - Combined: ?tagadaClientEnv=local&tagadaClientBaseUrl=https://tagada.loclx.io\n * - Hard reset + production: ?forceReset=true&tagadaClientEnv=production\n * - Cross-domain auth: ?authCode=ah_... (automatically handled, highest priority)\n */\n\nimport { clearClientToken, setClientToken, getClientToken } from './tokenStorage';\nimport { clearFunnelSessionCookie } from './sessionStorage';\n\n/**\n * SDK Override Parameters - centralized across all SDK functions\n * Can be set via URL params, localStorage, or cookies\n */\nexport interface SDKOverrideParams {\n /** Force clean state (clear localStorage and cookies) - simulates hard refresh */\n forceReset?: boolean;\n /** Token from URL (overrides localStorage) */\n token?: string | null;\n /** Funnel session ID from URL (overrides cookie) */\n funnelSessionId?: string | null;\n /** Funnel ID from URL */\n funnelId?: string | null;\n /** Draft mode - marks customers/sessions as draft */\n draft?: boolean;\n /** Enable/disable funnel tracking events (false in config editor iframe, true in funnel previews) */\n funnelTracking?: boolean;\n /** Funnel environment (staging/production) - determines which funnel config to use */\n funnelEnv?: 'staging' | 'production';\n /** Force specific environment (production/development/local) - overrides auto-detection */\n tagadaClientEnv?: 'production' | 'development' | 'local';\n /** Force custom API base URL - overrides environment-based URL */\n tagadaClientBaseUrl?: string;\n /** Display currency override (e.g., 'USD', 'EUR') */\n currency?: string;\n /** Display locale override (e.g., 'en', 'fr') */\n locale?: string;\n}\n\n// Storage keys for SDK override params\nconst STORAGE_KEYS = {\n DRAFT: 'tgd_draft',\n FUNNEL_TRACKING: 'tgd_funnel_tracking',\n FORCE_RESET: 'tgd_force_reset',\n CLIENT_ENV: 'tgd_client_env',\n CLIENT_BASE_URL: 'tgd_client_base_url',\n CURRENCY: 'tgd_currency',\n LOCALE: 'tgd_locale',\n} as const;\n\n/**\n * Check if force reset is active (simulates hard refresh)\n */\nexport function isForceReset(): boolean {\n if (typeof window === 'undefined') return false;\n\n const params = new URLSearchParams(window.location.search);\n return params.get('forceReset') === 'true';\n}\n\n/**\n * Get value from localStorage with fallback\n */\nfunction getFromStorage(key: string): string | null {\n if (typeof window === 'undefined') return null;\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\n/**\n * Set value in localStorage\n */\nfunction setInStorage(key: string, value: string): void {\n if (typeof window === 'undefined') return;\n try {\n localStorage.setItem(key, value);\n } catch {\n // Storage not available\n }\n}\n\n/**\n * Get value from cookie\n */\nfunction getFromCookie(key: string): string | null {\n if (typeof document === 'undefined') return null;\n const cookies = document.cookie.split(';');\n const cookie = cookies.find(c => c.trim().startsWith(`${key}=`));\n return cookie ? cookie.split('=')[1]?.trim() : null;\n}\n\n/**\n * Set value in cookie\n * \u26A0\uFE0F NEVER allows tgd_draft to be set as a cookie (localStorage-only)\n */\nfunction setInCookie(key: string, value: string, maxAge = 86400): void {\n if (typeof document === 'undefined') return;\n\n // \uD83D\uDEE1\uFE0F SAFETY: Block tgd_draft from EVER being written to cookies\n if (key === 'tgd_draft' || key === 'tgd-draft') {\n console.warn(`\uD83D\uDEE1\uFE0F [SDK] Blocked attempt to set ${key} as cookie - this should only be in localStorage`);\n return;\n }\n\n document.cookie = `${key}=${value}; path=/; max-age=${maxAge}`;\n}\n\n/**\n * Clear value from cookie\n */\nfunction clearFromCookie(key: string): void {\n if (typeof document === 'undefined') return;\n document.cookie = `${key}=; path=/; max-age=0`;\n}\n\n/**\n * Get SDK override parameters from all sources (URL, localStorage, cookies)\n * Priority: URL > localStorage > Cookie\n */\nexport function getSDKParams(): SDKOverrideParams {\n if (typeof window === 'undefined') {\n return {};\n }\n\n const urlParams = new URLSearchParams(window.location.search);\n\n // Get draft mode (URL > localStorage only - no cookie fallback to avoid resurrection)\n let draft: boolean | undefined;\n const urlDraft = urlParams.get('draft');\n if (urlDraft !== null) {\n draft = urlDraft === 'true';\n } else {\n const storageDraft = getFromStorage(STORAGE_KEYS.DRAFT);\n if (storageDraft !== null) {\n draft = storageDraft === 'true';\n }\n }\n\n // Get funnel tracking (URL > localStorage > cookie, default true)\n let funnelTracking: boolean | undefined;\n const urlTracking = urlParams.get('funnelTracking');\n if (urlTracking !== null) {\n funnelTracking = urlTracking !== 'false';\n } else {\n const storageTracking = getFromStorage(STORAGE_KEYS.FUNNEL_TRACKING) || getFromCookie(STORAGE_KEYS.FUNNEL_TRACKING);\n if (storageTracking !== null) {\n funnelTracking = storageTracking !== 'false';\n }\n }\n\n // Get token (URL > localStorage)\n const token = urlParams.get('token') || getClientToken() || null;\n\n // Get funnel session ID (URL only, cookie handled elsewhere)\n const funnelSessionId = urlParams.get('funnelSessionId') || null;\n\n // Get funnel ID (URL only)\n const funnelId = urlParams.get('funnelId') || null;\n\n // Get funnel environment (URL only - not persisted, set on entry)\n let funnelEnv: 'staging' | 'production' | undefined;\n const urlFunnelEnv = urlParams.get('funnelEnv');\n if (urlFunnelEnv && (urlFunnelEnv === 'staging' || urlFunnelEnv === 'production')) {\n funnelEnv = urlFunnelEnv;\n }\n\n // Force reset is URL-only (not persisted)\n const forceReset = urlParams.get('forceReset') === 'true';\n\n // Get client environment override (URL > localStorage > cookie)\n let tagadaClientEnv: 'production' | 'development' | 'local' | undefined;\n const urlEnv = urlParams.get('tagadaClientEnv');\n if (urlEnv && (urlEnv === 'production' || urlEnv === 'development' || urlEnv === 'local')) {\n tagadaClientEnv = urlEnv;\n } else {\n const storageEnv = getFromStorage(STORAGE_KEYS.CLIENT_ENV) || getFromCookie(STORAGE_KEYS.CLIENT_ENV);\n if (storageEnv && (storageEnv === 'production' || storageEnv === 'development' || storageEnv === 'local')) {\n tagadaClientEnv = storageEnv as 'production' | 'development' | 'local';\n }\n }\n\n // Get custom API base URL override (URL > localStorage > cookie)\n let tagadaClientBaseUrl: string | undefined;\n const urlBaseUrl = urlParams.get('tagadaClientBaseUrl');\n if (urlBaseUrl) {\n tagadaClientBaseUrl = urlBaseUrl;\n } else {\n const storageBaseUrl = getFromStorage(STORAGE_KEYS.CLIENT_BASE_URL) || getFromCookie(STORAGE_KEYS.CLIENT_BASE_URL);\n if (storageBaseUrl) {\n tagadaClientBaseUrl = storageBaseUrl;\n }\n }\n\n // Get display currency (URL > localStorage > cookie)\n let currency: string | undefined;\n const urlCurrency = urlParams.get('currency');\n if (urlCurrency) {\n currency = urlCurrency;\n } else {\n const storageCurrency = getFromStorage(STORAGE_KEYS.CURRENCY) || getFromCookie(STORAGE_KEYS.CURRENCY);\n if (storageCurrency) {\n currency = storageCurrency;\n }\n }\n\n // Get display locale (URL > localStorage > cookie)\n let locale: string | undefined;\n const urlLocale = urlParams.get('locale');\n if (urlLocale) {\n locale = urlLocale;\n } else {\n const storageLocale = getFromStorage(STORAGE_KEYS.LOCALE) || getFromCookie(STORAGE_KEYS.LOCALE);\n if (storageLocale) {\n locale = storageLocale;\n }\n }\n\n return {\n forceReset,\n token,\n funnelSessionId,\n funnelId,\n draft,\n funnelTracking,\n funnelEnv,\n tagadaClientEnv,\n tagadaClientBaseUrl,\n currency,\n locale,\n };\n}\n\n/**\n * Legacy alias for backward compatibility\n * @deprecated Use getSDKParams() instead\n */\nexport function getPreviewParams(): SDKOverrideParams {\n return getSDKParams();\n}\n\n/**\n * Check if draft mode is active\n * Uses centralized getSDKParams()\n */\nexport function isDraftMode(): boolean {\n const params = getSDKParams();\n return params.draft ?? false;\n}\n\n/**\n * Set draft mode in storage for persistence\n * \u26A0\uFE0F ONLY writes to localStorage (not cookies) to avoid resurrection issues\n */\nexport function setDraftMode(draft: boolean): void {\n if (typeof window === 'undefined') return;\n\n if (draft) {\n setInStorage(STORAGE_KEYS.DRAFT, 'true');\n } else {\n try {\n localStorage.removeItem(STORAGE_KEYS.DRAFT);\n } catch {\n // Storage not available\n }\n }\n}\n\n/**\n * Initialize SDK with override parameters\n * \n * This function handles SDK initialization based on override params:\n * 1. If forceReset flag is set: Clear all stored state (simulates hard refresh)\n * 2. If token in URL: Use it (override localStorage)\n * 3. If draft in URL: Persist it to storage\n * 4. If funnelTracking in URL: Persist it to storage\n * \n * @returns True if force reset was activated and state was cleared\n */\nexport function handlePreviewMode(debugMode = false): boolean {\n // \uD83D\uDD12 CRITICAL: Read URL token DIRECTLY first before any getSDKParams()\n // This ensures we have the URL token before any clearing happens\n let urlToken: string | null = null;\n if (typeof window !== 'undefined') {\n const urlParams = new URLSearchParams(window.location.search);\n urlToken = urlParams.get('token');\n }\n\n const params = getSDKParams();\n const shouldReset = params.forceReset || false;\n\n if (!shouldReset && !params.token) {\n // Not forcing reset and no explicit token override\n // But still persist draft/tracking if in URL\n persistSDKParamsFromURL();\n return false;\n }\n\n if (debugMode) {\n console.log('[SDK] Detected params:', params);\n console.log('[SDK] URL token (direct read):', urlToken ? urlToken.substring(0, 20) + '...' : 'none');\n }\n\n // CASE 1: Force reset - clear all state (simulates hard refresh)\n if (shouldReset) {\n if (debugMode) {\n console.log('[SDK] Force reset: Clearing all stored state');\n }\n\n clearClientToken();\n clearFunnelSessionCookie();\n\n // Clear all tagadapay-related localStorage keys\n if (typeof window !== 'undefined' && window.localStorage) {\n const keys = Object.keys(localStorage);\n keys.forEach(key => {\n if (key.startsWith('tagadapay_') || key.startsWith('tgd_')) {\n if (debugMode) {\n console.log(`[SDK] Clearing localStorage: ${key}`);\n }\n localStorage.removeItem(key);\n }\n });\n }\n }\n\n // CASE 2: Token in URL - override stored token\n // \uD83D\uDD12 CRITICAL: Use the directly-read URL token to avoid any race conditions\n const tokenToSet = urlToken || params.token;\n if (tokenToSet !== null && tokenToSet !== undefined) {\n if (debugMode) {\n console.log('[SDK] Setting token from URL:', tokenToSet.substring(0, 20) + '...');\n }\n\n if (tokenToSet === '' || tokenToSet === 'null') {\n // Explicitly cleared token\n clearClientToken();\n } else {\n // Set token from URL IMMEDIATELY after clearing\n setClientToken(tokenToSet);\n if (debugMode) {\n console.log('[SDK] \u2705 Token set in localStorage immediately after clear');\n }\n }\n } else if (shouldReset) {\n // Force reset but no token = clear stored token\n if (debugMode) {\n console.log('[SDK] Force reset mode (no token in URL)');\n }\n clearClientToken();\n }\n\n // CASE 3: Persist URL params to storage\n persistSDKParamsFromURL();\n\n // CASE 4: Funnel session ID in URL - will be used by FunnelClient\n if (params.funnelSessionId && debugMode) {\n console.log('[SDK] Using funnelSessionId from URL:', params.funnelSessionId);\n }\n\n return shouldReset;\n}\n\n/**\n * Persist SDK parameters from URL to storage\n * This ensures params survive page navigation\n */\nfunction persistSDKParamsFromURL(): void {\n if (typeof window === 'undefined') return;\n\n const urlParams = new URLSearchParams(window.location.search);\n\n // Persist draft mode if in URL\n const urlDraft = urlParams.get('draft');\n if (urlDraft !== null) {\n setDraftMode(urlDraft === 'true');\n }\n\n // Persist funnel tracking if in URL\n const urlTracking = urlParams.get('funnelTracking');\n if (urlTracking !== null) {\n setFunnelTracking(urlTracking !== 'false');\n }\n\n // Persist client environment if in URL\n const urlEnv = urlParams.get('tagadaClientEnv');\n if (urlEnv && (urlEnv === 'production' || urlEnv === 'development' || urlEnv === 'local')) {\n setClientEnvironment(urlEnv);\n }\n\n // Persist custom base URL if in URL\n const urlBaseUrl = urlParams.get('tagadaClientBaseUrl');\n if (urlBaseUrl) {\n setClientBaseUrl(urlBaseUrl);\n }\n}\n\n/**\n * Set funnel tracking mode in storage for persistence\n */\nexport function setFunnelTracking(enabled: boolean): void {\n if (typeof window === 'undefined') return;\n\n const value = enabled ? 'true' : 'false';\n setInStorage(STORAGE_KEYS.FUNNEL_TRACKING, value);\n setInCookie(STORAGE_KEYS.FUNNEL_TRACKING, value, 86400);\n}\n\n/**\n * Set client environment override in storage for persistence\n */\nexport function setClientEnvironment(env: 'production' | 'development' | 'local'): void {\n if (typeof window === 'undefined') return;\n\n setInStorage(STORAGE_KEYS.CLIENT_ENV, env);\n setInCookie(STORAGE_KEYS.CLIENT_ENV, env, 86400);\n}\n\n/**\n * Clear client environment override\n */\nexport function clearClientEnvironment(): void {\n if (typeof window === 'undefined') return;\n\n try {\n localStorage.removeItem(STORAGE_KEYS.CLIENT_ENV);\n clearFromCookie(STORAGE_KEYS.CLIENT_ENV);\n } catch {\n // Storage not available\n }\n}\n\n/**\n * Set custom API base URL override in storage for persistence\n */\nexport function setClientBaseUrl(baseUrl: string): void {\n if (typeof window === 'undefined') return;\n\n setInStorage(STORAGE_KEYS.CLIENT_BASE_URL, baseUrl);\n setInCookie(STORAGE_KEYS.CLIENT_BASE_URL, baseUrl, 86400);\n}\n\n/**\n * Clear custom API base URL override\n */\nexport function clearClientBaseUrl(): void {\n if (typeof window === 'undefined') return;\n\n try {\n localStorage.removeItem(STORAGE_KEYS.CLIENT_BASE_URL);\n clearFromCookie(STORAGE_KEYS.CLIENT_BASE_URL);\n } catch {\n // Storage not available\n }\n}\n\n/**\n * Check if we should use URL params over stored values\n * \n * Returns true if:\n * - Force reset is active, OR\n * - Explicit token/sessionId in URL (indicating intentional override)\n */\nexport function shouldUseUrlParams(): boolean {\n const params = getSDKParams();\n return !!(\n params.forceReset ||\n params.token !== null ||\n params.funnelSessionId !== null\n );\n}\n\n/**\n * Check if funnel tracking is enabled\n * Uses centralized getSDKParams()\n * Default is true for normal operations\n */\nexport function isFunnelTrackingEnabled(): boolean {\n const params = getSDKParams();\n return params.funnelTracking ?? true; // Default true\n}\n\n", "/**\n * Preview Mode Indicator - Auto-injected DOM element\n * \n * Automatically injects a visual indicator when SDK is in preview/draft mode\n * Works with vanilla JS/DOM - no React required\n */\n\nimport { isDraftMode, isFunnelTrackingEnabled, getSDKParams, setDraftMode, setFunnelTracking, clearClientEnvironment, clearClientBaseUrl } from './previewMode';\nimport { clearClientToken } from './tokenStorage';\nimport { clearFunnelSessionCookie } from './sessionStorage';\n\nlet indicatorElement: HTMLElement | null = null;\nlet isInjected = false;\n\n/**\n * Helper to clear a specific cookie with all possible domain/path combinations\n */\nfunction clearSpecificCookie(cookieName: string): void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return;\n\n const hostname = window.location.hostname;\n const parts = hostname.split('.');\n\n // All possible domains\n const domains = [\n '', // No domain (current)\n hostname, // Full hostname\n '.' + hostname, // Wildcard current\n ];\n\n // Add parent domains\n for (let i = 1; i < parts.length; i++) {\n const domain = parts.slice(i).join('.');\n domains.push(domain);\n domains.push('.' + domain);\n }\n\n // All possible paths\n const pathParts = window.location.pathname.split('/').filter(p => p);\n const paths = ['/'];\n let currentPath = '';\n pathParts.forEach(part => {\n currentPath += '/' + part;\n paths.push(currentPath);\n });\n\n // Try all combinations\n domains.forEach(domain => {\n paths.forEach(path => {\n const baseDelete = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=${path}`;\n const domainPart = domain ? `; domain=${domain}` : '';\n\n // Try all security flag variations\n document.cookie = baseDelete + domainPart;\n document.cookie = baseDelete + domainPart + '; secure';\n document.cookie = baseDelete + domainPart + '; SameSite=None; secure';\n document.cookie = baseDelete + domainPart + '; SameSite=Lax';\n document.cookie = baseDelete + domainPart + '; SameSite=Strict';\n });\n });\n}\n\n/**\n * Leave preview mode - Clear ALL storage (including Shopify cookies, all localStorage, etc.) and reload\n * \u26A0\uFE0F Nuclear option - clears everything to exit preview mode completely\n */\nfunction leavePreviewMode(): void {\n if (typeof window === 'undefined') return;\n\n const confirmed = confirm(\n '\uD83D\uDEAA Leave Preview Mode?\\n\\nThis will clear ALL cookies and localStorage (including Shopify session, cart, and preview settings) and reload the page.\\n\\nAre you sure?'\n );\n\n if (!confirmed) return;\n\n // STEP 0: Remove ALL preview params from URL immediately\n const url = new URL(window.location.href);\n const previewParams = [\n 'draft', 'funnelEnv', 'funnelTracking', 'tagadaClientEnv',\n 'tagadaClientBaseUrl', 'forceReset', 'funnelId', 'funnelSessionId', 'token',\n ];\n\n previewParams.forEach(param => url.searchParams.delete(param));\n window.history.replaceState({}, '', url.href);\n\n // STEP 0.5: Install global cookie blocker for tgd_draft\n try {\n const cookieDescriptor = Object.getOwnPropertyDescriptor(Document.prototype, 'cookie') ||\n Object.getOwnPropertyDescriptor(HTMLDocument.prototype, 'cookie');\n\n if (cookieDescriptor && cookieDescriptor.set) {\n Object.defineProperty(document, 'cookie', {\n configurable: true,\n enumerable: true,\n get: function () { return cookieDescriptor.get ? cookieDescriptor.get.call(this) : ''; },\n set: function (val) {\n if (typeof val === 'string') {\n const normalizedVal = val.toLowerCase();\n if (normalizedVal.includes('tgd_draft') ||\n normalizedVal.includes('tgd-draft') ||\n normalizedVal.includes('tgd.draft') ||\n normalizedVal.includes('tgddraft')) {\n\n // Allow deletion attempts\n if (normalizedVal.includes('max-age=0') ||\n normalizedVal.includes('expires=thu, 01 jan 1970')) {\n if (cookieDescriptor.set) {\n cookieDescriptor.set.call(this, val);\n }\n return;\n }\n\n // Block all creation/update attempts\n console.warn('\uD83D\uDEE1\uFE0F [TagadaPay] BLOCKED: tgd_draft should never be a cookie');\n return;\n }\n }\n\n if (cookieDescriptor.set) {\n cookieDescriptor.set.call(this, val);\n }\n }\n });\n }\n } catch (e) {\n console.warn('[TagadaPay] Could not install cookie blocker:', e);\n }\n\n // STEP 1: Clear TagadaPay localStorage keys\n if (window.localStorage) {\n try {\n localStorage.removeItem('tgd_draft');\n localStorage.removeItem('tgd_funnel_tracking');\n localStorage.removeItem('tgd_client_env');\n localStorage.removeItem('tgd_client_base_url');\n localStorage.removeItem('cms_token');\n } catch (e) {\n console.warn('[TagadaPay] Failed to clear some localStorage keys:', e);\n }\n }\n\n // Clear SDK utilities\n clearClientToken();\n clearFunnelSessionCookie();\n clearClientEnvironment();\n clearClientBaseUrl();\n\n // STEP 2: Clear ALL storage\n if (window.localStorage) {\n localStorage.clear();\n }\n if (window.sessionStorage) {\n sessionStorage.clear();\n }\n\n // STEP 3: Clear known TagadaPay cookies\n const tagadaCookies = [\n 'tgd-funnel-session-id', 'tgd_draft', 'tgd_funnel_tracking',\n 'tgd_client_env', 'tgd_client_base_url', 'cms_token', 'tagadapay_session',\n ];\n\n tagadaCookies.forEach(cookieName => clearSpecificCookie(cookieName));\n\n // STEP 3.5: Clear alternative cookie name formats\n const alternativeNames = ['tgd-draft', 'tgd_draft', 'tgd.draft', 'tgddraft'];\n alternativeNames.forEach(cookieName => clearSpecificCookie(cookieName));\n\n // STEP 4: Clear ALL remaining cookies aggressively\n if (document.cookie) {\n const cookies = document.cookie.split(';');\n cookies.forEach(cookie => {\n const cookieName = cookie.split('=')[0].trim();\n if (!cookieName) return;\n\n const hostname = window.location.hostname;\n const parts = hostname.split('.');\n const domains = ['', hostname, '.' + hostname];\n\n for (let i = 1; i < parts.length; i++) {\n const domain = parts.slice(i).join('.');\n domains.push(domain);\n domains.push('.' + domain);\n }\n\n const pathParts = window.location.pathname.split('/').filter(p => p);\n const paths = ['/'];\n let currentPath = '';\n pathParts.forEach(part => {\n currentPath += '/' + part;\n paths.push(currentPath);\n });\n\n domains.forEach(domain => {\n paths.forEach(path => {\n const baseDelete = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=${path}`;\n const domainPart = domain ? `; domain=${domain}` : '';\n\n document.cookie = baseDelete + domainPart;\n document.cookie = baseDelete + domainPart + '; secure';\n document.cookie = baseDelete + domainPart + '; SameSite=None; secure';\n document.cookie = baseDelete + domainPart + '; SameSite=Lax';\n document.cookie = baseDelete + domainPart + '; SameSite=Strict';\n document.cookie = baseDelete + domainPart + '; secure; SameSite=None';\n document.cookie = baseDelete + domainPart + '; secure; SameSite=Lax';\n document.cookie = baseDelete + domainPart + '; secure; SameSite=Strict';\n });\n });\n });\n }\n\n // Final cleanup and reload\n setTimeout(() => {\n if (window.localStorage && localStorage.length > 0) {\n localStorage.clear();\n }\n\n clearSpecificCookie('tgd_draft');\n\n if (typeof window.stop === 'function') {\n window.stop();\n }\n\n window.location.replace(url.href);\n }, 10);\n}\n\n/**\n * Inject the preview mode indicator into the DOM\n * Called automatically during SDK initialization if preview mode is active\n */\nexport function injectPreviewModeIndicator(): void {\n // Skip if already injected or not in browser\n if (isInjected || typeof window === 'undefined' || typeof document === 'undefined') {\n return;\n }\n\n const params = getSDKParams();\n const draftMode = isDraftMode();\n const trackingDisabled = !isFunnelTrackingEnabled();\n const hasCustomEnv = !!(params.tagadaClientEnv || params.tagadaClientBaseUrl);\n\n // Only inject if in preview/dev mode\n if (!draftMode && !trackingDisabled && !hasCustomEnv) {\n return;\n }\n\n // Create container\n const container = document.createElement('div');\n container.id = 'tgd-preview-indicator';\n container.style.cssText = `\n position: fixed;\n bottom: 16px;\n right: 16px;\n z-index: 999999;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n `;\n\n // Create badge\n const badge = document.createElement('div');\n badge.style.cssText = `\n background: ${draftMode ? '#ff9500' : '#007aff'};\n color: white;\n padding: 8px 12px;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 600;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 6px;\n `;\n badge.innerHTML = `\n <span style=\"font-size: 16px;\">\uD83D\uDD0D</span>\n <span>${draftMode ? 'Preview Mode' : 'Dev Mode'}</span>\n `;\n\n // Create details popup (with padding-top to bridge gap with badge)\n const details = document.createElement('div');\n details.style.cssText = `\n position: absolute;\n bottom: calc(100% + 8px);\n right: 0;\n background: white;\n border: 1px solid #e5e5e5;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n padding: 12px;\n min-width: 250px;\n font-size: 12px;\n line-height: 1.5;\n display: none;\n `;\n details.style.paddingTop = '20px'; // Extra padding to bridge the gap\n\n // Add invisible bridge between badge and popup to prevent flickering\n const bridge = document.createElement('div');\n bridge.style.cssText = `\n position: absolute;\n bottom: 100%;\n left: 0;\n right: 0;\n height: 8px;\n display: none;\n `;\n\n // Build details content\n let detailsHTML = '<div style=\"margin-bottom: 8px; font-weight: 600; color: #1d1d1f;\">Current Environment</div>';\n detailsHTML += '<div style=\"display: flex; flex-direction: column; gap: 6px;\">';\n\n if (draftMode) {\n detailsHTML += `\n <div style=\"display: flex; justify-content: space-between; color: #86868b;\">\n <span>Draft Mode:</span>\n <span style=\"color: #ff9500; font-weight: 600;\">ON</span>\n </div>\n `;\n }\n\n if (trackingDisabled) {\n detailsHTML += `\n <div style=\"display: flex; justify-content: space-between; color: #86868b;\">\n <span>Tracking:</span>\n <span style=\"color: #ff3b30; font-weight: 600;\">DISABLED</span>\n </div>\n `;\n }\n\n if (params.funnelEnv) {\n detailsHTML += `\n <div style=\"display: flex; justify-content: space-between; color: #86868b;\">\n <span>Funnel Env:</span>\n <span style=\"color: #1d1d1f; font-weight: 600; font-family: monospace; font-size: 11px;\">\n ${params.funnelEnv}\n </span>\n </div>\n `;\n }\n\n if (params.tagadaClientEnv) {\n detailsHTML += `\n <div style=\"display: flex; justify-content: space-between; color: #86868b;\">\n <span>API Env:</span>\n <span style=\"color: #1d1d1f; font-weight: 600; font-family: monospace; font-size: 11px;\">\n ${params.tagadaClientEnv}\n </span>\n </div>\n `;\n }\n\n if (params.tagadaClientBaseUrl) {\n detailsHTML += `\n <div style=\"color: #86868b;\">\n <div style=\"margin-bottom: 4px;\">API URL:</div>\n <div style=\"color: #1d1d1f; font-weight: 600; font-family: monospace; font-size: 10px; word-break: break-all; background: #f5f5f7; padding: 4px 6px; border-radius: 4px;\">\n ${params.tagadaClientBaseUrl}\n </div>\n </div>\n `;\n }\n\n if (params.funnelId) {\n detailsHTML += `\n <div style=\"color: #86868b; margin-top: 4px; padding-top: 8px; border-top: 1px solid #e5e5e5;\">\n <div style=\"margin-bottom: 4px;\">Funnel ID:</div>\n <div style=\"color: #1d1d1f; font-family: monospace; font-size: 10px; word-break: break-all; background: #f5f5f7; padding: 4px 6px; border-radius: 4px;\">\n ${params.funnelId}\n </div>\n </div>\n `;\n }\n\n detailsHTML += '</div>';\n detailsHTML += `\n <div style=\"margin-top: 12px; padding-top: 8px; border-top: 1px solid #e5e5e5; font-size: 11px; color: #86868b; text-align: center;\">\n Add <code style=\"background: #f5f5f7; padding: 2px 4px; border-radius: 3px;\">?forceReset=true</code> to reset\n </div>\n `;\n\n // Add action button\n detailsHTML += `\n <div style=\"margin-top: 12px; padding-top: 8px; border-top: 1px solid #e5e5e5;\">\n <button id=\"tgd-leave-preview\" style=\"\n background: #ff3b30;\n color: white;\n border: none;\n border-radius: 6px;\n padding: 10px 12px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: opacity 0.2s;\n width: 100%;\n \">\n \uD83D\uDEAA Leave Preview Mode\n </button>\n </div>\n `;\n\n details.innerHTML = detailsHTML;\n\n // Hover behavior - keep popup visible when hovering over badge, bridge, or popup\n let isHovering = false;\n\n const showDetails = () => {\n isHovering = true;\n details.style.display = 'block';\n bridge.style.display = 'block';\n };\n\n const hideDetails = () => {\n isHovering = false;\n setTimeout(() => {\n if (!isHovering) {\n details.style.display = 'none';\n bridge.style.display = 'none';\n }\n }, 100); // Small delay to allow moving between elements\n };\n\n badge.addEventListener('mouseenter', showDetails);\n badge.addEventListener('mouseleave', hideDetails);\n bridge.addEventListener('mouseenter', showDetails);\n bridge.addEventListener('mouseleave', hideDetails);\n details.addEventListener('mouseenter', showDetails);\n details.addEventListener('mouseleave', hideDetails);\n\n // Button: Leave preview mode\n const leavePreviewBtn = details.querySelector('#tgd-leave-preview') as HTMLButtonElement;\n if (leavePreviewBtn) {\n leavePreviewBtn.addEventListener('mouseenter', () => {\n leavePreviewBtn.style.opacity = '0.8';\n });\n leavePreviewBtn.addEventListener('mouseleave', () => {\n leavePreviewBtn.style.opacity = '1';\n });\n leavePreviewBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n leavePreviewMode();\n });\n }\n\n // Assemble\n container.appendChild(badge);\n container.appendChild(bridge); // Add invisible bridge\n container.appendChild(details);\n\n // Inject into DOM\n document.body.appendChild(container);\n indicatorElement = container;\n isInjected = true;\n}\n\n/**\n * Remove the preview mode indicator from the DOM\n */\nexport function removePreviewModeIndicator(): void {\n if (indicatorElement && indicatorElement.parentNode) {\n indicatorElement.parentNode.removeChild(indicatorElement);\n indicatorElement = null;\n isInjected = false;\n }\n}\n\n/**\n * Check if indicator is currently injected\n */\nexport function isIndicatorInjected(): boolean {\n return isInjected;\n}\n\n", "import { detectEnvironment } from './config/environment';\nimport { ApiClient } from './resources/apiClient';\nimport { FunnelAction, FunnelActionType, FunnelNavigationResult, FunnelResource, SimpleFunnelContext } from './resources/funnel';\nimport { EventDispatcher } from './utils/eventDispatcher';\nimport { PluginConfig } from './utils/pluginConfig';\nimport { getSDKParams } from './utils/previewMode';\nimport { injectPreviewModeIndicator } from './utils/previewModeIndicator';\nimport { getFunnelSessionCookie, setFunnelSessionCookie } from './utils/sessionStorage';\n\n/**\n * Tracking providers supported by the SDK.\n * Mirrors `TrackingType` in `apps/crm-app/.../types/tracking.ts`.\n */\nexport enum TrackingProvider {\n FACEBOOK = 'facebook',\n TIKTOK = 'tiktok',\n SNAPCHAT = 'snapchat',\n META_CONVERSION = 'meta_conversion',\n GTM = 'gtm',\n}\n\n/**\n * Base tracking config (all providers)\n */\nexport interface BaseTrackingConfig {\n enabled: boolean;\n}\n\n/**\n * Pixel-based providers (Facebook, TikTok)\n */\nexport interface PixelTrackingConfig extends BaseTrackingConfig {\n pixelId: string;\n events: {\n PageView: boolean;\n InitiateCheckout: boolean;\n Purchase: boolean;\n };\n}\n\n/**\n * Snapchat pixel config (extends base pixel events)\n */\nexport interface SnapchatTrackingConfig extends BaseTrackingConfig {\n pixelId: string;\n events: {\n PageView: boolean;\n InitiateCheckout: boolean;\n Purchase: boolean;\n AddToCart: boolean;\n ViewContent: boolean;\n Search: boolean;\n AddToWishlist: boolean;\n CompleteRegistration: boolean;\n };\n}\n\n/**\n * Meta Conversion API config\n */\nexport interface MetaConversionTrackingConfig extends BaseTrackingConfig {\n accessToken: string;\n pixelId: string;\n publishPurchaseIfNewCustomerOnly: boolean;\n}\n\n/**\n * Google Tag Manager config\n */\nexport interface GTMTrackingConfig extends BaseTrackingConfig {\n containerId: string;\n events: {\n PageView: boolean;\n InitiateCheckout: boolean;\n Purchase: boolean;\n AddToCart: boolean;\n ViewContent: boolean;\n };\n}\n\n/**\n * Union of all tracking configs.\n * This mirrors `TrackingFormValues` from the CRM.\n */\nexport type PixelConfig =\n | PixelTrackingConfig\n | SnapchatTrackingConfig\n | MetaConversionTrackingConfig\n | GTMTrackingConfig;\n\n/**\n * Runtime step configuration injected from the CRM\n * Contains payment flows, static resources, scripts, and tracking configs\n */\nexport interface RuntimeStepConfig {\n payment?: {\n paymentFlowId?: string;\n };\n staticResources?: Record<string, string>;\n scripts?: Array<{\n name: string;\n enabled: boolean;\n content: string;\n position?: 'head-start' | 'head-end' | 'body-start' | 'body-end';\n }>;\n // Tracking configs keyed by provider (e.g. 'facebook', 'tiktok', 'snapchat', 'meta_conversion', 'gtm')\n pixels?: {\n [TrackingProvider.FACEBOOK]?: PixelTrackingConfig[];\n [TrackingProvider.TIKTOK]?: PixelTrackingConfig[];\n [TrackingProvider.SNAPCHAT]?: SnapchatTrackingConfig[];\n [TrackingProvider.META_CONVERSION]?: MetaConversionTrackingConfig[];\n [TrackingProvider.GTM]?: GTMTrackingConfig[];\n };\n}\n\n/**\n * Get the funnel ID from the injected HTML\n * Returns undefined if not available\n */\nfunction getAssignedFunnelId(): string | undefined {\n if (typeof window === 'undefined') return undefined;\n\n // Method 1: Window variable (preferred - synchronous, fast)\n if ((window as any).__TGD_FUNNEL_ID__) {\n return (window as any).__TGD_FUNNEL_ID__;\n }\n\n // Method 2: Meta tag fallback\n if (typeof document !== 'undefined') {\n const meta = document.querySelector('meta[name=\"x-funnel-id\"]');\n return meta?.getAttribute('content') || undefined;\n }\n\n return undefined;\n}\n\n/**\n * Get the assigned A/B test variant ID from the injected HTML\n * Returns undefined if not in an A/B test\n */\nfunction getAssignedFunnelVariant(): string | undefined {\n if (typeof window === 'undefined') return undefined;\n\n // Method 1: Window variable (preferred - synchronous, fast)\n if ((window as any).__TGD_FUNNEL_VARIANT_ID__) {\n return (window as any).__TGD_FUNNEL_VARIANT_ID__;\n }\n\n // Method 2: Meta tag fallback\n if (typeof document !== 'undefined') {\n const meta = document.querySelector('meta[name=\"x-funnel-variant-id\"]');\n return meta?.getAttribute('content') || undefined;\n }\n\n return undefined;\n}\n\n/**\n * Get the funnel step ID from the injected HTML\n * Returns undefined if not available\n */\nfunction getAssignedFunnelStep(): string | undefined {\n if (typeof window === 'undefined') return undefined;\n\n // Method 1: Window variable (preferred - synchronous, fast)\n if ((window as any).__TGD_FUNNEL_STEP_ID__) {\n return (window as any).__TGD_FUNNEL_STEP_ID__;\n }\n\n // Method 2: Meta tag fallback\n if (typeof document !== 'undefined') {\n const meta = document.querySelector('meta[name=\"x-funnel-step-id\"]');\n return meta?.getAttribute('content') || undefined;\n }\n\n return undefined;\n}\n\n/**\n * Parse step config from a string value (handles both JSON and URL-encoded formats)\n * Robust parsing with multiple fallback strategies\n */\nfunction parseStepConfig(value: string): RuntimeStepConfig | undefined {\n if (!value || typeof value !== 'string') return undefined;\n\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n\n // Try parsing strategies in order of likelihood\n const strategies = [\n // Strategy 1: Direct JSON parse (for properly escaped window variable)\n () => JSON.parse(trimmed),\n // Strategy 2: URL decode then JSON parse (for meta tag)\n () => JSON.parse(decodeURIComponent(trimmed)),\n // Strategy 3: Double URL decode (edge case: double-encoded)\n () => JSON.parse(decodeURIComponent(decodeURIComponent(trimmed))),\n ];\n\n for (const strategy of strategies) {\n try {\n const result = strategy();\n if (result && typeof result === 'object') {\n return result as RuntimeStepConfig;\n }\n } catch {\n // Try next strategy\n }\n }\n\n // All strategies failed\n if (typeof console !== 'undefined') {\n console.warn('[SDK] Failed to parse stepConfig:', trimmed.substring(0, 100));\n }\n return undefined;\n}\n\n/**\n * Local funnel configuration for development\n * Loaded from /config/funnel.local.json\n */\nexport interface LocalFunnelConfig {\n /** Funnel ID to use in local dev */\n funnelId?: string;\n /** Step ID to simulate */\n stepId?: string;\n /** Static resources (offer ID, product ID, etc.) */\n staticResources?: Record<string, string>;\n /** Payment flow ID override */\n paymentFlowId?: string;\n /** Custom scripts for local testing */\n scripts?: RuntimeStepConfig['scripts'];\n /** Pixel tracking config */\n pixels?: RuntimeStepConfig['pixels'];\n}\n\n// Cache for local funnel config (loaded once)\nlet localFunnelConfigCache: LocalFunnelConfig | null | undefined = undefined;\nlet localFunnelConfigLoading = false;\n\n/**\n * Check if we're in true local development (not CDN deployment)\n */\nfunction isLocalDevelopment(): boolean {\n if (typeof window === 'undefined') return false;\n const hostname = window.location.hostname;\n // True local: localhost without CDN subdomain pattern\n return hostname === 'localhost' ||\n hostname === '127.0.0.1' ||\n (hostname.endsWith('.localhost') && !hostname.includes('.cdn.'));\n}\n\n/**\n * Load local funnel config from /config/funnel.local.json (for local dev only)\n * This replaces the old resources.static.json with a more complete structure\n * \n * Example funnel.local.json:\n * {\n * \"funnelId\": \"funnelv2_xxx\",\n * \"stepId\": \"step_checkout\",\n * \"staticResources\": {\n * \"offer\": \"offer_xxx\",\n * \"product\": \"product_xxx\"\n * },\n * \"paymentFlowId\": \"flow_xxx\"\n * }\n */\nexport async function loadLocalFunnelConfig(): Promise<LocalFunnelConfig | null> {\n // Only in true local development\n if (!isLocalDevelopment()) return null;\n\n // Return cached value if already loaded\n if (localFunnelConfigCache !== undefined) {\n return localFunnelConfigCache;\n }\n\n // Prevent concurrent loads\n if (localFunnelConfigLoading) {\n // Wait for existing load\n await new Promise(resolve => setTimeout(resolve, 100));\n return localFunnelConfigCache ?? null;\n }\n\n localFunnelConfigLoading = true;\n\n try {\n console.log('\uD83D\uDEE0\uFE0F [SDK] Loading local funnel config from /config/funnel.local.json...');\n const response = await fetch('/config/funnel.local.json');\n if (!response.ok) {\n console.log('\uD83D\uDEE0\uFE0F [SDK] funnel.local.json not found (this is fine in production)');\n localFunnelConfigCache = null;\n return null;\n }\n\n const config = await response.json() as LocalFunnelConfig;\n console.log('\uD83D\uDEE0\uFE0F [SDK] \u2705 Loaded local funnel config:', config);\n localFunnelConfigCache = config;\n return config;\n } catch (error) {\n console.log('\uD83D\uDEE0\uFE0F [SDK] funnel.local.json not available:', error);\n localFunnelConfigCache = null;\n return null;\n } finally {\n localFunnelConfigLoading = false;\n }\n}\n\n/**\n * Get the cached local funnel config (sync access after loadLocalFunnelConfig)\n */\nexport function getLocalFunnelConfig(): LocalFunnelConfig | null {\n return localFunnelConfigCache ?? null;\n}\n\n/**\n * Convert LocalFunnelConfig to RuntimeStepConfig\n */\nfunction localConfigToStepConfig(local: LocalFunnelConfig): RuntimeStepConfig {\n return {\n payment: local.paymentFlowId ? { paymentFlowId: local.paymentFlowId } : undefined,\n staticResources: local.staticResources,\n scripts: local.scripts,\n pixels: local.pixels,\n };\n}\n\n/**\n * Get the runtime step configuration\n * Contains payment flow, static resources, scripts, and pixel tracking\n * \n * Priority:\n * 1. Local funnel config (local dev only - /config/funnel.local.json) - HIGHEST in local dev\n * 2. Window variable (production - HTML injection)\n * 3. Meta tag (production - HTML injection fallback)\n * \n * This allows local developers to override injected config for testing.\n * \n * Returns undefined if not available\n */\nexport function getAssignedStepConfig(): RuntimeStepConfig | undefined {\n if (typeof window === 'undefined') return undefined;\n\n // Method 1: Local dev override (HIGHEST PRIORITY in local dev)\n // Allows developers to test different configurations without redeploying\n const localConfig = getLocalFunnelConfig();\n if (localConfig) {\n console.log('\uD83D\uDEE0\uFE0F [SDK] Using local funnel.local.json (overrides injected)');\n return localConfigToStepConfig(localConfig);\n }\n\n // Method 2: Window variable (production - HTML injection)\n const windowValue = (window as any).__TGD_STEP_CONFIG__;\n if (windowValue) {\n const parsed = parseStepConfig(windowValue);\n if (parsed) return parsed;\n }\n\n // Method 3: Meta tag fallback (URL-encoded)\n if (typeof document !== 'undefined') {\n const meta = document.querySelector('meta[name=\"x-step-config\"]');\n const content = meta?.getAttribute('content');\n if (content) {\n const parsed = parseStepConfig(content);\n if (parsed) return parsed;\n }\n }\n\n return undefined;\n}\n\n/**\n * Get the assigned payment flow ID from step config or legacy injection\n * Returns undefined if not available\n */\nexport function getAssignedPaymentFlowId(): string | undefined {\n // Method 1: New stepConfig (preferred)\n const stepConfig = getAssignedStepConfig();\n if (stepConfig?.payment?.paymentFlowId) {\n return stepConfig.payment.paymentFlowId;\n }\n\n // Method 2: Legacy direct injection (backward compatibility)\n if (typeof window !== 'undefined') {\n // Legacy window variable\n if ((window as any).__TGD_PAYMENT_FLOW_ID__) {\n return (window as any).__TGD_PAYMENT_FLOW_ID__;\n }\n // Legacy meta tag\n if (typeof document !== 'undefined') {\n const meta = document.querySelector('meta[name=\"x-payment-flow-id\"]');\n return meta?.getAttribute('content') || undefined;\n }\n }\n\n return undefined;\n}\n\n/**\n * Get the assigned static resources from step config\n * Returns undefined if not available\n */\nexport function getAssignedStaticResources(): Record<string, string> | undefined {\n const stepConfig = getAssignedStepConfig();\n return stepConfig?.staticResources;\n}\n\n/**\n * Get the assigned scripts from step config\n * Returns only enabled scripts, filtered by position if specified\n */\nexport function getAssignedScripts(position?: 'head-start' | 'head-end' | 'body-start' | 'body-end'): RuntimeStepConfig['scripts'] {\n const stepConfig = getAssignedStepConfig();\n if (!stepConfig?.scripts) return undefined;\n\n // Filter enabled scripts\n let scripts = stepConfig.scripts.filter(s => s.enabled);\n\n // Filter by position if specified\n if (position) {\n scripts = scripts.filter(s => s.position === position || (!s.position && position === 'head-end'));\n }\n\n return scripts.length > 0 ? scripts : undefined;\n}\n\n/**\n * Get assigned pixel tracking configuration (normalized to arrays)\n * Always returns arrays of PixelConfig for consistent consumption.\n */\nexport function getAssignedPixels(): {\n [TrackingProvider.FACEBOOK]?: PixelTrackingConfig[];\n [TrackingProvider.TIKTOK]?: PixelTrackingConfig[];\n [TrackingProvider.SNAPCHAT]?: SnapchatTrackingConfig[];\n [TrackingProvider.META_CONVERSION]?: MetaConversionTrackingConfig[];\n [TrackingProvider.GTM]?: GTMTrackingConfig[];\n} | undefined {\n const stepConfig = getAssignedStepConfig();\n const rawPixels = stepConfig?.pixels;\n if (!rawPixels || typeof rawPixels !== 'object') return undefined;\n\n const normalized: Record<string, PixelConfig[]> = {};\n\n for (const [key, value] of Object.entries(rawPixels)) {\n if (!value) continue;\n\n if (Array.isArray(value)) {\n // Already an array\n normalized[key] = value as PixelConfig[];\n } else if (typeof value === 'object') {\n // Single object - wrap in array\n normalized[key] = [value as PixelConfig];\n }\n // Skip invalid entries\n }\n\n return Object.keys(normalized).length > 0 ? normalized : undefined;\n}\n\nexport interface FunnelClientConfig {\n apiClient: ApiClient;\n debugMode?: boolean;\n pluginConfig?: PluginConfig;\n environment?: {\n environment: 'local' | 'development' | 'production' | 'staging';\n };\n /**\n * Automatically redirect to result.url after navigation (default: true)\n * Set to false if you want to handle navigation manually\n */\n autoRedirect?: boolean;\n /**\n * Override funnelId from rawPluginConfig\n */\n funnelId?: string;\n /**\n * Override stepId from rawPluginConfig\n */\n stepId?: string;\n}\n\nexport interface FunnelState {\n context: SimpleFunnelContext | null;\n isLoading: boolean;\n isInitialized: boolean;\n isNavigating: boolean;\n error: Error | null;\n sessionError: Error | null;\n}\n\nexport class FunnelClient {\n public state: FunnelState;\n private resource: FunnelResource;\n private eventDispatcher = new EventDispatcher<FunnelState>();\n private config: FunnelClientConfig;\n\n // Guards\n private isInitializing = false;\n private initializationAttempted = false;\n\n constructor(config: FunnelClientConfig) {\n this.config = config;\n this.resource = new FunnelResource(config.apiClient);\n\n this.state = {\n context: null,\n isLoading: false,\n isInitialized: false,\n isNavigating: false,\n error: null,\n sessionError: null,\n };\n }\n\n /**\n * Update configuration (e.g. when plugin config loads)\n */\n setConfig(config: Partial<FunnelClientConfig>) {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Subscribe to state changes\n */\n subscribe(listener: (state: FunnelState) => void): () => void {\n return this.eventDispatcher.subscribe(listener);\n }\n\n /**\n * Get current state\n */\n getState(): FunnelState {\n return this.state;\n }\n\n /**\n * Get the session ID that would be used for initialization (URL params or cookie)\n * This allows getting the session ID even before the client is fully initialized.\n */\n getDetectedSessionId(): string | null {\n // Priority 1: Already initialized session\n if (this.state.context?.sessionId) {\n return this.state.context.sessionId;\n }\n\n if (typeof window === 'undefined') return null;\n\n // Priority 2: URL params\n const params = new URLSearchParams(window.location.search);\n const urlSessionId = params.get('funnelSessionId');\n if (urlSessionId) return urlSessionId;\n\n // Priority 3: Cookie\n return getFunnelSessionCookie() || null;\n }\n\n /**\n * Reset initialization state (used for back-button restores)\n */\n resetInitialization() {\n this.initializationAttempted = false;\n this.isInitializing = false;\n // Clear context to force a fresh autoInitialize call to hit the backend\n this.updateState({\n context: null,\n isInitialized: false,\n });\n }\n\n /**\n * Initialize session with automatic detection (cookies, URL, etc.)\n */\n async autoInitialize(\n authSession: { customerId: string; sessionId: string },\n store: { id: string; accountId: string },\n funnelId?: string\n ): Promise<SimpleFunnelContext | null> {\n if (this.state.context) return this.state.context;\n if (this.isInitializing) return null;\n if (this.initializationAttempted) return null;\n\n this.initializationAttempted = true;\n this.isInitializing = true;\n this.updateState({ isLoading: true, error: null });\n\n try {\n // \uD83C\uDFAF Get detected session ID\n const existingSessionId = this.getDetectedSessionId();\n\n // URL params for funnelId\n const params = new URLSearchParams(typeof window !== 'undefined' ? window.location.search : '');\n const urlFunnelId = params.get('funnelId');\n const effectiveFunnelId = urlFunnelId || funnelId;\n\n // \uD83C\uDFAF Read funnel tracking data from injected HTML\n const injectedFunnelId = getAssignedFunnelId(); // Funnel ID from server\n const funnelVariantId = getAssignedFunnelVariant(); // A/B test variant ID\n const injectedStepId = getAssignedFunnelStep(); // Current step ID\n\n // \uD83C\uDFAF Get SDK override parameters (draft, funnelTracking, etc.)\n const sdkParams = getSDKParams();\n\n // Priority: config override > injected > URL/prop\n const finalFunnelId = this.config.funnelId || injectedFunnelId || effectiveFunnelId;\n const finalStepId = this.config.stepId || injectedStepId;\n\n // \uD83C\uDFAF Determine funnelEnv from URL params\n const urlParams = typeof window !== 'undefined' ? new URLSearchParams(window.location.search) : null;\n const funnelEnv = urlParams?.get('funnelEnv') as 'staging' | 'production' | null;\n\n if (this.config.debugMode) {\n console.log('\uD83D\uDE80 [FunnelClient] Auto-initializing...', {\n existingSessionId,\n effectiveFunnelId: finalFunnelId,\n funnelVariantId, // \uD83C\uDFAF Log variant ID for debugging\n funnelStepId: finalStepId, // \uD83C\uDFAF Log step ID for debugging\n draft: sdkParams.draft, // \uD83C\uDFAF Log draft mode\n funnelTracking: sdkParams.funnelTracking, // \uD83C\uDFAF Log tracking flag\n funnelEnv, // \uD83C\uDFAF Log funnel environment\n tagadaClientEnv: sdkParams.tagadaClientEnv, // \uD83C\uDFAF Log client environment\n tagadaClientBaseUrl: sdkParams.tagadaClientBaseUrl, // \uD83C\uDFAF Log custom API URL\n source: {\n funnelId: this.config.funnelId ? 'config' : injectedFunnelId ? 'injected' : effectiveFunnelId ? 'url/prop' : 'none',\n stepId: this.config.stepId ? 'config' : injectedStepId ? 'injected' : 'none',\n },\n });\n }\n\n // Note: We proceed even without funnelId/sessionId - the backend will create a new anonymous session if needed\n\n const response = await this.resource.initialize({\n cmsSession: {\n customerId: authSession.customerId,\n sessionId: authSession.sessionId,\n storeId: store.id,\n accountId: store.accountId,\n },\n funnelId: finalFunnelId,\n existingSessionId: existingSessionId || undefined,\n currentUrl: typeof window !== 'undefined' ? window.location.href : undefined,\n funnelVariantId, // \uD83C\uDFAF Pass A/B test variant ID to backend\n funnelStepId: finalStepId, // \uD83C\uDFAF Pass step ID to backend (with config override)\n draft: sdkParams.draft, // \uD83C\uDFAF Pass draft mode explicitly (more robust than URL parsing)\n funnelTracking: sdkParams.funnelTracking, // \uD83C\uDFAF Pass funnel tracking flag explicitly\n funnelEnv: funnelEnv || undefined, // \uD83C\uDFAF Pass funnel environment (staging/production)\n tagadaClientEnv: sdkParams.tagadaClientEnv, // \uD83C\uDFAF Pass client environment override\n tagadaClientBaseUrl: sdkParams.tagadaClientBaseUrl, // \uD83C\uDFAF Pass custom API base URL\n currency: sdkParams.currency, // \uD83C\uDF0D Pass display currency override\n locale: sdkParams.locale, // \uD83C\uDF0D Pass display locale override\n });\n\n if (response.success && response.context) {\n const enriched = this.enrichContext(response.context);\n this.handleSessionSuccess(enriched);\n\n // \uD83D\uDD0D Auto-inject preview mode indicator if in preview/dev mode\n injectPreviewModeIndicator();\n\n return enriched;\n } else {\n throw new Error(response.error || 'Failed to initialize funnel session');\n }\n\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.updateState({ error: err, isLoading: false });\n if (this.config.debugMode) {\n console.error('\u274C [FunnelClient] Init failed:', err);\n }\n throw err;\n } finally {\n this.isInitializing = false;\n }\n }\n\n /**\n * Manual initialization\n */\n async initialize(\n authSession: { customerId: string; sessionId: string },\n store: { id: string; accountId: string },\n funnelId?: string,\n entryStepId?: string\n ) {\n this.updateState({ isLoading: true, error: null });\n try {\n // \uD83C\uDFAF Read A/B test variant ID and step ID from injected HTML\n const funnelVariantId = getAssignedFunnelVariant();\n const funnelStepId = getAssignedFunnelStep();\n\n if (this.config.debugMode) {\n if (funnelVariantId) console.log('\uD83C\uDFAF [FunnelClient] Detected A/B test variant:', funnelVariantId);\n if (funnelStepId) console.log('\uD83C\uDFAF [FunnelClient] Detected step ID:', funnelStepId);\n }\n\n const response = await this.resource.initialize({\n cmsSession: {\n customerId: authSession.customerId,\n sessionId: authSession.sessionId,\n storeId: store.id,\n accountId: store.accountId,\n },\n funnelId: funnelId,\n entryStepId,\n currentUrl: typeof window !== 'undefined' ? window.location.href : undefined,\n funnelVariantId, // \uD83C\uDFAF Pass A/B test variant ID to backend\n funnelStepId, // \uD83C\uDFAF Pass step ID to backend\n });\n\n if (response.success && response.context) {\n const enriched = this.enrichContext(response.context);\n this.handleSessionSuccess(enriched);\n\n // \uD83D\uDD0D Auto-inject preview mode indicator if in preview/dev mode\n injectPreviewModeIndicator();\n\n return enriched;\n } else {\n throw new Error(response.error || 'Failed to initialize');\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.updateState({ error: err, isLoading: false });\n throw err;\n }\n }\n\n /**\n * Navigate\n * @param event - Navigation event/action\n * @param options - Navigation options\n * @param options.fireAndForget - If true, queues navigation to QStash and returns immediately without waiting for result\n * @param options.customerTags - Customer tags to set (merged with existing customer tags)\n * @param options.deviceId - Device ID for geo/device tag enrichment (optional, rarely needed)\n * @param options.autoRedirect - Override global autoRedirect setting for this specific call (default: use config)\n */\n async navigate(\n event: FunnelAction,\n options?: {\n fireAndForget?: boolean;\n customerTags?: string[];\n deviceId?: string;\n autoRedirect?: boolean;\n waitForSession?: boolean;\n }\n ): Promise<FunnelNavigationResult> {\n // Wait for session if requested\n if (options?.waitForSession && !this.state.context?.sessionId) {\n if (this.config.debugMode) {\n console.log('\u23F3 [FunnelClient] Waiting for session before navigation...');\n }\n\n const maxWaitTime = 5000;\n const startTime = Date.now();\n\n while (!this.state.context?.sessionId && (Date.now() - startTime < maxWaitTime)) {\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n\n if (this.state.context?.sessionId && this.config.debugMode) {\n console.log('\u2705 [FunnelClient] Session ready, proceeding with navigation');\n }\n }\n\n if (!this.state.context?.sessionId) throw new Error('No active session');\n\n this.updateState({ isNavigating: true, isLoading: true });\n\n try {\n // Get current funnel state from injected HTML/meta tags\n let funnelVariantId = getAssignedFunnelVariant();\n let funnelStepId = getAssignedFunnelStep();\n const currentUrl = typeof window !== 'undefined' ? window.location.href : undefined;\n\n // \u2705 FALLBACK: Use config values if injection not available (e.g., on Shopify storefront)\n if (!funnelStepId && this.config.stepId) {\n funnelStepId = this.config.stepId;\n if (this.config.debugMode) {\n console.log('\uD83D\uDD0D [FunnelClient.navigate] Using stepId from config (no injection):', funnelStepId);\n }\n }\n\n if (!funnelVariantId && (this.config as any).variantId) {\n funnelVariantId = (this.config as any).variantId;\n if (this.config.debugMode) {\n console.log('\uD83D\uDD0D [FunnelClient.navigate] Using variantId from config (no injection):', funnelVariantId);\n }\n }\n\n // \u2705 DEBUG: Log what we're sending\n if (this.config.debugMode) {\n console.log('\uD83D\uDD0D [FunnelClient.navigate] Sending to backend:', {\n sessionId: this.state.context.sessionId,\n currentUrl,\n funnelStepId: funnelStepId || '(not found)',\n funnelVariantId: funnelVariantId || '(not found)',\n hasInjectedStepId: !!getAssignedFunnelStep(),\n hasInjectedVariantId: !!getAssignedFunnelVariant(),\n usedConfigFallback: !getAssignedFunnelStep() && !!this.config.stepId,\n customerTags: options?.customerTags || '(none)',\n deviceId: options?.deviceId || '(none)',\n });\n }\n\n const fireAndForget = options?.fireAndForget || false;\n\n const response = await this.resource.navigate({\n sessionId: this.state.context.sessionId,\n event,\n currentUrl,\n funnelStepId,\n funnelVariantId,\n fireAndForget,\n customerTags: options?.customerTags,\n deviceId: options?.deviceId,\n });\n\n if (!response.success || !response.result) {\n throw new Error(response.error || 'Navigation failed');\n }\n\n const result = response.result as FunnelNavigationResult;\n\n // \uD83D\uDD25 Fire-and-forget mode: Just return acknowledgment, skip everything else\n if (result.queued) {\n this.updateState({ isNavigating: false, isLoading: false });\n\n // Update session ID if it changed (session recovery)\n if (result.sessionId && result.sessionId !== this.state.context?.sessionId) {\n if (this.config.debugMode) {\n console.log(`\uD83D\uDD25 [FunnelClient] Session ID updated: ${this.state.context?.sessionId} \u2192 ${result.sessionId}`);\n }\n // Update context session ID\n if (this.state.context) {\n this.state.context.sessionId = result.sessionId;\n }\n }\n\n if (this.config.debugMode) {\n console.log('\uD83D\uDD25 [FunnelClient] Navigation queued (fire-and-forget mode)');\n }\n\n return result;\n }\n\n // Normal navigation: handle redirect\n // Per-call option takes precedence over global config\n const shouldAutoRedirect = options?.autoRedirect !== undefined\n ? options.autoRedirect\n : this.config.autoRedirect !== false; // Default to true\n\n // Skip refreshSession if auto-redirecting (next page will initialize with fresh state)\n // Only refresh if staying on same page (autoRedirect: false)\n if (!shouldAutoRedirect) {\n if (this.config.debugMode) {\n console.log('\uD83D\uDD04 [FunnelClient] Refreshing session (no auto-redirect)');\n }\n await this.refreshSession();\n }\n\n this.updateState({ isNavigating: false, isLoading: false });\n\n // Auto-redirect if enabled and result has a URL\n if (shouldAutoRedirect && result?.url && typeof window !== 'undefined') {\n if (this.config.debugMode) {\n console.log('\uD83D\uDE80 [FunnelClient] Auto-redirecting to:', result.url, '(skipped session refresh - next page will initialize)');\n }\n window.location.href = result.url;\n }\n\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.updateState({ error: err, isNavigating: false, isLoading: false });\n throw err;\n }\n }\n\n /**\n * Go to a specific step (direct navigation)\n * @param stepId - Target step ID\n * @param options - Navigation options (autoRedirect, etc.)\n */\n async goToStep(\n stepId: string,\n options?: { autoRedirect?: boolean }\n ): Promise<FunnelNavigationResult> {\n return this.navigate(\n {\n type: FunnelActionType.DIRECT_NAVIGATION,\n data: { targetStepId: stepId },\n } as FunnelAction,\n options\n );\n }\n\n /**\n * Refresh session data\n */\n async refreshSession() {\n if (!this.state.context?.sessionId) return;\n\n try {\n const response = await this.resource.getSession(this.state.context.sessionId);\n if (response.success && response.context) {\n const enriched = this.enrichContext(response.context);\n this.updateState({ context: enriched, sessionError: null });\n return enriched;\n }\n } catch (error) {\n this.updateState({ sessionError: error instanceof Error ? error : new Error(String(error)) });\n }\n }\n\n /**\n * Update context data\n */\n async updateContext(updates: Partial<SimpleFunnelContext>) {\n if (!this.state.context?.sessionId) throw new Error('No active session');\n this.updateState({ isLoading: true });\n\n try {\n const response = await this.resource.updateContext(this.state.context.sessionId, { contextUpdates: updates });\n if (response.success) {\n await this.refreshSession();\n } else {\n throw new Error(response.error || 'Failed to update context');\n }\n } finally {\n this.updateState({ isLoading: false });\n }\n }\n\n /**\n * End session\n */\n async endSession() {\n if (!this.state.context?.sessionId) return;\n\n try {\n await this.resource.endSession(this.state.context.sessionId);\n } finally {\n this.state.context = null;\n this.updateState({ context: null, isInitialized: false });\n if (typeof document !== 'undefined') {\n // Clear cookie via import or manually if needed, but we have utility for that\n // We should probably import clearFunnelSessionCookie\n }\n }\n }\n\n // Private helpers\n\n private updateState(updates: Partial<FunnelState>) {\n this.state = { ...this.state, ...updates };\n this.eventDispatcher.notify(this.state);\n }\n\n private handleSessionSuccess(context: SimpleFunnelContext) {\n setFunnelSessionCookie(context.sessionId);\n this.updateState({\n context,\n isLoading: false,\n isInitialized: true,\n error: null,\n sessionError: null\n });\n }\n\n private enrichContext(ctx: SimpleFunnelContext): SimpleFunnelContext {\n const env = this.config.environment?.environment || detectEnvironment();\n\n if (env !== 'local') return ctx;\n\n const localResources = this.config.pluginConfig?.staticResources || {};\n if (Object.keys(localResources).length === 0) return ctx;\n\n // \uD83C\uDFAF Check if context already has the same static resources\n // This prevents creating new objects unnecessarily, which would trigger React re-renders\n const existingStatic = ctx.static || {};\n const hasAllResources = Object.keys(localResources).every(\n key => existingStatic[key] === localResources[key]\n );\n\n // If context already has all static resources with same references, don't recreate\n if (hasAllResources && Object.keys(existingStatic).length === Object.keys(localResources).length) {\n return ctx;\n }\n\n return {\n ...ctx,\n static: {\n ...localResources,\n ...existingStatic\n }\n };\n }\n}\n\n", "/**\n * TagadaPay External Page Tracker\n * \n * A lightweight standalone script for tracking users on external pages\n * that are part of a Tagadapay funnel but not hosted on the Tagadapay platform.\n * \n * ARCHITECTURE:\n * - Reuses core SDK infrastructure (TagadaClient) for authentication and API handling\n * - All tracking handled automatically by funnelOrchestrator via autoInitialize() and navigate()\n * - No separate tracking endpoints needed - unified tracking through orchestrator\n * \n * Usage (via CDN):\n * <script src=\"https://cdn.jsdelivr.net/npm/@tagadapay/plugin-sdk/dist/external-tracker.min.js\"></script>\n * <script>\n * TagadaTracker.init({\n * storeId: 'store_xxx',\n * accountId: 'acc_xxx',\n * funnelId: 'funnel_xxx', // Optional: detected from URL\n * stepId: 'step_xxx',\n * stepName: 'External Offer Page',\n * stepType: 'external'\n * });\n * \n * // Navigate to next step (tracking automatic)\n * TagadaTracker.navigate({\n * eventType: 'form.submitted',\n * eventData: { email: 'user@example.com' }\n * });\n * </script>\n */\n\nimport { createTagadaClient } from './index';\nimport type { TagadaClient } from '../core/client';\nimport type { SimpleFunnelContext, FunnelActionType } from '../core/resources/funnel';\nimport { setClientToken } from '../core/utils/tokenStorage';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface TagadaTrackerConfig {\n /** Store ID (required) */\n storeId: string;\n /** Account ID (required for session init) */\n accountId?: string;\n /** Funnel ID (optional - can be extracted from URL param) */\n funnelId?: string;\n /**\n * Step ID (REQUIRED for external pages)\n * \n * External URLs cannot be mapped to steps via URL matching (only works for Tagadapay-hosted pages).\n * You must explicitly specify which step this external page represents.\n */\n stepId: string;\n /** Step name (optional - for analytics/debugging) */\n stepName?: string;\n /** Step type (optional - e.g., 'landing', 'offer', 'external') */\n stepType?: string;\n /** API base URL (defaults to production) */\n apiBaseUrl?: string;\n /** Enable debug logging */\n debug?: boolean;\n /** Callback when session is ready */\n onReady?: (session: ExternalTrackerSession) => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\nexport interface ExternalTrackerSession {\n sessionId: string;\n customerId: string;\n storeId: string;\n funnelId?: string;\n currentStepId?: string;\n cmsToken?: string;\n}\n\nexport interface NavigateOptions {\n /** Event type for navigation (e.g., 'offer.accepted', 'form.submitted') */\n eventType: string;\n /** Event data */\n eventData?: Record<string, unknown>;\n /** Override return URL */\n returnUrl?: string;\n /** Disable auto-redirect to control navigation manually (default: true) */\n autoRedirect?: boolean;\n}\n\n// ============================================================================\n// UTILITIES\n// ============================================================================\n\nfunction getUrlParam(name: string): string | null {\n if (typeof window === 'undefined') return null;\n const params = new URLSearchParams(window.location.search);\n return params.get(name);\n}\n\nfunction log(debug: boolean, ...args: unknown[]): void {\n if (debug) {\n console.log('[TagadaTracker]', ...args);\n }\n}\n\n// ============================================================================\n// MAIN CLASS\n// ============================================================================\n\nclass TagadaExternalTracker {\n private config: TagadaTrackerConfig | null = null;\n private client: TagadaClient | null = null;\n private initialized = false;\n private initializing = false;\n\n /**\n * Initialize the tracker using SDK infrastructure\n */\n async init(config: TagadaTrackerConfig): Promise<ExternalTrackerSession | null> {\n if (this.initialized || this.initializing) {\n log(config.debug || false, 'Already initialized or initializing');\n return this.getSession();\n }\n\n this.initializing = true;\n this.config = {\n debug: false,\n ...config,\n };\n\n log(this.config.debug!, '\uD83D\uDE80 Initializing external tracker with SDK...', config);\n\n try {\n // 1. Check for token in URL and save to storage (bootstrap auth)\n // TagadaClient will automatically pick it up from storage\n const urlToken = getUrlParam('token');\n if (urlToken) {\n setClientToken(urlToken);\n log(this.config.debug!, '\uD83D\uDD11 Bootstrapped token from URL');\n }\n\n // 2. Create TagadaClient\n this.client = createTagadaClient({\n debugMode: this.config.debug,\n features: { funnel: true },\n });\n\n // 3. Wait for client to be ready (load token, init auth state)\n await this.waitForClientReady();\n\n // 4. Auto-initialize funnel session\n // FunnelClient handles cookies, existing session restoration, etc.\n // Orchestrator automatically tracks session start and step view\n const funnelContext = await this.initializeFunnel();\n\n log(this.config.debug!, '\u2705 Session initialized (tracking handled by orchestrator):', funnelContext);\n\n this.initialized = true;\n const session = this.getSession();\n if (session) {\n this.config.onReady?.(session);\n }\n\n return session;\n\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n log(this.config.debug!, '\u274C Initialization failed:', err);\n this.config.onError?.(err);\n throw err;\n } finally {\n this.initializing = false;\n }\n }\n\n /**\n * Get current session from SDK state\n */\n getSession(): ExternalTrackerSession | null {\n if (!this.client?.funnel?.state.context) return null;\n\n const ctx = this.client.funnel.state.context;\n return {\n sessionId: ctx.sessionId,\n customerId: ctx.customerId,\n storeId: ctx.storeId,\n funnelId: ctx.funnelId,\n currentStepId: ctx.currentStepId,\n cmsToken: this.client.state.token || undefined,\n };\n }\n\n /**\n * Check if tracker is ready\n */\n isReady(): boolean {\n return this.initialized && !!this.client?.funnel?.state.context;\n }\n\n /**\n * Navigate to next step in funnel using SDK's funnel client\n */\n async navigate(options: NavigateOptions): Promise<{ url: string } | null> {\n if (!this.isReady()) {\n throw new Error('Tracker not initialized. Call init() first.');\n }\n\n log(this.config!.debug!, '\uD83D\uDE80 Navigating:', options);\n\n // Determine if we should auto-redirect (default: true)\n const shouldAutoRedirect = options.autoRedirect !== false;\n\n try {\n const result = await this.client!.funnel!.navigate(\n {\n type: options.eventType as FunnelActionType,\n data: options.eventData || {},\n },\n { autoRedirect: false } // Always disable SDK auto-redirect, we handle it here\n );\n\n if (result?.url) {\n log(this.config!.debug!, '\u2705 Navigation result:', result.url);\n\n // Only redirect if autoRedirect is enabled\n if (shouldAutoRedirect && typeof window !== 'undefined') {\n window.location.href = options.returnUrl || result.url;\n }\n\n return { url: result.url };\n }\n\n return null;\n } catch (error) {\n log(this.config!.debug!, '\u274C Navigation failed:', error);\n throw error;\n }\n }\n\n /**\n * Get customer ID (for identifying the user)\n */\n getCustomerId(): string | null {\n return this.client?.state.auth.customer?.id || this.client?.funnel?.state.context?.customerId || null;\n }\n\n /**\n * Get funnel session ID\n */\n getFunnelSessionId(): string | null {\n return this.client?.funnel?.state.context?.sessionId || null;\n }\n\n /**\n * Build a URL with funnel context parameters\n * Useful for linking to other external pages while preserving session\n */\n buildUrl(baseUrl: string, additionalParams?: Record<string, string>): string {\n const session = this.getSession();\n if (!session) {\n return baseUrl;\n }\n\n const url = new URL(baseUrl, typeof window !== 'undefined' ? window.location.origin : undefined);\n\n // Add funnel session context\n url.searchParams.set('funnelSessionId', session.sessionId);\n if (session.cmsToken) {\n url.searchParams.set('token', session.cmsToken);\n }\n if (session.funnelId) {\n url.searchParams.set('funnelId', session.funnelId);\n }\n url.searchParams.set('storeId', session.storeId);\n\n // Add any additional params\n if (additionalParams) {\n Object.entries(additionalParams).forEach(([key, value]) => {\n url.searchParams.set(key, value);\n });\n }\n\n return url.toString();\n }\n\n /**\n * Get the underlying SDK client (for advanced usage)\n */\n getClient(): TagadaClient | null {\n return this.client;\n }\n\n // ========================================================================\n // PRIVATE METHODS\n // ========================================================================\n\n private async waitForClientReady(): Promise<void> {\n if (!this.client) return;\n\n // Wait for token/auth to be resolved\n return new Promise((resolve) => {\n let retries = 0;\n const checkReady = () => {\n // Check if initialized OR if we have a token (sometimes isInitialized is lazy)\n if (this.client?.state.isInitialized || this.client?.state.token) {\n resolve();\n } else if (retries > 40) { // 2 seconds timeout\n resolve(); // Proceed anyway (might be anonymous)\n } else {\n retries++;\n setTimeout(checkReady, 50);\n }\n };\n checkReady();\n });\n }\n\n private async initializeFunnel(): Promise<SimpleFunnelContext | null> {\n if (!this.client?.funnel) return null;\n\n // Prepare auth session object\n const authSession = {\n customerId: this.client.state.auth.customer?.id || 'anon_placeholder',\n sessionId: this.client.state.auth.session?.sessionId || 'sess_placeholder',\n };\n\n const store = {\n id: this.config!.storeId,\n accountId: this.config!.accountId || '',\n };\n\n // IMPORTANT: For external pages, we must explicitly pass stepId as entryStepId\n // because URL-to-step mapping won't work for external URLs not hosted on Tagadapay\n const entryStepId = this.config!.stepId;\n\n if (!entryStepId) {\n throw new Error('stepId is required for external page tracking (URL mapping does not work for external pages)');\n }\n\n log(this.config!.debug!, '\uD83D\uDD0D Initializing external page at step:', entryStepId);\n\n // Use initialize() (not autoInitialize()) to explicitly specify the step\n // Orchestrator will automatically track session start and step view at this step\n return this.client.funnel.initialize(\n authSession,\n store,\n this.config!.funnelId || getUrlParam('funnelId') || undefined,\n entryStepId // \u2705 Explicitly tell orchestrator which step we're on\n );\n }\n}\n\n// ============================================================================\n// GLOBAL INSTANCE\n// ============================================================================\n\nconst TagadaTracker = new TagadaExternalTracker();\n\nexport { TagadaTracker, TagadaExternalTracker };\n\nif (typeof window !== 'undefined') {\n (window as any).TagadaTracker = TagadaTracker;\n}\n", "import { detectEnvironment, getEnvironmentConfig } from './config/environment';\nimport { FunnelClient } from './funnelClient';\nimport { ApiClient } from './resources/apiClient';\nimport {\n AnonymousTokenResponse,\n AuthState,\n Currency,\n Customer,\n Environment,\n EnvironmentConfig,\n Locale,\n Session,\n SessionInitResponse,\n Store,\n} from './types';\nimport { collectDeviceInfo, getBrowserLocale, getUrlParams } from './utils/deviceInfo';\nimport { EventBus } from './utils/eventBus';\nimport { EventDispatcher } from './utils/eventDispatcher';\nimport { decodeJWTClient, isTokenExpired } from './utils/jwtDecoder';\nimport { loadPluginConfig, PluginConfig, RawPluginConfig } from './utils/pluginConfig';\nimport { handlePreviewMode, isDraftMode, setDraftMode } from './utils/previewMode';\nimport { getClientToken, setClientToken } from './utils/tokenStorage';\nimport { shouldResolveAuthCode, resolveAuthHandoff } from './utils/authHandoff';\n\nexport interface TagadaClientConfig {\n environment?: Environment;\n customApiConfig?: Partial<EnvironmentConfig>;\n debugMode?: boolean;\n localConfig?: string;\n rawPluginConfig?: RawPluginConfig;\n blockUntilSessionReady?: boolean;\n /**\n * Optional feature flags to enable/disable subsystems.\n * By default all features are enabled.\n */\n features?: {\n /**\n * Funnel session + navigation layer.\n * Set to false to completely disable funnel behaviour.\n * Pass object to configure behavior.\n */\n funnel?: boolean | {\n autoRedirect?: boolean;\n };\n };\n}\n\nexport interface TagadaState {\n auth: AuthState;\n session: Session | null;\n customer: Customer | null;\n locale: Locale;\n currency: Currency;\n store: Store | null;\n environment: EnvironmentConfig;\n isLoading: boolean;\n isInitialized: boolean;\n isSessionInitialized: boolean;\n pluginConfig: PluginConfig;\n pluginConfigLoading: boolean;\n debugMode: boolean;\n token: string | null;\n}\n\nexport class TagadaClient {\n public apiClient: ApiClient;\n public state: TagadaState;\n /**\n * Optional funnel client.\n * Exposed so higher-level SDKs (React, Standalone, Vue) can reuse the same\n * low-level logic without instantiating a second client.\n */\n public funnel?: FunnelClient;\n /**\n * Event bus for domain events and coordination\n */\n public bus = new EventBus();\n\n private eventDispatcher = new EventDispatcher<TagadaState>();\n private tokenPromise: Promise<string | null> | null = null;\n private tokenResolver: ((token: string | null) => void) | null = null;\n private boundHandleStorageChange: () => void;\n private boundHandlePageshow: (event: PageTransitionEvent) => void;\n\n // Config\n private readonly config: TagadaClientConfig;\n private instanceId: string;\n\n // Track initialization state to prevent infinite loops\n private isInitializingSession = false;\n private lastSessionInitError: Error | null = null;\n private sessionInitRetryCount = 0;\n private readonly MAX_SESSION_INIT_RETRIES = 3;\n\n constructor(config: TagadaClientConfig = {}) {\n this.config = config;\n this.instanceId = Math.random().toString(36).substr(2, 9);\n this.boundHandleStorageChange = this.handleStorageChange.bind(this);\n this.boundHandlePageshow = (event: PageTransitionEvent) => {\n if (event.persisted) {\n if (this.state.debugMode) {\n console.log(`[TagadaClient ${this.instanceId}] Page restored from BFcache (back button), re-initializing funnel...`);\n }\n\n // If we have an active session and store, we only need to re-initialize the funnel\n // This ensures tracking is correct and the session is fresh on the backend\n if (this.funnel && this.state.session && this.state.store) {\n this.funnel.resetInitialization();\n\n const accountId = this.getAccountId();\n const urlParams = new URLSearchParams(typeof window !== 'undefined' ? window.location.search : '');\n const funnelId = urlParams.get('funnelId') || undefined;\n\n this.funnel.autoInitialize(\n { customerId: this.state.session.customerId, sessionId: this.state.session.sessionId },\n { id: this.state.store.id, accountId },\n funnelId,\n ).catch((err) => {\n console.error('[TagadaClient] Funnel re-initialization failed:', err);\n });\n } else {\n // If state is missing, perform a full initialization\n this.sessionInitRetryCount = 0;\n this.initialize();\n }\n }\n };\n\n console.log(`[TagadaClient ${this.instanceId}] Initializing...`);\n console.log(`[TagadaClient ${this.instanceId}] Config:`, {\n debugMode: config.debugMode,\n hasRawPluginConfig: !!config.rawPluginConfig,\n rawPluginConfig: config.rawPluginConfig,\n features: config.features,\n });\n\n // Handle preview mode FIRST - clears state if needed\n // This ensures clean state when CRM previews pages\n const previewModeActive = handlePreviewMode(this.config.debugMode);\n if (previewModeActive && this.config.debugMode) {\n console.log(`[TagadaClient ${this.instanceId}] Preview mode active - state cleared`);\n }\n\n // Initialize default state\n const env = this.resolveEnvironment();\n let envConfig = getEnvironmentConfig(env);\n\n // Apply custom API config if provided\n if (config.customApiConfig) {\n envConfig = {\n ...envConfig,\n ...config.customApiConfig,\n apiConfig: {\n ...envConfig.apiConfig,\n ...config.customApiConfig.apiConfig,\n },\n };\n if (this.config.debugMode) {\n console.log(`[TagadaClient ${this.instanceId}] Applied custom API config:`, envConfig.apiConfig.baseUrl);\n }\n }\n\n this.state = {\n auth: {\n isAuthenticated: false,\n isLoading: false,\n customer: null,\n session: null,\n },\n session: null,\n customer: null,\n locale: {\n locale: 'en-US',\n language: 'en',\n region: 'US',\n messages: {},\n },\n currency: {\n code: 'USD',\n symbol: '$',\n name: 'US Dollar',\n },\n store: null,\n environment: envConfig,\n isLoading: true,\n isInitialized: false,\n isSessionInitialized: false,\n pluginConfig: { basePath: '/', config: {} },\n pluginConfigLoading: true, // Always true - loadPluginConfig will process rawPluginConfig\n debugMode: config.debugMode ?? env !== 'production',\n token: null,\n };\n\n console.log(`[TagadaClient ${this.instanceId}] Initial state:`, {\n pluginConfigLoading: this.state.pluginConfigLoading,\n hasRawPluginConfig: !!config.rawPluginConfig,\n });\n\n // Initialize API Client\n this.apiClient = new ApiClient({\n baseURL: envConfig.apiConfig.baseUrl,\n });\n\n // Initialize optional funnel client (feature-flagged)\n const funnelFeature = config.features?.funnel;\n const funnelEnabled = funnelFeature !== false;\n\n if (funnelEnabled) {\n const funnelConfig = typeof funnelFeature === 'object' ? funnelFeature : {};\n\n this.funnel = new FunnelClient({\n apiClient: this.apiClient,\n debugMode: this.state.debugMode,\n pluginConfig: this.state.pluginConfig,\n environment: this.state.environment,\n autoRedirect: funnelConfig.autoRedirect,\n // Pass funnelId and stepId from rawPluginConfig to enable config-based initialization\n funnelId: config.rawPluginConfig?.funnelId,\n stepId: config.rawPluginConfig?.stepId,\n });\n }\n\n // Setup token waiting mechanism\n this.apiClient.setTokenProvider(this.waitForToken.bind(this));\n\n // Listen for storage changes (cross-tab sync)\n if (typeof window !== 'undefined') {\n window.addEventListener('storage', this.boundHandleStorageChange);\n window.addEventListener('pageshow', this.boundHandlePageshow);\n }\n\n // Setup config hot-reload listener (for live config editing)\n this.setupConfigHotReload();\n\n // Start initialization\n this.initialize();\n }\n\n /**\n * Cleanup client resources\n */\n destroy() {\n if (typeof window !== 'undefined') {\n window.removeEventListener('storage', this.boundHandleStorageChange);\n window.removeEventListener('pageshow', this.boundHandlePageshow);\n }\n if (this.state.debugMode) {\n console.log(`[TagadaClient ${this.instanceId}] Destroyed`);\n }\n this.eventDispatcher.clear();\n this.bus.clear();\n }\n\n /**\n * Handle storage changes (e.g. token update in another tab)\n */\n private handleStorageChange() {\n const storedToken = getClientToken();\n\n // Avoid unnecessary re-initialization if token hasn't changed\n if (storedToken === this.state.token) {\n if (this.state.debugMode) {\n console.log(`[TagadaClient ${this.instanceId}] Token unchanged (ignoring event)`);\n }\n return;\n }\n\n // Prevent infinite loop: Don't re-initialize if we're currently initializing\n if (this.isInitializingSession) {\n if (this.state.debugMode) {\n console.log(`[TagadaClient ${this.instanceId}] Session initialization in progress, skipping storage change`);\n }\n return;\n }\n\n // Prevent infinite loop: Don't retry if we've hit max retries\n if (this.sessionInitRetryCount >= this.MAX_SESSION_INIT_RETRIES && this.lastSessionInitError) {\n if (this.state.debugMode) {\n console.error(`[TagadaClient ${this.instanceId}] Max session init retries reached, giving up`, this.lastSessionInitError);\n }\n return;\n }\n\n // Re-run initialization when token may have changed\n if (this.state.debugMode) {\n console.log(`[TagadaClient ${this.instanceId}] Storage changed, re-initializing token...`);\n }\n this.initializeToken();\n }\n\n /**\n * Subscribe to state changes\n */\n subscribe(listener: (state: TagadaState) => void): () => void {\n return this.eventDispatcher.subscribe(listener);\n }\n\n /**\n * Get current state\n */\n getState(): TagadaState {\n return this.state;\n }\n\n /**\n * Update state and notify listeners\n */\n private updateState(updates: Partial<TagadaState>) {\n this.state = { ...this.state, ...updates };\n this.eventDispatcher.notify(this.state);\n }\n\n /**\n * Resolve environment\n */\n private resolveEnvironment(): Environment {\n if (this.config.environment) return this.config.environment;\n return detectEnvironment();\n }\n\n /**\n * Main initialization flow\n */\n private async initialize() {\n try {\n // 1. Load Plugin Config\n await this.initializePluginConfig();\n\n // 2. Initialize Token (Background or Blocking based on config)\n if (this.state.pluginConfig.storeId) {\n await this.initializeToken();\n } else {\n console.warn('[TagadaClient] No store ID found in plugin config. Skipping token initialization.');\n this.updateState({ isLoading: false, isInitialized: true });\n }\n } catch (error) {\n console.error('[TagadaClient] Initialization failed:', error);\n this.updateState({ isLoading: false, isInitialized: true });\n }\n }\n\n /**\n * Load plugin configuration\n */\n private async initializePluginConfig() {\n console.log(`[TagadaClient ${this.instanceId}] initializePluginConfig called`, {\n pluginConfigLoading: this.state.pluginConfigLoading,\n hasRawPluginConfig: !!this.config.rawPluginConfig,\n });\n\n if (!this.state.pluginConfigLoading) {\n console.log(`[TagadaClient ${this.instanceId}] Plugin config already loading or loaded, skipping...`);\n return;\n }\n\n try {\n const configVariant = this.config.localConfig || 'default';\n console.log(`[TagadaClient ${this.instanceId}] Loading plugin config with variant: ${configVariant}`);\n const config = await loadPluginConfig(configVariant, this.config.rawPluginConfig);\n\n console.log(`[TagadaClient ${this.instanceId}] Plugin config loaded:`, config);\n\n this.updateState({\n pluginConfig: config,\n pluginConfigLoading: false,\n });\n\n // Keep funnel client in sync with latest plugin config / environment\n if (this.funnel) {\n this.funnel.setConfig({\n pluginConfig: config,\n environment: this.state.environment,\n });\n }\n } catch (error) {\n console.error('[TagadaClient] Failed to load plugin config:', error);\n this.updateState({\n pluginConfig: { basePath: '/', config: {} },\n pluginConfigLoading: false,\n });\n }\n }\n\n /**\n * Initialize token and session\n */\n private async initializeToken() {\n // \uD83D\uDD10 PRIORITY 1: Check for authCode (cross-domain handoff)\n // This ALWAYS takes precedence over existing tokens\n if (shouldResolveAuthCode()) {\n const storeId = this.state.pluginConfig.storeId;\n if (!storeId) {\n console.error('[TagadaClient] Cannot resolve authCode: storeId not found in config');\n return this.fallbackToNormalFlow();\n }\n\n console.log(`[TagadaClient ${this.instanceId}] \uD83D\uDD10 Cross-domain auth detected, resolving...`);\n\n try {\n const authCode = new URLSearchParams(window.location.search).get('authCode');\n if (!authCode) {\n return this.fallbackToNormalFlow();\n }\n\n // Resolve the handoff\n const handoffData = await resolveAuthHandoff(\n authCode,\n storeId,\n this.state.environment.apiConfig.baseUrl,\n this.state.debugMode\n );\n\n console.log(`[TagadaClient ${this.instanceId}] \u2705 Auth handoff resolved:`, {\n customerId: handoffData.customer.id,\n role: handoffData.customer.role,\n hasContext: Object.keys(handoffData.context).length > 0,\n });\n\n // Set the new token (already stored by resolveAuthHandoff)\n this.setToken(handoffData.token);\n\n // Decode session from token\n const decodedSession = decodeJWTClient(handoffData.token);\n if (decodedSession) {\n this.updateState({ session: decodedSession });\n await this.initializeSession(decodedSession);\n\n // If context has funnelSessionId, restore it\n if (handoffData.context?.funnelSessionId && this.funnel) {\n if (this.state.debugMode) {\n console.log(`[TagadaClient ${this.instanceId}] Restoring funnel session from handoff context:`, handoffData.context.funnelSessionId);\n }\n // The funnel client will pick this up during auto-initialization\n }\n } else {\n console.error('[TagadaClient] Failed to decode token from handoff');\n this.updateState({ isInitialized: true, isLoading: false });\n }\n\n return; // \u2705 Auth handoff resolved successfully, exit early\n } catch (error) {\n console.error(`[TagadaClient ${this.instanceId}] \u274C Auth handoff failed, falling back to normal flow:`, error);\n // Fall through to normal initialization\n }\n }\n\n // Continue with normal flow if no authCode or resolution failed\n await this.fallbackToNormalFlow();\n }\n\n /**\n * Normal token initialization flow (no cross-domain handoff)\n */\n private async fallbackToNormalFlow() {\n // \uD83D\uDD12 CRITICAL: Read URL token FIRST before any async operations\n // This prevents race conditions where anonymous token creation overwrites URL token\n const urlParams = new URLSearchParams(typeof window !== 'undefined' ? window.location.search : '');\n const queryToken = urlParams.get('token');\n\n // If URL has token, set it IMMEDIATELY to prevent any race condition\n if (queryToken) {\n if (this.state.debugMode) {\n console.log(`[TagadaClient ${this.instanceId}] \uD83D\uDD12 URL token detected, setting immediately to prevent race condition`);\n }\n // Set token on API client immediately\n this.apiClient.updateToken(queryToken);\n // Also persist to localStorage\n setClientToken(queryToken);\n }\n\n // Now check storage (which should have the URL token if we just set it)\n const existingToken = getClientToken();\n\n console.log(`[TagadaClient ${this.instanceId}] Initializing token (normal flow)...`, {\n hasExistingToken: !!existingToken,\n hasQueryToken: !!queryToken,\n storeId: this.state.pluginConfig.storeId,\n });\n\n let tokenToUse: string | null = null;\n let shouldPersist = false;\n\n if (queryToken) {\n tokenToUse = queryToken;\n shouldPersist = true;\n } else if (existingToken && !isTokenExpired(existingToken)) {\n tokenToUse = existingToken;\n }\n\n if (tokenToUse) {\n this.setToken(tokenToUse);\n\n // Persist token if it came from query (updates localStorage and fires event)\n // We do this AFTER setToken so state is updated and handleStorageChange sees match\n if (shouldPersist) {\n if (this.state.debugMode) {\n console.log(`[TagadaClient ${this.instanceId}] Persisting query token to storage...`);\n }\n setClientToken(tokenToUse);\n }\n\n const decodedSession = decodeJWTClient(tokenToUse);\n if (decodedSession) {\n this.updateState({ session: decodedSession });\n await this.initializeSession(decodedSession);\n } else {\n console.error('[TagadaClient] Failed to decode token');\n this.updateState({ isInitialized: true, isLoading: false });\n }\n } else {\n // Create anonymous token\n const storeId = this.state.pluginConfig.storeId;\n console.log(`[TagadaClient ${this.instanceId}] No existing token, creating anonymous token...`, {\n hasStoreId: !!storeId,\n storeId,\n });\n if (storeId) {\n await this.createAnonymousToken(storeId);\n } else {\n console.warn(`[TagadaClient ${this.instanceId}] No storeId in plugin config, skipping anonymous token creation`);\n this.updateState({ isInitialized: true, isLoading: false });\n }\n }\n }\n\n /**\n * Set token and resolve waiting requests\n */\n private setToken(token: string | null) {\n this.apiClient.updateToken(token);\n this.updateState({ token });\n\n // Notify waiting requests\n if (this.tokenResolver) {\n this.tokenResolver(token);\n this.tokenPromise = null;\n this.tokenResolver = null;\n } else {\n // If we set a token but no one was waiting, ensure future requests don't wait unnecessarily\n // Actually, if we have a token, the provider won't be called by ApiClient logic if we handle it right.\n // But to be safe, if we set a token, we can pre-resolve the promise if it exists.\n // Wait, if tokenPromise exists, tokenResolver must exist.\n }\n }\n\n /**\n * Wait for token to be available\n */\n private waitForToken(): Promise<string | null> {\n if (this.apiClient.getCurrentToken()) {\n return Promise.resolve(this.apiClient.getCurrentToken());\n }\n\n if (!this.tokenPromise) {\n this.tokenPromise = new Promise<string | null>((resolve) => {\n this.tokenResolver = resolve;\n });\n }\n\n return this.tokenPromise;\n }\n\n /**\n * Create anonymous token\n */\n async createAnonymousToken(storeId: string) {\n // \uD83D\uDD12 CRITICAL: Never create anonymous token if URL has a token\n // This prevents race conditions during forceReset\n if (typeof window !== 'undefined') {\n const urlParams = new URLSearchParams(window.location.search);\n const urlToken = urlParams.get('token');\n if (urlToken) {\n if (this.state.debugMode) {\n console.log(`[TagadaClient ${this.instanceId}] \uD83D\uDD12 URL has token, skipping anonymous token creation`);\n }\n // Use the URL token instead\n this.setToken(urlToken);\n setClientToken(urlToken);\n const decodedSession = decodeJWTClient(urlToken);\n if (decodedSession) {\n this.updateState({ session: decodedSession });\n await this.initializeSession(decodedSession);\n }\n return;\n }\n }\n\n // Prevent concurrent anonymous token creation\n if (this.isInitializingSession) {\n if (this.state.debugMode) {\n console.log(`[TagadaClient ${this.instanceId}] Session initialization in progress, skipping anonymous token creation`);\n }\n return;\n }\n\n try {\n // \uD83C\uDFAF Check draft mode from URL, localStorage, or cookie\n const draft = isDraftMode();\n\n if (this.state.debugMode) {\n console.log('[TagadaClient] Creating anonymous token for store:', storeId, { draft });\n }\n\n // We use fetch directly or ApiClient with skipAuth to avoid waiting for itself\n const response = await this.apiClient.post<AnonymousTokenResponse>(\n '/api/v1/cms/session/anonymous',\n {\n storeId,\n role: 'anonymous',\n draft, // \uD83C\uDFAF Pass draft mode to anonymous login\n },\n { skipAuth: true }\n );\n\n this.setToken(response.token);\n setClientToken(response.token);\n\n const decodedSession = decodeJWTClient(response.token);\n if (decodedSession) {\n this.updateState({ session: decodedSession });\n await this.initializeSession(decodedSession);\n }\n\n this.updateState({ isSessionInitialized: true });\n\n } catch (error) {\n console.error('[TagadaClient] Failed to create anonymous token:', error);\n this.updateState({ isInitialized: true, isLoading: false });\n }\n }\n\n /**\n * Initialize session\n */\n async initializeSession(sessionData: Session) {\n // Prevent concurrent initialization attempts\n if (this.isInitializingSession) {\n if (this.state.debugMode) {\n console.log(`[TagadaClient ${this.instanceId}] Session initialization already in progress, skipping`);\n }\n return;\n }\n\n this.isInitializingSession = true;\n\n try {\n if (this.state.debugMode) {\n console.log(`[TagadaClient ${this.instanceId}] Initializing session...`, { sessionId: sessionData.sessionId });\n }\n\n const deviceInfo = collectDeviceInfo();\n const urlParams = getUrlParams();\n const browserLocale = getBrowserLocale();\n\n // \uD83C\uDFAF Check draft mode from URL, localStorage, or cookie\n const draft = isDraftMode();\n\n // Store draft mode if detected from URL (urlParams may have draft from query string)\n const draftParam = new URLSearchParams(window.location.search).get('draft');\n if (draftParam !== null) {\n setDraftMode(draftParam === 'true');\n }\n\n const sessionInitData = {\n storeId: sessionData.storeId,\n accountId: sessionData.accountId,\n customerId: sessionData.customerId,\n role: sessionData.role,\n browserLocale,\n queryLocale: urlParams.locale,\n queryCurrency: urlParams.currency,\n utmSource: urlParams.utmSource,\n utmMedium: urlParams.utmMedium,\n utmCampaign: urlParams.utmCampaign,\n browser: deviceInfo.userAgent.browser.name,\n browserVersion: deviceInfo.userAgent.browser.version,\n os: deviceInfo.userAgent.os.name,\n osVersion: deviceInfo.userAgent.os.version,\n deviceType: deviceInfo.userAgent.device?.type,\n deviceModel: deviceInfo.userAgent.device?.model,\n deviceVendor: deviceInfo.userAgent.device?.vendor,\n userAgent: deviceInfo.userAgent.name,\n engineName: deviceInfo.userAgent.engine.name,\n engineVersion: deviceInfo.userAgent.engine.version,\n cpuArchitecture: deviceInfo.userAgent.cpu.architecture,\n isBot: deviceInfo.flags?.isBot ?? false,\n isChromeFamily: deviceInfo.flags?.isChromeFamily ?? false,\n isStandalonePWA: deviceInfo.flags?.isStandalonePWA ?? false,\n isAppleSilicon: deviceInfo.flags?.isAppleSilicon ?? false,\n screenWidth: deviceInfo.screenResolution.width,\n screenHeight: deviceInfo.screenResolution.height,\n timeZone: deviceInfo.timeZone,\n draft, // \uD83C\uDFAF Pass draft mode to session init\n fetchMessages: false,\n };\n\n const response = await this.apiClient.post<SessionInitResponse>(\n '/api/v1/cms/session/v2/init',\n sessionInitData\n );\n\n // Success - reset error tracking\n this.lastSessionInitError = null;\n this.sessionInitRetryCount = 0;\n\n // Update state with session data\n this.updateSessionState(response, sessionData);\n\n this.updateState({\n isInitialized: true,\n isSessionInitialized: true,\n isLoading: false,\n });\n\n if (this.state.debugMode) console.log('[TagadaClient] Session initialized successfully');\n\n } catch (error) {\n // Track error and increment retry count\n this.lastSessionInitError = error as Error;\n this.sessionInitRetryCount++;\n\n console.error(`[TagadaClient] Error initializing session (attempt ${this.sessionInitRetryCount}/${this.MAX_SESSION_INIT_RETRIES}):`, error);\n\n this.updateState({\n isInitialized: true,\n isLoading: false,\n });\n } finally {\n // Always release the lock\n this.isInitializingSession = false;\n }\n }\n\n private updateSessionState(response: SessionInitResponse, sessionData: Session) {\n // Update Store\n if (response.store) {\n const storeData = response.store as any;\n const storeConfig = {\n ...response.store,\n // Ensure accountId is included - fallback to plugin config or session accountId\n accountId: storeData.accountId || this.state.pluginConfig?.accountId || sessionData.accountId || '',\n presentmentCurrencies: storeData.presentmentCurrencies || [response.store.currency || 'USD'],\n chargeCurrencies: storeData.chargeCurrencies || [response.store.currency || 'USD'],\n };\n this.updateState({ store: storeConfig });\n }\n\n // Update Locale (only if provided - V2 endpoint doesn't return locale)\n if (response.locale) {\n const localeConfig = {\n locale: response.locale,\n language: response.locale.split('-')[0],\n region: response.locale.split('-')[1] ?? 'US',\n messages: response.messages ?? {},\n };\n this.updateState({ locale: localeConfig });\n }\n\n // Update Currency\n if (response.store) {\n const currencyConfig = {\n code: response.store.currency,\n symbol: this.getCurrencySymbol(response.store.currency),\n name: this.getCurrencyName(response.store.currency),\n };\n this.updateState({ currency: currencyConfig });\n }\n\n // Update Customer & Auth\n const authState = {\n isAuthenticated: response.customer?.isAuthenticated ?? false,\n isLoading: false,\n customer: response.customer ?? null,\n session: sessionData,\n };\n this.updateState({\n customer: response.customer ?? null,\n auth: authState\n });\n\n // Auto-initialize funnel if enabled\n // This runs after we have all required data: auth.session, store, accountId\n if (this.funnel && sessionData.customerId && response.store?.id) {\n const accountId = response.store.accountId || this.state.pluginConfig?.accountId || sessionData.accountId || '';\n\n if (accountId) {\n // Get funnelId from URL or config\n const urlParams = new URLSearchParams(typeof window !== 'undefined' ? window.location.search : '');\n const funnelId = urlParams.get('funnelId') || undefined;\n\n if (this.state.debugMode) {\n console.log('[TagadaClient] Auto-initializing funnel...', {\n customerId: sessionData.customerId,\n storeId: response.store.id,\n accountId,\n funnelId: funnelId || 'auto-detect',\n });\n }\n\n // Auto-initialize funnel in background (don't block session init)\n this.funnel.autoInitialize(\n { customerId: sessionData.customerId, sessionId: sessionData.sessionId },\n { id: response.store.id, accountId },\n funnelId,\n ).catch((err) => {\n console.error('[TagadaClient] Funnel auto-initialization failed:', err);\n });\n } else {\n console.warn('[TagadaClient] Cannot auto-initialize funnel: accountId is missing');\n }\n }\n }\n\n // Helper methods\n private getCurrencySymbol(code: string): string {\n const symbols: Record<string, string> = {\n USD: '$', EUR: '\u20AC', GBP: '\u00A3', JPY: '\u00A5', CAD: 'C$', AUD: 'A$',\n };\n return symbols[code] || code;\n }\n\n private getCurrencyName(code: string): string {\n const names: Record<string, string> = {\n USD: 'US Dollar', EUR: 'Euro', GBP: 'British Pound',\n JPY: 'Japanese Yen', CAD: 'Canadian Dollar', AUD: 'Australian Dollar',\n };\n return names[code] || code;\n }\n\n /**\n * Helper to get accountId with fallbacks\n */\n getAccountId(): string {\n return this.state.store?.accountId || this.state.pluginConfig?.accountId || this.state.session?.accountId || '';\n }\n\n /**\n * Update plugin config dynamically (hot-reload)\n * Used for live config editing without page reload\n */\n updatePluginConfig(newConfig: Partial<PluginConfig['config']>) {\n if (this.state.debugMode) {\n console.log('[TagadaClient] Hot-reloading config:', newConfig);\n }\n\n // Merge new config with existing\n const updatedConfig = {\n ...this.state.pluginConfig.config,\n ...newConfig,\n };\n\n // Update state\n this.updateState({\n pluginConfig: {\n ...this.state.pluginConfig,\n config: updatedConfig,\n },\n });\n\n // Emit config update event\n this.bus.emit('CONFIG_UPDATED', updatedConfig);\n\n if (this.state.debugMode) {\n console.log('[TagadaClient] Config updated successfully');\n }\n }\n\n /**\n * Setup listener for config updates from parent window (config editor)\n * Enables live config editing via postMessage\n */\n private setupConfigHotReload() {\n if (typeof window === 'undefined') return;\n\n const handleMessage = (event: MessageEvent) => {\n // Security: Only accept messages from same origin or trusted origins\n // In production, you might want to check event.origin more strictly\n\n if (event.data?.type === 'TAGADAPAY_CONFIG_UPDATE') {\n const { config } = event.data;\n\n if (this.state.debugMode) {\n console.log('[TagadaClient] Received config update from parent:', config);\n }\n\n this.updatePluginConfig(config);\n } else if (event.data?.type === 'APPLY_STYLES_TO_ELEMENT') {\n const { elementId, styles } = event.data;\n\n if (this.state.debugMode) {\n console.log('[TagadaClient] Received style application request:', { elementId, styles });\n }\n\n this.applyStylesToElement(elementId, styles);\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n if (this.state.debugMode) {\n console.log('[TagadaClient] Config hot-reload and style manipulation listeners enabled');\n }\n }\n\n /**\n * Apply CSS properties to a real div child element for highlighting\n * Used by config editor to highlight elements in preview without altering the element's style\n */\n private applyStylesToElement(elementId: string, styles?: Record<string, string>) {\n if (typeof document === 'undefined') return;\n\n // Always remove any existing highlight, even if the target element is not found\n const staticHighlightId = 'tagada-editor-highlight';\n const existingHighlight = document.getElementById(staticHighlightId) as HTMLElement | null;\n if (existingHighlight) {\n existingHighlight.remove();\n }\n\n const applyToElement = (element: HTMLElement) => {\n // List of void/self-closing elements that don't accept children\n const voidElements = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\n ]);\n\n const isVoidElement = voidElements.has(element.tagName.toLowerCase());\n\n // For void elements, wrap them in a container div\n let targetElement = element;\n\n if (isVoidElement) {\n // Check if element is already wrapped (from a previous highlight)\n const parent = element.parentElement;\n const existingWrapper = parent?.getAttribute('data-tagada-highlight-wrapper');\n\n if (existingWrapper === 'true' && parent instanceof HTMLElement) {\n // Reuse existing wrapper\n targetElement = parent;\n } else {\n // Create a new wrapper\n const newWrapper = document.createElement('div');\n newWrapper.setAttribute('data-tagada-highlight-wrapper', 'true');\n\n // Preserve the element's layout behavior by matching its display style\n // This minimizes the visual impact of the wrapper\n const computedStyle = window.getComputedStyle(element);\n const elementDisplay = computedStyle.display;\n\n // Match the display type to preserve layout\n // For inline elements, use inline-block (to support position: relative)\n // For all others, use the same display value\n if (elementDisplay === 'inline') {\n newWrapper.style.display = 'inline-block';\n } else {\n newWrapper.style.display = elementDisplay;\n }\n\n newWrapper.style.position = 'relative';\n\n // Preserve vertical alignment for inline elements\n if (elementDisplay === 'inline' || elementDisplay.includes('inline')) {\n const verticalAlign = computedStyle.verticalAlign;\n if (verticalAlign && verticalAlign !== 'baseline') {\n newWrapper.style.verticalAlign = verticalAlign;\n }\n }\n\n // Preserve spacing and layout properties from the original element\n // List of CSS properties that affect spacing and layout\n const spacingProperties = [\n // Width and height\n 'width', 'height', 'minWidth', 'minHeight', 'maxWidth', 'maxHeight',\n // Flex properties\n 'flex', 'flexGrow', 'flexShrink', 'flexBasis',\n // Grid properties\n 'gridColumn', 'gridRow', 'gridColumnStart', 'gridColumnEnd',\n 'gridRowStart', 'gridRowEnd', 'gridArea',\n // Alignment properties\n 'alignSelf', 'justifySelf',\n // Box sizing\n 'boxSizing',\n // Gap (for grid/flex)\n 'gap', 'rowGap', 'columnGap',\n // Order (for flex/grid)\n 'order',\n // Aspect ratio\n 'aspectRatio',\n ];\n\n spacingProperties.forEach(prop => {\n const camelProp = prop.replace(/([A-Z])/g, '-$1').toLowerCase();\n const value = computedStyle.getPropertyValue(camelProp);\n\n // Only copy if the value is not empty\n // For most properties, we want to preserve the value even if it's 'auto' or '0px'\n // as these might be intentional layout choices\n if (value && value.trim() !== '') {\n // Handle special cases\n if (prop === 'flex' && value !== 'none' && value !== '0 1 auto') {\n newWrapper.style.flex = value;\n } else if (prop === 'boxSizing') {\n newWrapper.style.boxSizing = value;\n } else {\n // Use setProperty for kebab-case properties\n // Preserve all values including percentages, auto, etc.\n newWrapper.style.setProperty(camelProp, value);\n }\n }\n });\n\n // Also check inline styles for spacing properties\n // This handles cases where styles are set directly on the element\n if (element.style) {\n const inlineSpacingProps = [\n 'width', 'height', 'min-width', 'min-height', 'max-width', 'max-height',\n 'flex', 'flex-grow', 'flex-shrink', 'flex-basis',\n 'grid-column', 'grid-row', 'grid-column-start', 'grid-column-end',\n 'grid-row-start', 'grid-row-end', 'grid-area',\n 'align-self', 'justify-self',\n 'box-sizing', 'gap', 'row-gap', 'column-gap', 'order', 'aspect-ratio'\n ];\n\n inlineSpacingProps.forEach(prop => {\n const inlineValue = element.style.getPropertyValue(prop);\n if (inlineValue) {\n newWrapper.style.setProperty(prop, inlineValue);\n }\n });\n }\n\n // Insert wrapper before element\n element.parentNode?.insertBefore(newWrapper, element);\n // Move element into wrapper\n newWrapper.appendChild(element);\n targetElement = newWrapper;\n }\n }\n\n // Ensure element has position relative for absolute child positioning\n const computedStyle = getComputedStyle(isVoidElement ? element : targetElement);\n if (targetElement.style.position === 'static' || !targetElement.style.position) {\n targetElement.style.position = 'relative';\n }\n\n // Create new highlight div with static ID\n const highlightDiv = document.createElement('div');\n highlightDiv.id = staticHighlightId;\n highlightDiv.style.position = 'absolute';\n highlightDiv.style.inset = '0';\n highlightDiv.style.pointerEvents = 'none';\n highlightDiv.style.zIndex = '9999';\n highlightDiv.style.boxSizing = 'border-box';\n highlightDiv.style.background = 'none';\n highlightDiv.style.border = 'none';\n highlightDiv.style.outline = 'none';\n highlightDiv.style.margin = '0';\n highlightDiv.style.padding = '0';\n\n // Inherit border radius from parent\n const borderRadius = computedStyle.borderRadius;\n if (borderRadius) {\n highlightDiv.style.borderRadius = borderRadius;\n }\n\n // Append the new highlight div to the target element\n targetElement.appendChild(highlightDiv);\n\n // Apply CSS properties to the highlight div\n const stylesToApply = styles || { boxShadow: '0 0 0 2px rgb(239 68 68)' }; // Default red ring\n\n Object.entries(stylesToApply).forEach(([property, value]) => {\n // Convert kebab-case to camelCase for style object\n const camelProperty = property.includes('-')\n ? property.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())\n : property;\n\n // Use setProperty for kebab-case or direct assignment for camelCase\n if (property.includes('-')) {\n highlightDiv.style.setProperty(property, value);\n } else {\n (highlightDiv.style as any)[camelProperty] = value;\n }\n });\n\n // Scroll element into view\n element.scrollIntoView({ behavior: 'smooth', block: 'center' });\n\n if (this.state.debugMode) {\n const appliedStyles = Object.entries(stylesToApply).map(([k, v]) => `${k}: ${v}`).join('; ');\n console.log(`[TagadaClient] Applied styles to highlight div of element #${elementId}:`, appliedStyles);\n }\n };\n\n // Support multiple IDs in editor-id attribute (space-separated)\n // Use ~= selector to match elementId as a space-separated value\n const maxAttempts = 5;\n const intervalMs = 1000;\n let attempts = 0;\n\n const isElementHidden = (element: HTMLElement): boolean => {\n const style = window.getComputedStyle(element);\n return (\n style.display === 'none' ||\n style.visibility === 'hidden' ||\n style.opacity === '0' ||\n element.hidden ||\n element.offsetWidth === 0 ||\n element.offsetHeight === 0\n );\n };\n\n const findAndApply = () => {\n const elements = document.querySelectorAll(`[editor-id~=\"${elementId}\"]`) as NodeListOf<HTMLElement>;\n\n if (elements.length === 0) {\n attempts += 1;\n\n if (attempts >= maxAttempts) {\n if (this.state.debugMode) {\n console.warn(\n `[TagadaClient] Element with editor-id containing \"${elementId}\" not found after ${maxAttempts} attempts`\n );\n }\n return;\n }\n\n if (this.state.debugMode) {\n console.warn(\n `[TagadaClient] Element with editor-id containing \"${elementId}\" not found (attempt ${attempts}/${maxAttempts}), retrying in ${intervalMs / 1000}s`\n );\n }\n\n setTimeout(findAndApply, intervalMs);\n return;\n }\n\n // If multiple elements found, prioritize the one that is not hidden\n let element: HTMLElement | null = null;\n\n if (elements.length === 1) {\n element = elements[0];\n } else {\n // Find the first non-hidden element\n for (let i = 0; i < elements.length; i++) {\n if (!isElementHidden(elements[i])) {\n element = elements[i];\n break;\n }\n }\n // If all are hidden, use the first one\n if (!element) {\n element = elements[0];\n }\n }\n\n if (element) {\n applyToElement(element);\n }\n };\n\n findAndApply();\n }\n}\n\n", "'use strict';\n\n/**\n * Create a bound version of a function with a specified `this` context\n *\n * @param {Function} fn - The function to bind\n * @param {*} thisArg - The value to be passed as the `this` parameter\n * @returns {Function} A new function that will call the original function with the specified `this` context\n */\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n", "'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\nconst {iterator, toStringTag} = Symbol;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(toStringTag in val) && !(iterator in val);\n}\n\n/**\n * Determine if a value is an empty object (safely handles Buffers)\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an empty object, otherwise false\n */\nconst isEmptyObject = (val) => {\n // Early return for non-objects or Buffers to prevent RangeError\n if (!isObject(val) || isBuffer(val)) {\n return false;\n }\n\n try {\n return Object.keys(val).length === 0 && Object.getPrototypeOf(val) === Object.prototype;\n } catch (e) {\n // Fallback for any other objects that might cause RangeError with Object.keys()\n return false;\n }\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\nconst [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Buffer check\n if (isBuffer(obj)) {\n return;\n }\n\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n if (isBuffer(obj)){\n return null;\n }\n\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless, skipUndefined} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else if (!skipUndefined || !isUndefined(val)) {\n result[targetKey] = val;\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[iterator];\n\n const _iterator = generator.call(obj);\n\n let result;\n\n while ((result = _iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n return value != null && Number.isFinite(value = +value) ? value : defaultValue;\n}\n\n\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[toStringTag] === 'FormData' && thing[iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n //Buffer check\n if (isBuffer(source)) {\n return source;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n }\n\n return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\n// original code\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\n\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\n if (setImmediateSupported) {\n return setImmediate;\n }\n\n return postMessageSupported ? ((token, callbacks) => {\n _global.addEventListener(\"message\", ({source, data}) => {\n if (source === _global && data === token) {\n callbacks.length && callbacks.shift()();\n }\n }, false);\n\n return (cb) => {\n callbacks.push(cb);\n _global.postMessage(token, \"*\");\n }\n })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);\n})(\n typeof setImmediate === 'function',\n isFunction(_global.postMessage)\n);\n\nconst asap = typeof queueMicrotask !== 'undefined' ?\n queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);\n\n// *********************\n\n\nconst isIterable = (thing) => thing != null && isFunction(thing[iterator]);\n\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isEmptyObject,\n isReadableStream,\n isRequest,\n isResponse,\n isHeaders,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable,\n setImmediate: _setImmediate,\n asap,\n isIterable\n};\n", "'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n if (response) {\n this.response = response;\n this.status = response.status ? response.status : null;\n }\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.status\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n const msg = error && error.message ? error.message : 'Error';\n\n // Prefer explicit code; otherwise copy the low-level error's code (e.g. ECONNREFUSED)\n const errCode = code == null && error ? error.code : code;\n AxiosError.call(axiosError, msg, errCode, config, request, response);\n\n // Chain the original error on the standard field; non-enumerable to avoid JSON noise\n if (error && axiosError.cause == null) {\n Object.defineProperty(axiosError, 'cause', { value: error, configurable: true });\n }\n\n axiosError.name = (error && error.name) || 'Error';\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n", "// eslint-disable-next-line strict\nexport default null;\n", "'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (PlatformFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (utils.isBoolean(value)) {\n return value.toString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array<String|Number>} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n", "'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n", "'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?(object|Function)} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n if (utils.isFunction(options)) {\n options = {\n serialize: options\n };\n } \n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n", "'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {void}\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n", "'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n", "'use strict';\n\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n", "'use strict';\n\nexport default typeof FormData !== 'undefined' ? FormData : null;\n", "'use strict'\n\nexport default typeof Blob !== 'undefined' ? Blob : null\n", "import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\nimport Blob from './classes/Blob.js'\n\nexport default {\n isBrowser: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob\n },\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n", "const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nconst _navigator = typeof navigator === 'object' && navigator || undefined;\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = hasBrowserEnv &&\n (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\nconst origin = hasBrowserEnv && window.location.href || 'http://localhost';\n\nexport {\n hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv,\n _navigator as navigator,\n origin\n}\n", "import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n ...utils,\n ...platform\n}\n", "'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), {\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n },\n ...options\n });\n}\n", "'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n\n if (name === '__proto__') return true;\n\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n", "'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http', 'fetch'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data) ||\n utils.isReadableStream(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (utils.isResponse(data) || utils.isReadableStream(data)) {\n return data;\n }\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data, this.parseReviver);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nexport default defaults;\n", "'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n", "'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite)\n } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else if (utils.isObject(header) && utils.isIterable(header)) {\n let obj = {}, dest, key;\n for (const entry of header) {\n if (!utils.isArray(entry)) {\n throw TypeError('Object iterator must return a key-value pair');\n }\n\n obj[key = entry[0]] = (dest = obj[key]) ?\n (utils.isArray(dest) ? [...dest, entry[1]] : [dest, entry[1]]) : entry[1];\n }\n\n setHeaders(obj, valueOrRewrite)\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n getSetCookie() {\n return this.get(\"set-cookie\") || [];\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n }\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n", "'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n", "'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n", "'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n", "'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n", "'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n", "'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n", "/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */\nfunction throttle(fn, freq) {\n let timestamp = 0;\n let threshold = 1000 / freq;\n let lastArgs;\n let timer;\n\n const invoke = (args, now = Date.now()) => {\n timestamp = now;\n lastArgs = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n fn(...args);\n }\n\n const throttled = (...args) => {\n const now = Date.now();\n const passed = now - timestamp;\n if ( passed >= threshold) {\n invoke(args, now);\n } else {\n lastArgs = args;\n if (!timer) {\n timer = setTimeout(() => {\n timer = null;\n invoke(lastArgs)\n }, threshold - passed);\n }\n }\n }\n\n const flush = () => lastArgs && invoke(lastArgs);\n\n return [throttled, flush];\n}\n\nexport default throttle;\n", "import speedometer from \"./speedometer.js\";\nimport throttle from \"./throttle.js\";\nimport utils from \"../utils.js\";\n\nexport const progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return throttle(e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e,\n lengthComputable: total != null,\n [isDownloadStream ? 'download' : 'upload']: true\n };\n\n listener(data);\n }, freq);\n}\n\nexport const progressEventDecorator = (total, throttled) => {\n const lengthComputable = total != null;\n\n return [(loaded) => throttled[0]({\n lengthComputable,\n total,\n loaded\n }), throttled[1]];\n}\n\nexport const asyncDecorator = (fn) => (...args) => utils.asap(() => fn(...args));\n", "import platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => {\n url = new URL(url, platform.origin);\n\n return (\n origin.protocol === url.protocol &&\n origin.host === url.host &&\n (isMSIE || origin.port === url.port)\n );\n})(\n new URL(platform.origin),\n platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)\n) : () => true;\n", "import utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure, sameSite) {\n if (typeof document === 'undefined') return;\n\n const cookie = [`${name}=${encodeURIComponent(value)}`];\n\n if (utils.isNumber(expires)) {\n cookie.push(`expires=${new Date(expires).toUTCString()}`);\n }\n if (utils.isString(path)) {\n cookie.push(`path=${path}`);\n }\n if (utils.isString(domain)) {\n cookie.push(`domain=${domain}`);\n }\n if (secure === true) {\n cookie.push('secure');\n }\n if (utils.isString(sameSite)) {\n cookie.push(`SameSite=${sameSite}`);\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read(name) {\n if (typeof document === 'undefined') return null;\n const match = document.cookie.match(new RegExp('(?:^|; )' + name + '=([^;]*)'));\n return match ? decodeURIComponent(match[1]) : null;\n },\n\n remove(name) {\n this.write(name, '', Date.now() - 86400000, '/');\n }\n }\n\n :\n\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {},\n read() {\n return null;\n },\n remove() {}\n };\n\n", "'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n", "'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n", "'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {\n let isRelativeUrl = !isAbsoluteURL(requestedURL);\n if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n", "'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? { ...thing } : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, prop, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({caseless}, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, prop, caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, prop, caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, prop, caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b, prop) => mergeDeepProperties(headersToObject(a), headersToObject(b), prop, true)\n };\n\n utils.forEach(Object.keys({...config1, ...config2}), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n", "import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport isURLSameOrigin from \"./isURLSameOrigin.js\";\nimport cookies from \"./cookies.js\";\nimport buildFullPath from \"../core/buildFullPath.js\";\nimport mergeConfig from \"../core/mergeConfig.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport buildURL from \"./buildURL.js\";\n\nexport default (config) => {\n const newConfig = mergeConfig({}, config);\n\n let { data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth } = newConfig;\n\n newConfig.headers = headers = AxiosHeaders.from(headers);\n\n newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer);\n\n // HTTP basic authentication\n if (auth) {\n headers.set('Authorization', 'Basic ' +\n btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))\n );\n }\n\n if (utils.isFormData(data)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n headers.setContentType(undefined); // browser handles it\n } else if (utils.isFunction(data.getHeaders)) {\n // Node.js FormData (like form-data package)\n const formHeaders = data.getHeaders();\n // Only set safe headers to avoid overwriting security headers\n const allowedHeaders = ['content-type', 'content-length'];\n Object.entries(formHeaders).forEach(([key, val]) => {\n if (allowedHeaders.includes(key.toLowerCase())) {\n headers.set(key, val);\n }\n });\n }\n } \n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n\n if (platform.hasStandardBrowserEnv) {\n withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\n\n if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {\n // Add xsrf header\n const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\n\n if (xsrfValue) {\n headers.set(xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n return newConfig;\n}\n\n", "import utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport {progressEventReducer} from '../helpers/progressEventReducer.js';\nimport resolveConfig from \"../helpers/resolveConfig.js\";\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n const _config = resolveConfig(config);\n let requestData = _config.data;\n const requestHeaders = AxiosHeaders.from(_config.headers).normalize();\n let {responseType, onUploadProgress, onDownloadProgress} = _config;\n let onCanceled;\n let uploadThrottled, downloadThrottled;\n let flushUpload, flushDownload;\n\n function done() {\n flushUpload && flushUpload(); // flush events\n flushDownload && flushDownload(); // flush events\n\n _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\n\n _config.signal && _config.signal.removeEventListener('abort', onCanceled);\n }\n\n let request = new XMLHttpRequest();\n\n request.open(_config.method.toUpperCase(), _config.url, true);\n\n // Set the request timeout in MS\n request.timeout = _config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError(event) {\n // Browsers deliver a ProgressEvent in XHR onerror\n // (message may be empty; when present, surface it)\n // See https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/error_event\n const msg = event && event.message ? event.message : 'Network Error';\n const err = new AxiosError(msg, AxiosError.ERR_NETWORK, config, request);\n // attach the underlying event for consumers who want details\n err.event = event || null;\n reject(err);\n request = null;\n };\n \n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = _config.transitional || transitionalDefaults;\n if (_config.timeoutErrorMessage) {\n timeoutErrorMessage = _config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(_config.withCredentials)) {\n request.withCredentials = !!_config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = _config.responseType;\n }\n\n // Handle progress if needed\n if (onDownloadProgress) {\n ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));\n request.addEventListener('progress', downloadThrottled);\n }\n\n // Not all browsers support upload events\n if (onUploadProgress && request.upload) {\n ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));\n\n request.upload.addEventListener('progress', uploadThrottled);\n\n request.upload.addEventListener('loadend', flushUpload);\n }\n\n if (_config.cancelToken || _config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\n if (_config.signal) {\n _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(_config.url);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n", "import CanceledError from \"../cancel/CanceledError.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport utils from '../utils.js';\n\nconst composeSignals = (signals, timeout) => {\n const {length} = (signals = signals ? signals.filter(Boolean) : []);\n\n if (timeout || length) {\n let controller = new AbortController();\n\n let aborted;\n\n const onabort = function (reason) {\n if (!aborted) {\n aborted = true;\n unsubscribe();\n const err = reason instanceof Error ? reason : this.reason;\n controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));\n }\n }\n\n let timer = timeout && setTimeout(() => {\n timer = null;\n onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT))\n }, timeout)\n\n const unsubscribe = () => {\n if (signals) {\n timer && clearTimeout(timer);\n timer = null;\n signals.forEach(signal => {\n signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);\n });\n signals = null;\n }\n }\n\n signals.forEach((signal) => signal.addEventListener('abort', onabort));\n\n const {signal} = controller;\n\n signal.unsubscribe = () => utils.asap(unsubscribe);\n\n return signal;\n }\n}\n\nexport default composeSignals;\n", "\nexport const streamChunk = function* (chunk, chunkSize) {\n let len = chunk.byteLength;\n\n if (!chunkSize || len < chunkSize) {\n yield chunk;\n return;\n }\n\n let pos = 0;\n let end;\n\n while (pos < len) {\n end = pos + chunkSize;\n yield chunk.slice(pos, end);\n pos = end;\n }\n}\n\nexport const readBytes = async function* (iterable, chunkSize) {\n for await (const chunk of readStream(iterable)) {\n yield* streamChunk(chunk, chunkSize);\n }\n}\n\nconst readStream = async function* (stream) {\n if (stream[Symbol.asyncIterator]) {\n yield* stream;\n return;\n }\n\n const reader = stream.getReader();\n try {\n for (;;) {\n const {done, value} = await reader.read();\n if (done) {\n break;\n }\n yield value;\n }\n } finally {\n await reader.cancel();\n }\n}\n\nexport const trackStream = (stream, chunkSize, onProgress, onFinish) => {\n const iterator = readBytes(stream, chunkSize);\n\n let bytes = 0;\n let done;\n let _onFinish = (e) => {\n if (!done) {\n done = true;\n onFinish && onFinish(e);\n }\n }\n\n return new ReadableStream({\n async pull(controller) {\n try {\n const {done, value} = await iterator.next();\n\n if (done) {\n _onFinish();\n controller.close();\n return;\n }\n\n let len = value.byteLength;\n if (onProgress) {\n let loadedBytes = bytes += len;\n onProgress(loadedBytes);\n }\n controller.enqueue(new Uint8Array(value));\n } catch (err) {\n _onFinish(err);\n throw err;\n }\n },\n cancel(reason) {\n _onFinish(reason);\n return iterator.return();\n }\n }, {\n highWaterMark: 2\n })\n}\n", "import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport composeSignals from \"../helpers/composeSignals.js\";\nimport {trackStream} from \"../helpers/trackStream.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport {progressEventReducer, progressEventDecorator, asyncDecorator} from \"../helpers/progressEventReducer.js\";\nimport resolveConfig from \"../helpers/resolveConfig.js\";\nimport settle from \"../core/settle.js\";\n\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\n\nconst {isFunction} = utils;\n\nconst globalFetchAPI = (({Request, Response}) => ({\n Request, Response\n}))(utils.global);\n\nconst {\n ReadableStream, TextEncoder\n} = utils.global;\n\n\nconst test = (fn, ...args) => {\n try {\n return !!fn(...args);\n } catch (e) {\n return false\n }\n}\n\nconst factory = (env) => {\n env = utils.merge.call({\n skipUndefined: true\n }, globalFetchAPI, env);\n\n const {fetch: envFetch, Request, Response} = env;\n const isFetchSupported = envFetch ? isFunction(envFetch) : typeof fetch === 'function';\n const isRequestSupported = isFunction(Request);\n const isResponseSupported = isFunction(Response);\n\n if (!isFetchSupported) {\n return false;\n }\n\n const isReadableStreamSupported = isFetchSupported && isFunction(ReadableStream);\n\n const encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?\n ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :\n async (str) => new Uint8Array(await new Request(str).arrayBuffer())\n );\n\n const supportsRequestStream = isRequestSupported && isReadableStreamSupported && test(() => {\n let duplexAccessed = false;\n\n const hasContentType = new Request(platform.origin, {\n body: new ReadableStream(),\n method: 'POST',\n get duplex() {\n duplexAccessed = true;\n return 'half';\n },\n }).headers.has('Content-Type');\n\n return duplexAccessed && !hasContentType;\n });\n\n const supportsResponseStream = isResponseSupported && isReadableStreamSupported &&\n test(() => utils.isReadableStream(new Response('').body));\n\n const resolvers = {\n stream: supportsResponseStream && ((res) => res.body)\n };\n\n isFetchSupported && ((() => {\n ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {\n !resolvers[type] && (resolvers[type] = (res, config) => {\n let method = res && res[type];\n\n if (method) {\n return method.call(res);\n }\n\n throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);\n })\n });\n })());\n\n const getBodyLength = async (body) => {\n if (body == null) {\n return 0;\n }\n\n if (utils.isBlob(body)) {\n return body.size;\n }\n\n if (utils.isSpecCompliantForm(body)) {\n const _request = new Request(platform.origin, {\n method: 'POST',\n body,\n });\n return (await _request.arrayBuffer()).byteLength;\n }\n\n if (utils.isArrayBufferView(body) || utils.isArrayBuffer(body)) {\n return body.byteLength;\n }\n\n if (utils.isURLSearchParams(body)) {\n body = body + '';\n }\n\n if (utils.isString(body)) {\n return (await encodeText(body)).byteLength;\n }\n }\n\n const resolveBodyLength = async (headers, body) => {\n const length = utils.toFiniteNumber(headers.getContentLength());\n\n return length == null ? getBodyLength(body) : length;\n }\n\n return async (config) => {\n let {\n url,\n method,\n data,\n signal,\n cancelToken,\n timeout,\n onDownloadProgress,\n onUploadProgress,\n responseType,\n headers,\n withCredentials = 'same-origin',\n fetchOptions\n } = resolveConfig(config);\n\n let _fetch = envFetch || fetch;\n\n responseType = responseType ? (responseType + '').toLowerCase() : 'text';\n\n let composedSignal = composeSignals([signal, cancelToken && cancelToken.toAbortSignal()], timeout);\n\n let request = null;\n\n const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {\n composedSignal.unsubscribe();\n });\n\n let requestContentLength;\n\n try {\n if (\n onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&\n (requestContentLength = await resolveBodyLength(headers, data)) !== 0\n ) {\n let _request = new Request(url, {\n method: 'POST',\n body: data,\n duplex: \"half\"\n });\n\n let contentTypeHeader;\n\n if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {\n headers.setContentType(contentTypeHeader)\n }\n\n if (_request.body) {\n const [onProgress, flush] = progressEventDecorator(\n requestContentLength,\n progressEventReducer(asyncDecorator(onUploadProgress))\n );\n\n data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);\n }\n }\n\n if (!utils.isString(withCredentials)) {\n withCredentials = withCredentials ? 'include' : 'omit';\n }\n\n // Cloudflare Workers throws when credentials are defined\n // see https://github.com/cloudflare/workerd/issues/902\n const isCredentialsSupported = isRequestSupported && \"credentials\" in Request.prototype;\n\n const resolvedOptions = {\n ...fetchOptions,\n signal: composedSignal,\n method: method.toUpperCase(),\n headers: headers.normalize().toJSON(),\n body: data,\n duplex: \"half\",\n credentials: isCredentialsSupported ? withCredentials : undefined\n };\n\n request = isRequestSupported && new Request(url, resolvedOptions);\n\n let response = await (isRequestSupported ? _fetch(request, fetchOptions) : _fetch(url, resolvedOptions));\n\n const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');\n\n if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {\n const options = {};\n\n ['status', 'statusText', 'headers'].forEach(prop => {\n options[prop] = response[prop];\n });\n\n const responseContentLength = utils.toFiniteNumber(response.headers.get('content-length'));\n\n const [onProgress, flush] = onDownloadProgress && progressEventDecorator(\n responseContentLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true)\n ) || [];\n\n response = new Response(\n trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\n flush && flush();\n unsubscribe && unsubscribe();\n }),\n options\n );\n }\n\n responseType = responseType || 'text';\n\n let responseData = await resolvers[utils.findKey(resolvers, responseType) || 'text'](response, config);\n\n !isStreamResponse && unsubscribe && unsubscribe();\n\n return await new Promise((resolve, reject) => {\n settle(resolve, reject, {\n data: responseData,\n headers: AxiosHeaders.from(response.headers),\n status: response.status,\n statusText: response.statusText,\n config,\n request\n })\n })\n } catch (err) {\n unsubscribe && unsubscribe();\n\n if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {\n throw Object.assign(\n new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),\n {\n cause: err.cause || err\n }\n )\n }\n\n throw AxiosError.from(err, err && err.code, config, request);\n }\n }\n}\n\nconst seedCache = new Map();\n\nexport const getFetch = (config) => {\n let env = (config && config.env) || {};\n const {fetch, Request, Response} = env;\n const seeds = [\n Request, Response, fetch\n ];\n\n let len = seeds.length, i = len,\n seed, target, map = seedCache;\n\n while (i--) {\n seed = seeds[i];\n target = map.get(seed);\n\n target === undefined && map.set(seed, target = (i ? new Map() : factory(env)))\n\n map = target;\n }\n\n return target;\n};\n\nconst adapter = getFetch();\n\nexport default adapter;\n", "import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport * as fetchAdapter from './fetch.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\n/**\n * Known adapters mapping.\n * Provides environment-specific adapters for Axios:\n * - `http` for Node.js\n * - `xhr` for browsers\n * - `fetch` for fetch API-based requests\n * \n * @type {Object<string, Function|Object>}\n */\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter,\n fetch: {\n get: fetchAdapter.getFetch,\n }\n};\n\n// Assign adapter names for easier debugging and identification\nutils.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', { value });\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', { value });\n }\n});\n\n/**\n * Render a rejection reason string for unknown or unsupported adapters\n * \n * @param {string} reason\n * @returns {string}\n */\nconst renderReason = (reason) => `- ${reason}`;\n\n/**\n * Check if the adapter is resolved (function, null, or false)\n * \n * @param {Function|null|false} adapter\n * @returns {boolean}\n */\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\n\n/**\n * Get the first suitable adapter from the provided list.\n * Tries each adapter in order until a supported one is found.\n * Throws an AxiosError if no adapter is suitable.\n * \n * @param {Array<string|Function>|string|Function} adapters - Adapter(s) by name or function.\n * @param {Object} config - Axios request configuration\n * @throws {AxiosError} If no suitable adapter is available\n * @returns {Function} The resolved adapter function\n */\nfunction getAdapter(adapters, config) {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n const { length } = adapters;\n let nameOrAdapter;\n let adapter;\n\n const rejectedReasons = {};\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n\n adapter = nameOrAdapter;\n\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n\n if (adapter && (utils.isFunction(adapter) || (adapter = adapter.get(config)))) {\n break;\n }\n\n rejectedReasons[id || '#' + i] = adapter;\n }\n\n if (!adapter) {\n const reasons = Object.entries(rejectedReasons)\n .map(([id, state]) => `adapter ${id} ` +\n (state === false ? 'is not supported by the environment' : 'is not available in the build')\n );\n\n let s = length ?\n (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n 'as no adapter specified';\n\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n return adapter;\n}\n\n/**\n * Exports Axios adapters and utility to resolve an adapter\n */\nexport default {\n /**\n * Resolve an adapter from a list of adapter names or functions.\n * @type {Function}\n */\n getAdapter,\n\n /**\n * Exposes all known adapters\n * @type {Object<string, Function|Object>}\n */\n adapters: knownAdapters\n};\n", "'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults.adapter, config);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n", "export const VERSION = \"1.13.2\";", "'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\nvalidators.spelling = function spelling(correctSpelling) {\n return (value, opt) => {\n // eslint-disable-next-line no-console\n console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);\n return true;\n }\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n", "'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig || {};\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(configOrUrl, config) {\n try {\n return await this._request(configOrUrl, config);\n } catch (err) {\n if (err instanceof Error) {\n let dummy = {};\n\n Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());\n\n // slice off the Error: ... line\n const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, '') : '';\n try {\n if (!err.stack) {\n err.stack = stack;\n // match without the 2 top stack lines\n } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, ''))) {\n err.stack += '\\n' + stack\n }\n } catch (e) {\n // ignore the case where \"stack\" is an un-writable property\n }\n }\n\n throw err;\n }\n }\n\n _request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n }\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.allowAbsoluteUrls\n if (config.allowAbsoluteUrls !== undefined) {\n // do nothing\n } else if (this.defaults.allowAbsoluteUrls !== undefined) {\n config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;\n } else {\n config.allowAbsoluteUrls = true;\n }\n\n validator.assertOptions(config, {\n baseUrl: validators.spelling('baseURL'),\n withXsrfToken: validators.spelling('withXSRFToken')\n }, true);\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift(...requestInterceptorChain);\n chain.push(...responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n", "'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n toAbortSignal() {\n const controller = new AbortController();\n\n const abort = (err) => {\n controller.abort(err);\n };\n\n this.subscribe(abort);\n\n controller.signal.unsubscribe = () => this.unsubscribe(abort);\n\n return controller.signal;\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n", "'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n", "'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n", "const HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n WebServerIsDown: 521,\n ConnectionTimedOut: 522,\n OriginIsUnreachable: 523,\n TimeoutOccurred: 524,\n SslHandshakeFailed: 525,\n InvalidSslCertificate: 526,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n", "'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n", "import axios from './lib/axios.js';\n\n// This module is intended to unwrap Axios default export as named.\n// Keep top-level export same with static properties\n// so that it can keep same with es module or cjs\nconst {\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n} = axios;\n\nexport {\n axios as default,\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n}\n", "/**\n * Base API Client using Axios\n * Shared between all resource clients\n */\n\nimport axios, { AxiosInstance, AxiosRequestConfig, InternalAxiosRequestConfig } from 'axios';\n\n// Extend AxiosRequestConfig to include skipAuth\ndeclare module 'axios' {\n export interface AxiosRequestConfig {\n skipAuth?: boolean;\n }\n}\n\nexport interface ApiClientConfig {\n baseURL: string;\n headers?: Record<string, string>;\n timeout?: number;\n}\n\nexport type TokenProvider = () => Promise<string | null>;\n\nexport class ApiClient {\n public axios: AxiosInstance;\n private currentToken: string | null = null;\n private tokenProvider: TokenProvider | null = null;\n\n // Circuit breaker state\n private requestHistory: Map<string, { count: number; firstRequestTime: number }> = new Map();\n private readonly WINDOW_MS = 5000; // 5 seconds window\n private readonly MAX_REQUESTS = 30; // Max 30 requests per endpoint in window\n\n constructor(config: ApiClientConfig) {\n this.axios = axios.create({\n baseURL: config.baseURL,\n timeout: config.timeout || 60000, // 60 seconds for payment operations\n headers: {\n 'Content-Type': 'application/json',\n ...config.headers,\n },\n });\n\n // Cleanup interval for circuit breaker history\n if (typeof setInterval !== 'undefined') {\n setInterval(() => this.cleanupHistory(), 10000);\n }\n\n // Request interceptor for logging and auth\n this.axios.interceptors.request.use(\n async (config: InternalAxiosRequestConfig) => {\n // Circuit Breaker Check\n if (config.url) {\n try {\n this.checkRequestLimit(`${config.method?.toUpperCase()}:${config.url}`);\n } catch (error) {\n console.error('[SDK] \uD83D\uDED1 Request blocked by Circuit Breaker:', error);\n return Promise.reject(error);\n }\n }\n\n // Check if we need to wait for token\n if (!config.skipAuth && !this.currentToken && this.tokenProvider) {\n try {\n console.log('[SDK] Waiting for token...');\n const token = await this.tokenProvider();\n if (token) {\n this.updateToken(token);\n // Ensure header is set on this specific request config\n config.headers['x-cms-token'] = token;\n }\n } catch (error) {\n console.error('[SDK] Failed to get token from provider:', error);\n }\n }\n\n // Ensure token is in headers if we have it (and not skipped)\n if (!config.skipAuth && this.currentToken) {\n config.headers['x-cms-token'] = this.currentToken;\n }\n\n console.log(`[SDK] Making ${config.method?.toUpperCase()} request to: ${config.baseURL || ''}${config.url}`);\n // console.log('[SDK] Request headers:', config.headers);\n\n return config;\n },\n (error) => {\n console.error('[SDK] Request error:', error);\n return Promise.reject(error instanceof Error ? error : new Error(String(error)));\n }\n );\n\n // Response interceptor for logging\n this.axios.interceptors.response.use(\n (response) => {\n // console.log('[SDK] Response status:', response.status);\n return response;\n },\n (error) => {\n console.error('[SDK] Response error:', error.message);\n return Promise.reject(error instanceof Error ? error : new Error(String(error)));\n }\n );\n }\n\n // Set a provider that returns a promise resolving to the token\n // This allows requests to wait until the token is ready\n setTokenProvider(provider: TokenProvider) {\n this.tokenProvider = provider;\n }\n\n // Convenience methods\n async get<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T> {\n const response = await this.axios.get<T>(url, config);\n return response.data;\n }\n\n async post<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> {\n const response = await this.axios.post<T>(url, data, config);\n return response.data;\n }\n\n async put<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> {\n const response = await this.axios.put<T>(url, data, config);\n return response.data;\n }\n\n async patch<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> {\n const response = await this.axios.patch<T>(url, data, config);\n return response.data;\n }\n\n async delete<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T> {\n const response = await this.axios.delete<T>(url, config);\n return response.data;\n }\n\n // Update headers (useful for auth tokens)\n setHeader(key: string, value: string) {\n this.axios.defaults.headers.common[key] = value;\n }\n\n removeHeader(key: string) {\n delete this.axios.defaults.headers.common[key];\n }\n\n // Token management methods (matching old ApiService pattern)\n updateToken(token: string | null) {\n this.currentToken = token;\n if (token) {\n this.setHeader('x-cms-token', token);\n // console.log('[SDK] Token updated in ApiClient:', token.substring(0, 8) + '...');\n } else {\n this.removeHeader('x-cms-token');\n console.log('[SDK] Token removed from ApiClient');\n }\n }\n\n getCurrentToken(): string | null {\n return this.currentToken;\n }\n\n // Update configuration (useful for environment changes)\n updateConfig(config: Partial<ApiClientConfig>) {\n if (config.baseURL) {\n this.axios.defaults.baseURL = config.baseURL;\n }\n if (config.timeout) {\n this.axios.defaults.timeout = config.timeout;\n }\n if (config.headers) {\n Object.assign(this.axios.defaults.headers.common, config.headers);\n }\n console.log('[SDK] ApiClient configuration updated');\n }\n\n // Circuit Breaker Implementation\n private checkRequestLimit(key: string) {\n const now = Date.now();\n const history = this.requestHistory.get(key);\n\n if (!history) {\n this.requestHistory.set(key, { count: 1, firstRequestTime: now });\n return;\n }\n\n if (now - history.firstRequestTime > this.WINDOW_MS) {\n // Window expired, reset\n this.requestHistory.set(key, { count: 1, firstRequestTime: now });\n return;\n }\n\n history.count++;\n if (history.count > this.MAX_REQUESTS) {\n const error = new Error(`Circuit Breaker: Too many requests to ${key} (${history.count} in ${this.WINDOW_MS}ms)`);\n // Add a property to identify this as a circuit breaker error\n (error as any).isCircuitBreaker = true;\n throw error;\n }\n }\n\n private cleanupHistory() {\n const now = Date.now();\n for (const [key, history] of this.requestHistory.entries()) {\n if (now - history.firstRequestTime > this.WINDOW_MS) {\n this.requestHistory.delete(key);\n }\n }\n }\n}\n", "// Generated ESM version of ua-parser-js\n// DO NOT EDIT THIS FILE!\n// Source: /src/main/ua-parser.js\n\n/////////////////////////////////////////////////////////////////////////////////\n/* UAParser.js v2.0.6\n Copyright \u00A9 2012-2025 Faisal Salman <f@faisalman.com>\n UAParser.js PRO Enterprise License *//*\n Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.\n Supports browser & node.js environment. \n Demo : https://uaparser.dev\n Source : https://github.com/faisalman/ua-parser-js */\n/////////////////////////////////////////////////////////////////////////////////\n\n/* jshint esversion: 6 */ \n/* globals window */\n\n\n \n //////////////\n // Constants\n /////////////\n\n var LIBVERSION = '2.0.6',\n UA_MAX_LENGTH = 500,\n USER_AGENT = 'user-agent',\n EMPTY = '',\n UNKNOWN = '?',\n TYPEOF = {\n FUNCTION : 'function',\n OBJECT : 'object',\n STRING : 'string',\n UNDEFINED : 'undefined'\n },\n\n // properties\n BROWSER = 'browser',\n CPU = 'cpu',\n DEVICE = 'device',\n ENGINE = 'engine',\n OS = 'os',\n RESULT = 'result',\n\n NAME = 'name',\n TYPE = 'type',\n VENDOR = 'vendor',\n VERSION = 'version',\n ARCHITECTURE= 'architecture',\n MAJOR = 'major',\n MODEL = 'model',\n\n // device types\n CONSOLE = 'console',\n MOBILE = 'mobile',\n TABLET = 'tablet',\n SMARTTV = 'smarttv',\n WEARABLE = 'wearable',\n XR = 'xr',\n EMBEDDED = 'embedded',\n\n // browser types\n INAPP = 'inapp',\n\n // client hints\n BRANDS = 'brands',\n FORMFACTORS = 'formFactors',\n FULLVERLIST = 'fullVersionList',\n PLATFORM = 'platform',\n PLATFORMVER = 'platformVersion',\n BITNESS = 'bitness',\n CH = 'sec-ch-ua',\n CH_FULL_VER_LIST= CH + '-full-version-list',\n CH_ARCH = CH + '-arch',\n CH_BITNESS = CH + '-' + BITNESS,\n CH_FORM_FACTORS = CH + '-form-factors',\n CH_MOBILE = CH + '-' + MOBILE,\n CH_MODEL = CH + '-' + MODEL,\n CH_PLATFORM = CH + '-' + PLATFORM,\n CH_PLATFORM_VER = CH_PLATFORM + '-version',\n CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS],\n\n // device vendors\n AMAZON = 'Amazon',\n APPLE = 'Apple',\n ASUS = 'ASUS',\n BLACKBERRY = 'BlackBerry',\n GOOGLE = 'Google',\n HUAWEI = 'Huawei',\n LENOVO = 'Lenovo',\n HONOR = 'Honor',\n LG = 'LG',\n MICROSOFT = 'Microsoft',\n MOTOROLA = 'Motorola',\n NVIDIA = 'Nvidia',\n ONEPLUS = 'OnePlus',\n OPPO = 'OPPO',\n SAMSUNG = 'Samsung',\n SHARP = 'Sharp',\n SONY = 'Sony',\n XIAOMI = 'Xiaomi',\n ZEBRA = 'Zebra',\n\n // browsers\n CHROME = 'Chrome',\n CHROMIUM = 'Chromium',\n CHROMECAST = 'Chromecast',\n EDGE = 'Edge',\n FIREFOX = 'Firefox',\n OPERA = 'Opera',\n FACEBOOK = 'Facebook',\n SOGOU = 'Sogou',\n\n PREFIX_MOBILE = 'Mobile ',\n SUFFIX_BROWSER = ' Browser',\n\n // os\n WINDOWS = 'Windows';\n \n var isWindow = typeof window !== TYPEOF.UNDEFINED,\n NAVIGATOR = (isWindow && window.navigator) ? \n window.navigator : \n undefined,\n NAVIGATOR_UADATA = (NAVIGATOR && NAVIGATOR.userAgentData) ? \n NAVIGATOR.userAgentData : \n undefined;\n\n ///////////\n // Helper\n //////////\n\n var extend = function (defaultRgx, extensions) {\n var mergedRgx = {};\n var extraRgx = extensions;\n if (!isExtensions(extensions)) {\n extraRgx = {};\n for (var i in extensions) {\n for (var j in extensions[i]) {\n extraRgx[j] = extensions[i][j].concat(extraRgx[j] ? extraRgx[j] : []);\n }\n }\n }\n for (var k in defaultRgx) {\n mergedRgx[k] = extraRgx[k] && extraRgx[k].length % 2 === 0 ? extraRgx[k].concat(defaultRgx[k]) : defaultRgx[k];\n }\n return mergedRgx;\n },\n enumerize = function (arr) {\n var enums = {};\n for (var i=0; i<arr.length; i++) {\n enums[arr[i].toUpperCase()] = arr[i];\n }\n return enums;\n },\n has = function (str1, str2) {\n if (typeof str1 === TYPEOF.OBJECT && str1.length > 0) {\n for (var i in str1) {\n if (lowerize(str2) == lowerize(str1[i])) return true;\n }\n return false;\n }\n return isString(str1) ? lowerize(str2) == lowerize(str1) : false;\n },\n isExtensions = function (obj, deep) {\n for (var prop in obj) {\n return /^(browser|cpu|device|engine|os)$/.test(prop) || (deep ? isExtensions(obj[prop]) : false);\n }\n },\n isString = function (val) {\n return typeof val === TYPEOF.STRING;\n },\n itemListToArray = function (header) {\n if (!header) return undefined;\n var arr = [];\n var tokens = strip(/\\\\?\\\"/g, header).split(',');\n for (var i = 0; i < tokens.length; i++) {\n if (tokens[i].indexOf(';') > -1) {\n var token = trim(tokens[i]).split(';v=');\n arr[i] = { brand : token[0], version : token[1] };\n } else {\n arr[i] = trim(tokens[i]);\n }\n }\n return arr;\n },\n lowerize = function (str) {\n return isString(str) ? str.toLowerCase() : str;\n },\n majorize = function (version) {\n return isString(version) ? strip(/[^\\d\\.]/g, version).split('.')[0] : undefined;\n },\n setProps = function (arr) {\n for (var i in arr) {\n if (!arr.hasOwnProperty(i)) continue;\n\n var propName = arr[i];\n if (typeof propName == TYPEOF.OBJECT && propName.length == 2) {\n this[propName[0]] = propName[1];\n } else {\n this[propName] = undefined;\n }\n }\n return this;\n },\n strip = function (pattern, str) {\n return isString(str) ? str.replace(pattern, EMPTY) : str;\n },\n stripQuotes = function (str) {\n return strip(/\\\\?\\\"/g, str); \n },\n trim = function (str, len) {\n str = strip(/^\\s\\s*/, String(str));\n return typeof len === TYPEOF.UNDEFINED ? str : str.substring(0, len);\n };\n\n ///////////////\n // Map helper\n //////////////\n\n var rgxMapper = function (ua, arrays) {\n\n if(!ua || !arrays) return;\n\n var i = 0, j, k, p, q, matches, match;\n\n // loop through all regexes maps\n while (i < arrays.length && !matches) {\n\n var regex = arrays[i], // even sequence (0,2,4,..)\n props = arrays[i + 1]; // odd sequence (1,3,5,..)\n j = k = 0;\n\n // try matching uastring with regexes\n while (j < regex.length && !matches) {\n\n if (!regex[j]) { break; }\n matches = regex[j++].exec(ua);\n\n if (!!matches) {\n for (p = 0; p < props.length; p++) {\n match = matches[++k];\n q = props[p];\n // check if given property is actually array\n if (typeof q === TYPEOF.OBJECT && q.length > 0) {\n if (q.length === 2) {\n if (typeof q[1] == TYPEOF.FUNCTION) {\n // assign modified match\n this[q[0]] = q[1].call(this, match);\n } else {\n // assign given value, ignore regex match\n this[q[0]] = q[1];\n }\n } else if (q.length >= 3) {\n // Check whether q[1] FUNCTION or REGEX\n if (typeof q[1] === TYPEOF.FUNCTION && !(q[1].exec && q[1].test)) {\n if (q.length > 3) {\n this[q[0]] = match ? q[1].apply(this, q.slice(2)) : undefined;\n } else {\n // call function (usually string mapper)\n this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;\n }\n } else {\n if (q.length == 3) {\n // sanitize match using given regex\n this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;\n } else if (q.length == 4) {\n this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;\n } else if (q.length > 4) {\n this[q[0]] = match ? q[3].apply(this, [match.replace(q[1], q[2])].concat(q.slice(4))) : undefined;\n }\n }\n }\n } else {\n this[q] = match ? match : undefined;\n }\n }\n }\n }\n i += 2;\n }\n },\n\n strMapper = function (str, map) {\n\n for (var i in map) {\n // check if current value is array\n if (typeof map[i] === TYPEOF.OBJECT && map[i].length > 0) {\n for (var j = 0; j < map[i].length; j++) {\n if (has(map[i][j], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n } else if (has(map[i], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n return map.hasOwnProperty('*') ? map['*'] : str;\n };\n\n ///////////////\n // String map\n //////////////\n\n var windowsVersionMap = {\n 'ME' : '4.90',\n 'NT 3.51': '3.51',\n 'NT 4.0': '4.0',\n '2000' : ['5.0', '5.01'],\n 'XP' : ['5.1', '5.2'],\n 'Vista' : '6.0',\n '7' : '6.1',\n '8' : '6.2',\n '8.1' : '6.3',\n '10' : ['6.4', '10.0'],\n 'NT' : ''\n },\n \n formFactorsMap = {\n 'embedded' : 'Automotive',\n 'mobile' : 'Mobile',\n 'tablet' : ['Tablet', 'EInk'],\n 'smarttv' : 'TV',\n 'wearable' : 'Watch',\n 'xr' : ['VR', 'XR'],\n '?' : ['Desktop', 'Unknown'],\n '*' : undefined\n },\n\n browserHintsMap = {\n 'Chrome' : 'Google Chrome',\n 'Edge' : 'Microsoft Edge',\n 'Edge WebView2' : 'Microsoft Edge WebView2',\n 'Chrome WebView': 'Android WebView',\n 'Chrome Headless':'HeadlessChrome',\n 'Huawei Browser': 'HuaweiBrowser',\n 'MIUI Browser' : 'Miui Browser',\n 'Opera Mobi' : 'OperaMobile',\n 'Yandex' : 'YaBrowser'\n };\n\n //////////////\n // Regex map\n /////////////\n\n var defaultRegexes = {\n\n browser : [[\n\n // Most common regardless engine\n /\\b(?:crmo|crios)\\/([\\w\\.]+)/i // Chrome for Android/iOS\n ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [\n /webview.+edge\\/([\\w\\.]+)/i // Microsoft Edge\n ], [VERSION, [NAME, EDGE+' WebView']], [\n /edg(?:e|ios|a)?\\/([\\w\\.]+)/i \n ], [VERSION, [NAME, 'Edge']], [\n\n // Presto based\n /(opera mini)\\/([-\\w\\.]+)/i, // Opera Mini\n /(opera [mobiletab]{3,6})\\b.+version\\/([-\\w\\.]+)/i, // Opera Mobi/Tablet\n /(opera)(?:.+version\\/|[\\/ ]+)([\\w\\.]+)/i // Opera\n ], [NAME, VERSION], [\n /opios[\\/ ]+([\\w\\.]+)/i // Opera mini on iphone >= 8.0\n ], [VERSION, [NAME, OPERA+' Mini']], [\n /\\bop(?:rg)?x\\/([\\w\\.]+)/i // Opera GX\n ], [VERSION, [NAME, OPERA+' GX']], [\n /\\bopr\\/([\\w\\.]+)/i // Opera Webkit\n ], [VERSION, [NAME, OPERA]], [\n\n // Mixed\n /\\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\\/ ]?([\\w\\.]+)/i // Baidu\n ], [VERSION, [NAME, 'Baidu']], [\n /\\b(?:mxbrowser|mxios|myie2)\\/?([-\\w\\.]*)\\b/i // Maxthon\n ], [VERSION, [NAME, 'Maxthon']], [\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\\/ ]?([\\w\\.]*)/i, \n // Lunascape/Maxthon/Netfront/Jasmine/Blazer/Sleipnir\n // Trident based\n /(avant|iemobile|slim(?:browser|boat|jet))[\\/ ]?([\\d\\.]*)/i, // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet\n /(?:ms|\\()(ie) ([\\w\\.]+)/i, // Internet Explorer\n\n // Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble/Palemoon\n /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:lg |qute)browser|palemoon)\\/([-\\w\\.]+)/i,\n // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon\n /(heytap|ovi|115|surf|qwant)browser\\/([\\d\\.]+)/i, // HeyTap/Ovi/115/Surf\n /(qwant)(?:ios|mobile)\\/([\\d\\.]+)/i, // Qwant\n /(ecosia|weibo)(?:__| \\w+@)([\\d\\.]+)/i // Ecosia/Weibo\n ], [NAME, VERSION], [\n /quark(?:pc)?\\/([-\\w\\.]+)/i // Quark\n ], [VERSION, [NAME, 'Quark']], [\n /\\bddg\\/([\\w\\.]+)/i // DuckDuckGo\n ], [VERSION, [NAME, 'DuckDuckGo']], [\n /(?:\\buc? ?browser|(?:juc.+)ucweb)[\\/ ]?([\\w\\.]+)/i // UCBrowser\n ], [VERSION, [NAME, 'UCBrowser']], [\n /microm.+\\bqbcore\\/([\\w\\.]+)/i, // WeChat Desktop for Windows Built-in Browser\n /\\bqbcore\\/([\\w\\.]+).+microm/i,\n /micromessenger\\/([\\w\\.]+)/i // WeChat\n ], [VERSION, [NAME, 'WeChat']], [\n /konqueror\\/([\\w\\.]+)/i // Konqueror\n ], [VERSION, [NAME, 'Konqueror']], [\n /trident.+rv[: ]([\\w\\.]{1,9})\\b.+like gecko/i // IE11\n ], [VERSION, [NAME, 'IE']], [\n /ya(?:search)?browser\\/([\\w\\.]+)/i // Yandex\n ], [VERSION, [NAME, 'Yandex']], [\n /slbrowser\\/([\\w\\.]+)/i // Smart Lenovo Browser\n ], [VERSION, [NAME, 'Smart ' + LENOVO + SUFFIX_BROWSER]], [\n /(avast|avg)\\/([\\w\\.]+)/i // Avast/AVG Secure Browser\n ], [[NAME, /(.+)/, '$1 Secure' + SUFFIX_BROWSER], VERSION], [\n /\\bfocus\\/([\\w\\.]+)/i // Firefox Focus\n ], [VERSION, [NAME, FIREFOX+' Focus']], [\n /\\bopt\\/([\\w\\.]+)/i // Opera Touch\n ], [VERSION, [NAME, OPERA+' Touch']], [\n /coc_coc\\w+\\/([\\w\\.]+)/i // Coc Coc Browser\n ], [VERSION, [NAME, 'Coc Coc']], [\n /dolfin\\/([\\w\\.]+)/i // Dolphin\n ], [VERSION, [NAME, 'Dolphin']], [\n /coast\\/([\\w\\.]+)/i // Opera Coast\n ], [VERSION, [NAME, OPERA+' Coast']], [\n /miuibrowser\\/([\\w\\.]+)/i // MIUI Browser\n ], [VERSION, [NAME, 'MIUI' + SUFFIX_BROWSER]], [\n /fxios\\/([\\w\\.-]+)/i // Firefox for iOS\n ], [VERSION, [NAME, PREFIX_MOBILE + FIREFOX]], [\n /\\bqihoobrowser\\/?([\\w\\.]*)/i // 360\n ], [VERSION, [NAME, '360']], [\n /\\b(qq)\\/([\\w\\.]+)/i // QQ\n ], [[NAME, /(.+)/, '$1Browser'], VERSION], [\n /(oculus|sailfish|huawei|vivo|pico)browser\\/([\\w\\.]+)/i\n ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser\n /samsungbrowser\\/([\\w\\.]+)/i // Samsung Internet\n ], [VERSION, [NAME, SAMSUNG + ' Internet']], [\n /metasr[\\/ ]?([\\d\\.]+)/i // Sogou Explorer\n ], [VERSION, [NAME, SOGOU + ' Explorer']], [\n /(sogou)mo\\w+\\/([\\d\\.]+)/i // Sogou Mobile\n ], [[NAME, SOGOU + ' Mobile'], VERSION], [\n /(electron)\\/([\\w\\.]+) safari/i, // Electron-based App\n /(tesla)(?: qtcarbrowser|\\/(20\\d\\d\\.[-\\w\\.]+))/i, // Tesla\n /m?(qqbrowser|2345(?=browser|chrome|explorer))\\w*[\\/ ]?v?([\\w\\.]+)/i // QQ/2345\n ], [NAME, VERSION], [\n /(lbbrowser|rekonq)/i // LieBao Browser/Rekonq\n ], [NAME], [\n /ome\\/([\\w\\.]+) \\w* ?(iron) saf/i, // Iron\n /ome\\/([\\w\\.]+).+qihu (360)[es]e/i // 360\n ], [VERSION, NAME], [\n\n // WebView\n /((?:fban\\/fbios|fb_iab\\/fb4a)(?!.+fbav)|;fbav\\/([\\w\\.]+);)/i // Facebook App for iOS & Android\n ], [[NAME, FACEBOOK], VERSION, [TYPE, INAPP]], [\n /(kakao(?:talk|story))[\\/ ]([\\w\\.]+)/i, // Kakao App\n /(naver)\\(.*?(\\d+\\.[\\w\\.]+).*\\)/i, // Naver InApp\n /(daum)apps[\\/ ]([\\w\\.]+)/i, // Daum App\n /safari (line)\\/([\\w\\.]+)/i, // Line App for iOS\n /\\b(line)\\/([\\w\\.]+)\\/iab/i, // Line App for Android\n /(alipay)client\\/([\\w\\.]+)/i, // Alipay\n /(twitter)(?:and| f.+e\\/([\\w\\.]+))/i, // Twitter\n /(bing)(?:web|sapphire)\\/([\\w\\.]+)/i, // Bing\n /(instagram|snapchat|klarna)[\\/ ]([-\\w\\.]+)/i // Instagram/Snapchat/Klarna\n ], [NAME, VERSION, [TYPE, INAPP]], [\n /\\bgsa\\/([\\w\\.]+) .*safari\\//i // Google Search Appliance on iOS\n ], [VERSION, [NAME, 'GSA'], [TYPE, INAPP]], [\n /musical_ly(?:.+app_?version\\/|_)([\\w\\.]+)/i // TikTok\n ], [VERSION, [NAME, 'TikTok'], [TYPE, INAPP]], [\n /\\[(linkedin)app\\]/i // LinkedIn App for iOS & Android\n ], [NAME, [TYPE, INAPP]], [\n /(zalo(?:app)?)[\\/\\sa-z]*([\\w\\.-]+)/i // Zalo \n ], [[NAME, /(.+)/, 'Zalo'], VERSION, [TYPE, INAPP]], [\n\n /(chromium)[\\/ ]([-\\w\\.]+)/i // Chromium\n ], [NAME, VERSION], [\n\n /headlesschrome(?:\\/([\\w\\.]+)| )/i // Chrome Headless\n ], [VERSION, [NAME, CHROME+' Headless']], [\n\n /wv\\).+chrome\\/([\\w\\.]+).+edgw\\//i // Edge WebView2\n ], [VERSION, [NAME, EDGE+' WebView2']], [\n\n / wv\\).+(chrome)\\/([\\w\\.]+)/i // Chrome WebView\n ], [[NAME, CHROME+' WebView'], VERSION], [\n\n /droid.+ version\\/([\\w\\.]+)\\b.+(?:mobile safari|safari)/i // Android Browser\n ], [VERSION, [NAME, 'Android' + SUFFIX_BROWSER]], [\n\n /chrome\\/([\\w\\.]+) mobile/i // Chrome Mobile\n ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [\n\n /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\\/v?([\\w\\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia\n ], [NAME, VERSION], [\n\n /version\\/([\\w\\.\\,]+) .*mobile(?:\\/\\w+ | ?)safari/i // Safari Mobile\n ], [VERSION, [NAME, PREFIX_MOBILE + 'Safari']], [\n /iphone .*mobile(?:\\/\\w+ | ?)safari/i\n ], [[NAME, PREFIX_MOBILE + 'Safari']], [\n /version\\/([\\w\\.\\,]+) .*(safari)/i // Safari\n ], [VERSION, NAME], [\n /webkit.+?(mobile ?safari|safari)(\\/[\\w\\.]+)/i // Safari < 3.0\n ], [NAME, [VERSION, '1']], [\n\n /(webkit|khtml)\\/([\\w\\.]+)/i\n ], [NAME, VERSION], [\n\n // Gecko based\n /(?:mobile|tablet);.*(firefox)\\/([\\w\\.-]+)/i // Firefox Mobile\n ], [[NAME, PREFIX_MOBILE + FIREFOX], VERSION], [\n /(navigator|netscape\\d?)\\/([-\\w\\.]+)/i // Netscape\n ], [[NAME, 'Netscape'], VERSION], [\n /(wolvic|librewolf)\\/([\\w\\.]+)/i // Wolvic/LibreWolf\n ], [NAME, VERSION], [\n /mobile vr; rv:([\\w\\.]+)\\).+firefox/i // Firefox Reality\n ], [VERSION, [NAME, FIREFOX+' Reality']], [\n /ekiohf.+(flow)\\/([\\w\\.]+)/i, // Flow\n /(swiftfox)/i, // Swiftfox\n /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\\/ ]?([\\w\\.\\+]+)/i,\n // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror\n /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\\/([-\\w\\.]+)$/i,\n // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix\n /(firefox)\\/([\\w\\.]+)/i, // Other Firefox-based\n /(mozilla)\\/([\\w\\.]+(?= .+rv\\:.+gecko\\/\\d+)|[0-4][\\w\\.]+(?!.+compatible))/i, // Mozilla\n\n // Other\n /(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\\. ]?browser)[-\\/ ]?v?([\\w\\.]+)/i,\n // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser/Ladybird\n /\\b(links) \\(([\\w\\.]+)/i // Links\n ], [NAME, [VERSION, /_/g, '.']], [\n \n /(cobalt)\\/([\\w\\.]+)/i // Cobalt\n ], [NAME, [VERSION, /[^\\d\\.]+./, EMPTY]]\n ],\n\n cpu : [[\n\n /\\b((amd|x|x86[-_]?|wow|win)64)\\b/i // AMD64 (x64)\n ], [[ARCHITECTURE, 'amd64']], [\n\n /(ia32(?=;))/i, // IA32 (quicktime)\n /\\b((i[346]|x)86)(pc)?\\b/i // IA32 (x86)\n ], [[ARCHITECTURE, 'ia32']], [\n\n /\\b(aarch64|arm(v?[89]e?l?|_?64))\\b/i // ARM64\n ], [[ARCHITECTURE, 'arm64']], [\n\n /\\b(arm(v[67])?ht?n?[fl]p?)\\b/i // ARMHF\n ], [[ARCHITECTURE, 'armhf']], [\n\n // PocketPC mistakenly identified as PowerPC\n /( (ce|mobile); ppc;|\\/[\\w\\.]+arm\\b)/i\n ], [[ARCHITECTURE, 'arm']], [\n\n / sun4\\w[;\\)]/i // SPARC\n ], [[ARCHITECTURE, 'sparc']], [\n // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC\n /\\b(avr32|ia64(?=;)|68k(?=\\))|\\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\\b|pa-risc)/i,\n /((ppc|powerpc)(64)?)( mac|;|\\))/i, // PowerPC\n /(?:osf1|[freopnt]{3,4}bsd) (alpha)/i // Alpha\n ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [\n /mc680.0/i\n ], [[ARCHITECTURE, '68k']], [\n /winnt.+\\[axp/i\n ], [[ARCHITECTURE, 'alpha']]\n ],\n\n device : [[\n\n //////////////////////////\n // MOBILES & TABLETS\n /////////////////////////\n\n // Samsung\n /\\b(sch-i[89]0\\d|shw-m380s|sm-[ptx]\\w{2,4}|gt-[pn]\\d{2,4}|sgh-t8[56]9|nexus 10)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [\n /\\b((?:s[cgp]h|gt|sm)-(?![lr])\\w+|sc[g-]?[\\d]+a?|galaxy nexus)/i,\n /samsung[- ]((?!sm-[lr]|browser)[-\\w]+)/i,\n /sec-(sgh\\w+)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [\n\n // Apple\n /(?:\\/|\\()(ip(?:hone|od)[\\w, ]*)[\\/\\);]/i // iPod/iPhone\n ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [\n /\\b(?:ios|apple\\w+)\\/.+[\\(\\/](ipad)/i, // iPad\n /\\b(ipad)[\\d,]*[;\\] ].+(mac |i(pad)?)os/i\n ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [\n /(macintosh);/i\n ], [MODEL, [VENDOR, APPLE]], [\n\n // Sharp\n /\\b(sh-?[altvz]?\\d\\d[a-ekm]?)/i\n ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [\n\n // Honor\n /\\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\\)|;)/i\n ], [MODEL, [VENDOR, HONOR], [TYPE, TABLET]], [\n /honor([-\\w ]+)[;\\)]/i\n ], [MODEL, [VENDOR, HONOR], [TYPE, MOBILE]], [\n\n // Huawei\n /\\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\\w\\. ]*(?= bui|\\)))\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [\n /(?:huawei) ?([-\\w ]+)[;\\)]/i,\n /\\b(nexus 6p|\\w{2,4}e?-[atu]?[ln][\\dx][\\dc][adnt]?)\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [\n\n // Xiaomi\n /oid[^\\)]+; (2[\\dbc]{4}(182|283|rp\\w{2})[cgl]|m2105k81a?c)(?: bui|\\))/i,\n /\\b(?:xiao)?((?:red)?mi[-_ ]?pad[\\w- ]*)(?: bui|\\))/i // Mi Pad tablets\n ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [\n\n /\\b(poco[\\w ]+|m2\\d{3}j\\d\\d[a-z]{2})(?: bui|\\))/i, // Xiaomi POCO\n /\\b; (\\w+) build\\/hm\\1/i, // Xiaomi Hongmi 'numeric' models\n /\\b(hm[-_ ]?note?[_ ]?(?:\\d\\w)?) bui/i, // Xiaomi Hongmi\n /\\b(redmi[\\-_ ]?(?:note|k)?[\\w_ ]+)(?: bui|\\))/i, // Xiaomi Redmi\n /oid[^\\)]+; (m?[12][0-389][01]\\w{3,6}[c-y])( bui|; wv|\\))/i, // Xiaomi Redmi 'numeric' models\n /\\b(mi[-_ ]?(?:a\\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\\d{0,2}\\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\\))/i, // Xiaomi Mi\n / ([\\w ]+) miui\\/v?\\d/i\n ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [\n\n // OnePlus\n /droid.+; (cph2[3-6]\\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\\d|p[g-k]\\w[1m]10)\\b/i,\n /(?:one)?(?:plus)? (a\\d0\\d\\d)(?: b|\\))/i\n ], [MODEL, [VENDOR, ONEPLUS], [TYPE, MOBILE]], [\n\n // OPPO\n /; (\\w+) bui.+ oppo/i,\n /\\b(cph[12]\\d{3}|p(?:af|c[al]|d\\w|e[ar])[mt]\\d0|x9007|a101op)\\b/i\n ], [MODEL, [VENDOR, OPPO], [TYPE, MOBILE]], [\n /\\b(opd2(\\d{3}a?))(?: bui|\\))/i\n ], [MODEL, [VENDOR, strMapper, { 'OnePlus' : ['203', '304', '403', '404', '413', '415'], '*' : OPPO }], [TYPE, TABLET]], [\n\n // BLU\n /(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\\w\\+ ]*)(?: bui|\\))/i // Vivo series\n ], [MODEL, [VENDOR, 'BLU'], [TYPE, MOBILE]], [ \n\n // Vivo\n /; vivo (\\w+)(?: bui|\\))/i,\n /\\b(v[12]\\d{3}\\w?[at])(?: bui|;)/i\n ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [\n\n // Realme\n /\\b(rmx[1-3]\\d{3})(?: bui|;|\\))/i\n ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [\n\n // Lenovo\n /(ideatab[-\\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\\d{3,4}(?:f[cu]|xu|[av])|yt\\d?-[jx]?\\d+[lfmx])( bui|;|\\)|\\/)/i,\n /lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\\w- ]+?)|tb[\\w-]{6,7})( bui|;|\\)|\\/)/i\n ], [MODEL, [VENDOR, LENOVO], [TYPE, TABLET]], [ \n /lenovo[-_ ]?([-\\w ]+?)(?: bui|\\)|\\/)/i\n ], [MODEL, [VENDOR, LENOVO], [TYPE, MOBILE]], [\n\n // Motorola\n /\\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\\b[\\w ]+build\\//i,\n /\\bmot(?:orola)?[- ]([\\w\\s]+)(\\)| bui)/i,\n /((?:moto(?! 360)[-\\w\\(\\) ]+|xt\\d{3,4}[cgkosw\\+]?[-\\d]*|nexus 6)(?= bui|\\)))/i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [\n /\\b(mz60\\d|xoom[2 ]{0,2}) build\\//i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [\n\n // LG\n /((?=lg)?[vl]k\\-?\\d{3}) bui| 3\\.[-\\w; ]{10}lg?-([06cv9]{3,4})/i\n ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [\n /(lm(?:-?f100[nv]?|-[\\w\\.]+)(?= bui|\\))|nexus [45])/i,\n /\\blg[-e;\\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\\w+)/i,\n /\\blg-?([\\d\\w]+) bui/i\n ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [\n\n // Nokia\n /(nokia) (t[12][01])/i\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n /(?:maemo|nokia).*(n900|lumia \\d+|rm-\\d+)/i,\n /nokia[-_ ]?(([-\\w\\. ]*?))( bui|\\)|;|\\/)/i\n ], [[MODEL, /_/g, ' '], [TYPE, MOBILE], [VENDOR, 'Nokia']], [\n\n // Google\n /(pixel (c|tablet))\\b/i // Google Pixel C/Tablet\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [\n // Google Pixel\n /droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\\d ]*a?( pro)?( xl)?( fold)?( \\(5g\\))?)( bui|\\))/i\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [\n /(google) (pixelbook( go)?)/i\n ], [VENDOR, MODEL], [\n\n // Sony\n /droid.+; (a?\\d[0-2]{2}so|[c-g]\\d{4}|so[-gl]\\w+|xq-\\w\\w\\d\\d)(?= bui|\\).+chrome\\/(?![1-6]{0,1}\\d\\.))/i\n ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [\n /sony tablet [ps]/i,\n /\\b(?:sony)?sgp\\w+(?: bui|\\))/i\n ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [\n\n // Amazon\n /(alexa)webm/i,\n /(kf[a-z]{2}wi|aeo(?!bc)\\w\\w)( bui|\\))/i, // Kindle Fire without Silk / Echo Show\n /(kf[a-z]+)( bui|\\)).+silk\\//i // Kindle Fire HD\n ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [\n /((?:sd|kf)[0349hijorstuw]+)( bui|\\)).+silk\\//i // Fire Phone\n ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [\n\n // BlackBerry\n /(playbook);[-\\w\\),; ]+(rim)/i // BlackBerry PlayBook\n ], [MODEL, VENDOR, [TYPE, TABLET]], [\n /\\b((?:bb[a-f]|st[hv])100-\\d)/i,\n /(?:blackberry|\\(bb10;) (\\w+)/i\n ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [\n\n // Asus\n /(?:\\b|asus_)(transfo[prime ]{4,10} \\w+|eeepc|slider \\w+|nexus 7|padfone|p00[cj])/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [\n / (z[bes]6[027][012][km][ls]|zenfone \\d\\w?)\\b/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [\n\n // HTC\n /(nexus 9)/i // HTC Nexus 9\n ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [\n /(htc)[-;_ ]{1,2}([\\w ]+(?=\\)| bui)|\\w+)/i, // HTC\n\n // ZTE\n /(zte)[- ]([\\w ]+?)(?: bui|\\/|\\))/i,\n /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\\.))|sony(?!-bra))[-_ ]?([-\\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony\n ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [\n\n // TCL\n /tcl (xess p17aa)/i,\n /droid [\\w\\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\\w(\\w|\\w\\w))?(\\)| bui)/i\n ], [MODEL, [VENDOR, 'TCL'], [TYPE, TABLET]], [\n /droid [\\w\\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\\w(\\w|\\w\\w))?(\\)| bui)/i\n ], [MODEL, [VENDOR, 'TCL'], [TYPE, MOBILE]], [\n\n // itel\n /(itel) ((\\w+))/i\n ], [[VENDOR, lowerize], MODEL, [TYPE, strMapper, { 'tablet' : ['p10001l', 'w7001'], '*' : 'mobile' }]], [\n\n // Acer\n /droid.+; ([ab][1-7]-?[0178a]\\d\\d?)/i\n ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [\n\n // Meizu\n /droid.+; (m[1-5] note) bui/i,\n /\\bmz-([-\\w]{2,})/i\n ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [\n \n // Ulefone\n /; ((?:power )?armor(?:[\\w ]{0,8}))(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [\n\n // Energizer\n /; (energy ?\\w+)(?: bui|\\))/i,\n /; energizer ([\\w ]+)(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Energizer'], [TYPE, MOBILE]], [\n\n // Cat\n /; cat (b35);/i,\n /; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Cat'], [TYPE, MOBILE]], [\n\n // Smartfren\n /((?:new )?andromax[\\w- ]+)(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Smartfren'], [TYPE, MOBILE]], [\n\n // Nothing\n /droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i\n ], [MODEL, [VENDOR, 'Nothing'], [TYPE, MOBILE]], [\n\n // Archos\n /; (x67 5g|tikeasy \\w+|ac[1789]\\d\\w+)( b|\\))/i,\n /archos ?(5|gamepad2?|([\\w ]*[t1789]|hello) ?\\d+[\\w ]*)( b|\\))/i\n ], [MODEL, [VENDOR, 'Archos'], [TYPE, TABLET]], [\n /archos ([\\w ]+)( b|\\))/i,\n /; (ac[3-6]\\d\\w{2,8})( b|\\))/i \n ], [MODEL, [VENDOR, 'Archos'], [TYPE, MOBILE]], [\n\n // HMD\n /; (n159v)/i\n ], [MODEL, [VENDOR, 'HMD'], [TYPE, MOBILE]], [\n\n // MIXED\n /(imo) (tab \\w+)/i, // IMO\n /(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i // Infinix XPad / Tecno\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(blackberry|benq|palm(?=\\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\\w]*)/i,\n // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Tecno/Micromax/Advan\n // BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko\n /; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\\w\\+ ]+?)(?: bui|\\)|; r)/i,\n /(hp) ([\\w ]+\\w)/i, // HP iPAQ\n /(microsoft); (lumia[\\w ]+)/i, // Microsoft Lumia\n /(oppo) ?([\\w ]+) bui/i, // OPPO\n /(hisense) ([ehv][\\w ]+)\\)/i, // Hisense\n /droid[^;]+; (philips)[_ ]([sv-x][\\d]{3,4}[xz]?)/i // Philips\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n\n /(kobo)\\s(ereader|touch)/i, // Kobo\n /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad\n /(kindle)\\/([\\w\\.]+)/i // Kindle\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(surface duo)/i // Surface Duo\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [\n /droid [\\d\\.]+; (fp\\du?)(?: b|\\))/i // Fairphone\n ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [\n /((?:tegranote|shield t(?!.+d tv))[\\w- ]*?)(?: b|\\))/i // Nvidia Tablets\n ], [MODEL, [VENDOR, NVIDIA], [TYPE, TABLET]], [\n /(sprint) (\\w+)/i // Sprint Phones\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n /(kin\\.[onetw]{3})/i // Microsoft Kin\n ], [[MODEL, /\\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [\n /droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\\)/i // Zebra\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [\n /droid.+; (ec30|ps20|tc[2-8]\\d[kx])\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [\n\n ///////////////////\n // SMARTTVS\n ///////////////////\n\n /(philips)[\\w ]+tv/i, // Philips\n /smart-tv.+(samsung)/i // Samsung\n ], [VENDOR, [TYPE, SMARTTV]], [\n /hbbtv.+maple;(\\d+)/i\n ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [\n /(vizio)(?: |.+model\\/)(\\w+-\\w+)/i, // Vizio\n /tcast.+(lg)e?. ([-\\w]+)/i // LG SmartTV\n ], [VENDOR, MODEL, [TYPE, SMARTTV]], [\n /(nux; netcast.+smarttv|lg (netcast\\.tv-201\\d|android tv))/i\n ], [[VENDOR, LG], [TYPE, SMARTTV]], [\n /(apple) ?tv/i // Apple TV\n ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [\n /crkey.*devicetype\\/chromecast/i // Google Chromecast Third Generation\n ], [[MODEL, CHROMECAST+' Third Generation'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /crkey.*devicetype\\/([^/]*)/i // Google Chromecast with specific device type\n ], [[MODEL, /^/, 'Chromecast '], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /fuchsia.*crkey/i // Google Chromecast Nest Hub\n ], [[MODEL, CHROMECAST+' Nest Hub'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /crkey/i // Google Chromecast, Linux-based or unknown\n ], [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /(portaltv)/i // Facebook Portal TV\n ], [MODEL, [VENDOR, FACEBOOK], [TYPE, SMARTTV]], [\n /droid.+aft(\\w+)( bui|\\))/i // Fire TV\n ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [\n /(shield \\w+ tv)/i // Nvidia Shield TV\n ], [MODEL, [VENDOR, NVIDIA], [TYPE, SMARTTV]], [\n /\\(dtv[\\);].+(aquos)/i,\n /(aquos-tv[\\w ]+)\\)/i // Sharp\n ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[\n /(bravia[\\w ]+)( bui|\\))/i // Sony\n ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [\n /(mi(tv|box)-?\\w+) bui/i // Xiaomi\n ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [\n /Hbbtv.*(technisat) (.*);/i // TechniSAT\n ], [VENDOR, MODEL, [TYPE, SMARTTV]], [\n /\\b(roku)[\\dx]*[\\)\\/]((?:dvp-)?[\\d\\.]*)/i, // Roku\n /hbbtv\\/\\d+\\.\\d+\\.\\d+ +\\([\\w\\+ ]*; *([\\w\\d][^;]*);([^;]*)/i // HbbTV devices\n ], [[VENDOR, /.+\\/(\\w+)/, '$1', strMapper, {'LG':'lge'}], [MODEL, trim], [TYPE, SMARTTV]], [\n\n ///////////////////\n // CONSOLES\n ///////////////////\n\n /(playstation \\w+)/i // Playstation\n ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [\n /\\b(xbox(?: one)?(?!; xbox))[\\); ]/i // Microsoft Xbox\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [\n /(ouya)/i, // Ouya\n /(nintendo) (\\w+)/i, // Nintendo\n /(retroid) (pocket ([^\\)]+))/i // Retroid Pocket\n ], [VENDOR, MODEL, [TYPE, CONSOLE]], [\n /droid.+; (shield)( bui|\\))/i // Nvidia Portable\n ], [MODEL, [VENDOR, NVIDIA], [TYPE, CONSOLE]], [\n\n ///////////////////\n // WEARABLES\n ///////////////////\n\n /\\b(sm-[lr]\\d\\d[0156][fnuw]?s?|gear live)\\b/i // Samsung Galaxy Watch\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]], [\n /((pebble))app/i, // Pebble\n /(asus|google|lg|oppo) ((pixel |zen)?watch[\\w ]*)( bui|\\))/i // Asus ZenWatch / LG Watch / Pixel Watch\n ], [VENDOR, MODEL, [TYPE, WEARABLE]], [\n /(ow(?:19|20)?we?[1-3]{1,3})/i // Oppo Watch\n ], [MODEL, [VENDOR, OPPO], [TYPE, WEARABLE]], [\n /(watch)(?: ?os[,\\/]|\\d,\\d\\/)[\\d\\.]+/i // Apple Watch\n ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [\n /(opwwe\\d{3})/i // OnePlus Watch\n ], [MODEL, [VENDOR, ONEPLUS], [TYPE, WEARABLE]], [\n /(moto 360)/i // Motorola 360\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, WEARABLE]], [\n /(smartwatch 3)/i // Sony SmartWatch\n ], [MODEL, [VENDOR, SONY], [TYPE, WEARABLE]], [\n /(g watch r)/i // LG G Watch R\n ], [MODEL, [VENDOR, LG], [TYPE, WEARABLE]], [\n /droid.+; (wt63?0{2,3})\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [\n\n ///////////////////\n // XR\n ///////////////////\n\n /droid.+; (glass) \\d/i // Google Glass\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, XR]], [\n /(pico) ([\\w ]+) os\\d/i // Pico\n ], [VENDOR, MODEL, [TYPE, XR]], [\n /(quest( \\d| pro)?s?).+vr/i // Meta Quest\n ], [MODEL, [VENDOR, FACEBOOK], [TYPE, XR]], [\n /mobile vr; rv.+firefox/i // Unidentifiable VR device using Firefox Reality / Wolvic\n ], [[TYPE, XR]], [\n\n ///////////////////\n // EMBEDDED\n ///////////////////\n\n /(tesla)(?: qtcarbrowser|\\/[-\\w\\.]+)/i // Tesla\n ], [VENDOR, [TYPE, EMBEDDED]], [\n /(aeobc)\\b/i // Echo Dot\n ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [\n /(homepod).+mac os/i // Apple HomePod\n ], [MODEL, [VENDOR, APPLE], [TYPE, EMBEDDED]], [\n /windows iot/i // Unidentifiable embedded device using Windows IoT\n ], [[TYPE, EMBEDDED]], [\n\n ////////////////////\n // MIXED (GENERIC)\n ///////////////////\n\n /droid.+; ([\\w- ]+) (4k|android|smart|google)[- ]?tv/i // Unidentifiable SmartTV\n ], [MODEL, [TYPE, SMARTTV]], [\n /\\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\\w ]+safari)\\b/i\n ], [[TYPE, SMARTTV]], [\n /droid .+?; ([^;]+?)(?: bui|; wv\\)|\\) applew|; hmsc).+?(mobile|vr|\\d) safari/i\n ], [MODEL, [TYPE, strMapper, { 'mobile' : 'Mobile', 'xr' : 'VR', '*' : TABLET }]], [\n /\\b((tablet|tab)[;\\/]|focus\\/\\d(?!.+mobile))/i // Unidentifiable Tablet\n ], [[TYPE, TABLET]], [\n /(phone|mobile(?:[;\\/]| [ \\w\\/\\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile\n ], [[TYPE, MOBILE]], [\n /droid .+?; ([\\w\\. -]+)( bui|\\))/i // Generic Android Device\n ], [MODEL, [VENDOR, 'Generic']]\n ],\n\n engine : [[\n\n /windows.+ edge\\/([\\w\\.]+)/i // EdgeHTML\n ], [VERSION, [NAME, EDGE+'HTML']], [\n\n /(arkweb)\\/([\\w\\.]+)/i // ArkWeb\n ], [NAME, VERSION], [\n\n /webkit\\/537\\.36.+chrome\\/(?!27)([\\w\\.]+)/i // Blink\n ], [VERSION, [NAME, 'Blink']], [\n\n /(presto)\\/([\\w\\.]+)/i, // Presto\n /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\\/([\\w\\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna/Servo\n /ekioh(flow)\\/([\\w\\.]+)/i, // Flow\n /(khtml|tasman|links)[\\/ ]\\(?([\\w\\.]+)/i, // KHTML/Tasman/Links\n /(icab)[\\/ ]([23]\\.[\\d\\.]+)/i, // iCab\n\n /\\b(libweb)/i // LibWeb\n ], [NAME, VERSION], [\n /ladybird\\//i\n ], [[NAME, 'LibWeb']], [\n\n /rv\\:([\\w\\.]{1,9})\\b.+(gecko)/i // Gecko\n ], [VERSION, NAME]\n ],\n\n os : [[\n\n // Windows\n /(windows nt) (6\\.[23]); arm/i // Windows RT\n ], [[NAME, /N/, 'R'], [VERSION, strMapper, windowsVersionMap]], [\n /(windows (?:phone|mobile|iot))(?: os)?[\\/ ]?([\\d\\.]*( se)?)/i, // Windows IoT/Mobile/Phone\n // Windows NT/3.1/95/98/ME/2000/XP/Vista/7/8/8.1/10/11\n /(windows)[\\/ ](1[01]|2000|3\\.1|7|8(\\.1)?|9[58]|me|server 20\\d\\d( r2)?|vista|xp)/i\n ], [NAME, VERSION], [\n /windows nt ?([\\d\\.\\)]*)(?!.+xbox)/i,\n /\\bwin(?=3| ?9|n)(?:nt| 9x )?([\\d\\.;]*)/i\n ], [[VERSION, /(;|\\))/g, '', strMapper, windowsVersionMap], [NAME, WINDOWS]], [\n /(windows ce)\\/?([\\d\\.]*)/i // Windows CE\n ], [NAME, VERSION], [\n\n // iOS/macOS\n /[adehimnop]{4,7}\\b(?:.*os ([\\w]+) like mac|; opera)/i, // iOS\n /(?:ios;fbsv|ios(?=.+ip(?:ad|hone))|ip(?:ad|hone)(?: |.+i(?:pad)?)os)[\\/ ]([\\w\\.]+)/i,\n /cfnetwork\\/.+darwin/i\n ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [\n /(mac os x) ?([\\w\\. ]*)/i,\n /(macintosh|mac_powerpc\\b)(?!.+(haiku|morphos))/i // Mac OS\n ], [[NAME, 'macOS'], [VERSION, /_/g, '.']], [\n\n // Google Chromecast\n /android ([\\d\\.]+).*crkey/i // Google Chromecast, Android-based\n ], [VERSION, [NAME, CHROMECAST + ' Android']], [\n /fuchsia.*crkey\\/([\\d\\.]+)/i // Google Chromecast, Fuchsia-based\n ], [VERSION, [NAME, CHROMECAST + ' Fuchsia']], [\n /crkey\\/([\\d\\.]+).*devicetype\\/smartspeaker/i // Google Chromecast, Linux-based Smart Speaker\n ], [VERSION, [NAME, CHROMECAST + ' SmartSpeaker']], [\n /linux.*crkey\\/([\\d\\.]+)/i // Google Chromecast, Legacy Linux-based\n ], [VERSION, [NAME, CHROMECAST + ' Linux']], [\n /crkey\\/([\\d\\.]+)/i // Google Chromecast, unknown\n ], [VERSION, [NAME, CHROMECAST]], [\n\n // Mobile OSes\n /droid ([\\w\\.]+)\\b.+(android[- ]x86)/i // Android-x86\n ], [VERSION, NAME], [ \n /(ubuntu) ([\\w\\.]+) like android/i // Ubuntu Touch\n ], [[NAME, /(.+)/, '$1 Touch'], VERSION], [\n /(harmonyos)[\\/ ]?([\\d\\.]*)/i, // HarmonyOS\n // Android/Blackberry/WebOS/QNX/Bada/RIM/KaiOS/Maemo/MeeGo/S40/Sailfish OS/OpenHarmony/Tizen\n /(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\\w*[-\\/\\.; ]?([\\d\\.]*)/i\n ], [NAME, VERSION], [\n /\\(bb(10);/i // BlackBerry 10\n ], [VERSION, [NAME, BLACKBERRY]], [\n /(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\\/ ]?([\\w\\.]*)/i // Symbian\n ], [VERSION, [NAME, 'Symbian']], [\n /mozilla\\/[\\d\\.]+ \\((?:mobile|tablet|tv|mobile; [\\w ]+); rv:.+ gecko\\/([\\w\\.]+)/i // Firefox OS\n ], [VERSION, [NAME, FIREFOX+' OS']], [\n /\\b(?:hp)?wos(?:browser)?\\/([\\w\\.]+)/i, // WebOS\n /webos(?:[ \\/]?|\\.tv-20(?=2[2-9]))(\\d[\\d\\.]*)/i\n ], [VERSION, [NAME, 'webOS']], [\n /web0s;.+?(?:chr[o0]me|safari)\\/(\\d+)/i\n // https://webostv.developer.lge.com/develop/specifications/web-api-and-web-engine\n ], [[VERSION, strMapper, {'25':'120','24':'108','23':'94','22':'87','6':'79','5':'68','4':'53','3':'38','2':'538','1':'537','*':'TV'}], [NAME, 'webOS']], [ \n /watch(?: ?os[,\\/]|\\d,\\d\\/)([\\d\\.]+)/i // watchOS\n ], [VERSION, [NAME, 'watchOS']], [\n\n // Google ChromeOS\n /(cros) [\\w]+(?:\\)| ([\\w\\.]+)\\b)/i // Chromium OS\n ], [[NAME, \"Chrome OS\"], VERSION],[\n\n // Smart TVs\n /panasonic;(viera)/i, // Panasonic Viera\n /(netrange)mmh/i, // Netrange\n /(nettv)\\/(\\d+\\.[\\w\\.]+)/i, // NetTV\n\n // Console\n /(nintendo|playstation) (\\w+)/i, // Nintendo/Playstation\n /(xbox); +xbox ([^\\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)\n /(pico) .+os([\\w\\.]+)/i, // Pico\n\n // Other\n /\\b(joli|palm)\\b ?(?:os)?\\/?([\\w\\.]*)/i, // Joli/Palm\n /linux.+(mint)[\\/\\(\\) ]?([\\w\\.]*)/i, // Mint\n /(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\\d\\.]*)/i, // Mageia/VectorLinux/Fuchsia/ArcaOS/Arch\n /([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\\/ ]?(?!chrom|package)([-\\w\\.]*)/i,\n // Ubuntu/Debian/SUSE/Gentoo/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire/Knoppix\n /((?:open)?solaris)[-\\/ ]?([\\w\\.]*)/i, // Solaris\n /\\b(aix)[; ]([1-9\\.]{0,4})/i, // AIX\n /(hurd|linux|morphos)(?: (?:arm|x86|ppc)\\w*| ?)([\\w\\.]*)/i, // Hurd/Linux/MorphOS\n /(gnu) ?([\\w\\.]*)/i, // GNU\n /\\b([-frentopcghs]{0,5}bsd|dragonfly)[\\/ ]?(?!amd|[ix346]{1,2}86)([\\w\\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly\n /(haiku) ?(r\\d)?/i // Haiku\n ], [NAME, VERSION], [\n /(sunos) ?([\\d\\.]*)/i // Solaris\n ], [[NAME, 'Solaris'], VERSION], [\n /\\b(beos|os\\/2|amigaos|openvms|hp-ux|serenityos)/i, // BeOS/OS2/AmigaOS/OpenVMS/HP-UX/SerenityOS\n /(unix) ?([\\w\\.]*)/i // UNIX\n ], [NAME, VERSION]\n ]\n };\n\n /////////////////\n // Factories\n ////////////////\n\n var defaultProps = (function () {\n var props = { init : {}, isIgnore : {}, isIgnoreRgx : {}, toString : {}};\n setProps.call(props.init, [\n [BROWSER, [NAME, VERSION, MAJOR, TYPE]],\n [CPU, [ARCHITECTURE]],\n [DEVICE, [TYPE, MODEL, VENDOR]],\n [ENGINE, [NAME, VERSION]],\n [OS, [NAME, VERSION]]\n ]);\n setProps.call(props.isIgnore, [\n [BROWSER, [VERSION, MAJOR]],\n [ENGINE, [VERSION]],\n [OS, [VERSION]]\n ]);\n setProps.call(props.isIgnoreRgx, [\n [BROWSER, / ?browser$/i],\n [OS, / ?os$/i]\n ]);\n setProps.call(props.toString, [\n [BROWSER, [NAME, VERSION]],\n [CPU, [ARCHITECTURE]],\n [DEVICE, [VENDOR, MODEL]],\n [ENGINE, [NAME, VERSION]],\n [OS, [NAME, VERSION]]\n ]);\n return props;\n })();\n\n var createIData = function (item, itemType) {\n\n var init_props = defaultProps.init[itemType],\n is_ignoreProps = defaultProps.isIgnore[itemType] || 0,\n is_ignoreRgx = defaultProps.isIgnoreRgx[itemType] || 0,\n toString_props = defaultProps.toString[itemType] || 0;\n\n function IData () {\n setProps.call(this, init_props);\n }\n\n IData.prototype.getItem = function () {\n return item;\n };\n\n IData.prototype.withClientHints = function () {\n\n // nodejs / non-client-hints browsers\n if (!NAVIGATOR_UADATA) {\n return item\n .parseCH()\n .get();\n }\n\n // browsers based on chromium 85+\n return NAVIGATOR_UADATA\n .getHighEntropyValues(CH_ALL_VALUES)\n .then(function (res) {\n return item\n .setCH(new UACHData(res, false))\n .parseCH()\n .get();\n });\n };\n\n IData.prototype.withFeatureCheck = function () {\n return item.detectFeature().get();\n };\n\n if (itemType != RESULT) {\n IData.prototype.is = function (strToCheck) {\n var is = false;\n for (var i in this) {\n if (this.hasOwnProperty(i) && !has(is_ignoreProps, i) && lowerize(is_ignoreRgx ? strip(is_ignoreRgx, this[i]) : this[i]) == lowerize(is_ignoreRgx ? strip(is_ignoreRgx, strToCheck) : strToCheck)) {\n is = true;\n if (strToCheck != TYPEOF.UNDEFINED) break;\n } else if (strToCheck == TYPEOF.UNDEFINED && is) {\n is = !is;\n break;\n }\n }\n return is;\n };\n IData.prototype.toString = function () {\n var str = EMPTY;\n for (var i in toString_props) {\n if (typeof(this[toString_props[i]]) !== TYPEOF.UNDEFINED) {\n str += (str ? ' ' : EMPTY) + this[toString_props[i]];\n }\n }\n return str || TYPEOF.UNDEFINED;\n };\n }\n\n if (!NAVIGATOR_UADATA) {\n IData.prototype.then = function (cb) { \n var that = this;\n var IDataResolve = function () {\n for (var prop in that) {\n if (that.hasOwnProperty(prop)) {\n this[prop] = that[prop];\n }\n }\n };\n IDataResolve.prototype = {\n is : IData.prototype.is,\n toString : IData.prototype.toString\n };\n var resolveData = new IDataResolve();\n cb(resolveData);\n return resolveData;\n };\n }\n\n return new IData();\n };\n\n /////////////////\n // Constructor\n ////////////////\n\n function UACHData (uach, isHttpUACH) {\n uach = uach || {};\n setProps.call(this, CH_ALL_VALUES);\n if (isHttpUACH) {\n setProps.call(this, [\n [BRANDS, itemListToArray(uach[CH])],\n [FULLVERLIST, itemListToArray(uach[CH_FULL_VER_LIST])],\n [MOBILE, /\\?1/.test(uach[CH_MOBILE])],\n [MODEL, stripQuotes(uach[CH_MODEL])],\n [PLATFORM, stripQuotes(uach[CH_PLATFORM])],\n [PLATFORMVER, stripQuotes(uach[CH_PLATFORM_VER])],\n [ARCHITECTURE, stripQuotes(uach[CH_ARCH])],\n [FORMFACTORS, itemListToArray(uach[CH_FORM_FACTORS])],\n [BITNESS, stripQuotes(uach[CH_BITNESS])]\n ]);\n } else {\n for (var prop in uach) {\n if(this.hasOwnProperty(prop) && typeof uach[prop] !== TYPEOF.UNDEFINED) this[prop] = uach[prop];\n }\n }\n }\n\n function UAItem (itemType, ua, rgxMap, uaCH) {\n\n this.get = function (prop) {\n if (!prop) return this.data;\n return this.data.hasOwnProperty(prop) ? this.data[prop] : undefined;\n };\n\n this.set = function (prop, val) {\n this.data[prop] = val;\n return this;\n };\n\n this.setCH = function (ch) {\n this.uaCH = ch;\n return this;\n };\n\n this.detectFeature = function () {\n if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) {\n switch (this.itemType) {\n case BROWSER:\n // Brave-specific detection\n if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == TYPEOF.FUNCTION) {\n this.set(NAME, 'Brave');\n }\n break;\n case DEVICE:\n // Chrome-specific detection: check for 'mobile' value of navigator.userAgentData\n if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) {\n this.set(TYPE, MOBILE);\n }\n // iPadOS-specific detection: identified as Mac, but has some iOS-only properties\n if (this.get(MODEL) == 'Macintosh' && NAVIGATOR && typeof NAVIGATOR.standalone !== TYPEOF.UNDEFINED && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) {\n this.set(MODEL, 'iPad')\n .set(TYPE, TABLET);\n }\n break;\n case OS:\n // Chrome-specific detection: check for 'platform' value of navigator.userAgentData\n if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) {\n this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);\n }\n break;\n case RESULT:\n var data = this.data;\n var detect = function (itemType) {\n return data[itemType]\n .getItem()\n .detectFeature()\n .get();\n };\n this.set(BROWSER, detect(BROWSER))\n .set(CPU, detect(CPU))\n .set(DEVICE, detect(DEVICE))\n .set(ENGINE, detect(ENGINE))\n .set(OS, detect(OS));\n }\n }\n return this;\n };\n\n this.parseUA = function () {\n if (this.itemType != RESULT) {\n rgxMapper.call(this.data, this.ua, this.rgxMap);\n }\n switch (this.itemType) {\n case BROWSER:\n this.set(MAJOR, majorize(this.get(VERSION)));\n break;\n case OS:\n if (this.get(NAME) == 'iOS' && this.get(VERSION) == '18.6') {\n // Based on the assumption that iOS version is tightly coupled with Safari version\n var realVersion = /\\) Version\\/([\\d\\.]+)/.exec(this.ua); // Get Safari version\n if (realVersion && parseInt(realVersion[1].substring(0,2), 10) >= 26) {\n this.set(VERSION, realVersion[1]); // Set as iOS version\n }\n }\n break;\n }\n return this;\n };\n\n this.parseCH = function () {\n var uaCH = this.uaCH,\n rgxMap = this.rgxMap;\n \n switch (this.itemType) {\n case BROWSER:\n case ENGINE:\n var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName;\n if (brands) {\n for (var i=0; i<brands.length; i++) {\n var brandName = brands[i].brand || brands[i],\n brandVersion = brands[i].version;\n if (this.itemType == BROWSER && \n !/not.a.brand/i.test(brandName) && \n (!prevName || \n (/Chrom/.test(prevName) && brandName != CHROMIUM) || \n (prevName == EDGE && /WebView2/.test(brandName))\n )) {\n brandName = strMapper(brandName, browserHintsMap);\n prevName = this.get(NAME);\n if (!(prevName && !/Chrom/.test(prevName) && /Chrom/.test(brandName))) {\n this.set(NAME, brandName)\n .set(VERSION, brandVersion)\n .set(MAJOR, majorize(brandVersion));\n }\n prevName = brandName;\n }\n if (this.itemType == ENGINE && brandName == CHROMIUM) {\n this.set(VERSION, brandVersion);\n }\n }\n }\n break;\n case CPU:\n var archName = uaCH[ARCHITECTURE];\n if (archName) {\n if (archName && uaCH[BITNESS] == '64') archName += '64';\n rgxMapper.call(this.data, archName + ';', rgxMap);\n }\n break;\n case DEVICE:\n if (uaCH[MOBILE]) {\n this.set(TYPE, MOBILE);\n }\n if (uaCH[MODEL]) {\n this.set(MODEL, uaCH[MODEL]);\n if (!this.get(TYPE) || !this.get(VENDOR)) {\n var reParse = {};\n rgxMapper.call(reParse, 'droid 9; ' + uaCH[MODEL] + ')', rgxMap);\n if (!this.get(TYPE) && !!reParse.type) {\n this.set(TYPE, reParse.type);\n }\n if (!this.get(VENDOR) && !!reParse.vendor) {\n this.set(VENDOR, reParse.vendor);\n }\n }\n }\n if (uaCH[FORMFACTORS]) {\n var ff;\n if (typeof uaCH[FORMFACTORS] !== 'string') {\n var idx = 0;\n while (!ff && idx < uaCH[FORMFACTORS].length) {\n ff = strMapper(uaCH[FORMFACTORS][idx++], formFactorsMap);\n }\n } else {\n ff = strMapper(uaCH[FORMFACTORS], formFactorsMap);\n }\n this.set(TYPE, ff);\n }\n break;\n case OS:\n var osName = uaCH[PLATFORM];\n if(osName) {\n var osVersion = uaCH[PLATFORMVER];\n if (osName == WINDOWS) osVersion = (parseInt(majorize(osVersion), 10) >= 13 ? '11' : '10');\n this.set(NAME, osName)\n .set(VERSION, osVersion);\n }\n // Xbox-Specific Detection\n if (this.get(NAME) == WINDOWS && uaCH[MODEL] == 'Xbox') {\n this.set(NAME, 'Xbox')\n .set(VERSION, undefined);\n } \n break;\n case RESULT:\n var data = this.data;\n var parse = function (itemType) {\n return data[itemType]\n .getItem()\n .setCH(uaCH)\n .parseCH()\n .get();\n };\n this.set(BROWSER, parse(BROWSER))\n .set(CPU, parse(CPU))\n .set(DEVICE, parse(DEVICE))\n .set(ENGINE, parse(ENGINE))\n .set(OS, parse(OS));\n }\n return this;\n };\n\n setProps.call(this, [\n ['itemType', itemType],\n ['ua', ua],\n ['uaCH', uaCH],\n ['rgxMap', rgxMap],\n ['data', createIData(this, itemType)]\n ]);\n\n return this;\n }\n\n function UAParser (ua, extensions, headers) {\n\n if (typeof ua === TYPEOF.OBJECT) {\n if (isExtensions(ua, true)) {\n if (typeof extensions === TYPEOF.OBJECT) {\n headers = extensions; // case UAParser(extensions, headers) \n }\n extensions = ua; // case UAParser(extensions)\n } else {\n headers = ua; // case UAParser(headers)\n extensions = undefined;\n }\n ua = undefined;\n } else if (typeof ua === TYPEOF.STRING && !isExtensions(extensions, true)) {\n headers = extensions; // case UAParser(ua, headers)\n extensions = undefined;\n }\n\n if (headers) {\n if (typeof headers.append === TYPEOF.FUNCTION) {\n // Convert Headers object into a plain object\n var kv = {};\n headers.forEach(function (v, k) { kv[String(k).toLowerCase()] = v; });\n headers = kv;\n } else {\n // Normalize headers field name into lowercase\n var normalized = {};\n for (var header in headers) {\n if (headers.hasOwnProperty(header)) {\n normalized[String(header).toLowerCase()] = headers[header];\n }\n }\n headers = normalized;\n }\n }\n \n if (!(this instanceof UAParser)) {\n return new UAParser(ua, extensions, headers).getResult();\n }\n\n var userAgent = typeof ua === TYPEOF.STRING ? ua : // Passed user-agent string\n (headers && headers[USER_AGENT] ? headers[USER_AGENT] : // User-Agent from passed headers\n ((NAVIGATOR && NAVIGATOR.userAgent) ? NAVIGATOR.userAgent : // navigator.userAgent\n EMPTY)), // empty string\n\n httpUACH = new UACHData(headers, true),\n regexMap = extensions ? \n extend(defaultRegexes, extensions) : \n defaultRegexes,\n\n createItemFunc = function (itemType) {\n if (itemType == RESULT) {\n return function () {\n return new UAItem(itemType, userAgent, regexMap, httpUACH)\n .set('ua', userAgent)\n .set(BROWSER, this.getBrowser())\n .set(CPU, this.getCPU())\n .set(DEVICE, this.getDevice())\n .set(ENGINE, this.getEngine())\n .set(OS, this.getOS())\n .get();\n };\n } else {\n return function () {\n return new UAItem(itemType, userAgent, regexMap[itemType], httpUACH)\n .parseUA()\n .get();\n };\n }\n };\n \n // public methods\n setProps.call(this, [\n ['getBrowser', createItemFunc(BROWSER)],\n ['getCPU', createItemFunc(CPU)],\n ['getDevice', createItemFunc(DEVICE)],\n ['getEngine', createItemFunc(ENGINE)],\n ['getOS', createItemFunc(OS)],\n ['getResult', createItemFunc(RESULT)],\n ['getUA', function () { return userAgent; }],\n ['setUA', function (ua) {\n if (isString(ua)) userAgent = trim(ua, UA_MAX_LENGTH);\n return this;\n }]\n ])\n .setUA(userAgent);\n\n return this;\n }\n\n UAParser.VERSION = LIBVERSION;\n UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR, TYPE]);\n UAParser.CPU = enumerize([ARCHITECTURE]);\n UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);\n UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);\n\n export {UAParser};", "// Generated ESM version of ua-parser-js/enums\n// DO NOT EDIT THIS FILE!\n// Source: /src/enums/ua-parser-enums.js\n\n///////////////////////////////////////////////\n/* Enums for UAParser.js v2.0.6\n https://github.com/faisalman/ua-parser-js\n Author: Faisal Salman <f@faisalman.com>\n UAParser.js PRO Enterprise License */\n//////////////////////////////////////////////\n\n/*jshint esversion: 6 */ \n\nconst BrowserName = Object.freeze({\n '115': '115',\n '2345': '2345',\n '360': '360',\n ALIPAY: 'Alipay',\n AMAYA: 'Amaya',\n ANDROID: 'Android Browser',\n ARORA: 'Arora',\n AVANT: 'Avant',\n AVAST: 'Avast Secure Browser',\n AVG: 'AVG Secure Browser',\n BAIDU: 'Baidu Browser',\n BASILISK: 'Basilisk',\n BING: 'Bing',\n BLAZER: 'Blazer',\n BOLT: 'Bolt',\n BOWSER: 'Bowser',\n BRAVE: 'Brave',\n CAMINO: 'Camino',\n CHIMERA: 'Chimera',\n CHROME: 'Chrome',\n CHROME_HEADLESS: 'Chrome Headless',\n CHROME_MOBILE: 'Mobile Chrome',\n CHROME_WEBVIEW: 'Chrome WebView',\n CHROMIUM: 'Chromium',\n COBALT: 'Cobalt',\n COC_COC: 'Coc Coc',\n CONKEROR: 'Conkeror',\n DAUM: 'Daum',\n DILLO: 'Dillo',\n DOLPHIN: 'Dolphin',\n DOOBLE: 'Dooble',\n DORIS: 'Doris',\n DRAGON: 'Dragon',\n DUCKDUCKGO: 'DuckDuckGo',\n ECOSIA: 'Ecosia',\n EDGE: 'Edge',\n EDGE_WEBVIEW: 'Edge WebView',\n EDGE_WEBVIEW2: 'Edge WebView2',\n EPIPHANY: 'Epiphany',\n FACEBOOK: 'Facebook',\n FALKON: 'Falkon',\n FIREBIRD: 'Firebird',\n FIREFOX: 'Firefox',\n FIREFOX_FOCUS: 'Firefox Focus',\n FIREFOX_MOBILE: 'Mobile Firefox',\n FIREFOX_REALITY: 'Firefox Reality',\n FENNEC: 'Fennec',\n FLOCK: 'Flock',\n FLOW: 'Flow',\n GO: 'GoBrowser',\n GOOGLE_SEARCH: 'GSA',\n HELIO: 'Helio',\n HEYTAP: 'HeyTap',\n HONOR: 'Honor',\n HUAWEI: 'Huawei Browser',\n ICAB: 'iCab',\n ICE: 'ICE Browser',\n ICEAPE: 'IceApe',\n ICECAT: 'IceCat',\n ICEDRAGON: 'IceDragon',\n ICEWEASEL: 'IceWeasel',\n IE: 'IE',\n INSTAGRAM: 'Instagram',\n IRIDIUM: 'Iridium',\n IRON: 'Iron',\n JASMINE: 'Jasmine',\n KONQUEROR: 'Konqueror',\n KAKAO: 'KakaoTalk',\n KHTML: 'KHTML',\n K_MELEON: 'K-Meleon',\n KLAR: 'Klar',\n KLARNA: 'Klarna',\n KINDLE: 'Kindle',\n LENOVO: 'Smart Lenovo Browser',\n LADYBIRD: 'Ladybird',\n LG: 'LG Browser',\n LIBREWOLF: 'LibreWolf',\n LIEBAO: 'LBBROWSER',\n LINE: 'Line',\n LINKEDIN: 'LinkedIn',\n LINKS: 'Links',\n LUNASCAPE: 'Lunascape',\n LYNX: 'Lynx',\n MAEMO: 'Maemo Browser',\n MAXTHON: 'Maxthon',\n MIDORI: 'Midori',\n MINIMO: 'Minimo',\n MIUI: 'MIUI Browser',\n MOZILLA: 'Mozilla',\n MOSAIC: 'Mosaic',\n NAVER: 'Naver',\n NETFRONT: 'NetFront',\n NETSCAPE: 'Netscape',\n NETSURF: 'Netsurf',\n NOKIA: 'Nokia Browser',\n OBIGO: 'Obigo',\n OCULUS: 'Oculus Browser',\n OMNIWEB: 'OmniWeb',\n OPERA: 'Opera',\n OPERA_COAST: 'Opera Coast',\n OPERA_GX: 'Opera GX',\n OPERA_MINI: 'Opera Mini',\n OPERA_MOBI: 'Opera Mobi',\n OPERA_TABLET: 'Opera Tablet',\n OPERA_TOUCH: 'Opera Touch',\n OTTER: 'Otter',\n OVI: 'OviBrowser',\n PALEMOON: 'PaleMoon',\n PHANTOMJS: 'PhantomJS',\n PHOENIX: 'Phoenix',\n PICOBROWSER: 'Pico Browser',\n POLARIS: 'Polaris',\n PUFFIN: 'Puffin',\n QQ: 'QQBrowser',\n QQ_LITE: 'QQBrowserLite',\n QUARK: 'Quark',\n QUPZILLA: 'QupZilla',\n QUTEBROWSER: 'qutebrowser',\n QWANT: 'Qwant',\n REKONQ: 'rekonq',\n ROCKMELT: 'Rockmelt',\n SAFARI: 'Safari',\n SAFARI_MOBILE: 'Mobile Safari',\n SAILFISH: 'Sailfish Browser',\n SAMSUNG: 'Samsung Internet',\n SEAMONKEY: 'SeaMonkey',\n SILK: 'Silk',\n SKYFIRE: 'Skyfire',\n SLEIPNIR: 'Sleipnir',\n SLIMBOAT: 'SlimBoat',\n SLIMBROWSER: 'SlimBrowser',\n SLIMJET: 'Slimjet',\n SNAPCHAT: 'Snapchat',\n SOGOU_EXPLORER: 'Sogou Explorer',\n SOGOU_MOBILE: 'Sogou Mobile',\n SURF: 'Surf',\n SWIFTFOX: 'Swiftfox',\n TESLA: 'Tesla',\n TIKTOK: 'TikTok',\n TIZEN: 'Tizen Browser',\n TWITTER: 'Twitter',\n UC: 'UCBrowser',\n UP: 'UP.Browser',\n VIVALDI: 'Vivaldi',\n VIVO: 'Vivo Browser',\n W3M: 'w3m',\n WATERFOX: 'Waterfox',\n WEBKIT: 'WebKit',\n WECHAT: 'WeChat',\n WEIBO: 'Weibo',\n WHALE: 'Whale',\n WOLVIC: 'Wolvic',\n YANDEX: 'Yandex',\n ZALO: 'Zalo'\n\n // TODO : test!\n});\n/**\n * @deprecated Use `BrowserName` instead\n */\nconst Browser = BrowserName;\n\nconst BrowserType = Object.freeze({\n CRAWLER: 'crawler',\n CLI: 'cli',\n EMAIL: 'email',\n FETCHER: 'fetcher',\n INAPP: 'inapp',\n MEDIAPLAYER: 'mediaplayer',\n LIBRARY: 'library'\n});\n\nconst CPUArch = Object.freeze({\n '68K': '68k',\n ALPHA: 'alpha',\n ARM : 'arm',\n ARM_64: 'arm64',\n ARM_HF: 'armhf',\n AVR: 'avr',\n AVR_32: 'avr32',\n IA64: 'ia64',\n IRIX: 'irix',\n IRIX_64: 'irix64',\n MIPS: 'mips',\n MIPS_64: 'mips64',\n PA_RISC: 'pa-risc',\n PPC: 'ppc',\n SPARC: 'sparc',\n SPARC_64: 'sparc64',\n X86: 'ia32',\n X86_64: 'amd64'\n});\n/**\n * @deprecated Use `CPUArch` instead\n */\nconst CPU = CPUArch;\n\nconst DeviceType = Object.freeze({\n CONSOLE: 'console',\n DESKTOP: 'desktop',\n EMBEDDED: 'embedded',\n MOBILE: 'mobile',\n SMARTTV: 'smarttv',\n TABLET: 'tablet',\n WEARABLE: 'wearable',\n XR: 'xr'\n});\n/**\n * @deprecated Use `DeviceType` instead\n */\nconst Device = DeviceType;\n\nconst DeviceVendor = Object.freeze({\n ACER: 'Acer',\n ADVAN: 'Advan',\n ALCATEL: 'Alcatel',\n APPLE: 'Apple',\n AMAZON: 'Amazon',\n ARCHOS: 'Archos',\n ASUS: 'ASUS',\n ATT: 'AT&T',\n BENQ: 'BenQ',\n BLACKBERRY: 'BlackBerry',\n BLU: 'BLU',\n CAT: 'Cat',\n DELL: 'Dell',\n ENERGIZER: 'Energizer',\n ESSENTIAL: 'Essential',\n FACEBOOK: 'Facebook',\n FAIRPHONE: 'Fairphone',\n GEEKSPHONE: 'GeeksPhone',\n GENERIC: 'Generic',\n GOOGLE: 'Google',\n HISENSE: 'Hisense',\n HMD: 'HMD',\n HP: 'HP',\n HTC: 'HTC',\n HUAWEI: 'Huawei',\n IMO: 'IMO',\n INFINIX: 'Infinix',\n ITEL: 'itel',\n JOLLA: 'Jolla',\n KOBO: 'Kobo',\n LAVA: 'Lava',\n LENOVO: 'Lenovo',\n LG: 'LG',\n MEIZU: 'Meizu',\n MICROMAX: 'Micromax',\n MICROSOFT: 'Microsoft',\n MOTOROLA: 'Motorola',\n NEXIAN: 'Nexian',\n NINTENDO: 'Nintendo',\n NOKIA: 'Nokia',\n NOTHING: 'Nothing',\n NVIDIA: 'Nvidia',\n ONEPLUS: 'OnePlus',\n OPPO: 'OPPO',\n OUYA: 'Ouya',\n PALM: 'Palm',\n PANASONIC: 'Panasonic',\n PEBBLE: 'Pebble',\n PHILIPS: 'Philips',\n PICO: 'Pico',\n POLYTRON: 'Polytron',\n REALME: 'Realme',\n RETROID: 'Retroid',\n RIM: 'RIM',\n ROKU: 'Roku',\n SAMSUNG: 'Samsung',\n SHARP: 'Sharp',\n SIEMENS: 'Siemens',\n SMARTFREN: 'Smartfren',\n SONY: 'Sony',\n SPRINT: 'Sprint',\n TCL: 'TCL',\n TECHNISAT: 'TechniSAT',\n TECNO: 'TECNO',\n TESLA: 'Tesla',\n ULEFONE: 'Ulefone',\n VIVO: 'Vivo',\n VIZIO: 'Vizio',\n VODAFONE: 'Vodafone',\n WIKO: 'Wiko',\n XBOX: 'Xbox',\n XIAOMI: 'Xiaomi',\n ZEBRA: 'Zebra',\n ZTE: 'ZTE',\n\n // TODO : test!\n});\n/**\n * @deprecated Use `DeviceVendor` instead\n */\nconst Vendor = DeviceVendor;\n\nconst EngineName = Object.freeze({\n AMAYA: 'Amaya',\n ARKWEB: 'ArkWeb',\n BLINK: 'Blink',\n EDGEHTML: 'EdgeHTML',\n FLOW: 'Flow',\n GECKO: 'Gecko',\n GOANNA: 'Goanna',\n ICAB: 'iCab',\n KHTML: 'KHTML',\n LIBWEB: 'LibWeb',\n LINKS: 'Links',\n LYNX: 'Lynx',\n NETFRONT: 'NetFront',\n NETSURF: 'NetSurf',\n PRESTO: 'Presto',\n SERVO: 'Servo',\n TASMAN: 'Tasman',\n TRIDENT: 'Trident',\n W3M: 'w3m',\n WEBKIT: 'WebKit'\n});\n/**\n * @deprecated Use `EngineName` instead\n */\nconst Engine = EngineName;\n\nconst OSName = Object.freeze({\n AIX: 'AIX',\n AMIGA_OS: 'Amiga OS',\n ANDROID: 'Android',\n ANDROID_X86: 'Android-x86',\n ARCAOS: 'ArcaOS',\n ARCH: 'Arch',\n BADA: 'Bada',\n BEOS: 'BeOS',\n BLACKBERRY: 'BlackBerry',\n CENTOS: 'CentOS',\n CHROME_OS: 'Chrome OS',\n CHROMECAST: 'Chromecast',\n CHROMECAST_ANDROID: 'Chromecast Android',\n CHROMECAST_FUCHSIA: 'Chromecast Fuchsia',\n CHROMECAST_LINUX: 'Chromecast Linux',\n CHROMECAST_SMARTSPEAKER: 'Chromecast SmartSpeaker',\n CONTIKI: 'Contiki',\n DEBIAN: 'Debian',\n DEEPIN: 'Deepin',\n DRAGONFLY: 'DragonFly',\n ELEMENTARY_OS: 'elementary OS',\n FEDORA: 'Fedora',\n FIREFOX_OS: 'Firefox OS',\n FREEBSD: 'FreeBSD',\n FUCHSIA: 'Fuchsia',\n GENTOO: 'Gentoo',\n GHOSTBSD: 'GhostBSD',\n GNU: 'GNU',\n HAIKU: 'Haiku',\n HARMONYOS: 'HarmonyOS',\n HP_UX: 'HP-UX',\n HURD: 'Hurd',\n IOS: 'iOS',\n JOLI: 'Joli',\n KAIOS: 'KaiOS',\n KNOPPIX: 'Knoppix',\n KUBUNTU: 'Kubuntu',\n LINPUS: 'Linpus',\n LINSPIRE: 'Linspire',\n LINUX: 'Linux',\n MACOS: 'macOS',\n MAEMO: 'Maemo',\n MAGEIA: 'Mageia',\n MANDRIVA: 'Mandriva',\n MANJARO: 'Manjaro',\n MEEGO: 'MeeGo',\n MINIX: 'Minix',\n MINT: 'Mint',\n MORPH_OS: 'Morph OS',\n NETBSD: 'NetBSD',\n NETRANGE: 'NetRange',\n NETTV: 'NetTV',\n NINTENDO: 'Nintendo',\n OPENHARMONY: 'OpenHarmony',\n OPENBSD: 'OpenBSD',\n OPENVMS: 'OpenVMS',\n OS2: 'OS/2',\n PALM: 'Palm',\n PC_BSD: 'PC-BSD',\n PCLINUXOS: 'PCLinuxOS',\n PICO: 'Pico',\n PLAN9: 'Plan9',\n PLAYSTATION: 'PlayStation',\n QNX: 'QNX',\n RASPBIAN: 'Raspbian',\n REDHAT: 'RedHat',\n RIM_TABLET_OS: 'RIM Tablet OS',\n RISC_OS: 'RISC OS',\n SABAYON: 'Sabayon',\n SAILFISH: 'Sailfish',\n SERENITYOS: 'SerenityOS',\n SERIES40: 'Series40',\n SLACKWARE: 'Slackware',\n SOLARIS: 'Solaris',\n SUSE: 'SUSE',\n SYMBIAN: 'Symbian',\n TIZEN: 'Tizen',\n UBUNTU: 'Ubuntu',\n UBUNTU_TOUCH: 'Ubuntu Touch',\n UNIX: 'Unix',\n VECTORLINUX: 'VectorLinux',\n WATCHOS: 'watchOS',\n WEBOS: 'WebOS',\n WINDOWS: 'Windows',\n WINDOWS_CE: 'Windows CE',\n WINDOWS_IOT: 'Windows IoT',\n WINDOWS_MOBILE: 'Windows Mobile',\n WINDOWS_PHONE: 'Windows Phone',\n WINDOWS_RT: 'Windows RT',\n XBOX: 'Xbox',\n XUBUNTU: 'Xubuntu',\n ZENWALK: 'Zenwalk'\n\n // TODO : test!\n});\n/**\n * @deprecated Use `OSName` instead\n */\nconst OS = OSName;\n\n/*////////////////////////////////\n * Enums for Extensions submodule\n *///////////////////////////////\n\nconst Extension = Object.freeze({\n BrowserName: {\n CLI: {\n CURL: 'curl',\n ELINKS: 'ELinks',\n HTTPIE: 'HTTPie',\n LYNX: 'Lynx',\n WGET: 'Wget'\n },\n Crawler: {\n AHREFS_BOT: 'AhrefsBot',\n AI2_BOT: 'AI2Bot',\n AIHIT_BOT: 'aiHitBot',\n ALGOLIA_CRAWLER: 'Algolia Crawler',\n APPLE_BOT: 'Applebot',\n APPLE_BOT_EXTENDED: 'Applebot-Extended',\n ASK_TEOMA: 'Teoma',\n AMAZON_BOT: 'Amazonbot',\n AMAZON_CONTXBOT: 'contxbot',\n ANTHROPIC_AI: 'anthropic-ai',\n ANTHROPIC_CLAUDE_BOT: 'ClaudeBot',\n ANTHROPIC_CLAUDE_SEARCHBOT: 'Claude-SearchBot',\n ANTHROPIC_CLAUDE_WEB: 'Claude-Web',\n ARCHIVEORG_BOT: 'archive.org_bot',\n BAIDU_ADS: 'Baidu-ADS',\n BAIDU_SPIDER: 'Baiduspider',\n BAIDU_SPIDER_ADS: 'Baiduspider-ads',\n BAIDU_SPIDER_CPRO: 'Baiduspider-cpro',\n BAIDU_SPIDER_FAVO: 'Baiduspider-favo',\n BAIDU_SPIDER_IMAGE: 'Baiduspider-image',\n BAIDU_SPIDER_NEWS: 'Baiduspider-news',\n BAIDU_SPIDER_RENDER: 'Baiduspider-render',\n BAIDU_SPIDER_VIDEO: 'Baiduspider-video',\n BLEX_BOT: 'BLEXBot',\n BOTIFY: 'botify',\n BRAVE_BOT: 'Bravebot',\n BYTEDANCE_BYTESPIDER: 'Bytespider',\n BYTEDANCE_TIKTOKSPIDER: 'TikTokSpider',\n COMMON_CRAWL_CCBOT: 'CCBot',\n COCCOC_BOT_WEB: 'coccocbot-web',\n COCCOC_BOT_IMAGE: 'coccocbot-image',\n COHERE_TRAINING_DATA_CRAWLER: 'cohere-training-data-crawler',\n COTOYOGI: 'Cotoyogi',\n COVEO_BOT: 'Coveobot',\n CRITEO_BOT: 'CriteoBot',\n DATAFORSEO_BOT: 'DataForSeoBot',\n DAUM: 'Daum',\n DAUM_DAUMOA: 'Daumoa',\n DAUM_DAUMOA_IMAGE: 'Daumoa-image',\n DEEPSEEK_BOT: 'DeepSeekBot',\n DIFFBOT: 'Diffbot',\n DUCKDUCKGO_BOT: 'DuckDuckBot',\n DUCKDUCKGO_FAVICONS_BOT: 'DuckDuckGo-Favicons-Bot',\n ELASTIC: 'Elastic',\n ELASTIC_SWIFTYPE_BOT: 'Swiftbot',\n EXALEAD_EXABOT: 'Exabot',\n FIRECRAWL_AGENT: 'FirecrawlAgent',\n FREESPOKE: 'Freespoke',\n GOOGLE_ADSBOT: 'AdsBot-Google',\n GOOGLE_ADSBOT_MOBILE: 'Adsbot-Google-Mobile',\n GOOGLE_ADSENSE: 'AdSense',\n GOOGLE_APIS: 'APIs-Google',\n GOOGLE_BOT: 'Googlebot',\n GOOGLE_BOT_IMAGE: 'Googlebot-Image',\n GOOGLE_BOT_NEWS: 'Googlebot-News',\n GOOGLE_BOT_VIDEO: 'Googlebot-Video',\n GOOGLE_CLOUDVERTEXBOT: 'Google-CloudVertexBot',\n GOOGLE_EXTENDED: 'Google-Extended',\n GOOGLE_INSPECTIONTOOL: 'Google-InspectionTool',\n GOOGLE_OTHER: 'GoogleOther',\n GOOGLE_OTHER_IMAGE: 'GoogleOther-Image',\n GOOGLE_OTHER_VIDEO: 'GoogleOther-Video',\n GOOGLE_SAFETY: 'Google-Safety',\n GOOGLE_STOREBOT: 'Storebot-Google',\n HIVE_IMAGESIFTBOT: 'ImagesiftBot',\n HUAWEI_PANGUBOT: 'PanguBot',\n HUAWEI_PETALBOT: 'PetalBot',\n HUGGINGFACE_BOT: 'HuggingFace-Bot',\n HUNTER_VELENPUBLICWEBCRAWLER: 'VelenPublicWebCrawler',\n IA_ARCHIVER: 'ia_archiver',\n IASK_BOT: 'iAskBot',\n KAGI_BOT: 'Kagibot',\n KANGAROO_BOT: 'Kangaroo Bot',\n LINE_SPIDER: 'Linespider',\n LINKEDIN_BOT: 'LinkedInBot',\n MAGPIE_CRAWLER: 'magpie-crawler',\n MARGINALIA: 'marginalia',\n META_EXTERNALAGENT: 'meta-externalagent',\n META_FACEBOOKBOT: 'FacebookBot',\n META_FACEBOOKCATALOG: 'facebookcatalog',\n META_FACEBOOKEXTERNALHIT: 'facebookexternalhit',\n MAJESTIC_MJ12BOT: 'MJ12bot',\n MICROSOFT_BINGBOT: 'Bingbot',\n MICROSOFT_MSNBOT: 'msnbot',\n MICROSOFT_ADIDXBOT: 'adidxbot',\n MOJEEK_BOT: 'MojeekBot',\n MOZ_DOTBOT: 'DotBot',\n ONCRAWL: 'OnCrawl',\n ONESPOT_SCRAPERBOT: 'Onespot-ScraperBot',\n OPENAI_GPTBOT: 'GPTBot',\n OPENAI_SEARCH_BOT: 'OAI-SearchBot',\n PERPLEXITY_BOT: 'PerplexityBot',\n QIHOO_360_SPIDER: '360Spider',\n QWANT_BOT: 'Qwantbot',\n QWANT_BOT_NEWS: 'Qwantbot-news',\n REPLICATE_BOT: 'Replicate-Bot',\n RUNPOD_BOT: 'RunPod-Bot',\n SB_INTUITIONS_BOT: 'SBIntuitionsBot',\n SEEKPORT_BOT: 'SeekportBot',\n SEMRUSH_BOT: 'SemrushBot',\n SEMRUSH_BOT_BACKLINK: 'SemrushBot-BA',\n SEMRUSH_BOT_CONTENTSHAKE: 'SemrushBot-OCOB',\n SEMRUSH_BOT_SEO_CHECKER: 'SemrushBot-SI',\n SEZNAM_BOT: 'SeznamBot',\n SITEIMPROVE: 'Siteimprove',\n SOGOU_PIC_SPIDER: 'Sogou Pic Spider',\n SOGOU_WEB_SPIDER: 'Sogou web spider',\n STARTPAGE: 'Startpage',\n SURLY_BOT: 'SurdotlyBot',\n TIMPI_BOT: 'Timpibot',\n TOGETHER_BOT: 'Together-Bot',\n TURNITIN_BOT: 'TurnitinBot',\n TWIN_AGENT: 'TwinAgent',\n VERCEL_V0BOT: 'v0bot',\n WEBZIO: 'webzio',\n WEBZIO_EXTENDED: 'Webzio-Extended',\n WEBZIO_OMGILI: 'omgili',\n WEBZIO_OMGILI_BOT: 'omgilibot',\n XAI_BOT: 'xAI-Bot',\n YAHOO_JAPAN: 'Y!J-BRW',\n YAHOO_SLURP: 'Yahoo! Slurp',\n YANDEX_ACCESSIBILITY_BOT: 'YandexAccessibilityBot',\n YANDEX_ADDITIONAL_BOT: 'YandexAdditionalBot',\n YANDEX_ADNET: 'YandexAdNet',\n YANDEX_BLOGS: 'YandexBlogs',\n YANDEX_BOT: 'YandexBot',\n YANDEX_BOT_MIRRORDETECTOR: 'YandexBot MirrorDetector',\n YANDEX_COMBOT: 'YandexComBot',\n YANDEX_FAVICONS: 'YandexFavicons',\n YANDEX_IMAGE_RESIZER: 'YandexImageResizer',\n YANDEX_IMAGES: 'YandexImages',\n YANDEX_MARKET: 'YandexMarket',\n YANDEX_MEDIA: 'YandexMedia',\n YANDEX_METRIKA: 'YandexMetrika',\n YANDEX_MOBILE_BOT: 'YandexMobileBot',\n YANDEX_MOBILE_SCREENSHOT_BOT: 'YandexMobileScreenShotBot',\n YANDEX_NEWS: 'YandexNews',\n YANDEX_ONTODB: 'YandexOntoDB',\n YANDEX_ONTODB_API: 'YandexOntoDBAPI',\n YANDEX_PARTNER: 'YandexPartner',\n YANDEX_RCA: 'YandexRCA',\n YANDEX_RENDERRESOURCES_BOT: 'YandexRenderResourcesBot',\n YANDEX_SCREENSHOT_BOT: 'YandexScreenshotBot',\n YANDEX_SPRAV_BOT: 'YandexSpravBot',\n YANDEX_TRACKER: 'YandexTracker',\n YANDEX_VERTICALS: 'YandexVerticals',\n YANDEX_VERTIS: 'YandexVertis',\n YANDEX_VIDEO: 'YandexVideo',\n YANDEX_VIDEO_PARSER: 'YandexVideoParser',\n YANDEX_WEBMASTER: 'YandexWebmaster',\n YEP_BOT: 'YepBot',\n YETI: 'Yeti',\n YISOU_SPIDER: 'YisouSpider',\n YOU_BOT: 'YouBot',\n ZHIPU_CHATGLM_SPIDER: 'ChatGLM-Spider',\n ZUM_BOT: 'ZumBot'\n },\n Email: {\n AIRMAIL: 'Airmail',\n APPLE_MAIL: 'Mail',\n BLUEMAIL: 'BlueMail',\n DAUM_MAIL: 'DaumMail',\n EVOLUTION: 'Evolution',\n EM_CLIENT: 'eM Client',\n FOXMAIL: 'Foxmail',\n KMAIL: 'KMail',\n KMAIL2: 'kmail2',\n KONTACT: 'Kontact',\n MICROSOFT_OUTLOOK: 'Microsoft Outlook',\n MICROSOFT_OUTLOOK_MAC: 'MacOutlook',\n NAVER_MAILAPP: 'NaverMailApp',\n POLYMAIL: 'Polymail',\n PROTON_MAIL: 'ProtonMail',\n SPARK_MAIL: 'SparkDesktop',\n SPARROW: 'Sparrow',\n THUNDERBIRD: 'Thunderbird',\n YAHOO_MAIL: 'Yahoo',\n ZIMBRA: 'Zimbra',\n ZOHO_MAIL: 'ZohoMail-Desktop'\n },\n Fetcher: {\n AHREFS_SITEAUDIT: 'AhrefsSiteAudit',\n ANTHROPIC_CLAUDE_USER: 'Claude-User',\n ASANA: 'Asana',\n BETTER_UPTIME_BOT: 'Better Uptime Bot',\n BITLY_BOT: 'bitlybot',\n BLUESKY: 'Bluesky',\n BUFFER_LINKPREVIEWBOT: 'BufferLinkPreviewBot',\n COHERE_AI: 'Cohere-AI',\n DISCORD_BOT: 'Discordbot',\n DUCKDUCKGO_ASSISTBOT: 'DuckAssistBot',\n GOOGLE_CHROME_LIGHTHOUSE: 'Chrome-Lighthouse',\n GOOGLE_FEEDFETCHER: 'FeedFetcher-Google',\n GOOGLE_GEMINI_DEEP_RESEARCH: 'Gemini-Deep-Research',\n GOOGLE_IMAGEPROXY: 'GoogleImageProxy',\n GOOGLE_PAGERENDERER: 'Google-PageRenderer',\n GOOGLE_READ_ALOUD: 'Google-Read-Aloud',\n GOOGLE_PRODUCER: 'GoogleProducer',\n GOOGLE_SITE_VERIFICATION: 'Google-Site-Verification',\n HUBSPOT_PAGE_FETCHER: 'HubSpot Page Fetcher',\n IFRAMELY: 'Iframely',\n KAKAOTALK_SCRAP: 'kakaotalk-scrap',\n KEYBASE_BOT: 'KeybaseBot',\n META_EXTERNALFETCHER: 'meta-externalfetcher',\n META_WHATSAPP: 'WhatsApp',\n MICROSOFT_BINGPREVIEW: 'BingPreview',\n MICROSOFT_PREVIEW: 'MicrosoftPreview',\n MISTRALAI_USER: 'MistralAI-User',\n NAVER_BLUENO: 'Blueno',\n ONCRAWL_ROGERBOT: 'rogerbot',\n OPENAI_CHATGPT_USER: 'ChatGPT-User',\n PERPLEXITY_USER: 'Perplexity-User',\n PINTEREST_BOT: 'Pinterestbot',\n SEMRUSH_SITEAUDITBOT: 'SiteAuditBot',\n SLACK_BOT: 'Slackbot',\n SLACK_BOT_LINKEXPANDING: 'Slackbot-LinkExpanding',\n SLACK_IMGPROXY: 'Slack-ImgProxy',\n SNAP_URL_PREVIEW: 'Snap URL Preview',\n SKYPE_URIPREVIEW: 'SkypeUriPreview',\n TELEGRAM_BOT: 'TelegramBot',\n UPTIMEROBOT: 'UptimeRobot',\n VERCEL_FAVICON_BOT: 'vercel-favicon-bot',\n VERCEL_SCREENSHOT_BOT: 'vercel-screenshot-bot',\n VERCEL_BOT: 'Vercelbot',\n VERCEL_FLAGS: 'vercelflags',\n VERCEL_TRACING: 'verceltracing',\n X_TWITTERBOT: 'Twitterbot',\n YANDEX_CALENDAR: 'YandexCalendar',\n YANDEX_DIRECT: 'YandexDirect',\n YANDEX_DIRECTDYN: 'YandexDirectDyn',\n YANDEX_DIRECTFETCHER: 'YaDirectFetcher',\n YANDEX_FORDOMAIN: 'YandexForDomain',\n YANDEX_PAGECHECKER: 'YandexPagechecker',\n YANDEX_SEARCHSHOP: 'YandexSearchShop',\n YANDEX_SITELINKS: 'YandexSitelinks',\n YANDEX_USERPROXY: 'YandexUserproxy',\n ZOOMINFO_BOT: 'Zoombot'\n },\n InApp: {\n DISCORD: 'Discord',\n EVERNOTE: 'Evernote',\n FIGMA: 'Figma',\n FLIPBOARD: 'Flipboard',\n MATTERMOST: 'Mattermost',\n TEAMS: 'Teams',\n NOTION: 'Notion',\n POSTMAN: 'Postman',\n RAMBOX: 'Rambox',\n ROCKETCHAT: 'Rocket.Chat',\n SLACK: 'Slack',\n TIKTOK_LITE: 'TikTok Lite',\n VSCODE: 'VS Code',\n YAHOO_JAPAN: 'Yahoo! Japan'\n },\n Library: {\n ADOBE_AIR: 'AdobeAIR',\n AIOHTTP: 'aiohttp',\n APACHE_HTTPCLIENT: 'Apache-HttpClient',\n AXIOS: 'axios',\n GO_HTTP_CLIENT: 'go-http-client',\n GOT: 'got',\n GUZZLEHTTP: 'GuzzleHttp',\n JAVA: 'Java',\n JAVA_HTTPCLIENT: 'Java-http-client',\n JSDOM: 'jsdom',\n LIBWWW_PERL: 'libwww-perl',\n LUA_RESTY_HTTP: 'lua-resty-http',\n NEEDLE: 'Needle',\n NUTCH: 'Nutch',\n OKHTTP: 'OkHttp',\n NODE_FETCH: 'node-fetch',\n NODE_SUPERAGENT: 'node-superagent',\n PHP_SOAP: 'PHP-SOAP',\n POSTMAN_RUNTIME: 'PostmanRuntime',\n PYTHON_HTTPX: 'python-httpx',\n PYTHON_URLLIB: 'python-urllib',\n PYTHON_URLLIB3: 'python-urllib3',\n PYTHON_REQUESTS: 'python-requests',\n SCRAPY: 'Scrapy'\n }\n },\n DeviceVendor: {\n Vehicle: {\n BMW: 'BMW',\n BYD: 'BYD',\n JEEP: 'Jeep',\n RIVIAN: 'Rivian',\n TESLA: 'Tesla',\n VOLVO: 'Volvo'\n }\n }\n});\n\nexport { \n Browser,// deprecated\n CPU, // deprecated\n Device, // deprecated\n Vendor, // deprecated\n Engine, // deprecated\n OS, // deprecated\n BrowserName,\n BrowserType, \n CPUArch,\n DeviceType, \n DeviceVendor,\n EngineName,\n OSName,\n Extension\n};", "// Generated ESM version of ua-parser-js/extensions\n// DO NOT EDIT THIS FILE!\n// Source: /src/extensions/ua-parser-extensions.js\n\n///////////////////////////////////////////////\n/* Extensions for UAParser.js v2.0.6\n https://github.com/faisalman/ua-parser-js\n Author: Faisal Salman <f@faisalman.com>\n UAParser.js PRO Enterprise License */\n//////////////////////////////////////////////\n\n/*jshint esversion: 6 */ \n\nconst MODEL = 'model';\nconst NAME = 'name';\nconst TYPE = 'type';\nconst VENDOR = 'vendor';\nconst VERSION = 'version';\nconst MOBILE = 'mobile';\nconst TABLET = 'tablet';\nconst CRAWLER = 'crawler';\nconst CLI = 'cli';\nconst EMAIL = 'email';\nconst FETCHER = 'fetcher';\nconst INAPP = 'inapp';\nconst MEDIAPLAYER = 'mediaplayer';\nconst LIBRARY = 'library';\n\n//////////////////////\n// COMMAND LINE APPS\n/////////////////////\n\nconst CLIs = Object.freeze({\n browser : [\n // wget / curl / Lynx / ELinks / HTTPie\n [/(wget|curl|lynx|elinks|httpie)[\\/ ]\\(?([\\w\\.-]+)/i], [NAME, VERSION, [TYPE, CLI]]\n ]\n});\n\n////////////////////////\n// CRAWLERS / SPIDERS\n///////////////////////\n\nconst Crawlers = Object.freeze({\n browser : [\n [\n // AhrefsBot - https://ahrefs.com/robot\n // Amazonbot - https://developer.amazon.com/amazonbot\n // Bingbot / AdIdxBot - https://www.bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0\n // Bravebot - https://search.brave.com/help/brave-search-crawler\n // CCBot - https://commoncrawl.org/faq\n // contxbot - https://affiliate-program.amazon.com/help/node/topic/GT98G5PPRERNVZ2C\n // Coveobot - https://connect.coveo.com/s/article/19648\n // CriteoBot - https://www.criteo.com/criteo-crawler/\n // Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot\n // DuckDuckBot - http://duckduckgo.com/duckduckbot.html\n // FacebookBot - https://developers.facebook.com/docs/sharing/bot/\n // GPTBot - https://platform.openai.com/docs/gptbot\n // iAskBot - https://iask.ai\n // Kagibot - https://kagi.com/bot\n // Kangaroo Bot - https://kangaroollm.com.au/kangaroo-bot/\n // LinkedInBot - http://www.linkedin.com\n // MJ12bot - https://mj12bot.com/\n // MojeekBot - https://www.mojeek.com/bot.html\n // Onespot - https://www.onespot.com/identifying-traffic.html\n // OpenAI's SearchGPT - https://platform.openai.com/docs/bots\n // PerplexityBot - https://perplexity.ai/perplexitybot\n // SBIntuitionsBot - https://www.sbintuitions.co.jp/bot/\n // SeznamBot - http://napoveda.seznam.cz/seznambot-intro\n // SurdotlyBot - http://sur.ly/bot.html\n // Swiftbot - https://swiftype.com/swiftbot\n // YepBot - https://yep.com/yepbot/\n /((?:adidx|ahrefs|amazon|bing|brave|cc|contx|coveo|criteo|dot|duckduck(?:go-favicons-)?|exa|facebook|gpt|iask|kagi|kangaroo |linkedin|mj12|mojeek|oai-search|onespot-scraper|perplexity|sbintuitions|semrush|seznam|surdotly|swift|yep)bot)\\/([\\w\\.-]+)/i,\n\n // Algolia Crawler\n /(algolia crawler(?: renderscript)?)\\/?([\\w\\.]*)/i,\n\n // Applebot - http://apple.com/go/applebot\n /(applebot(?:-extended)?)\\/?([\\w\\.]*)/i,\n\n // Baiduspider https://help.baidu.com/question?prod_id=99&class=0&id=3001\n /(baiduspider[-imagevdonwsfcpr]{0,7})\\/?([\\w\\.]*)/i,\n\n // ClaudeBot (Anthropic)\n /(claude(?:bot|-searchbot|-web)|anthropic-ai)\\/?([\\w\\.]*)/i, \n\n // Coc Coc Bot - https://help.coccoc.com/en/search-engine\n /(coccocbot-(?:image|web))\\/([\\w\\.]+)/i, \n\n // Daum\n /(daum(?:oa)?(?:-image)?)[ \\/]([\\w\\.]+)/i,\n\n // Facebook / Meta \n // https://developers.facebook.com/docs/sharing/webmasters/web-crawlers\n /(facebook(?:externalhit|catalog)|meta-externalagent)\\/([\\w\\.]+)/i,\n\n // Googlebot - http://www.google.com/bot.html\n /(google(?:bot|other|-inspectiontool)(?:-image|-video|-news)?|storebot-google)\\/?([\\w\\.]*)/i, \n\n // Internet Archive (archive.org)\n /(ia_archiver|archive\\.org_bot)\\/?([\\w\\.]*)/i,\n\n // OnCrawl\n /(oncrawl) mobile\\/([\\w\\.]+)/i,\n\n // Qwantbot - https://help.qwant.com/bot\n /(qwantbot(?:-news)?)[-\\w]*\\/?([\\w\\.]*)/i,\n\n // SemrushBot - http://www.semrush.com/bot.html\n /((?:semrush|splitsignal)bot[-abcfimostw]*)\\/?([\\w\\.-]*)/i,\n\n // Sogou Spider\n /(sogou (?:pic|head|web|orion|news) spider)\\/([\\w\\.]+)/i, \n\n // Yahoo! Japan - https://support.yahoo-net.jp/PccSearch/s/article/H000007955\n /(y!?j-(?:asr|br[uw]|dscv|mmp|vsidx|wsc))\\/([\\w\\.]+)/i, \n\n // Yandex Bots - https://yandex.com/bots\n /(yandex(?:(?:mobile)?(?:accessibility|additional|com|renderresources|screenshot|sprav)?bot(?!.+mirror)|image(?:s|resizer)|adnet|blogs|favicons|market|media|metrika|news|ontodb(?:api)?|partner|rca|tracker|turbo|verti(?:cal)?s|webmaster|video(?:parser)?))\\/([\\w\\.]+)/i,\n\n // Yeti (Naver)\n /(yeti)\\/([\\w\\.]+)/i,\n\n // aiHitBot / Algolia Crawler / BLEXBot / Diffbot / FirecrawlAgent / HuggingFace-Bot / Linespider / MSNBot / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / PanguBot / Replicate-Bot / RunPod-Bot / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / Together-Bot / VelenPublicWebCrawler / xAI-Bot / YisouSpider / YouBot / ZumBot\n // Cotoyogi - https://ds.rois.ac.jp/en_center8/en_crawler/\n // Freespoke - https://docs.freespoke.com/search/bot/\n /((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cotoyogi|firecrawlagent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|twinagent|webzio-extended)\\/?([\\w\\.]*)/i\n ],\n [NAME, VERSION, [TYPE, CRAWLER]],\n\n [\n // YandexBot MirrorDetector\n /(yandexbot\\/([\\w\\.]+); mirrordetector)/i\n ],\n [[NAME, /\\/.+;/ig, ''], VERSION, [TYPE, CRAWLER]],\n\n [\n // Google Bots\n /((?:adsbot|apis|mediapartners)-google(?:-mobile)?|google-?(?:other|cloudvertexbot|extended|safety))/i,\n\n // AI2Bot - https://allenai.org/crawler\n // DataForSeoBot - https://dataforseo.com/dataforseo-bot\n // Huawei AspiegelBot / PetalBot https://aspiegel.com/petalbot\n // ImagesiftBot - https://imagesift.com/about\n // Siteimprove - https://help.siteimprove.com/support/solutions/articles/80000448553\n // TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html\n // v0bot - https://vercel.com/docs/bot-management\n // Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp\n // Botify / Bytespider / DeepSeekBot / Qihoo 360Spider / SeekportBot / TikTokSpider\n /\\b((ai2|aspiegel|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\\/s)|marginalia|siteimprove(?=bot|\\.com)|teoma|webzio|yahoo! slurp)/i\n ], \n [NAME, [TYPE, CRAWLER]]\n ]\n});\n\n//////////////////\n// EXTRA DEVICES\n/////////////////\n\nconst ExtraDevices = Object.freeze({\n device : [[ \n /(nook)[\\w ]+build\\/(\\w+)/i, // Nook\n /(dell) (strea[kpr\\d ]*[\\dko])/i, // Dell Streak\n /(le[- ]+pan)[- ]+(\\w{1,9}) bui/i, // Le Pan Tablets\n /(trinity)[- ]*(t\\d{3}) bui/i, // Trinity Tablets\n /(gigaset)[- ]+(q\\w{1,9}) bui/i, // Gigaset Tablets\n /(vodafone) ([\\w ]+)(?:\\)| bui)/i // Vodafone\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(u304aa)/i // AT&T\n ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [\n\n /\\bsie-(\\w*)/i // Siemens\n ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [\n\n /\\b(rct\\w+) b/i // RCA Tablets\n ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [\n\n /\\b(venue[\\d ]{2,7}) b/i // Dell Venue Tablets\n ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [\n\n /\\b(q(?:mv|ta)\\w+) b/i // Verizon Tablet\n ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [\n\n /\\b(?:barnes[& ]+noble |bn[rt])([\\w\\+ ]*) b/i // Barnes & Noble Tablet\n ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [\n\n /\\b(tm\\d{3}\\w+) b/i\n ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [\n\n /\\b(k88) b/i // ZTE K Series Tablet\n ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [\n\n /\\b(nx\\d{3}j) b/i // ZTE Nubia\n ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [\n\n /\\b(gen\\d{3}) b.+49h/i // Swiss GEN Mobile\n ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [\n\n /\\b(zur\\d{3}) b/i // Swiss ZUR Tablet\n ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [\n\n /^((zeki)?tb.*\\b) b/i // Zeki Tablets\n ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [\n\n /\\b([yr]\\d{2}) b/i,\n /\\b(?:dragon[- ]+touch |dt)(\\w{5}) b/i // Dragon Touch Tablet\n ], [MODEL, [VENDOR, 'Dragon Touch'], [TYPE, TABLET]], [\n\n /\\b(ns-?\\w{0,9}) b/i // Insignia Tablets\n ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [\n\n /\\b((nxa|next)-?\\w{0,9}) b/i // NextBook Tablets\n ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [\n\n /\\b(xtreme\\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i // Voice Xtreme Phones\n ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [\n\n /\\b(lvtel\\-)?(v1[12]) b/i // LvTel Phones\n ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [\n\n /\\b(ph-1) /i // Essential PH-1\n ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [\n\n /\\b(v(100md|700na|7011|917g).*\\b) b/i // Envizen Tablets\n ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [\n\n /\\b(trio[-\\w\\. ]+) b/i // MachSpeed Tablets\n ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [\n\n /\\btu_(1491) b/i // Rotor Tablets\n ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]]\n ]\n});\n\n///////////////\n// EMAIL APPS\n//////////////\n\nconst Emails = Object.freeze({\n browser : [\n [\n // Evolution / Kontact/KMail[2] / [Microsoft/Mac] Outlook / Thunderbird\n // Airmail / BlueMail / DaumMail / eMClient / Foxmail / NaverMailApp / Polymail\n // ProtonMail / SparkDesktop / Sparrow / Yahoo! Mail / Zimbra / ZohoMail-Desktop\n /((?:air|blue|daum|fox|poly|proton)mail|emclient|evolution|kmail2?|kontact|(?:microsoft |mac)?outlook(?:-express)?|navermailapp|(?!chrom.+)sparrow|sparkdesktop|thunderbird|yahoo|zohomail-desktop)(?:m.+ail; |[\\/ ])([\\w\\.]+)/i,\n\n // Apple's Mail\n /(mail)\\/([\\w\\.]+) cf/i\n ], [NAME, VERSION, [TYPE, EMAIL]], [\n \n // Zimbra\n /zdesktop\\/([\\w\\.]+)/i\n ], [VERSION, [NAME, 'Zimbra'], [TYPE, EMAIL]]\n ]\n});\n\n///////////////////////\n// ON-DEMAND SCRAPERS\n//////////////////////\n\nconst Fetchers = Object.freeze({\n browser : [\n [\n // Asana / Bitlybot / Better Uptime / BingPreview / Blueno / Cohere-AI / HubSpot Page Fetcher / kakaotalk-scrap / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot\n // AhrefsSiteAudit - https://ahrefs.com/robot/site-audit\n // Buffer Link Preview Bot - https://scraper.buffer.com/about/bots/link-preview-bot\n // ChatGPT-User - https://platform.openai.com/docs/plugins/bot\n // DuckAssistBot - https://duckduckgo.com/duckassistbot/\n // Google Site Verifier / Meta / Yahoo! Japan\n // Iframely - https://iframely.com/docs/about\n // Perplexity-User - https://docs.perplexity.ai/guides/bots\n // MistralAI-User - https://docs.mistral.ai/robots/\n // Yandex Bots - https://yandex.com/bots\n /(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:chatgpt|claude|mistralai|perplexity)-user|cohere-ai|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher)\\/([\\w\\.]+)/i,\n\n // Bluesky\n /(bluesky) cardyb\\/([\\w\\.]+)/i,\n\n // Skype\n /(skypeuripreview) preview\\/([\\w\\.]+)/i,\n\n // Slackbot - https://api.slack.com/robots\n /(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\\w\\.]+)/i,\n \n // WhatsApp\n /(whatsapp)\\/([\\w\\.]+)/i\n ], \n [NAME, VERSION, [TYPE, FETCHER]],\n\n [\n // Google Bots / Chrome-Lighthouse / Gemini-Deep-Research / KeybaseBot / Snapchat / Vercelbot / Yandex Bots\n /((?:better uptime |keybase|telegram|vercel)bot|chrome-lighthouse|feedfetcher-google|gemini-deep-research|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|yandex(?:sitelinks|userproxy))/i\n ], \n [NAME, [TYPE, FETCHER]],\n ],\n\n os : [\n [/whatsapp\\/[\\d\\.]+ (a|i)/i],\n [[NAME, os => os == 'A' ? 'Android' : 'iOS' ]]\n ]\n});\n\n////////////////////\n// IN-APP BROWSERS\n///////////////////\n\nconst InApps = Object.freeze({\n browser : [[\n // Discord/Figma/Flipboard/Mattermost/Notion/Postman/Rambox/Rocket.Chat/Slack/Teams\n /\\b(discord|figma|mattermost|notion|postman|rambox|rocket.chat|slack|teams)\\/([\\w\\.]+).+(electron\\/|; ios)/i,\n /(flipboard)\\/([\\w\\.]+)/i\n ], [NAME, VERSION, [TYPE, INAPP]], [\n\n // Evernote/Teams on mobile\n /(evernote) win/i,\n /(teams)mobile-(ios|and)/i\n ], [NAME, [TYPE, INAPP]], [\n\n // Slack\n /chatlyio\\/([\\d\\.]+)/i], \n [VERSION, [NAME, 'Slack'], [TYPE, INAPP]], [\n\n // TikTok Lite\n /ultralite app_version\\/([\\w\\.]+)/i], \n [VERSION, [NAME, 'TikTok Lite'], [TYPE, INAPP]], [\n\n // VS Code\n /\\) code\\/([\\d\\.]+).+electron\\//i], \n [VERSION, [NAME, 'VS Code'], [TYPE, INAPP]], [\n\n // Yahoo! Japan\n /jp\\.co\\.yahoo\\.(?:android\\.yjtop|ipn\\.appli)\\/([\\d\\.]+)/i], \n [VERSION, [NAME, 'Yahoo! Japan'], [TYPE, INAPP]]\n ]\n});\n\n//////////////////////\n// MEDIA PLAYER APPS\n/////////////////////\n\nconst MediaPlayers = Object.freeze({\n browser : [[\n /(apple(?:coremedia|tv))\\/([\\w\\._]+)/i, // Generic Apple CoreMedia\n /(coremedia) v([\\w\\._]+)/i, \n // Ares/Nexplayer/OSSProxy\n /(ares|clementine|music player daemon|nexplayer|ossproxy) ([\\w\\.-]+)/i, \n // Aqualung/Lyssna/BSPlayer/Clementine/MPD\n // Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/GnomeMplayer/MoC\n // NSPlayer/PSP-InternetRadioPlayer/Videos\n // Nero Home/Nero Scout/Nokia\n // QuickTime/RealMedia/RadioApp/RadioClientApplication/\n // SoundTap/Totem/Stagefright/Streamium\n // XBMC/gvfs/Xine/XMMS/irapp\n /^(aqualung|audacious|audimusicstream|amarok|bass|bsplayer|core|gnomemplayer|gvfs|irapp|lyssna|music on console|nero (?:home|scout)|nokia\\d+|nsplayer|psp-internetradioplayer|quicktime|rma|radioapp|radioclientapplication|soundtap|stagefright|streamium|totem|videos|xbmc|xine|xmms)\\/([\\w\\.-]+)/i,\n /(lg player|nexplayer) ([\\d\\.]+)/i,\n /player\\/(nexplayer|lg player) ([\\w\\.-]+)/i, // NexPlayer/LG Player\n /(gstreamer) souphttpsrc.+libsoup\\/([\\w\\.-]+)/i, // Gstreamer\n /(htc streaming player) [\\w_]+ \\/ ([\\d\\.]+)/i, // HTC Streaming Player\n /(lavf)([\\d\\.]+)/i, // Lavf (FFMPEG)\n // MPlayer SVN\n /(mplayer)(?: |\\/)(?:(?:sherpya-){0,1}svn)(?:-| )(r\\d+(?:-\\d+[\\w\\.-]+))/i,\n / (songbird)\\/([\\w\\.-]+)/i, // Songbird/Philips-Songbird\n /(winamp)(?:3 version|mpeg| ) ([\\w\\.-]+)/i, // Winamp\n /(vlc)(?:\\/| media player - version )([\\w\\.-]+)/i, // VLC Videolan\n /^(foobar2000|itunes|smp)\\/([\\d\\.]+)/i, // Foobar2000/iTunes/SMP\n /com\\.(riseupradioalarm)\\/([\\d\\.]*)/i, // RiseUP Radio Alarm\n /(mplayer)(?:\\s|\\/| unknown-)([\\w\\.\\-]+)/i, // MPlayer\n // Windows Media Server\n /(windows)\\/([\\w\\.-]+) upnp\\/[\\d\\.]+ dlnadoc\\/[\\d\\.]+ home media server/i\n ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [\n\n /(flrp)\\/([\\w\\.-]+)/i // Flip Player\n ], [[NAME, 'Flip Player'], VERSION, [TYPE, MEDIAPLAYER]], [\n // FStream/NativeHost/QuerySeekSpider\n // MPlayer (no other info)/Media Player Classic/Nero ShowTime\n // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)\n // inlight radio / YourMuze\n /(fstream|media player classic|inlight radio|mplayer|nativehost|nero showtime|ocms-bot|queryseekspider|tapinradio|tunein radio|winamp|yourmuze)/i \n ], [NAME, [TYPE, MEDIAPLAYER]], [\n\n /(htc_one_s|windows-media-player|wmplayer)\\/([\\w\\.-]+)/i, // HTC One S / Windows Media Player\n ], [[NAME, /[_-]/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [\n\n /(rad.io|radio.(?:de|at|fr)) ([\\d\\.]+)/i // Rad.io\n ], [[NAME, 'rad.io'], VERSION, [TYPE, MEDIAPLAYER]]\n ]\n});\n\n/////////////\n// LIBRARIES\n//////////////\n\nconst Libraries = Object.freeze({\n browser : [\n // Apache-HttpClient/Axios/go-http-client/got/GuzzleHttp/Java[-HttpClient]/jsdom/libwww-perl/lua-resty-http/Needle/node-fetch/OkHttp/PHP-SOAP/PostmanRuntime/python-urllib/python-requests/Scrapy/superagent\n [\n /^(apache-httpclient|axios|(?:go|java)-http-client|got|guzzlehttp|java|libwww-perl|lua-resty-http|needle|node-(?:fetch|superagent)|okhttp|php-soap|postmanruntime|python-(?:httpx|urllib[23]?|requests)|scrapy)\\/([\\w\\.]+)/i,\n /(adobeair|aiohttp|jsdom)\\/([\\w\\.]+)/i,\n /(nutch)-([\\w\\.-]+)(\\(|$)/i,\n /\\((java)\\/([\\w\\.]+)/i\n ], [NAME, VERSION, [TYPE, LIBRARY]]\n ]\n});\n\n/////////////\n// VEHICLES\n////////////\n\nconst Vehicles = Object.freeze({\n device : [\n [/aftlbt962e2/i], // BMW\n [[VENDOR, 'BMW']],\n\n [/dilink.+(byd) auto/i], // BYD\n [VENDOR],\n\n [/aftlft962x3/i], // Jeep\n [[VENDOR, 'Jeep'], [MODEL, 'Wagooner']],\n \n [/(rivian) (r1t)/i], // Rivian\n [VENDOR, MODEL],\n\n [/vcc.+netfront/i], // Volvo\n [[VENDOR, 'Volvo']]\n ]\n});\n\n//////////\n// BOTS\n/////////\n\nconst Bots = Object.freeze({\n browser : [\n ...CLIs.browser,\n ...Fetchers.browser,\n ...Crawlers.browser,\n ...Libraries.browser\n ],\n os : [\n ...Fetchers.os\n ]\n});\n\nexport { \n Bots,\n CLIs,\n Crawlers,\n ExtraDevices,\n Emails,\n Fetchers,\n InApps,\n Libraries,\n MediaPlayers,\n Vehicles\n};", "/*! detectEurope.js v0.1.2\n Determine whether a user is from the European Union (EU) area\n https://github.com/faisalman/detect-europe-js\n Author: Faisal Salman <f@faisalman.com>\n MIT License */\nconst TIMEZONE = {\n ANDORRA: {\n ANDORRA: 'Europe/Andorra'\n },\n AUSTRIA: {\n VIENNA: 'Europe/Vienna'\n },\n BELGIUM: {\n BRUSSELS: 'Europe/Brussels'\n },\n BULGARIA: {\n SOFIA: 'Europe/Sofia'\n },\n CROATIA: {\n ZAGREB: 'Europe/Zagreb'\n },\n CYPRUS: {\n NICOSIA_EUROPE: 'Europe/Nicosia',\n NICOSIA_ASIA: 'Asia/Nicosia',\n FAMAGUSTA: 'Asia/Famagusta'\n },\n CZECHIA: {\n PRAGUE: 'Europe/Prague'\n },\n DENMARK: {\n COPENHAGEN: 'Europe/Copenhagen',\n FAROE: 'Atlantic/Faroe'\n },\n ESTONIA: {\n TALLINN: 'Europe/Tallinn'\n },\n FINLAND: {\n HELSINKI: 'Europe/Helsinki',\n MARIEHAMN: 'Europe/Mariehamn'\n },\n FRANCE: {\n PARIS: 'Europe/Paris',\n CAYENNE: 'America/Cayenne',\n GUADELOUPE: 'America/Guadeloupe',\n MARIGOT: 'America/Marigot',\n MARTINIQUE: 'America/Martinique',\n MAYOTTE: 'Indian/Mayotte',\n REUNION: 'Indian/Reunion'\n },\n GERMANY: {\n BERLIN: 'Europe/Berlin',\n BUSINGEN: 'Europe/Busingen'\n },\n GREECE: {\n ATHENS: 'Europe/Athens'\n },\n HUNGARY: {\n BUDAPEST: 'Europe/Budapest'\n },\n ICELAND: {\n REYKJAVIK: 'Atlantic/Reykjavik'\n },\n IRELAND: {\n DUBLIN: 'Europe/Dublin'\n },\n ITALY: {\n ROME: 'Europe/Rome'\n },\n LATVIA: {\n RIGA: 'Europe/Riga'\n },\n LIECHTENSTEIN: {\n VADUZ: 'Europe/Vaduz'\n },\n LITHUANIA: {\n VILNIUS: 'Europe/Vilnius'\n },\n LUXEMBOURG: {\n LUXEMBOURG: 'Europe/Luxembourg'\n },\n MALTA: {\n MALTA: 'Europe/Malta'\n },\n MONACO: {\n MONACO: 'Europe/Monaco'\n },\n NETHERLANDS: {\n AMSTERDAM: 'Europe/Amsterdam',\n ARUBA: 'America/Aruba',\n CURACAO: 'America/Curacao',\n KRALENDIJK: 'America/Kralendijk',\n LOWER_PRINCES: 'America/Lower_Princes'\n },\n NORWAY: {\n OSLO: 'Europe/Oslo',\n JAN_MAYEN: 'Atlantic/Jan_Mayen',\n LONGYEARBYEN: 'Arctic/Longyearbyen'\n },\n POLAND: {\n WARSAW: 'Europe/Warsaw'\n },\n PORTUGAL: {\n LISBON: 'Europe/Lisbon',\n AZORES: 'Atlantic/Azores',\n MADEIRA: 'Atlantic/Madeira'\n },\n ROMANIA: {\n BUCHAREST: 'Europe/Bucharest'\n },\n SAN_MARINO: {\n SAN_MARINO: 'Europe/San_Marino'\n },\n SLOVAKIA: {\n BRATISLAVA: 'Europe/Bratislava'\n },\n SLOVENIA: {\n LJUBLJANA: 'Europe/Ljubljana'\n },\n SPAIN: {\n MADRID: 'Europe/Madrid',\n CANARY: 'Atlantic/Canary',\n CEUTA: 'Africa/Ceuta'\n },\n SWEDEN: {\n STOCKHOLM: 'Europe/Stockholm'\n },\n SWITZERLAND: {\n ZURICH: 'Europe/Zurich'\n },\n VATICAN: {\n VATICAN: 'Europe/Vatican'\n }\n};\nconst EU_TIMEZONE = [\n TIMEZONE.AUSTRIA.VIENNA,\n TIMEZONE.BELGIUM.BRUSSELS,\n TIMEZONE.BULGARIA.SOFIA,\n TIMEZONE.CROATIA.ZAGREB,\n TIMEZONE.CYPRUS.NICOSIA_EUROPE,\n TIMEZONE.CYPRUS.NICOSIA_ASIA,\n TIMEZONE.CYPRUS.FAMAGUSTA,\n TIMEZONE.CZECHIA.PRAGUE,\n TIMEZONE.DENMARK.COPENHAGEN,\n TIMEZONE.ESTONIA.TALLINN,\n TIMEZONE.FINLAND.HELSINKI,\n TIMEZONE.FINLAND.MARIEHAMN,\n TIMEZONE.FRANCE.PARIS,\n TIMEZONE.GERMANY.BERLIN,\n TIMEZONE.GREECE.ATHENS,\n TIMEZONE.HUNGARY.BUDAPEST,\n TIMEZONE.IRELAND.DUBLIN,\n TIMEZONE.ITALY.ROME,\n TIMEZONE.LATVIA.RIGA,\n TIMEZONE.LITHUANIA.VILNIUS,\n TIMEZONE.LUXEMBOURG.LUXEMBOURG,\n TIMEZONE.MALTA.MALTA,\n TIMEZONE.NETHERLANDS.AMSTERDAM,\n TIMEZONE.POLAND.WARSAW,\n TIMEZONE.PORTUGAL.LISBON,\n TIMEZONE.ROMANIA.BUCHAREST,\n TIMEZONE.SLOVAKIA.BRATISLAVA,\n TIMEZONE.SLOVENIA.LJUBLJANA,\n TIMEZONE.SPAIN.MADRID,\n TIMEZONE.SWEDEN.STOCKHOLM,\n TIMEZONE.FRANCE.CAYENNE,\n TIMEZONE.FRANCE.GUADELOUPE,\n TIMEZONE.FRANCE.MARIGOT,\n TIMEZONE.FRANCE.MARTINIQUE,\n TIMEZONE.FRANCE.MAYOTTE,\n TIMEZONE.FRANCE.REUNION,\n TIMEZONE.PORTUGAL.AZORES,\n TIMEZONE.PORTUGAL.MADEIRA,\n TIMEZONE.SPAIN.CANARY\n];\nconst EEA_EFTA_TIMEZONE = [\n TIMEZONE.ICELAND.REYKJAVIK,\n TIMEZONE.LIECHTENSTEIN.VADUZ,\n TIMEZONE.NORWAY.OSLO,\n TIMEZONE.NORWAY.JAN_MAYEN\n];\nconst EEA_TIMEZONE = [\n ...EU_TIMEZONE,\n ...EEA_EFTA_TIMEZONE\n];\nconst EFTA_TIMEZONE = [\n TIMEZONE.SWITZERLAND.ZURICH,\n ...EEA_EFTA_TIMEZONE\n];\nconst SCHENGEN_TIMEZONE = [\n TIMEZONE.AUSTRIA.VIENNA,\n TIMEZONE.BELGIUM.BRUSSELS,\n TIMEZONE.BULGARIA.SOFIA,\n TIMEZONE.CROATIA.ZAGREB,\n TIMEZONE.CZECHIA.PRAGUE,\n TIMEZONE.DENMARK.COPENHAGEN,\n TIMEZONE.ESTONIA.TALLINN,\n TIMEZONE.FINLAND.HELSINKI,\n TIMEZONE.FINLAND.MARIEHAMN,\n TIMEZONE.FRANCE.PARIS,\n TIMEZONE.GERMANY.BERLIN,\n TIMEZONE.GREECE.ATHENS,\n TIMEZONE.HUNGARY.BUDAPEST,\n TIMEZONE.ITALY.ROME,\n TIMEZONE.LATVIA.RIGA,\n TIMEZONE.LITHUANIA.VILNIUS,\n TIMEZONE.LUXEMBOURG.LUXEMBOURG,\n TIMEZONE.MALTA.MALTA,\n TIMEZONE.NETHERLANDS.AMSTERDAM,\n TIMEZONE.POLAND.WARSAW,\n TIMEZONE.PORTUGAL.LISBON,\n TIMEZONE.PORTUGAL.AZORES,\n TIMEZONE.PORTUGAL.MADEIRA,\n TIMEZONE.ROMANIA.BUCHAREST,\n TIMEZONE.SLOVAKIA.BRATISLAVA,\n TIMEZONE.SLOVENIA.LJUBLJANA,\n TIMEZONE.SPAIN.MADRID,\n TIMEZONE.SPAIN.CANARY,\n TIMEZONE.SWEDEN.STOCKHOLM,\n TIMEZONE.ANDORRA.ANDORRA,\n TIMEZONE.GERMANY.BUSINGEN,\n TIMEZONE.ICELAND.REYKJAVIK,\n TIMEZONE.LIECHTENSTEIN.VADUZ,\n TIMEZONE.MONACO.MONACO,\n TIMEZONE.NORWAY.OSLO,\n TIMEZONE.SAN_MARINO.SAN_MARINO,\n TIMEZONE.SPAIN.CEUTA,\n TIMEZONE.SWITZERLAND.ZURICH,\n TIMEZONE.VATICAN.VATICAN\n];\nconst isTimezoneIn = (tz) => { var _a; return typeof window !== 'undefined' && ((_a = window === null || window === void 0 ? void 0 : window.Intl) === null || _a === void 0 ? void 0 : _a.DateTimeFormat) && tz.includes(Intl.DateTimeFormat().resolvedOptions().timeZone); };\nconst isFromEU = () => isTimezoneIn(EU_TIMEZONE);\nconst isFromEEA = () => isTimezoneIn(EEA_TIMEZONE);\nconst isFromEFTA = () => isTimezoneIn(EFTA_TIMEZONE);\nconst isFromSchengen = () => isTimezoneIn(SCHENGEN_TIMEZONE);\nexport { isFromEU, isFromEEA, isFromEFTA, isFromSchengen };\n", "/*! isStandalonePWA 0.1.1\n Detect if PWA is running in standalone mode\n https://github.com/faisalman/is-standalone-pwa\n Author: Faisal Salman <f@faisalman.com>\n MIT License */\nexport function isStandalonePWA() {\n var _a;\n return typeof window !== 'undefined' &&\n ((window === null || window === void 0 ? void 0 : window.matchMedia('(display-mode: standalone)').matches) ||\n ((_a = window.navigator) === null || _a === void 0 ? void 0 : _a.standalone) ||\n document.referrer.startsWith('android-app://') ||\n (window === null || window === void 0 ? void 0 : window.Windows) ||\n /trident.+(msapphost|webview)\\//i.test(navigator.userAgent) ||\n document.referrer.startsWith('app-info://platform/microsoft-store'));\n}\n;\n", "// Generated ESM version of ua-parser-js/helpers\n// DO NOT EDIT THIS FILE!\n// Source: /src/helpers/ua-parser-helpers.js\n\n///////////////////////////////////////////////\n/* Helpers for UAParser.js v2.0.6\n https://github.com/faisalman/ua-parser-js\n Author: Faisal Salman <f@faisalman.com>\n UAParser.js PRO Enterprise License */\n//////////////////////////////////////////////\n\n/*jshint esversion: 6 */ \n\nimport { UAParser } from '../main/ua-parser.mjs';\nimport { CPUArch, OSName, EngineName, Extension, BrowserType } from '../enums/ua-parser-enums.mjs';\nimport { Bots, Crawlers } from '../extensions/ua-parser-extensions.mjs';\nimport { isFromEU } from 'detect-europe-js';\nimport { isFrozenUA } from 'ua-is-frozen';\nimport { isStandalonePWA } from 'is-standalone-pwa';\nconst { Crawler } = Extension.BrowserName;\n\nconst toResult = (value, head, ext) => typeof value === 'string' ? UAParser(value, head, ext) : value;\n\nconst getDeviceVendor = (model) => UAParser(`Mozilla/5.0 (Linux; Android 10; ${model}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36`).device.vendor;\n\nconst isAppleSilicon = (resultOrUA) => {\n const res = toResult(resultOrUA);\n if (res.os.is(OSName.MACOS)) {\n if (res.cpu.is(CPUArch.ARM)) {\n return true;\n }\n if (typeof resultOrUA !== 'string' && typeof window !== 'undefined') {\n try {\n const canvas = document.createElement('canvas');\n const webgl = canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n const debug = webgl.getExtension('WEBGL_debug_renderer_info');\n const renderer = webgl.getParameter(debug.UNMASKED_RENDERER_WEBGL);\n if (renderer.match(/apple m\\d/i)) {\n return true;\n }\n } catch {\n return false;\n }\n }\n }\n return false;\n}\n\nconst isAIBot = (resultOrUA) => [\n\n // AI2\n Crawler.AI2_BOT,\n\n // Amazon\n Crawler.AMAZON_BOT,\n\n // Anthropic\n Crawler.ANTHROPIC_AI,\n Crawler.ANTHROPIC_CLAUDE_BOT,\n Crawler.ANTHROPIC_CLAUDE_SEARCHBOT,\n Crawler.ANTHROPIC_CLAUDE_WEB,\n\n // Apple\n Crawler.APPLE_BOT,\n Crawler.APPLE_BOT_EXTENDED,\n\n // Brave\n Crawler.BRAVE_BOT,\n\n // ByteDance\n Crawler.BYTEDANCE_BYTESPIDER,\n Crawler.BYTEDANCE_TIKTOKSPIDER,\n\n // Cohere\n Crawler.COHERE_TRAINING_DATA_CRAWLER,\n\n // Common Crawl\n Crawler.COMMON_CRAWL_CCBOT,\n \n // Coveo\n Crawler.COVEO_BOT,\n\n // DataForSeo\n Crawler.DATAFORSEO_BOT,\n\n // DeepSeek\n Crawler.DEEPSEEK_BOT,\n\n // Diffbot\n Crawler.DIFFBOT,\n\n // Google\n Crawler.GOOGLE_EXTENDED,\n Crawler.GOOGLE_OTHER,\n Crawler.GOOGLE_OTHER_IMAGE,\n Crawler.GOOGLE_OTHER_VIDEO,\n Crawler.GOOGLE_CLOUDVERTEXBOT,\n\n // Hive AI\n Crawler.HIVE_IMAGESIFTBOT,\n\n // Huawei\n Crawler.HUAWEI_PETALBOT,\n Crawler.HUAWEI_PANGUBOT,\n\n // Hugging Face\n Crawler.HUGGINGFACE_BOT,\n\n // Kangaroo\n Crawler.KANGAROO_BOT,\n\n // Mendable.ai\n Crawler.FIRECRAWL_AGENT,\n\n // Meta\n Crawler.META_FACEBOOKBOT,\n Crawler.META_EXTERNALAGENT,\n\n // OpenAI\n Crawler.OPENAI_GPTBOT,\n Crawler.OPENAI_SEARCH_BOT,\n\n // Perplexity\n Crawler.PERPLEXITY_BOT,\n\n // Replicate\n Crawler.REPLICATE_BOT,\n\n // Runpod\n Crawler.RUNPOD_BOT,\n\n // SB Intuitions\n Crawler.SB_INTUITIONS_BOT,\n\n // Semrush\n Crawler.SEMRUSH_BOT_CONTENTSHAKE,\n\n // Timpi\n Crawler.TIMPI_BOT,\n\n // Together AI\n Crawler.TOGETHER_BOT,\n\n // Velen.io\n Crawler.HUNTER_VELENPUBLICWEBCRAWLER,\n\n // Vercel\n Crawler.VERCEL_V0BOT,\n\n // Webz.io\n Crawler.WEBZIO_OMGILI,\n Crawler.WEBZIO_OMGILI_BOT,\n Crawler.WEBZIO_EXTENDED,\n\n // X\n Crawler.XAI_BOT,\n\n // You.com\n Crawler.YOU_BOT,\n\n // Zhipu AI\n Crawler.ZHIPU_CHATGLM_SPIDER\n ]\n .map((s) => s.toLowerCase())\n .includes(String(toResult(resultOrUA, Crawlers).browser.name).toLowerCase());\n\nconst isBot = (resultOrUA) => [\n BrowserType.CLI, \n BrowserType.CRAWLER, \n BrowserType.FETCHER, \n BrowserType.LIBRARY\n ].includes(toResult(resultOrUA, Bots).browser.type);\n\nconst isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(EngineName.BLINK);\n\nconst isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js\n / electron\\//i.test(navigator?.userAgent)); // browser\n\nexport { \n getDeviceVendor,\n isAppleSilicon,\n isAIBot,\n isBot,\n isChromeFamily,\n isElectron,\n isFromEU,\n isFrozenUA,\n isStandalonePWA\n}", "import { UAParser } from '@ua-parser-js/pro-enterprise';\nimport {\n isBot,\n isChromeFamily,\n isStandalonePWA,\n isAppleSilicon,\n} from '@ua-parser-js/pro-enterprise/helpers';\n\nexport interface DeviceInfo {\n userAgent: {\n name: string;\n browser: {\n major: string;\n name: string;\n version: string;\n type?: string;\n };\n os: {\n name: string;\n version: string;\n };\n device?: {\n model?: string;\n type?: string;\n vendor?: string;\n };\n engine: {\n name: string;\n version: string;\n };\n cpu: {\n architecture: string;\n };\n };\n screenResolution: {\n width: number;\n height: number;\n };\n timeZone: string;\n // Enhanced detection helpers\n flags?: {\n isBot: boolean; // Bot/crawler detection\n isChromeFamily: boolean; // Chrome/Edge/Brave/Opera\n isStandalonePWA: boolean; // Installed as PWA\n isAppleSilicon: boolean; // M1/M2/M3 Mac\n };\n}\n\n/**\n * Get screen resolution\n */\nfunction getScreenResolution(): { width: number; height: number } {\n return {\n width: window.screen.width,\n height: window.screen.height,\n };\n}\n\n/**\n * Get timezone\n */\nfunction getTimeZone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (error) {\n console.error('Failed to get timezone:', error);\n return 'UTC';\n }\n}\n\n/**\n * Get browser locale\n */\nexport function getBrowserLocale(): string {\n try {\n return navigator.language || 'en-US';\n } catch (error) {\n console.error('Failed to get browser locale:', error);\n return 'en-US';\n }\n}\n\n/**\n * Collect all device information using UAParser\n */\nexport function collectDeviceInfo(): DeviceInfo {\n if (typeof window === 'undefined') {\n // Server-side fallback\n return {\n userAgent: {\n name: '',\n browser: { major: '', name: '', version: '' },\n os: { name: '', version: '' },\n device: undefined,\n engine: { name: '', version: '' },\n cpu: { architecture: '' },\n },\n screenResolution: { width: 0, height: 0 },\n timeZone: 'UTC',\n flags: {\n isBot: false,\n isChromeFamily: false,\n isStandalonePWA: false,\n isAppleSilicon: false,\n },\n };\n }\n\n const parser = new UAParser();\n const result = parser.getResult();\n\n // Enhanced detection using UAParser official helpers\n let flags: DeviceInfo['flags'];\n try {\n flags = {\n isBot: isBot(result),\n isChromeFamily: isChromeFamily(result),\n isStandalonePWA: isStandalonePWA(),\n isAppleSilicon: isAppleSilicon(result),\n };\n } catch (error) {\n console.error('Failed to compute device flags:', error);\n flags = {\n isBot: false,\n isChromeFamily: false,\n isStandalonePWA: false,\n isAppleSilicon: false,\n };\n }\n\n return {\n userAgent: {\n name: result.ua,\n browser: {\n major: result.browser.major || '',\n name: result.browser.name || '',\n version: result.browser.version || '',\n type: result.browser.type,\n },\n os: {\n name: result.os.name || '',\n version: result.os.version || '',\n },\n device: result.device.model || result.device.type || result.device.vendor\n ? {\n model: result.device.model,\n type: result.device.type,\n vendor: result.device.vendor,\n }\n : undefined,\n engine: {\n name: result.engine.name || '',\n version: result.engine.version || '',\n },\n cpu: {\n architecture: result.cpu.architecture || '',\n },\n },\n screenResolution: getScreenResolution(),\n timeZone: getTimeZone(),\n flags,\n };\n}\n\n/**\n * Get URL parameters for session initialization\n */\nexport function getUrlParams(): {\n locale?: string;\n currency?: string;\n utmSource?: string;\n utmMedium?: string;\n utmCampaign?: string;\n} {\n if (typeof window === 'undefined') {\n return {};\n }\n\n const params = new URLSearchParams(window.location.search);\n\n return {\n locale: params.get('locale') || undefined,\n currency: params.get('currency') || undefined,\n utmSource: params.get('utm_source') || undefined,\n utmMedium: params.get('utm_medium') || undefined,\n utmCampaign: params.get('utm_campaign') || undefined,\n };\n}\n\n", "/**\n * Event Bus for handling domain events and coordination\n */\nexport type EventCallback<T = any> = (data: T) => void | Promise<void>;\n\nexport class EventBus {\n private listeners: Map<string, Set<EventCallback>> = new Map();\n\n on<T = any>(event: string, callback: EventCallback<T>): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(callback);\n return () => this.off(event, callback);\n }\n\n off<T = any>(event: string, callback: EventCallback<T>): void {\n if (this.listeners.has(event)) {\n this.listeners.get(event)!.delete(callback);\n }\n }\n\n async emit<T = any>(event: string, data?: T): Promise<void> {\n if (this.listeners.has(event)) {\n const callbacks = Array.from(this.listeners.get(event)!);\n await Promise.all(callbacks.map(cb => {\n try {\n return Promise.resolve(cb(data));\n } catch (e) {\n console.error(`[EventBus] Error in listener for event \"${event}\":`, e);\n return Promise.resolve();\n }\n }));\n }\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n\n\n", "import { Session } from '../types';\n\n/**\n * JWT payload structure from the CMS token\n */\ninterface JWTPayload {\n sessionId: string;\n storeId: string;\n accountId: string;\n customerId: string;\n role: 'authenticated' | 'anonymous';\n iat?: number;\n exp?: number;\n}\n\n/**\n * Decode a JWT token to extract session information\n * This is a simple client-side decoder - do not use for security validation\n */\nexport function decodeJWTClient(token: string): Session | null {\n try {\n // Split the token into parts\n const parts = token.split('.');\n if (parts.length !== 3) {\n console.error('Invalid JWT token format');\n return null;\n }\n\n // Decode the payload (second part)\n const payload = parts[1];\n\n // Add padding if needed\n const paddedPayload = payload + '='.repeat((4 - (payload.length % 4)) % 4);\n\n // Decode base64\n const decoded = atob(paddedPayload);\n\n // Parse JSON\n const parsedPayload: JWTPayload = JSON.parse(decoded);\n\n // Check if token is expired\n if (parsedPayload.exp && Date.now() >= parsedPayload.exp * 1000) {\n console.warn('JWT token is expired');\n return null;\n }\n\n // Return session data\n return {\n sessionId: parsedPayload.sessionId,\n storeId: parsedPayload.storeId,\n accountId: parsedPayload.accountId,\n customerId: parsedPayload.customerId,\n role: parsedPayload.role,\n isValid: true,\n isLoading: false,\n };\n } catch (error) {\n console.error('Failed to decode JWT token:', error);\n return null;\n }\n}\n\n/**\n * Check if a JWT token is expired\n */\nexport function isTokenExpired(token: string): boolean {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) return true;\n\n const payload = parts[1];\n const paddedPayload = payload + '='.repeat((4 - (payload.length % 4)) % 4);\n const decoded = atob(paddedPayload);\n const parsedPayload: JWTPayload = JSON.parse(decoded);\n\n if (parsedPayload.exp) {\n return Date.now() >= parsedPayload.exp * 1000;\n }\n\n return false;\n } catch (error) {\n console.error('Failed to check token expiration:', error);\n return true;\n }\n}\n\n/**\n * Get token expiration time\n */\nexport function getTokenExpiration(token: string): Date | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n\n const payload = parts[1];\n const paddedPayload = payload + '='.repeat((4 - (payload.length % 4)) % 4);\n const decoded = atob(paddedPayload);\n const parsedPayload: JWTPayload = JSON.parse(decoded);\n\n if (parsedPayload.exp) {\n return new Date(parsedPayload.exp * 1000);\n }\n\n return null;\n } catch (error) {\n console.error('Failed to get token expiration:', error);\n return null;\n }\n}\n\n", "/**\n * Plugin Configuration Utility Functions\n * Pure functions for plugin configuration management\n */\n\nimport { isLocalEnvironment } from '../config/environment';\nimport { resolveEnvValue } from './env';\n\nexport type PluginConfig<TConfig = Record<string, any>> = {\n storeId?: string;\n accountId?: string;\n basePath?: string;\n config?: any;\n staticResources?: Record<string, any>; // NEW: Static resources for local dev\n // Common config properties that plugins expect\n productId?: string;\n variants?: Record<string, string>;\n prices?: Record<string, any>;\n defaultCurrency?: string;\n hidePriceId?: string;\n upsellId?: string;\n googleApiKey?: string;\n} & TConfig;\n\nexport type RawPluginConfig<TConfig = Record<string, any>> = {\n storeId?: string;\n accountId?: string;\n basePath?: string;\n config?: any;\n} & TConfig;\n\n/**\n * Load local development configuration\n */\nconst loadLocalDevConfig = async (configVariant = 'default'): Promise<PluginConfig | null> => {\n try {\n // Check for explicit environment override\n const env = resolveEnvValue('TAGADA_ENV') || resolveEnvValue('TAGADA_ENVIRONMENT');\n if (env === 'production') {\n // Skip local config loading if explicitly in production mode\n return null;\n }\n\n // Only try to load local config in TRUE local development (not deployed CDN instances)\n // Exclude CDN subdomains (e.g., instance-id.cdn.localhost)\n if (!isLocalEnvironment(true)) {\n return null;\n }\n\n // Load local store/account config\n const localResponse = await fetch('/.local.json');\n if (!localResponse.ok) {\n return null;\n }\n const localConfig = await localResponse.json();\n\n // Load deployment config (specified variant or fallback to default)\n let config: Record<string, any> = {};\n let configLoaded = false;\n\n try {\n // Try .tgd.json first (new format), then fallback to .json\n let deploymentResponse = await fetch(`/config/${configVariant}.tgd.json`);\n if (!deploymentResponse.ok) {\n deploymentResponse = await fetch(`/config/${configVariant}.json`);\n }\n\n if (deploymentResponse.ok) {\n config = await deploymentResponse.json();\n configLoaded = true;\n }\n } catch {\n // Config fetch failed, will try fallback\n }\n\n // If config didn't load and it's not 'default', try fallback to default\n if (!configLoaded && configVariant !== 'default') {\n console.warn(`\u26A0\uFE0F Config variant '${configVariant}' not found, falling back to 'default'`);\n try {\n let defaultResponse = await fetch('/config/default.tgd.json');\n if (!defaultResponse.ok) {\n defaultResponse = await fetch('/config/default.json');\n }\n\n if (defaultResponse.ok) {\n config = await defaultResponse.json();\n configLoaded = true;\n console.log(`\u2705 Fallback to 'default' config successful`);\n }\n } catch {\n // Default config also failed\n }\n }\n\n // Final warning if no config was loaded\n if (!configLoaded) {\n if (configVariant === 'default') {\n console.warn(`\u26A0\uFE0F No 'default' config found. Create /config/default.tgd.json`);\n } else {\n console.warn(`\u26A0\uFE0F Neither '${configVariant}' nor 'default' config found. Create /config/default.tgd.json`);\n }\n }\n\n const result = {\n storeId: localConfig.storeId,\n accountId: localConfig.accountId,\n basePath: localConfig.basePath,\n config,\n };\n\n console.log('\uD83D\uDEE0\uFE0F Using local development plugin config:', result);\n\n return result;\n } catch {\n return null;\n }\n};\n\n/**\n * Load static resources for local development\n * \n * Priority:\n * 1. /config/funnel.local.json (NEW - recommended)\n * 2. /config/resources.static.json (OLD - deprecated, for backward compatibility)\n */\nconst loadStaticResources = async (): Promise<Record<string, any> | null> => {\n try {\n // Check for explicit environment override\n const env = resolveEnvValue('TAGADA_ENV') || resolveEnvValue('TAGADA_ENVIRONMENT');\n if (env === 'production') {\n return null;\n }\n\n // Only try to load in TRUE local development (not deployed CDN instances)\n // Exclude CDN subdomains (e.g., instance-id.cdn.localhost)\n if (!isLocalEnvironment(true)) {\n return null;\n }\n\n // ============================================================\n // PRIORITY 1: NEW format - funnel.local.json\n // Also populates the stepConfig cache for getAssignedStepConfig()\n // ============================================================\n try {\n console.log('\uD83D\uDEE0\uFE0F [V2] Attempting to load /config/funnel.local.json...');\n const funnelResponse = await fetch('/config/funnel.local.json');\n if (funnelResponse.ok) {\n const funnelConfig = await funnelResponse.json();\n console.log('\uD83D\uDEE0\uFE0F [V2] \u2705 Loaded local funnel config (NEW format):', funnelConfig);\n \n // Also trigger loadLocalFunnelConfig to populate the cache\n // Import dynamically to avoid circular dependency\n const { loadLocalFunnelConfig } = await import('../funnelClient');\n await loadLocalFunnelConfig();\n \n // Return staticResources in the old format for backward compatibility\n // The new stepConfig system reads from funnel.local.json via getAssignedStepConfig()\n if (funnelConfig.staticResources) {\n // Transform flat format to old nested format for legacy compatibility\n const transformed: Record<string, any> = {};\n for (const [key, value] of Object.entries(funnelConfig.staticResources)) {\n transformed[key] = { id: value };\n }\n return transformed;\n }\n return null;\n }\n } catch (e) {\n console.log('\uD83D\uDEE0\uFE0F [V2] funnel.local.json not found, trying legacy format...');\n }\n\n // ============================================================\n // PRIORITY 2: OLD format - resources.static.json (deprecated)\n // ============================================================\n console.log('\uD83D\uDEE0\uFE0F [V2] Attempting to load /config/resources.static.json (legacy)...');\n const response = await fetch('/config/resources.static.json');\n if (!response.ok) {\n console.log('\uD83D\uDEE0\uFE0F [V2] No local static resources found');\n return null;\n }\n\n const staticResources = await response.json();\n console.log('\uD83D\uDEE0\uFE0F [V2] \u2705 Loaded legacy static resources:', staticResources);\n return staticResources;\n } catch (error) {\n console.error('\uD83D\uDEE0\uFE0F [V2] \u274C Error loading static resources:', error);\n return null;\n }\n};\n\n/**\n * Helper to get content from meta tag\n */\nconst getMetaContent = (name: string): string | undefined => {\n if (typeof document === 'undefined') return undefined;\n const metaTag = document.querySelector(`meta[name=\"${name}\"]`);\n return metaTag?.getAttribute('content') || undefined;\n};\n\n/**\n * Synchronously get plugin config from meta tags\n * This is a lightweight sync alternative to loadPluginConfig\n * Use this when you need immediate config access (e.g., in CDN bundles)\n * \n * @returns Plugin config from meta tags or defaults\n */\nexport function getPluginConfig(): PluginConfig {\n if (typeof document === 'undefined') {\n return { basePath: '/', config: {} };\n }\n\n const storeId = getMetaContent('x-plugin-store-id');\n const accountId = getMetaContent('x-plugin-account-id');\n const basePath = getMetaContent('x-plugin-base-path') || '/';\n\n let config: Record<string, any> = {};\n try {\n const encodedConfig = getMetaContent('x-plugin-config');\n if (encodedConfig) {\n config = JSON.parse(decodeURIComponent(encodedConfig));\n }\n } catch (error) {\n console.warn('[TagadaSDK] Failed to parse plugin config from meta tag:', error);\n }\n\n return { storeId, accountId, basePath, config };\n}\n\n/**\n * Load production config from meta tags (HIGHEST PRIORITY)\n * Meta tags are injected by the plugin middleware during HTML serving\n * This avoids making an additional HEAD request (~300ms savings)\n * \n * Returns null if meta tags are not present (not in production deployment)\n */\nconst loadProductionConfig = async (): Promise<PluginConfig | null> => {\n try {\n // Check if we're in a browser environment\n if (typeof document === 'undefined') {\n return null;\n }\n\n // Read store/account info from meta tags (injected by middleware)\n const storeId = getMetaContent('x-plugin-store-id');\n const accountId = getMetaContent('x-plugin-account-id');\n\n // If no store ID in meta tags, this is not a production deployment with injected config\n if (!storeId) {\n return null;\n }\n\n const basePath = getMetaContent('x-plugin-base-path') || '/';\n\n // Get deployment config from meta tags\n let config: Record<string, any> = {};\n try {\n const encodedConfig = getMetaContent('x-plugin-config');\n if (encodedConfig) {\n const decodedConfig = decodeURIComponent(encodedConfig);\n config = JSON.parse(decodedConfig);\n }\n } catch (error) {\n console.warn('\u26A0\uFE0F Failed to parse plugin config from meta tag:', error);\n }\n\n // Final validation\n if (!accountId) {\n console.warn('\u26A0\uFE0F Plugin config: Account ID not found in meta tags');\n }\n\n const result = { storeId, accountId, basePath, config };\n console.log('\uD83D\uDE80 [HIGHEST PRIORITY] Plugin config loaded from meta tags (runtime injected config):', {\n storeId,\n accountId,\n basePath,\n configKeys: Object.keys(config),\n configSize: JSON.stringify(config).length\n });\n\n return result;\n } catch (error) {\n console.warn('\u26A0\uFE0F Error loading production config from meta tags:', error);\n return null;\n }\n};\n\n/**\n * Core plugin config loading function\n * \n * PRIORITY ORDER (highest to lowest):\n * 1. Injected meta tags (runtime config) - ALWAYS CHECK FIRST\n * 2. Raw config parameter (programmatic override)\n * 3. Environment variables (build-time config)\n * 4. Local dev files (.local.json + config files)\n * 5. Defaults\n */\nexport const loadPluginConfig = async (\n configVariant = 'default',\n rawConfig?: RawPluginConfig,\n): Promise<PluginConfig> => {\n console.log('\uD83D\uDD27 [V2] loadPluginConfig called with variant:', configVariant);\n\n // Load static resources first (only in local dev)\n const staticResources = await loadStaticResources();\n\n // ============================================================\n // PRIORITY 1: Check meta tags FIRST (runtime injected config)\n // This ensures deployed plugins always use injected config\n // ============================================================\n const productionConfig = await loadProductionConfig();\n if (productionConfig) {\n const result = {\n ...productionConfig,\n staticResources: staticResources ?? undefined,\n };\n console.log('\u2705 [V2] Using INJECTED config from meta tags (HIGHEST PRIORITY)');\n return result;\n }\n\n // ============================================================\n // PRIORITY 2: Raw config parameter (programmatic override)\n // ============================================================\n if (rawConfig) {\n const result = {\n storeId: rawConfig.storeId,\n accountId: rawConfig.accountId,\n basePath: rawConfig.basePath ?? '/',\n config: rawConfig.config ?? {},\n staticResources: staticResources ?? undefined,\n };\n console.log('\u2705 [V2] Using raw config parameter (PRIORITY 2)');\n return result;\n }\n\n // ============================================================\n // PRIORITY 3: Environment variables (build-time config)\n // Only in localhost - production should use meta tags\n // ============================================================\n const envConfig = await createRawPluginConfig();\n if (envConfig) {\n const result = {\n ...envConfig,\n staticResources: staticResources ?? undefined,\n };\n console.log('\u2705 [V2] Using environment variables config (PRIORITY 3 - build time)');\n return result;\n }\n\n // ============================================================\n // PRIORITY 4: Local development config files\n // ============================================================\n const localConfig = await loadLocalDevConfig(configVariant);\n if (localConfig) {\n const result = {\n ...localConfig,\n staticResources: staticResources ?? undefined,\n };\n console.log('\u2705 [V2] Using local dev config files (PRIORITY 4)');\n return result;\n }\n\n // ============================================================\n // PRIORITY 5: Defaults (no config found)\n // ============================================================\n console.warn('\u26A0\uFE0F [V2] No plugin config found - using defaults');\n return {\n basePath: '/',\n config: {},\n staticResources: staticResources ?? undefined,\n };\n};\n/**\n * Helper to load local config file for development (from /config directory)\n * Returns the config object that can be passed to TagadaProvider\n */\nexport async function loadLocalConfig(configName: string = 'default', defaultConfig?: any): Promise<Record<string, unknown> | null> {\n try {\n // Only load in localhost\n if (!isLocalEnvironment()) {\n return null;\n }\n\n if (defaultConfig) {\n return defaultConfig;\n }\n\n // Try .tgd.json first, then .json, then .config.json\n const possiblePaths = [\n `/config/${configName}.config.json`,\n `/config/${configName}.tgd.json`,\n `/config/${configName}.json`,\n ];\n\n for (const path of possiblePaths) {\n try {\n const response = await fetch(path);\n if (response.ok) {\n const config = await response.json() as Record<string, unknown>;\n\n return config;\n }\n } catch {\n continue;\n }\n }\n\n\n console.warn(`\u26A0\uFE0F [loadLocalConfig] No config found for '${configName}'`);\n return null;\n } catch (error) {\n console.error('[loadLocalConfig] Error loading config:', error);\n return null;\n }\n}\n/**\n * Creates a RawPluginConfig from environment variables (build-time config)\n * \n * This should ONLY be used when:\n * 1. Running in localhost development\n * 2. Meta tags are not present (not a deployed plugin)\n * \n * @returns A RawPluginConfig object or undefined if not applicable\n */\nexport async function createRawPluginConfig(): Promise<RawPluginConfig | undefined> {\n try {\n // Only run in true localhost - production MUST use meta tags\n if (!isLocalEnvironment()) {\n return undefined;\n }\n\n const storeId = resolveEnvValue('TAGADA_STORE_ID');\n const accountId = resolveEnvValue('TAGADA_ACCOUNT_ID');\n const basePath = resolveEnvValue('TAGADA_BASE_PATH');\n const configName = resolveEnvValue('TAGADA_CONFIG_NAME');\n\n if (!storeId || !accountId) {\n return undefined;\n }\n\n const resolvedConfig = await loadLocalConfig(configName);\n\n if (!resolvedConfig) {\n return undefined;\n }\n\n const rawConfig: RawPluginConfig = {\n storeId: storeId,\n accountId: accountId,\n basePath: basePath || '/',\n config: resolvedConfig,\n };\n\n console.log('\uD83D\uDEE0\uFE0F [createRawPluginConfig] Using environment variables (build-time config):', {\n hasStoreId: !!rawConfig.storeId,\n hasAccountId: !!rawConfig.accountId,\n basePath: rawConfig.basePath,\n hasConfig: !!rawConfig.config,\n });\n\n return rawConfig;\n } catch (error) {\n console.error('[createRawPluginConfig] Error creating config:', error);\n return undefined;\n }\n}\n\nexport class PluginConfigUtils {\n /**\n * Get plugin configuration from various sources\n */\n static getPluginConfig<TConfig = Record<string, any>>(\n rawConfig?: RawPluginConfig<TConfig>,\n context?: {\n storeId?: string;\n accountId?: string;\n basePath?: string;\n }\n ): PluginConfig<TConfig> {\n // Priority: rawConfig > context > defaults\n return {\n storeId: rawConfig?.storeId || context?.storeId,\n accountId: rawConfig?.accountId || context?.accountId,\n basePath: rawConfig?.basePath || context?.basePath || '/',\n config: rawConfig?.config || ({} as TConfig),\n } as PluginConfig<TConfig>;\n }\n\n /**\n * Validate plugin configuration\n */\n static validateConfig(config: PluginConfig): boolean {\n return !!(config.storeId && config.accountId);\n }\n}\n", "const DEFAULT_PREFIXES = ['', 'VITE_', 'REACT_APP_', 'NEXT_PUBLIC_'];\n\n/**\n * Resolves a value from multiple possible environment sources (Node, Vite, CRA, Next, window)\n * using a list of supported prefixes.\n */\nexport function resolveEnvValue(key: string, prefixes: string[] = DEFAULT_PREFIXES): string | undefined {\n for (const prefix of prefixes) {\n const envKey = prefix ? `${prefix}${key}` : key;\n\n if (typeof process !== 'undefined' && process?.env?.[envKey]) {\n console.log(`process.env[${envKey}]`, process.env[envKey]);\n return process.env[envKey];\n }\n\n if (typeof import.meta !== 'undefined' && (import.meta as any)?.env?.[envKey]) {\n console.log(`import.meta.env[${envKey}]`, (import.meta as any).env[envKey]);\n return (import.meta as any).env[envKey];\n }\n\n if (typeof window !== 'undefined' && (window as any)?.__TAGADA_ENV__?.[envKey]) {\n console.log(`window.__TAGADA_ENV__[${envKey}]`, (window as any).__TAGADA_ENV__[envKey]);\n return (window as any).__TAGADA_ENV__[envKey];\n }\n }\n\n return undefined;\n}\n\n", "/**\n * Cross-Domain Auth Handoff Utilities\n * \n * Handles automatic resolution of authCode query parameters for seamless\n * cross-domain authentication.\n * \n * Flow:\n * 1. Check URL for authCode parameter\n * 2. If present, resolve it with backend\n * 3. Store the returned token (overrides any existing token)\n * 4. Clean the URL (remove authCode)\n * 5. Return resolved customer and context\n */\n\nimport { setClientToken } from './tokenStorage';\n\nexport interface AuthHandoffResolveResponse {\n sessionId: string;\n token: string;\n customer: {\n id: string;\n email?: string;\n firstName?: string;\n lastName?: string;\n role: 'authenticated' | 'anonymous';\n };\n context: Record<string, unknown>;\n}\n\n// Track in-flight and completed resolutions to prevent duplicates\nconst resolutionCache = new Map<string, Promise<AuthHandoffResolveResponse>>();\nconst resolvedCodes = new Set<string>();\n\n/**\n * Check if authCode is present in URL\n */\nexport function hasAuthCode(): boolean {\n if (typeof window === 'undefined') return false;\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.has('authCode');\n}\n\n/**\n * Get authCode from URL\n */\nexport function getAuthCode(): string | null {\n if (typeof window === 'undefined') return null;\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.get('authCode');\n}\n\n/**\n * Check if a code has already been resolved\n */\nexport function isCodeAlreadyResolved(code: string): boolean {\n return resolvedCodes.has(code);\n}\n\n/**\n * Resolve auth handoff and return token + customer info\n * \n * This function:\n * 1. Calls POST /api/v1/cms/auth/resolve-handoff\n * 2. Stores the returned token (overrides existing)\n * 3. Cleans the URL (removes authCode)\n * 4. Returns customer and context data\n * \n * \uD83D\uDD12 Deduplication: Multiple calls with the same code will return the same promise\n * to prevent duplicate API requests (e.g., React StrictMode double-mounting)\n */\nexport async function resolveAuthHandoff(\n authCode: string,\n storeId: string,\n apiBaseUrl: string,\n debugMode = false\n): Promise<AuthHandoffResolveResponse> {\n // Check if already resolved\n if (resolvedCodes.has(authCode)) {\n if (debugMode) {\n console.log('[AuthHandoff] Code already resolved, skipping duplicate request');\n }\n throw new Error('Auth code already resolved');\n }\n\n // Check if resolution is in-flight\n const inFlightResolution = resolutionCache.get(authCode);\n if (inFlightResolution) {\n if (debugMode) {\n console.log('[AuthHandoff] Resolution already in progress, waiting for existing request');\n }\n return inFlightResolution;\n }\n\n if (debugMode) {\n console.log('[AuthHandoff] Resolving authCode:', authCode.substring(0, 15) + '...');\n }\n\n // Create resolution promise\n const resolutionPromise = (async () => {\n try {\n // Call resolve endpoint (no authentication required)\n const response = await fetch(`${apiBaseUrl}/api/v1/cms/auth/resolve-handoff`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n code: authCode,\n storeId,\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ message: 'Unknown error' }));\n throw new Error(errorData.message || `Failed to resolve auth handoff: ${response.status}`);\n }\n\n const data: AuthHandoffResolveResponse = await response.json();\n\n if (debugMode) {\n console.log('[AuthHandoff] \u2705 Resolved successfully:', {\n customerId: data.customer.id,\n role: data.customer.role,\n hasContext: Object.keys(data.context).length > 0,\n });\n }\n\n // Store token (overrides any existing token)\n if (debugMode) {\n console.log('[AuthHandoff] Storing new token (overriding existing)');\n }\n setClientToken(data.token);\n\n // Clean URL (remove authCode parameter)\n cleanAuthCodeFromUrl(debugMode);\n\n // Mark as resolved\n resolvedCodes.add(authCode);\n\n return data;\n } catch (error) {\n console.error('[AuthHandoff] \u274C Failed to resolve:', error);\n throw error;\n } finally {\n // Remove from in-flight cache after completion (success or failure)\n resolutionCache.delete(authCode);\n }\n })();\n\n // Cache the in-flight promise\n resolutionCache.set(authCode, resolutionPromise);\n\n return resolutionPromise;\n}\n\n/**\n * Remove authCode from URL without page reload\n * Uses history.replaceState to update URL cleanly\n */\nexport function cleanAuthCodeFromUrl(debugMode = false): void {\n if (typeof window === 'undefined') return;\n\n const url = new URL(window.location.href);\n\n if (url.searchParams.has('authCode')) {\n url.searchParams.delete('authCode');\n\n // Use replaceState to update URL without reload\n window.history.replaceState({}, '', url.pathname + url.search + url.hash);\n\n if (debugMode) {\n console.log('[AuthHandoff] Cleaned authCode from URL');\n }\n }\n}\n\n/**\n * Check if we should resolve authCode\n * Returns true if authCode is present and valid format\n */\nexport function shouldResolveAuthCode(): boolean {\n const authCode = getAuthCode();\n if (!authCode || !authCode.startsWith('ah_')) {\n return false;\n }\n\n // Don't resolve if already resolved\n if (resolvedCodes.has(authCode)) {\n return false;\n }\n\n return true;\n}\n\n", "/**\n * Standalone Adapter for TagadaPay SDK v2\n *\n * Provides a vanilla JS interface for using the SDK without a framework.\n * Suitable for standard HTML/JS sites or other frameworks (Svelte, Angular, etc).\n *\n * This layer is a very thin wrapper over the Core SDK.\n */\n\nimport { TagadaClient, TagadaClientConfig, TagadaState } from '../core/client';\nimport { ApiClient } from '../core/resources/apiClient';\nimport { CheckoutResource } from '../core/resources/checkout';\n\n/**\n * Factory function to create a Tagada Client instance.\n * Features (like funnel) can be toggled via the config.\n */\nexport function createTagadaClient(config: TagadaClientConfig = {}): TagadaClient {\n return new TagadaClient(config);\n}\n\n// Re-export Core Classes\nexport { TagadaClient, ApiClient, CheckoutResource };\n\n// Re-export Types\nexport type { TagadaClientConfig, TagadaState };\nexport { FunnelActionType } from '../core/resources/funnel';\nexport type { FunnelAction, FunnelNavigationResult, SimpleFunnelContext } from '../core/resources/funnel';\n\n// Re-export Utilities (includes formatMoney from core/utils/currency)\nexport * from '../core/utils';\n\n// ============================================================================\n// EXTERNAL PAGE TRACKER\n// ============================================================================\n// Lightweight tracker for external pages not hosted on Tagadapay\n// NOTE: This is also available as a standalone CDN bundle (external-tracker.min.js)\nexport {\n TagadaTracker,\n TagadaExternalTracker,\n} from './external-tracker';\n\nexport type {\n TagadaTrackerConfig,\n ExternalTrackerSession,\n NavigateOptions,\n} from './external-tracker';\n", "/**\n * Core Utility Functions\n * Pure functions without React dependencies\n */\n\nexport * from './products';\nexport * from './order';\nexport * from './currency';\nexport * from './pluginConfig';\nexport * from './checkout';\nexport * from './promotions';\nexport * from './postPurchases';\nexport * from './orderBump';\nexport * from './sessionStorage';\nexport * from './funnelQueryKeys';\n\n// Config hot reload for live preview editing\nexport * from './configHotReload';\n"],
|
|
5
|
-
"mappings": ";;;;;69DAKA,SAASA,GAAUC,EAA6B,CALhD,IAAAC,EAME,GAAI,OAAO,UAAa,YAAa,OAAO,KAE5C,IAAMC,EADQ,KAAK,gBAAS,QACR,MAAM,KAAK,OAAAF,EAAI,IAAG,EACtC,OAAIE,EAAM,SAAW,KAAUD,EAAAC,EAAM,IAAI,IAAV,YAAAD,EAAa,MAAM,KAAK,UAAW,IAEpE,CAsFO,SAASE,GAAqBC,EAA2B,QAA4B,CAC1F,IAAMC,EAAYC,GAAoBF,CAAW,EAEjD,GAAI,CAACC,EACH,eAAQ,KAAK,wBAAwB,OAAAD,EAAW,2BAA0B,EACnE,CACL,YAAa,QACb,UAAWE,GAAoB,KACjC,EAIF,IAAIC,EAA+B,KAEnC,GAAI,OAAO,QAAW,cAEpBA,EADkB,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAClC,IAAI,qBAAqB,EAE/C,CAACA,GACH,GAAI,CACFA,EAAgB,aAAa,QAAQ,qBAAqB,GAAKR,GAAU,qBAAqB,CAChG,OAAQS,EAAA,CAER,CAKJ,OAAID,GACF,QAAQ,IAAI,6CAA6C,OAAAA,EAAe,EACjE,CACL,YAAAH,EACA,UAAWK,EAAAC,EAAA,GACNL,GADM,CAET,QAASE,CACX,EACF,GAGK,CACL,YAAAH,EACA,UAAAC,CACF,CACF,CAsCO,SAASM,IAAiC,CAlLjD,IAAAV,EAqLE,GAFA,QAAQ,IAAI,kCAAkC,EAE1C,OAAO,QAAW,YACpB,MAAO,QAMT,IAAMW,EADY,IAAI,gBAAgB,OAAO,SAAS,MAAM,EACnC,IAAI,iBAAiB,EAC9C,GAAIA,IAAWA,IAAW,cAAgBA,IAAW,eAAiBA,IAAW,SAC/E,eAAQ,IAAI,8CAA8C,OAAAA,EAAQ,EAC3DA,EAIT,GAAI,CACF,IAAMC,EAAa,aAAa,QAAQ,gBAAgB,GAAKd,GAAU,gBAAgB,EACvF,GAAIc,IAAeA,IAAe,cAAgBA,IAAe,eAAiBA,IAAe,SAC/F,eAAQ,IAAI,+CAA+C,OAAAA,EAAY,EAChEA,CAEX,OAAQL,EAAA,CAER,CAEA,IAAMM,EAAW,OAAO,SAAS,SAC3BC,EAAO,OAAO,SAAS,KAM7B,GAJA,QAAQ,IAAI,0CAA0C,OAAAD,EAAQ,IAAG,EAK/DA,IAAa,aACbA,EAAS,WAAW,MAAM,GAC1BA,EAAS,WAAW,UAAU,GAC9BA,EAAS,WAAW,KAAK,GACzBA,EAAS,SAAS,QAAQ,GAC1BA,IAAa,IACbA,IAAa,WACbA,EAAS,SAAS,gBAAgB,GAClCA,EAAS,SAAS,gBAAgB,GAClCA,EAAS,SAAS,UAAU,GAC5BA,EAAS,SAAS,WAAW,EAC7B,CAGA,GAFA,QAAQ,IAAI,6CAA6C,EAErD,OAAO,QAAW,eAAgBb,EAAA,2BAAgB,iBAAhB,MAAAA,EAAgC,oBAAoB,CACxF,IAAMe,EAAY,OAAe,eAAe,mBAAmB,YAAY,EAC/E,GAAIA,IAAa,cAAgBA,IAAa,eAAiBA,IAAa,QAC1E,eAAQ,IAAI,kCAAkC,OAAAA,EAAU,EACjDA,CAEX,CACA,MAAO,OACT,CAGA,OACEF,IAAa,qBACbA,EAAS,SAAS,eAAe,GACjCA,EAAS,SAAS,0BAA0B,EAErC,aAKPA,IAAa,qBACbA,EAAS,SAAS,eAAe,GACjCA,EAAS,SAAS,YAAY,GAC9BA,EAAS,SAAS,aAAa,GAC/BA,EAAS,SAAS,UAAU,GAC5BA,EAAS,SAAS,WAAW,GAC7BA,EAAS,SAAS,eAAe,GACjCA,EAAS,SAAS,aAAa,GAC/BC,EAAK,SAAS,UAAU,GACxBA,EAAK,SAAS,WAAW,GACzBA,EAAK,SAAS,MAAM,EAEb,eAIT,QAAQ,KAAK,yBAAyB,OAAAD,EAAQ,6BAA4B,EACnE,aACT,CASO,SAASG,GAAmBC,EAAa,GAAgB,CAG9D,OAFYP,GAAkB,IAElB,QACH,GAILO,GAAc,OAAO,QAAW,YAC3B,CAAC,OAAO,SAAS,SAAS,SAAS,OAAO,EAG5C,EACT,CAhSA,IAmCaZ,GAnCba,GAAAC,GAAA,kBAmCad,GAAsD,CACjE,WAAY,CACV,QAAS,4BACT,UAAW,CACT,SAAU,CACR,YAAa,gCACb,iBAAkB,sCAClB,cAAe,kCACf,YAAa,sCACf,EACA,SAAU,CACR,QAAS,2BACT,QAAS,0BACX,EACA,MAAO,CACL,OAAQ,sBACV,CACF,CACF,EACA,YAAa,CACX,QAAS,4BACT,UAAW,CACT,SAAU,CACR,YAAa,gCACb,iBAAkB,sCAClB,cAAe,kCACf,YAAa,sCACf,EACA,SAAU,CACR,QAAS,2BACT,QAAS,0BACX,EACA,MAAO,CACL,OAAQ,sBACV,CACF,CACF,EACA,MAAO,CACL,QAAS,4BACT,UAAW,CACT,SAAU,CACR,YAAa,gCACb,iBAAkB,sCAClB,cAAe,kCACf,YAAa,sCACf,EACA,SAAU,CACR,QAAS,2BACT,QAAS,0BACX,EACA,MAAO,CACL,OAAQ,sBACV,CACF,CACF,CACF,IC1FA,IAqoBae,GAroBbC,GAAAC,GAAA,kBAqoBaF,GAAN,KAAqB,CACxB,YAAoBG,EAAsB,CAAtB,eAAAA,CAAwB,CAK5C,MAAM,WAAWC,EAAqE,CAClF,OAAO,KAAK,UAAU,KAAK,4BAA6BA,CAAO,CACnE,CAKA,MAAM,SAASA,EAAiE,CAC5E,OAAO,KAAK,UAAU,KAAK,0BAA2BA,CAAO,CACjE,CAKA,MAAM,cAAcC,EAAmBD,EAA2E,CAC9G,OAAO,KAAK,UAAU,MAAM,0BAA0B,OAAAC,GAAaD,CAAO,CAC9E,CAKA,MAAM,WAAWC,EAAkE,CAC/E,OAAO,KAAK,UAAU,OAAO,0BAA0B,OAAAA,EAAW,CACtE,CAOA,MAAM,WAAWA,EAAmBC,EAAqBC,EAA2H,CAChL,IAAMC,EAAS,IAAI,gBACfF,GACAE,EAAO,OAAO,aAAcF,CAAU,EAEtCC,GACAC,EAAO,OAAO,mBAAoB,MAAM,EAE5C,IAAMC,EAAM,0BAA0B,OAAAJ,GAAY,OAAAG,EAAO,SAAS,EAAI,IAAI,OAAAA,GAAW,IACrF,OAAO,KAAK,UAAU,IAAIC,CAAG,CACjC,CACJ,ICprBA,IAKaC,GALbC,GAAAC,GAAA,kBAKaF,GAAN,KAAyB,CAAzB,cACL,KAAQ,UAA8B,IAAI,IAE1C,UAAUG,EAAmC,CAC3C,YAAK,UAAU,IAAIA,CAAQ,EACpB,IAAM,CACX,KAAK,UAAU,OAAOA,CAAQ,CAChC,CACF,CAEA,OAAOC,EAAe,CACpB,KAAK,UAAU,QAASD,GAAa,CACnC,GAAI,CACFA,EAASC,CAAI,CACf,OAASC,EAAO,CACd,QAAQ,MAAM,2BAA4BA,CAAK,CACjD,CACF,CAAC,CACH,CAEA,OAAc,CACZ,KAAK,UAAU,MAAM,CACvB,CACF,ICfO,SAASC,GAAeC,EAAqB,CAClD,GAAI,OAAO,QAAW,YACpB,GAAI,CAGF,IAAMC,EADe,aAAa,QAAQC,EAAS,IACbF,EAEtC,aAAa,QAAQE,GAAWF,CAAK,EAOjCC,GACF,OAAO,cAAc,IAAI,MAAM,SAAS,CAAC,CAE7C,OAASE,EAAO,CACd,QAAQ,MAAM,wCAAyCA,CAAK,CAC9D,CAEJ,CAKO,SAASC,IAAgC,CAC9C,GAAI,OAAO,QAAW,YACpB,GAAI,CACF,OAAO,aAAa,QAAQF,EAAS,CACvC,OAASC,EAAO,CACd,eAAQ,MAAM,yCAA0CA,CAAK,EACtD,IACT,CAEF,OAAO,IACT,CAKO,SAASE,IAAyB,CACvC,GAAI,OAAO,QAAW,YACpB,GAAI,CACF,aAAa,WAAWH,EAAS,CACnC,OAASC,EAAO,CACd,QAAQ,MAAM,2CAA4CA,CAAK,CACjE,CAEJ,CA9DA,IAIMD,GAJNI,GAAAC,GAAA,kBAIML,GAAY,cCQX,SAASM,GAAuBC,EAAyB,CAC1D,OAAO,UAAa,cAExB,SAAS,OAAS,GAAG,OAAAC,GAA0B,KAAI,OAAAD,EAAS,2CAC9D,CAKO,SAASE,IAA6C,CAC3D,GAAI,OAAO,UAAa,YAAa,OAErC,IAAMC,EAAS,SAAS,OACrB,MAAM,IAAI,EACV,KAAMC,GAAQA,EAAI,WAAW,GAAG,OAAAH,GAA0B,IAAG,CAAC,EAEjE,OAAOE,EAASA,EAAO,MAAM,GAAG,EAAE,CAAC,EAAI,MACzC,CAKO,SAASE,IAAiC,CAC3C,OAAO,UAAa,cAExB,SAAS,OAAS,GAAG,OAAAJ,GAA0B,wBACjD,CAtCA,IAKMA,GALNK,GAAAC,GAAA,kBAKMN,GAA6B,0BC+EnC,SAASO,GAAeC,EAA4B,CAChD,GAAI,OAAO,QAAW,YAAa,OAAO,KAC1C,GAAI,CACA,OAAO,aAAa,QAAQA,CAAG,CACnC,OAAQ,GACJ,OAAO,IACX,CACJ,CAKA,SAASC,GAAaD,EAAaE,EAAqB,CACpD,GAAI,OAAO,QAAW,YACtB,GAAI,CACA,aAAa,QAAQF,EAAKE,CAAK,CACnC,OAAQC,EAAA,CAER,CACJ,CAKA,SAASC,GAAcJ,EAA4B,CA5GnD,IAAAK,EA6GI,GAAI,OAAO,UAAa,YAAa,OAAO,KAE5C,IAAMC,EADU,SAAS,OAAO,MAAM,GAAG,EAClB,KAAKC,GAAKA,EAAE,KAAK,EAAE,WAAW,GAAG,OAAAP,EAAG,IAAG,CAAC,EAC/D,OAAOM,GAASD,EAAAC,EAAO,MAAM,GAAG,EAAE,CAAC,IAAnB,YAAAD,EAAsB,OAAS,IACnD,CAMA,SAASG,GAAYR,EAAaE,EAAeO,EAAS,MAAa,CACnE,GAAI,OAAO,UAAa,YAGxB,IAAIT,IAAQ,aAAeA,IAAQ,YAAa,CAC5C,QAAQ,KAAK,gDAAoC,OAAAA,EAAG,mDAAkD,EACtG,MACJ,CAEA,SAAS,OAAS,GAAG,OAAAA,EAAG,KAAI,OAAAE,EAAK,sBAAqB,OAAAO,GAC1D,CAKA,SAASC,GAAgBV,EAAmB,CACpC,OAAO,UAAa,cACxB,SAAS,OAAS,GAAG,OAAAA,EAAG,wBAC5B,CAMO,SAASW,IAAkC,CAC9C,GAAI,OAAO,QAAW,YAClB,MAAO,CAAC,EAGZ,IAAMC,EAAY,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAGxDC,EACEC,EAAWF,EAAU,IAAI,OAAO,EACtC,GAAIE,IAAa,KACbD,EAAQC,IAAa,WAClB,CACH,IAAMC,EAAehB,GAAeiB,EAAa,KAAK,EAClDD,IAAiB,OACjBF,EAAQE,IAAiB,OAEjC,CAGA,IAAIE,EACEC,EAAcN,EAAU,IAAI,gBAAgB,EAClD,GAAIM,IAAgB,KAChBD,EAAiBC,IAAgB,YAC9B,CACH,IAAMC,EAAkBpB,GAAeiB,EAAa,eAAe,GAAKZ,GAAcY,EAAa,eAAe,EAC9GG,IAAoB,OACpBF,EAAiBE,IAAoB,QAE7C,CAGA,IAAMC,EAAQR,EAAU,IAAI,OAAO,GAAKS,GAAe,GAAK,KAGtDC,EAAkBV,EAAU,IAAI,iBAAiB,GAAK,KAGtDW,EAAWX,EAAU,IAAI,UAAU,GAAK,KAG1CY,EACEC,EAAeb,EAAU,IAAI,WAAW,EAC1Ca,IAAiBA,IAAiB,WAAaA,IAAiB,gBAChED,EAAYC,GAIhB,IAAMC,EAAad,EAAU,IAAI,YAAY,IAAM,OAG/Ce,EACEC,EAAShB,EAAU,IAAI,iBAAiB,EAC9C,GAAIgB,IAAWA,IAAW,cAAgBA,IAAW,eAAiBA,IAAW,SAC7ED,EAAkBC,MACf,CACH,IAAMC,EAAa9B,GAAeiB,EAAa,UAAU,GAAKZ,GAAcY,EAAa,UAAU,EAC/Fa,IAAeA,IAAe,cAAgBA,IAAe,eAAiBA,IAAe,WAC7FF,EAAkBE,EAE1B,CAGA,IAAIC,EACEC,EAAanB,EAAU,IAAI,qBAAqB,EACtD,GAAImB,EACAD,EAAsBC,MACnB,CACH,IAAMC,EAAiBjC,GAAeiB,EAAa,eAAe,GAAKZ,GAAcY,EAAa,eAAe,EAC7GgB,IACAF,EAAsBE,EAE9B,CAGA,IAAIC,EACEC,EAActB,EAAU,IAAI,UAAU,EAC5C,GAAIsB,EACAD,EAAWC,MACR,CACH,IAAMC,EAAkBpC,GAAeiB,EAAa,QAAQ,GAAKZ,GAAcY,EAAa,QAAQ,EAChGmB,IACAF,EAAWE,EAEnB,CAGA,IAAIC,EACEC,EAAYzB,EAAU,IAAI,QAAQ,EACxC,GAAIyB,EACAD,EAASC,MACN,CACH,IAAMC,EAAgBvC,GAAeiB,EAAa,MAAM,GAAKZ,GAAcY,EAAa,MAAM,EAC1FsB,IACAF,EAASE,EAEjB,CAEA,MAAO,CACH,WAAAZ,EACA,MAAAN,EACA,gBAAAE,EACA,SAAAC,EACA,MAAAV,EACA,eAAAI,EACA,UAAAO,EACA,gBAAAG,EACA,oBAAAG,EACA,SAAAG,EACA,OAAAG,CACJ,CACJ,CAcO,SAASG,IAAuB,CA5QvC,IAAAlC,EA8QI,OAAOA,EADQM,GAAa,EACd,QAAP,KAAAN,EAAgB,EAC3B,CAMO,SAASmC,GAAa3B,EAAsB,CAC/C,GAAI,OAAO,QAAW,YAEtB,GAAIA,EACAZ,GAAae,EAAa,MAAO,MAAM,MAEvC,IAAI,CACA,aAAa,WAAWA,EAAa,KAAK,CAC9C,OAAQ,GAER,CAER,CAaO,SAASyB,GAAkBC,EAAY,GAAgB,CAG1D,IAAIC,EAA0B,KAC1B,OAAO,QAAW,cAElBA,EADkB,IAAI,gBAAgB,OAAO,SAAS,MAAM,EACvC,IAAI,OAAO,GAGpC,IAAMC,EAASjC,GAAa,EACtBkC,EAAcD,EAAO,YAAc,GAEzC,GAAI,CAACC,GAAe,CAACD,EAAO,MAGxB,OAAAE,GAAwB,EACjB,GAGPJ,IACA,QAAQ,IAAI,yBAA0BE,CAAM,EAC5C,QAAQ,IAAI,iCAAkCD,EAAWA,EAAS,UAAU,EAAG,EAAE,EAAI,MAAQ,MAAM,GAInGE,IACIH,GACA,QAAQ,IAAI,8CAA8C,EAG9DK,GAAiB,EACjBC,GAAyB,EAGrB,OAAO,QAAW,aAAe,OAAO,cAC3B,OAAO,KAAK,YAAY,EAChC,QAAQhD,GAAO,EACZA,EAAI,WAAW,YAAY,GAAKA,EAAI,WAAW,MAAM,KACjD0C,GACA,QAAQ,IAAI,gCAAgC,OAAA1C,EAAK,EAErD,aAAa,WAAWA,CAAG,EAEnC,CAAC,GAMT,IAAMiD,EAAaN,GAAYC,EAAO,MACtC,OAAIK,GAAe,MACXP,GACA,QAAQ,IAAI,gCAAiCO,EAAW,UAAU,EAAG,EAAE,EAAI,KAAK,EAGhFA,IAAe,IAAMA,IAAe,OAEpCF,GAAiB,GAGjBG,GAAeD,CAAU,EACrBP,GACA,QAAQ,IAAI,gEAA2D,IAGxEG,IAEHH,GACA,QAAQ,IAAI,0CAA0C,EAE1DK,GAAiB,GAIrBD,GAAwB,EAGpBF,EAAO,iBAAmBF,GAC1B,QAAQ,IAAI,wCAAyCE,EAAO,eAAe,EAGxEC,CACX,CAMA,SAASC,IAAgC,CACrC,GAAI,OAAO,QAAW,YAAa,OAEnC,IAAMlC,EAAY,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAGtDE,EAAWF,EAAU,IAAI,OAAO,EAClCE,IAAa,MACb0B,GAAa1B,IAAa,MAAM,EAIpC,IAAMI,EAAcN,EAAU,IAAI,gBAAgB,EAC9CM,IAAgB,MAChBiC,GAAkBjC,IAAgB,OAAO,EAI7C,IAAMU,EAAShB,EAAU,IAAI,iBAAiB,EAC1CgB,IAAWA,IAAW,cAAgBA,IAAW,eAAiBA,IAAW,UAC7EwB,GAAqBxB,CAAM,EAI/B,IAAMG,EAAanB,EAAU,IAAI,qBAAqB,EAClDmB,GACAsB,GAAiBtB,CAAU,CAEnC,CAKO,SAASoB,GAAkBG,EAAwB,CACtD,GAAI,OAAO,QAAW,YAAa,OAEnC,IAAMpD,EAAQoD,EAAU,OAAS,QACjCrD,GAAae,EAAa,gBAAiBd,CAAK,EAChDM,GAAYQ,EAAa,gBAAiBd,EAAO,KAAK,CAC1D,CAKO,SAASkD,GAAqBG,EAAmD,CAChF,OAAO,QAAW,cAEtBtD,GAAae,EAAa,WAAYuC,CAAG,EACzC/C,GAAYQ,EAAa,WAAYuC,EAAK,KAAK,EACnD,CAKO,SAASC,IAA+B,CAC3C,GAAI,OAAO,QAAW,YAEtB,GAAI,CACA,aAAa,WAAWxC,EAAa,UAAU,EAC/CN,GAAgBM,EAAa,UAAU,CAC3C,OAAQb,EAAA,CAER,CACJ,CAKO,SAASkD,GAAiBI,EAAuB,CAChD,OAAO,QAAW,cAEtBxD,GAAae,EAAa,gBAAiByC,CAAO,EAClDjD,GAAYQ,EAAa,gBAAiByC,EAAS,KAAK,EAC5D,CAKO,SAASC,IAA2B,CACvC,GAAI,OAAO,QAAW,YAEtB,GAAI,CACA,aAAa,WAAW1C,EAAa,eAAe,EACpDN,GAAgBM,EAAa,eAAe,CAChD,OAAQb,EAAA,CAER,CACJ,CAuBO,SAASwD,IAAmC,CApfnD,IAAAtD,EAsfI,OAAOA,EADQM,GAAa,EACd,iBAAP,KAAAN,EAAyB,EACpC,CAvfA,IA6DMW,EA7DN4C,GAAAC,GAAA,kBA4BAC,KACAC,KAgCM/C,EAAe,CACjB,MAAO,YACP,gBAAiB,sBACjB,YAAa,kBACb,WAAY,iBACZ,gBAAiB,sBACjB,SAAU,eACV,OAAQ,YACZ,ICpDA,SAASgD,GAAoBC,EAA0B,CACnD,GAAI,OAAO,QAAW,aAAe,OAAO,UAAa,YAAa,OAEtE,IAAMC,EAAW,OAAO,SAAS,SAC3BC,EAAQD,EAAS,MAAM,GAAG,EAG1BE,EAAU,CACZ,GACAF,EACA,IAAMA,CACV,EAGA,QAASG,EAAI,EAAGA,EAAIF,EAAM,OAAQE,IAAK,CACnC,IAAMC,EAASH,EAAM,MAAME,CAAC,EAAE,KAAK,GAAG,EACtCD,EAAQ,KAAKE,CAAM,EACnBF,EAAQ,KAAK,IAAME,CAAM,CAC7B,CAGA,IAAMC,EAAY,OAAO,SAAS,SAAS,MAAM,GAAG,EAAE,OAAOC,GAAKA,CAAC,EAC7DC,EAAQ,CAAC,GAAG,EACdC,EAAc,GAClBH,EAAU,QAAQI,GAAQ,CACtBD,GAAe,IAAMC,EACrBF,EAAM,KAAKC,CAAW,CAC1B,CAAC,EAGDN,EAAQ,QAAQE,GAAU,CACtBG,EAAM,QAAQG,GAAQ,CAClB,IAAMC,EAAa,GAAG,OAAAZ,EAAU,mDAAkD,OAAAW,GAC5EE,EAAaR,EAAS,YAAY,OAAAA,GAAW,GAGnD,SAAS,OAASO,EAAaC,EAC/B,SAAS,OAASD,EAAaC,EAAa,WAC5C,SAAS,OAASD,EAAaC,EAAa,0BAC5C,SAAS,OAASD,EAAaC,EAAa,iBAC5C,SAAS,OAASD,EAAaC,EAAa,mBAChD,CAAC,CACL,CAAC,CACL,CAMA,SAASC,IAAyB,CAO9B,GANI,OAAO,QAAW,aAMlB,CAJc,QACd,6KACJ,EAEgB,OAGhB,IAAMC,EAAM,IAAI,IAAI,OAAO,SAAS,IAAI,EAClB,CAClB,QAAS,YAAa,iBAAkB,kBACxC,sBAAuB,aAAc,WAAY,kBAAmB,OACxE,EAEc,QAAQC,GAASD,EAAI,aAAa,OAAOC,CAAK,CAAC,EAC7D,OAAO,QAAQ,aAAa,CAAC,EAAG,GAAID,EAAI,IAAI,EAG5C,GAAI,CACA,IAAME,EAAmB,OAAO,yBAAyB,SAAS,UAAW,QAAQ,GACjF,OAAO,yBAAyB,aAAa,UAAW,QAAQ,EAEhEA,GAAoBA,EAAiB,KACrC,OAAO,eAAe,SAAU,SAAU,CACtC,aAAc,GACd,WAAY,GACZ,IAAK,UAAY,CAAE,OAAOA,EAAiB,IAAMA,EAAiB,IAAI,KAAK,IAAI,EAAI,EAAI,EACvF,IAAK,SAAUC,EAAK,CAChB,GAAI,OAAOA,GAAQ,SAAU,CACzB,IAAMC,EAAgBD,EAAI,YAAY,EACtC,GAAIC,EAAc,SAAS,WAAW,GAClCA,EAAc,SAAS,WAAW,GAClCA,EAAc,SAAS,WAAW,GAClCA,EAAc,SAAS,UAAU,EAAG,CAGpC,GAAIA,EAAc,SAAS,WAAW,GAClCA,EAAc,SAAS,0BAA0B,EAAG,CAChDF,EAAiB,KACjBA,EAAiB,IAAI,KAAK,KAAMC,CAAG,EAEvC,MACJ,CAGA,QAAQ,KAAK,yEAA6D,EAC1E,MACJ,CACJ,CAEID,EAAiB,KACjBA,EAAiB,IAAI,KAAK,KAAMC,CAAG,CAE3C,CACJ,CAAC,CAET,OAASE,EAAG,CACR,QAAQ,KAAK,gDAAiDA,CAAC,CACnE,CAGA,GAAI,OAAO,aACP,GAAI,CACA,aAAa,WAAW,WAAW,EACnC,aAAa,WAAW,qBAAqB,EAC7C,aAAa,WAAW,gBAAgB,EACxC,aAAa,WAAW,qBAAqB,EAC7C,aAAa,WAAW,WAAW,CACvC,OAASA,EAAG,CACR,QAAQ,KAAK,sDAAuDA,CAAC,CACzE,CAIJC,GAAiB,EACjBC,GAAyB,EACzBC,GAAuB,EACvBC,GAAmB,EAGf,OAAO,cACP,aAAa,MAAM,EAEnB,OAAO,gBACP,eAAe,MAAM,EAIH,CAClB,wBAAyB,YAAa,sBACtC,iBAAkB,sBAAuB,YAAa,mBAC1D,EAEc,QAAQxB,GAAcD,GAAoBC,CAAU,CAAC,EAG1C,CAAC,YAAa,YAAa,YAAa,UAAU,EAC1D,QAAQA,GAAcD,GAAoBC,CAAU,CAAC,EAGlE,SAAS,QACO,SAAS,OAAO,MAAM,GAAG,EACjC,QAAQyB,GAAU,CACtB,IAAMzB,EAAayB,EAAO,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK,EAC7C,GAAI,CAACzB,EAAY,OAEjB,IAAMC,EAAW,OAAO,SAAS,SAC3BC,EAAQD,EAAS,MAAM,GAAG,EAC1BE,EAAU,CAAC,GAAIF,EAAU,IAAMA,CAAQ,EAE7C,QAASG,EAAI,EAAGA,EAAIF,EAAM,OAAQE,IAAK,CACnC,IAAMC,EAASH,EAAM,MAAME,CAAC,EAAE,KAAK,GAAG,EACtCD,EAAQ,KAAKE,CAAM,EACnBF,EAAQ,KAAK,IAAME,CAAM,CAC7B,CAEA,IAAMC,EAAY,OAAO,SAAS,SAAS,MAAM,GAAG,EAAE,OAAOC,GAAKA,CAAC,EAC7DC,EAAQ,CAAC,GAAG,EACdC,EAAc,GAClBH,EAAU,QAAQI,GAAQ,CACtBD,GAAe,IAAMC,EACrBF,EAAM,KAAKC,CAAW,CAC1B,CAAC,EAEDN,EAAQ,QAAQE,GAAU,CACtBG,EAAM,QAAQG,GAAQ,CAClB,IAAMC,EAAa,GAAG,OAAAZ,EAAU,mDAAkD,OAAAW,GAC5EE,EAAaR,EAAS,YAAY,OAAAA,GAAW,GAEnD,SAAS,OAASO,EAAaC,EAC/B,SAAS,OAASD,EAAaC,EAAa,WAC5C,SAAS,OAASD,EAAaC,EAAa,0BAC5C,SAAS,OAASD,EAAaC,EAAa,iBAC5C,SAAS,OAASD,EAAaC,EAAa,oBAC5C,SAAS,OAASD,EAAaC,EAAa,0BAC5C,SAAS,OAASD,EAAaC,EAAa,yBAC5C,SAAS,OAASD,EAAaC,EAAa,2BAChD,CAAC,CACL,CAAC,CACL,CAAC,EAIL,WAAW,IAAM,CACT,OAAO,cAAgB,aAAa,OAAS,GAC7C,aAAa,MAAM,EAGvBd,GAAoB,WAAW,EAE3B,OAAO,OAAO,MAAS,YACvB,OAAO,KAAK,EAGhB,OAAO,SAAS,QAAQgB,EAAI,IAAI,CACpC,EAAG,EAAE,CACT,CAMO,SAASW,IAAmC,CAE/C,GAAIC,IAAc,OAAO,QAAW,aAAe,OAAO,UAAa,YACnE,OAGJ,IAAMC,EAASC,GAAa,EACtBC,EAAYC,GAAY,EACxBC,EAAmB,CAACC,GAAwB,EAC5CC,EAAe,CAAC,EAAEN,EAAO,iBAAmBA,EAAO,qBAGzD,GAAI,CAACE,GAAa,CAACE,GAAoB,CAACE,EACpC,OAIJ,IAAMC,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,GAAK,wBACfA,EAAU,MAAM,QAAU,mMAS1B,IAAMC,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,MAAM,QAAU,yBACJ,OAAAN,EAAY,UAAY,UAAS,2UAanDM,EAAM,UAAY,4EAEN,OAAAN,EAAY,eAAiB,WAAU,iBAInD,IAAMO,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,MAAM,QAAU,8WAcxBA,EAAQ,MAAM,WAAa,OAG3B,IAAMC,EAAS,SAAS,cAAc,KAAK,EAC3CA,EAAO,MAAM,QAAU,gJAUvB,IAAIC,EAAc,+FAClBA,GAAe,iEAEXT,IACAS,GAAe,iPAQfP,IACAO,GAAe,qPAQfX,EAAO,YACPW,GAAe,wQAID,OAAAX,EAAO,UAAS,4DAM9BA,EAAO,kBACPW,GAAe,qQAID,OAAAX,EAAO,gBAAe,4DAMpCA,EAAO,sBACPW,GAAe,iUAID,OAAAX,EAAO,oBAAmB,2DAMxCA,EAAO,WACPW,GAAe,mXAID,OAAAX,EAAO,SAAQ,2DAMjCW,GAAe,SACfA,GAAe,mSAOfA,GAAe,0lBAmBfF,EAAQ,UAAYE,EAGpB,IAAIC,EAAa,GAEXC,EAAc,IAAM,CACtBD,EAAa,GACbH,EAAQ,MAAM,QAAU,QACxBC,EAAO,MAAM,QAAU,OAC3B,EAEMI,EAAc,IAAM,CACtBF,EAAa,GACb,WAAW,IAAM,CACRA,IACDH,EAAQ,MAAM,QAAU,OACxBC,EAAO,MAAM,QAAU,OAE/B,EAAG,GAAG,CACV,EAEAF,EAAM,iBAAiB,aAAcK,CAAW,EAChDL,EAAM,iBAAiB,aAAcM,CAAW,EAChDJ,EAAO,iBAAiB,aAAcG,CAAW,EACjDH,EAAO,iBAAiB,aAAcI,CAAW,EACjDL,EAAQ,iBAAiB,aAAcI,CAAW,EAClDJ,EAAQ,iBAAiB,aAAcK,CAAW,EAGlD,IAAMC,EAAkBN,EAAQ,cAAc,oBAAoB,EAC9DM,IACAA,EAAgB,iBAAiB,aAAc,IAAM,CACjDA,EAAgB,MAAM,QAAU,KACpC,CAAC,EACDA,EAAgB,iBAAiB,aAAc,IAAM,CACjDA,EAAgB,MAAM,QAAU,GACpC,CAAC,EACDA,EAAgB,iBAAiB,QAAUvB,GAAM,CAC7CA,EAAE,gBAAgB,EAClBN,GAAiB,CACrB,CAAC,GAILqB,EAAU,YAAYC,CAAK,EAC3BD,EAAU,YAAYG,CAAM,EAC5BH,EAAU,YAAYE,CAAO,EAG7B,SAAS,KAAK,YAAYF,CAAS,EACnCS,GAAmBT,EACnBR,GAAa,EACjB,CApcA,IAWIiB,GACAjB,GAZJkB,GAAAC,GAAA,kBAOAC,KACAC,KACAC,KAEIL,GAAuC,KACvCjB,GAAa,KCZjB,IAAAuB,GAAA,GAAAC,GAAAD,GAAA,kBAAAE,GAAA,qBAAAC,GAAA,6BAAAC,GAAA,sBAAAC,GAAA,uBAAAC,GAAA,+BAAAC,GAAA,0BAAAC,GAAA,yBAAAC,GAAA,0BAAAC,KAuHA,SAASC,IAA0C,CACjD,GAAI,OAAO,QAAW,YAGtB,IAAK,OAAe,kBAClB,OAAQ,OAAe,kBAIzB,GAAI,OAAO,UAAa,YAAa,CACnC,IAAMC,EAAO,SAAS,cAAc,0BAA0B,EAC9D,OAAOA,GAAA,YAAAA,EAAM,aAAa,aAAc,MAC1C,EAGF,CAMA,SAASC,IAA+C,CACtD,GAAI,OAAO,QAAW,YAGtB,IAAK,OAAe,0BAClB,OAAQ,OAAe,0BAIzB,GAAI,OAAO,UAAa,YAAa,CACnC,IAAMD,EAAO,SAAS,cAAc,kCAAkC,EACtE,OAAOA,GAAA,YAAAA,EAAM,aAAa,aAAc,MAC1C,EAGF,CAMA,SAASE,IAA4C,CACnD,GAAI,OAAO,QAAW,YAGtB,IAAK,OAAe,uBAClB,OAAQ,OAAe,uBAIzB,GAAI,OAAO,UAAa,YAAa,CACnC,IAAMF,EAAO,SAAS,cAAc,+BAA+B,EACnE,OAAOA,GAAA,YAAAA,EAAM,aAAa,aAAc,MAC1C,EAGF,CAMA,SAASG,GAAgBC,EAA8C,CACrE,GAAI,CAACA,GAAS,OAAOA,GAAU,SAAU,OAEzC,IAAMC,EAAUD,EAAM,KAAK,EAC3B,GAAI,CAACC,EAAS,OAGd,IAAMC,EAAa,CAEjB,IAAM,KAAK,MAAMD,CAAO,EAExB,IAAM,KAAK,MAAM,mBAAmBA,CAAO,CAAC,EAE5C,IAAM,KAAK,MAAM,mBAAmB,mBAAmBA,CAAO,CAAC,CAAC,CAClE,EAEA,QAAWE,KAAYD,EACrB,GAAI,CACF,IAAME,EAASD,EAAS,EACxB,GAAIC,GAAU,OAAOA,GAAW,SAC9B,OAAOA,CAEX,OAAQC,EAAA,CAER,CAIE,OAAO,SAAY,aACrB,QAAQ,KAAK,oCAAqCJ,EAAQ,UAAU,EAAG,GAAG,CAAC,CAG/E,CA4BA,SAASK,IAA8B,CACrC,GAAI,OAAO,QAAW,YAAa,MAAO,GAC1C,IAAMC,EAAW,OAAO,SAAS,SAEjC,OAAOA,IAAa,aAClBA,IAAa,aACZA,EAAS,SAAS,YAAY,GAAK,CAACA,EAAS,SAAS,OAAO,CAClE,CAiBA,eAAsBb,IAA2D,CAE/E,GAAI,CAACY,GAAmB,EAAG,OAAO,KAGlC,GAAIE,KAA2B,OAC7B,OAAOA,GAIT,GAAIC,GAEF,aAAM,IAAI,QAAQC,GAAW,WAAWA,EAAS,GAAG,CAAC,EAC9CF,IAAA,KAAAA,GAA0B,KAGnCC,GAA2B,GAE3B,GAAI,CACF,QAAQ,IAAI,qFAAyE,EACrF,IAAME,EAAW,MAAM,MAAM,2BAA2B,EACxD,GAAI,CAACA,EAAS,GACZ,eAAQ,IAAI,gFAAoE,EAChFH,GAAyB,KAClB,KAGT,IAAMI,EAAS,MAAMD,EAAS,KAAK,EACnC,eAAQ,IAAI,2DAA2CC,CAAM,EAC7DJ,GAAyBI,EAClBA,CACT,OAASC,EAAO,CACd,eAAQ,IAAI,yDAA8CA,CAAK,EAC/DL,GAAyB,KAClB,IACT,QAAE,CACAC,GAA2B,EAC7B,CACF,CAKO,SAAShB,IAAiD,CAC/D,OAAOe,IAAA,KAAAA,GAA0B,IACnC,CAKA,SAASM,GAAwBC,EAA6C,CAC5E,MAAO,CACL,QAASA,EAAM,cAAgB,CAAE,cAAeA,EAAM,aAAc,EAAI,OACxE,gBAAiBA,EAAM,gBACvB,QAASA,EAAM,QACf,OAAQA,EAAM,MAChB,CACF,CAeO,SAASvB,IAAuD,CACrE,GAAI,OAAO,QAAW,YAAa,OAInC,IAAMwB,EAAcvB,GAAqB,EACzC,GAAIuB,EACF,eAAQ,IAAI,0EAA8D,EACnEF,GAAwBE,CAAW,EAI5C,IAAMC,EAAe,OAAe,oBACpC,GAAIA,EAAa,CACf,IAAMC,EAASnB,GAAgBkB,CAAW,EAC1C,GAAIC,EAAQ,OAAOA,CACrB,CAGA,GAAI,OAAO,UAAa,YAAa,CACnC,IAAMtB,EAAO,SAAS,cAAc,4BAA4B,EAC1DuB,EAAUvB,GAAA,YAAAA,EAAM,aAAa,WACnC,GAAIuB,EAAS,CACX,IAAMD,EAASnB,GAAgBoB,CAAO,EACtC,GAAID,EAAQ,OAAOA,CACrB,CACF,CAGF,CAMO,SAAS9B,IAA+C,CArX/D,IAAAgC,EAuXE,IAAMC,EAAa7B,GAAsB,EACzC,IAAI4B,EAAAC,GAAA,YAAAA,EAAY,UAAZ,MAAAD,EAAqB,cACvB,OAAOC,EAAW,QAAQ,cAI5B,GAAI,OAAO,QAAW,YAAa,CAEjC,GAAK,OAAe,wBAClB,OAAQ,OAAe,wBAGzB,GAAI,OAAO,UAAa,YAAa,CACnC,IAAMzB,EAAO,SAAS,cAAc,gCAAgC,EACpE,OAAOA,GAAA,YAAAA,EAAM,aAAa,aAAc,MAC1C,CACF,CAGF,CAMO,SAASL,IAAiE,CAC/E,IAAM8B,EAAa7B,GAAsB,EACzC,OAAO6B,GAAA,YAAAA,EAAY,eACrB,CAMO,SAAS/B,GAAmBgC,EAAgG,CACjI,IAAMD,EAAa7B,GAAsB,EACzC,GAAI,EAAC6B,GAAA,MAAAA,EAAY,SAAS,OAG1B,IAAIE,EAAUF,EAAW,QAAQ,OAAOG,GAAKA,EAAE,OAAO,EAGtD,OAAIF,IACFC,EAAUA,EAAQ,OAAOC,GAAKA,EAAE,WAAaF,GAAa,CAACE,EAAE,UAAYF,IAAa,UAAW,GAG5FC,EAAQ,OAAS,EAAIA,EAAU,MACxC,CAMO,SAASlC,IAMF,CACZ,IAAMgC,EAAa7B,GAAsB,EACnCiC,EAAYJ,GAAA,YAAAA,EAAY,OAC9B,GAAI,CAACI,GAAa,OAAOA,GAAc,SAAU,OAEjD,IAAMC,EAA4C,CAAC,EAEnD,OAAW,CAACC,EAAK3B,CAAK,IAAK,OAAO,QAAQyB,CAAS,EAC5CzB,IAED,MAAM,QAAQA,CAAK,EAErB0B,EAAWC,CAAG,EAAI3B,EACT,OAAOA,GAAU,WAE1B0B,EAAWC,CAAG,EAAI,CAAC3B,CAAoB,IAK3C,OAAO,OAAO,KAAK0B,CAAU,EAAE,OAAS,EAAIA,EAAa,MAC3D,CAvcA,IAaYvC,GA+NRqB,GACAC,GA2PSvB,GAxeb0C,GAAAC,GAAA,kBAAAC,KAEAC,KACAC,KAEAC,KACAC,KACAC,KAMYhD,QACVA,EAAA,SAAW,WACXA,EAAA,OAAS,SACTA,EAAA,SAAW,WACXA,EAAA,gBAAkB,kBAClBA,EAAA,IAAM,MALIA,QAAA,IAgORsB,GAA2B,GA2PlBvB,GAAN,KAAmB,CAUxB,YAAY0B,EAA4B,CAPxC,KAAQ,gBAAkB,IAAIwB,GAI9B,KAAQ,eAAiB,GACzB,KAAQ,wBAA0B,GAGhC,KAAK,OAASxB,EACd,KAAK,SAAW,IAAIyB,GAAezB,EAAO,SAAS,EAEnD,KAAK,MAAQ,CACX,QAAS,KACT,UAAW,GACX,cAAe,GACf,aAAc,GACd,MAAO,KACP,aAAc,IAChB,CACF,CAKA,UAAUA,EAAqC,CAC7C,KAAK,OAAS0B,IAAA,GAAK,KAAK,QAAW1B,EACrC,CAKA,UAAU2B,EAAoD,CAC5D,OAAO,KAAK,gBAAgB,UAAUA,CAAQ,CAChD,CAKA,UAAwB,CACtB,OAAO,KAAK,KACd,CAMA,sBAAsC,CAzhBxC,IAAAnB,EA2hBI,IAAIA,EAAA,KAAK,MAAM,UAAX,MAAAA,EAAoB,UACtB,OAAO,KAAK,MAAM,QAAQ,UAG5B,GAAI,OAAO,QAAW,YAAa,OAAO,KAI1C,IAAMoB,EADS,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAC7B,IAAI,iBAAiB,EACjD,OAAIA,GAGGC,GAAuB,GAAK,IACrC,CAKA,qBAAsB,CACpB,KAAK,wBAA0B,GAC/B,KAAK,eAAiB,GAEtB,KAAK,YAAY,CACf,QAAS,KACT,cAAe,EACjB,CAAC,CACH,CAKA,MAAM,eACJC,EACAC,EACAC,EACqC,CACrC,GAAI,KAAK,MAAM,QAAS,OAAO,KAAK,MAAM,QAE1C,GADI,KAAK,gBACL,KAAK,wBAAyB,OAAO,KAEzC,KAAK,wBAA0B,GAC/B,KAAK,eAAiB,GACtB,KAAK,YAAY,CAAE,UAAW,GAAM,MAAO,IAAK,CAAC,EAEjD,GAAI,CAEF,IAAMC,EAAoB,KAAK,qBAAqB,EAK9CC,EAFS,IAAI,gBAAgB,OAAO,QAAW,YAAc,OAAO,SAAS,OAAS,EAAE,EACnE,IAAI,UAAU,GACAF,EAGnCG,EAAmBpD,GAAoB,EACvCqD,EAAkBnD,GAAyB,EAC3CoD,EAAiBnD,GAAsB,EAGvCoD,EAAYC,GAAa,EAGzBC,EAAgB,KAAK,OAAO,UAAYL,GAAoBD,EAC5DO,EAAc,KAAK,OAAO,QAAUJ,EAGpCK,EAAY,OAAO,QAAW,YAAc,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAI,KAC1FC,EAAYD,GAAA,YAAAA,EAAW,IAAI,aAE7B,KAAK,OAAO,WACd,QAAQ,IAAI,gDAA0C,CACpD,kBAAAT,EACA,kBAAmBO,EACnB,gBAAAJ,EACA,aAAcK,EACd,MAAOH,EAAU,MACjB,eAAgBA,EAAU,eAC1B,UAAAK,EACA,gBAAiBL,EAAU,gBAC3B,oBAAqBA,EAAU,oBAC/B,OAAQ,CACN,SAAU,KAAK,OAAO,SAAW,SAAWH,EAAmB,WAAaD,EAAoB,WAAa,OAC7G,OAAQ,KAAK,OAAO,OAAS,SAAWG,EAAiB,WAAa,MACxE,CACF,CAAC,EAKH,IAAMtC,EAAW,MAAM,KAAK,SAAS,WAAW,CAC9C,WAAY,CACV,WAAY+B,EAAY,WACxB,UAAWA,EAAY,UACvB,QAASC,EAAM,GACf,UAAWA,EAAM,SACnB,EACA,SAAUS,EACV,kBAAmBP,GAAqB,OACxC,WAAY,OAAO,QAAW,YAAc,OAAO,SAAS,KAAO,OACnE,gBAAAG,EACA,aAAcK,EACd,MAAOH,EAAU,MACjB,eAAgBA,EAAU,eAC1B,UAAWK,GAAa,OACxB,gBAAiBL,EAAU,gBAC3B,oBAAqBA,EAAU,oBAC/B,SAAUA,EAAU,SACpB,OAAQA,EAAU,MACpB,CAAC,EAED,GAAIvC,EAAS,SAAWA,EAAS,QAAS,CACxC,IAAM6C,EAAW,KAAK,cAAc7C,EAAS,OAAO,EACpD,YAAK,qBAAqB6C,CAAQ,EAGlCC,GAA2B,EAEpBD,CACT,KACE,OAAM,IAAI,MAAM7C,EAAS,OAAS,qCAAqC,CAG3E,OAASE,EAAO,CACd,IAAM6C,EAAM7C,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,CAAC,EACpE,WAAK,YAAY,CAAE,MAAO6C,EAAK,UAAW,EAAM,CAAC,EAC7C,KAAK,OAAO,WACd,QAAQ,MAAM,qCAAiCA,CAAG,EAE9CA,CACR,QAAE,CACA,KAAK,eAAiB,EACxB,CACF,CAKA,MAAM,WACJhB,EACAC,EACAC,EACAe,EACA,CACA,KAAK,YAAY,CAAE,UAAW,GAAM,MAAO,IAAK,CAAC,EACjD,GAAI,CAEF,IAAMX,EAAkBnD,GAAyB,EAC3C+D,EAAe9D,GAAsB,EAEvC,KAAK,OAAO,YACVkD,GAAiB,QAAQ,IAAI,sDAAgDA,CAAe,EAC5FY,GAAc,QAAQ,IAAI,6CAAuCA,CAAY,GAGnF,IAAMjD,EAAW,MAAM,KAAK,SAAS,WAAW,CAC9C,WAAY,CACV,WAAY+B,EAAY,WACxB,UAAWA,EAAY,UACvB,QAASC,EAAM,GACf,UAAWA,EAAM,SACnB,EACA,SAAUC,EACV,YAAAe,EACA,WAAY,OAAO,QAAW,YAAc,OAAO,SAAS,KAAO,OACnE,gBAAAX,EACA,aAAAY,CACF,CAAC,EAED,GAAIjD,EAAS,SAAWA,EAAS,QAAS,CACxC,IAAM6C,EAAW,KAAK,cAAc7C,EAAS,OAAO,EACpD,YAAK,qBAAqB6C,CAAQ,EAGlCC,GAA2B,EAEpBD,CACT,KACE,OAAM,IAAI,MAAM7C,EAAS,OAAS,sBAAsB,CAE5D,OAASE,EAAO,CACd,IAAM6C,EAAM7C,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,CAAC,EACpE,WAAK,YAAY,CAAE,MAAO6C,EAAK,UAAW,EAAM,CAAC,EAC3CA,CACR,CACF,CAWA,MAAM,SACJG,EACAC,EAOiC,CAvuBrC,IAAA1C,EAAA2C,EAAAC,EAAAC,EAAAC,EAAAC,EAyuBI,GAAIL,GAAA,MAAAA,EAAS,gBAAkB,GAAC1C,EAAA,KAAK,MAAM,UAAX,MAAAA,EAAoB,WAAW,CACzD,KAAK,OAAO,WACd,QAAQ,IAAI,gEAA2D,EAGzE,IAAMgD,EAAc,IACdC,EAAY,KAAK,IAAI,EAE3B,KAAO,GAACN,EAAA,KAAK,MAAM,UAAX,MAAAA,EAAoB,YAAc,KAAK,IAAI,EAAIM,EAAYD,GACjE,MAAM,IAAI,QAAQ1D,GAAW,WAAWA,EAAS,GAAG,CAAC,GAGnDsD,EAAA,KAAK,MAAM,UAAX,MAAAA,EAAoB,WAAa,KAAK,OAAO,WAC/C,QAAQ,IAAI,iEAA4D,CAE5E,CAEA,GAAI,GAACC,EAAA,KAAK,MAAM,UAAX,MAAAA,EAAoB,WAAW,MAAM,IAAI,MAAM,mBAAmB,EAEvE,KAAK,YAAY,CAAE,aAAc,GAAM,UAAW,EAAK,CAAC,EAExD,GAAI,CAEF,IAAIjB,EAAkBnD,GAAyB,EAC3C+D,EAAe9D,GAAsB,EACnCwE,EAAa,OAAO,QAAW,YAAc,OAAO,SAAS,KAAO,OAGtE,CAACV,GAAgB,KAAK,OAAO,SAC/BA,EAAe,KAAK,OAAO,OACvB,KAAK,OAAO,WACd,QAAQ,IAAI,6EAAuEA,CAAY,GAI/F,CAACZ,GAAoB,KAAK,OAAe,YAC3CA,EAAmB,KAAK,OAAe,UACnC,KAAK,OAAO,WACd,QAAQ,IAAI,gFAA0EA,CAAe,GAKrG,KAAK,OAAO,WACd,QAAQ,IAAI,wDAAkD,CAC5D,UAAW,KAAK,MAAM,QAAQ,UAC9B,WAAAsB,EACA,aAAcV,GAAgB,cAC9B,gBAAiBZ,GAAmB,cACpC,kBAAmB,CAAC,CAAClD,GAAsB,EAC3C,qBAAsB,CAAC,CAACD,GAAyB,EACjD,mBAAoB,CAACC,GAAsB,GAAK,CAAC,CAAC,KAAK,OAAO,OAC9D,cAAcgE,GAAA,YAAAA,EAAS,eAAgB,SACvC,UAAUA,GAAA,YAAAA,EAAS,WAAY,QACjC,CAAC,EAGH,IAAMS,GAAgBT,GAAA,YAAAA,EAAS,gBAAiB,GAE1CnD,EAAW,MAAM,KAAK,SAAS,SAAS,CAC5C,UAAW,KAAK,MAAM,QAAQ,UAC9B,MAAAkD,EACA,WAAAS,EACA,aAAAV,EACA,gBAAAZ,EACA,cAAAuB,EACA,aAAcT,GAAA,YAAAA,EAAS,aACvB,SAAUA,GAAA,YAAAA,EAAS,QACrB,CAAC,EAED,GAAI,CAACnD,EAAS,SAAW,CAACA,EAAS,OACjC,MAAM,IAAI,MAAMA,EAAS,OAAS,mBAAmB,EAGvD,IAAMP,EAASO,EAAS,OAGxB,GAAIP,EAAO,OACT,YAAK,YAAY,CAAE,aAAc,GAAO,UAAW,EAAM,CAAC,EAGtDA,EAAO,WAAaA,EAAO,cAAc8D,EAAA,KAAK,MAAM,UAAX,YAAAA,EAAoB,aAC3D,KAAK,OAAO,WACd,QAAQ,IAAI,gDAAyC,QAAAC,EAAA,KAAK,MAAM,UAAX,YAAAA,EAAoB,UAAS,YAAM,OAAA/D,EAAO,UAAW,EAGxG,KAAK,MAAM,UACb,KAAK,MAAM,QAAQ,UAAYA,EAAO,YAItC,KAAK,OAAO,WACd,QAAQ,IAAI,mEAA4D,EAGnEA,EAKT,IAAMoE,GAAqBV,GAAA,YAAAA,EAAS,gBAAiB,OACjDA,EAAQ,aACR,KAAK,OAAO,eAAiB,GAIjC,OAAKU,IACC,KAAK,OAAO,WACd,QAAQ,IAAI,gEAAyD,EAEvE,MAAM,KAAK,eAAe,GAG5B,KAAK,YAAY,CAAE,aAAc,GAAO,UAAW,EAAM,CAAC,EAGtDA,IAAsBpE,GAAA,MAAAA,EAAQ,MAAO,OAAO,QAAW,cACrD,KAAK,OAAO,WACd,QAAQ,IAAI,gDAA0CA,EAAO,IAAK,uDAAuD,EAE3H,OAAO,SAAS,KAAOA,EAAO,KAGzBA,CACT,OAASS,EAAO,CACd,IAAM6C,EAAM7C,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,CAAC,EACpE,WAAK,YAAY,CAAE,MAAO6C,EAAK,aAAc,GAAO,UAAW,EAAM,CAAC,EAChEA,CACR,CACF,CAOA,MAAM,SACJe,EACAX,EACiC,CACjC,OAAO,KAAK,SACV,CACE,yBACA,KAAM,CAAE,aAAcW,CAAO,CAC/B,EACAX,CACF,CACF,CAKA,MAAM,gBAAiB,CAj4BzB,IAAA1C,EAk4BI,IAAKA,EAAA,KAAK,MAAM,UAAX,MAAAA,EAAoB,UAEzB,GAAI,CACF,IAAMT,EAAW,MAAM,KAAK,SAAS,WAAW,KAAK,MAAM,QAAQ,SAAS,EAC5E,GAAIA,EAAS,SAAWA,EAAS,QAAS,CACxC,IAAM6C,EAAW,KAAK,cAAc7C,EAAS,OAAO,EACpD,YAAK,YAAY,CAAE,QAAS6C,EAAU,aAAc,IAAK,CAAC,EACnDA,CACT,CACF,OAAS3C,EAAO,CACd,KAAK,YAAY,CAAE,aAAcA,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,CAAC,CAAE,CAAC,CAC9F,CACF,CAKA,MAAM,cAAc6D,EAAuC,CAn5B7D,IAAAtD,EAo5BI,GAAI,GAACA,EAAA,KAAK,MAAM,UAAX,MAAAA,EAAoB,WAAW,MAAM,IAAI,MAAM,mBAAmB,EACvE,KAAK,YAAY,CAAE,UAAW,EAAK,CAAC,EAEpC,GAAI,CACF,IAAMT,EAAW,MAAM,KAAK,SAAS,cAAc,KAAK,MAAM,QAAQ,UAAW,CAAE,eAAgB+D,CAAQ,CAAC,EAC5G,GAAI/D,EAAS,QACX,MAAM,KAAK,eAAe,MAE1B,OAAM,IAAI,MAAMA,EAAS,OAAS,0BAA0B,CAEhE,QAAE,CACA,KAAK,YAAY,CAAE,UAAW,EAAM,CAAC,CACvC,CACF,CAKA,MAAM,YAAa,CAt6BrB,IAAAS,EAu6BI,IAAKA,EAAA,KAAK,MAAM,UAAX,MAAAA,EAAoB,UAEzB,GAAI,CACF,MAAM,KAAK,SAAS,WAAW,KAAK,MAAM,QAAQ,SAAS,CAC7D,QAAE,CACA,KAAK,MAAM,QAAU,KACrB,KAAK,YAAY,CAAE,QAAS,KAAM,cAAe,EAAM,CAAC,CAK1D,CACF,CAIQ,YAAYsD,EAA+B,CACjD,KAAK,MAAQpC,IAAA,GAAK,KAAK,OAAUoC,GACjC,KAAK,gBAAgB,OAAO,KAAK,KAAK,CACxC,CAEQ,qBAAqBC,EAA8B,CACzDC,GAAuBD,EAAQ,SAAS,EACxC,KAAK,YAAY,CACf,QAAAA,EACA,UAAW,GACX,cAAe,GACf,MAAO,KACP,aAAc,IAChB,CAAC,CACH,CAEQ,cAAcE,EAA+C,CAv8BvE,IAAAzD,EAAA2C,EA08BI,MAFY3C,EAAA,KAAK,OAAO,cAAZ,YAAAA,EAAyB,cAAe0D,GAAkB,KAE1D,QAAS,OAAOD,EAE5B,IAAME,IAAiBhB,EAAA,KAAK,OAAO,eAAZ,YAAAA,EAA0B,kBAAmB,CAAC,EACrE,GAAI,OAAO,KAAKgB,CAAc,EAAE,SAAW,EAAG,OAAOF,EAIrD,IAAMG,EAAiBH,EAAI,QAAU,CAAC,EAMtC,OALwB,OAAO,KAAKE,CAAc,EAAE,MAClDpD,GAAOqD,EAAerD,CAAG,IAAMoD,EAAepD,CAAG,CACnD,GAGuB,OAAO,KAAKqD,CAAc,EAAE,SAAW,OAAO,KAAKD,CAAc,EAAE,OACjFF,EAGFI,EAAA3C,EAAA,GACFuC,GADE,CAEL,OAAQvC,IAAA,GACHyC,GACAC,EAEP,EACF,CACF,ICn+BA,IAAAE,GAAA,GAAAC,GAAAD,GAAA,2BAAAE,GAAA,kBAAAC,KCAAC,KACAC,KCQe,SAARC,GAAsBC,EAAIC,EAAS,CACxC,OAAO,UAAgB,CACrB,OAAOD,EAAG,MAAMC,EAAS,SAAS,CACpC,CACF,CCPA,GAAM,CAAC,SAAAC,EAAQ,EAAI,OAAO,UACpB,CAAC,eAAAC,EAAc,EAAI,OACnB,CAAC,SAAAC,GAAU,YAAAC,EAAW,EAAI,OAE1BC,IAAUC,GAASC,GAAS,CAC9B,IAAMC,EAAMP,GAAS,KAAKM,CAAK,EAC/B,OAAOD,EAAME,CAAG,IAAMF,EAAME,CAAG,EAAIA,EAAI,MAAM,EAAG,EAAE,EAAE,YAAY,EACpE,GAAG,OAAO,OAAO,IAAI,CAAC,EAEhBC,GAAcC,IAClBA,EAAOA,EAAK,YAAY,EAChBH,GAAUF,GAAOE,CAAK,IAAMG,GAGhCC,GAAaD,GAAQH,GAAS,OAAOA,IAAUG,EAS/C,CAAC,QAAAE,EAAO,EAAI,MASZC,GAAcF,GAAW,WAAW,EAS1C,SAASG,GAASC,EAAK,CACrB,OAAOA,IAAQ,MAAQ,CAACF,GAAYE,CAAG,GAAKA,EAAI,cAAgB,MAAQ,CAACF,GAAYE,EAAI,WAAW,GAC/FC,EAAWD,EAAI,YAAY,QAAQ,GAAKA,EAAI,YAAY,SAASA,CAAG,CAC3E,CASA,IAAME,GAAgBR,GAAW,aAAa,EAU9C,SAASS,GAAkBH,EAAK,CAC9B,IAAII,EACJ,OAAK,OAAO,aAAgB,aAAiB,YAAY,OACvDA,EAAS,YAAY,OAAOJ,CAAG,EAE/BI,EAAUJ,GAASA,EAAI,QAAYE,GAAcF,EAAI,MAAM,EAEtDI,CACT,CASA,IAAMC,GAAWT,GAAW,QAAQ,EAQ9BK,EAAaL,GAAW,UAAU,EASlCU,GAAWV,GAAW,QAAQ,EAS9BW,GAAYf,GAAUA,IAAU,MAAQ,OAAOA,GAAU,SAQzDgB,GAAYhB,GAASA,IAAU,IAAQA,IAAU,GASjDiB,GAAiBT,GAAQ,CAC7B,GAAIV,GAAOU,CAAG,IAAM,SAClB,MAAO,GAGT,IAAMU,EAAYvB,GAAea,CAAG,EACpC,OAAQU,IAAc,MAAQA,IAAc,OAAO,WAAa,OAAO,eAAeA,CAAS,IAAM,OAAS,EAAErB,MAAeW,IAAQ,EAAEZ,MAAYY,EACvJ,EASMW,GAAiBX,GAAQ,CAE7B,GAAI,CAACO,GAASP,CAAG,GAAKD,GAASC,CAAG,EAChC,MAAO,GAGT,GAAI,CACF,OAAO,OAAO,KAAKA,CAAG,EAAE,SAAW,GAAK,OAAO,eAAeA,CAAG,IAAM,OAAO,SAChF,OAAS,EAAG,CAEV,MAAO,EACT,CACF,EASMY,GAASlB,GAAW,MAAM,EAS1BmB,GAASnB,GAAW,MAAM,EAS1BoB,GAASpB,GAAW,MAAM,EAS1BqB,GAAarB,GAAW,UAAU,EASlCsB,GAAYhB,GAAQO,GAASP,CAAG,GAAKC,EAAWD,EAAI,IAAI,EASxDiB,GAAczB,GAAU,CAC5B,IAAI0B,EACJ,OAAO1B,IACJ,OAAO,UAAa,YAAcA,aAAiB,UAClDS,EAAWT,EAAM,MAAM,KACpB0B,EAAO5B,GAAOE,CAAK,KAAO,YAE1B0B,IAAS,UAAYjB,EAAWT,EAAM,QAAQ,GAAKA,EAAM,SAAS,IAAM,qBAIjF,EASM2B,GAAoBzB,GAAW,iBAAiB,EAEhD,CAAC0B,GAAkBC,GAAWC,GAAYC,EAAS,EAAI,CAAC,iBAAkB,UAAW,WAAY,SAAS,EAAE,IAAI7B,EAAU,EAS1H8B,GAAQ/B,GAAQA,EAAI,KACxBA,EAAI,KAAK,EAAIA,EAAI,QAAQ,qCAAsC,EAAE,EAiBnE,SAASgC,GAAQC,EAAKC,EAAI,CAAC,WAAAC,EAAa,EAAK,EAAI,CAAC,EAAG,CAEnD,GAAIF,IAAQ,MAAQ,OAAOA,GAAQ,YACjC,OAGF,IAAI,EACAG,EAQJ,GALI,OAAOH,GAAQ,WAEjBA,EAAM,CAACA,CAAG,GAGR7B,GAAQ6B,CAAG,EAEb,IAAK,EAAI,EAAGG,EAAIH,EAAI,OAAQ,EAAIG,EAAG,IACjCF,EAAG,KAAK,KAAMD,EAAI,CAAC,EAAG,EAAGA,CAAG,MAEzB,CAEL,GAAI3B,GAAS2B,CAAG,EACd,OAIF,IAAMI,EAAOF,EAAa,OAAO,oBAAoBF,CAAG,EAAI,OAAO,KAAKA,CAAG,EACrEK,EAAMD,EAAK,OACbE,EAEJ,IAAK,EAAI,EAAG,EAAID,EAAK,IACnBC,EAAMF,EAAK,CAAC,EACZH,EAAG,KAAK,KAAMD,EAAIM,CAAG,EAAGA,EAAKN,CAAG,CAEpC,CACF,CAEA,SAASO,GAAQP,EAAKM,EAAK,CACzB,GAAIjC,GAAS2B,CAAG,EACd,OAAO,KAGTM,EAAMA,EAAI,YAAY,EACtB,IAAMF,EAAO,OAAO,KAAKJ,CAAG,EACxB,EAAII,EAAK,OACTI,EACJ,KAAO,KAAM,GAEX,GADAA,EAAOJ,EAAK,CAAC,EACTE,IAAQE,EAAK,YAAY,EAC3B,OAAOA,EAGX,OAAO,IACT,CAEA,IAAMC,GAEA,OAAO,YAAe,YAAoB,WACvC,OAAO,MAAS,YAAc,KAAQ,OAAO,QAAW,YAAc,OAAS,OAGlFC,GAAoBC,GAAY,CAACvC,GAAYuC,CAAO,GAAKA,IAAYF,GAoB3E,SAASG,IAAmC,CAC1C,GAAM,CAAC,SAAAC,EAAU,cAAAC,CAAa,EAAIJ,GAAiB,IAAI,GAAK,MAAQ,CAAC,EAC/DhC,EAAS,CAAC,EACVqC,EAAc,CAACzC,EAAKgC,IAAQ,CAChC,IAAMU,EAAYH,GAAYN,GAAQ7B,EAAQ4B,CAAG,GAAKA,EAClDvB,GAAcL,EAAOsC,CAAS,CAAC,GAAKjC,GAAcT,CAAG,EACvDI,EAAOsC,CAAS,EAAIJ,GAAMlC,EAAOsC,CAAS,EAAG1C,CAAG,EACvCS,GAAcT,CAAG,EAC1BI,EAAOsC,CAAS,EAAIJ,GAAM,CAAC,EAAGtC,CAAG,EACxBH,GAAQG,CAAG,EACpBI,EAAOsC,CAAS,EAAI1C,EAAI,MAAM,GACrB,CAACwC,GAAiB,CAAC1C,GAAYE,CAAG,KAC3CI,EAAOsC,CAAS,EAAI1C,EAExB,EAEA,QAAS2C,EAAI,EAAGd,EAAI,UAAU,OAAQc,EAAId,EAAGc,IAC3C,UAAUA,CAAC,GAAKlB,GAAQ,UAAUkB,CAAC,EAAGF,CAAW,EAEnD,OAAOrC,CACT,CAYA,IAAMwC,GAAS,CAACC,EAAGC,EAAGC,EAAS,CAAC,WAAAnB,CAAU,EAAG,CAAC,KAC5CH,GAAQqB,EAAG,CAAC9C,EAAKgC,IAAQ,CACnBe,GAAW9C,EAAWD,CAAG,EAC3B6C,EAAEb,CAAG,EAAIgB,GAAKhD,EAAK+C,CAAO,EAE1BF,EAAEb,CAAG,EAAIhC,CAEb,EAAG,CAAC,WAAA4B,CAAU,CAAC,EACRiB,GAUHI,GAAYC,IACZA,EAAQ,WAAW,CAAC,IAAM,QAC5BA,EAAUA,EAAQ,MAAM,CAAC,GAEpBA,GAYHC,GAAW,CAACC,EAAaC,EAAkBC,EAAOC,IAAgB,CACtEH,EAAY,UAAY,OAAO,OAAOC,EAAiB,UAAWE,CAAW,EAC7EH,EAAY,UAAU,YAAcA,EACpC,OAAO,eAAeA,EAAa,QAAS,CAC1C,MAAOC,EAAiB,SAC1B,CAAC,EACDC,GAAS,OAAO,OAAOF,EAAY,UAAWE,CAAK,CACrD,EAWME,GAAe,CAACC,EAAWC,EAASC,EAAQC,IAAe,CAC/D,IAAIN,EACAX,EACAkB,EACEC,EAAS,CAAC,EAIhB,GAFAJ,EAAUA,GAAW,CAAC,EAElBD,GAAa,KAAM,OAAOC,EAE9B,EAAG,CAGD,IAFAJ,EAAQ,OAAO,oBAAoBG,CAAS,EAC5Cd,EAAIW,EAAM,OACHX,KAAM,GACXkB,EAAOP,EAAMX,CAAC,GACT,CAACiB,GAAcA,EAAWC,EAAMJ,EAAWC,CAAO,IAAM,CAACI,EAAOD,CAAI,IACvEH,EAAQG,CAAI,EAAIJ,EAAUI,CAAI,EAC9BC,EAAOD,CAAI,EAAI,IAGnBJ,EAAYE,IAAW,IAASxE,GAAesE,CAAS,CAC1D,OAASA,IAAc,CAACE,GAAUA,EAAOF,EAAWC,CAAO,IAAMD,IAAc,OAAO,WAEtF,OAAOC,CACT,EAWMK,GAAW,CAACtE,EAAKuE,EAAcC,IAAa,CAChDxE,EAAM,OAAOA,CAAG,GACZwE,IAAa,QAAaA,EAAWxE,EAAI,UAC3CwE,EAAWxE,EAAI,QAEjBwE,GAAYD,EAAa,OACzB,IAAME,EAAYzE,EAAI,QAAQuE,EAAcC,CAAQ,EACpD,OAAOC,IAAc,IAAMA,IAAcD,CAC3C,EAUME,GAAW3E,GAAU,CACzB,GAAI,CAACA,EAAO,OAAO,KACnB,GAAIK,GAAQL,CAAK,EAAG,OAAOA,EAC3B,IAAImD,EAAInD,EAAM,OACd,GAAI,CAACc,GAASqC,CAAC,EAAG,OAAO,KACzB,IAAMyB,EAAM,IAAI,MAAMzB,CAAC,EACvB,KAAOA,KAAM,GACXyB,EAAIzB,CAAC,EAAInD,EAAMmD,CAAC,EAElB,OAAOyB,CACT,EAWMC,IAAgBC,GAEb9E,GACE8E,GAAc9E,aAAiB8E,GAEvC,OAAO,YAAe,aAAenF,GAAe,UAAU,CAAC,EAU5DoF,GAAe,CAAC7C,EAAKC,IAAO,CAGhC,IAAM6C,GAFY9C,GAAOA,EAAItC,EAAQ,GAET,KAAKsC,CAAG,EAEhCtB,EAEJ,MAAQA,EAASoE,EAAU,KAAK,IAAM,CAACpE,EAAO,MAAM,CAClD,IAAMqE,EAAOrE,EAAO,MACpBuB,EAAG,KAAKD,EAAK+C,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,CAC/B,CACF,EAUMC,GAAW,CAACC,EAAQlF,IAAQ,CAChC,IAAImF,EACER,EAAM,CAAC,EAEb,MAAQQ,EAAUD,EAAO,KAAKlF,CAAG,KAAO,MACtC2E,EAAI,KAAKQ,CAAO,EAGlB,OAAOR,CACT,EAGMS,GAAanF,GAAW,iBAAiB,EAEzCoF,GAAcrF,GACXA,EAAI,YAAY,EAAE,QAAQ,wBAC/B,SAAkBsF,EAAGC,EAAIC,EAAI,CAC3B,OAAOD,EAAG,YAAY,EAAIC,CAC5B,CACF,EAIIC,IAAkB,CAAC,CAAC,eAAAA,CAAc,IAAM,CAACxD,EAAKmC,IAASqB,EAAe,KAAKxD,EAAKmC,CAAI,GAAG,OAAO,SAAS,EASvGsB,GAAWzF,GAAW,QAAQ,EAE9B0F,GAAoB,CAAC1D,EAAK2D,IAAY,CAC1C,IAAM9B,EAAc,OAAO,0BAA0B7B,CAAG,EAClD4D,EAAqB,CAAC,EAE5B7D,GAAQ8B,EAAa,CAACgC,EAAYC,IAAS,CACzC,IAAIC,GACCA,EAAMJ,EAAQE,EAAYC,EAAM9D,CAAG,KAAO,KAC7C4D,EAAmBE,CAAI,EAAIC,GAAOF,EAEtC,CAAC,EAED,OAAO,iBAAiB7D,EAAK4D,CAAkB,CACjD,EAOMI,GAAiBhE,GAAQ,CAC7B0D,GAAkB1D,EAAK,CAAC6D,EAAYC,IAAS,CAE3C,GAAIvF,EAAWyB,CAAG,GAAK,CAAC,YAAa,SAAU,QAAQ,EAAE,QAAQ8D,CAAI,IAAM,GACzE,MAAO,GAGT,IAAMG,EAAQjE,EAAI8D,CAAI,EAEtB,GAAKvF,EAAW0F,CAAK,EAIrB,IAFAJ,EAAW,WAAa,GAEpB,aAAcA,EAAY,CAC5BA,EAAW,SAAW,GACtB,MACF,CAEKA,EAAW,MACdA,EAAW,IAAM,IAAM,CACrB,MAAM,MAAM,qCAAwCC,EAAO,GAAI,CACjE,GAEJ,CAAC,CACH,EAEMI,GAAc,CAACC,EAAeC,IAAc,CAChD,IAAMpE,EAAM,CAAC,EAEPqE,EAAU3B,GAAQ,CACtBA,EAAI,QAAQuB,GAAS,CACnBjE,EAAIiE,CAAK,EAAI,EACf,CAAC,CACH,EAEA,OAAA9F,GAAQgG,CAAa,EAAIE,EAAOF,CAAa,EAAIE,EAAO,OAAOF,CAAa,EAAE,MAAMC,CAAS,CAAC,EAEvFpE,CACT,EAEMsE,GAAO,IAAM,CAAC,EAEdC,GAAiB,CAACN,EAAOO,IACtBP,GAAS,MAAQ,OAAO,SAASA,EAAQ,CAACA,CAAK,EAAIA,EAAQO,EAYpE,SAASC,GAAoB3G,EAAO,CAClC,MAAO,CAAC,EAAEA,GAASS,EAAWT,EAAM,MAAM,GAAKA,EAAMH,EAAW,IAAM,YAAcG,EAAMJ,EAAQ,EACpG,CAEA,IAAMgH,GAAgB1E,GAAQ,CAC5B,IAAM2E,EAAQ,IAAI,MAAM,EAAE,EAEpBC,EAAQ,CAACC,EAAQ5D,IAAM,CAE3B,GAAIpC,GAASgG,CAAM,EAAG,CACpB,GAAIF,EAAM,QAAQE,CAAM,GAAK,EAC3B,OAIF,GAAIxG,GAASwG,CAAM,EACjB,OAAOA,EAGT,GAAG,EAAE,WAAYA,GAAS,CACxBF,EAAM1D,CAAC,EAAI4D,EACX,IAAMC,EAAS3G,GAAQ0G,CAAM,EAAI,CAAC,EAAI,CAAC,EAEvC,OAAA9E,GAAQ8E,EAAQ,CAACZ,EAAO3D,IAAQ,CAC9B,IAAMyE,EAAeH,EAAMX,EAAOhD,EAAI,CAAC,EACvC,CAAC7C,GAAY2G,CAAY,IAAMD,EAAOxE,CAAG,EAAIyE,EAC/C,CAAC,EAEDJ,EAAM1D,CAAC,EAAI,OAEJ6D,CACT,CACF,CAEA,OAAOD,CACT,EAEA,OAAOD,EAAM5E,EAAK,CAAC,CACrB,EAEMgF,GAAYhH,GAAW,eAAe,EAEtCiH,GAAcnH,GAClBA,IAAUe,GAASf,CAAK,GAAKS,EAAWT,CAAK,IAAMS,EAAWT,EAAM,IAAI,GAAKS,EAAWT,EAAM,KAAK,EAK/FoH,IAAiB,CAACC,EAAuBC,IACzCD,EACK,aAGFC,GAAwB,CAACC,EAAOC,KACrC7E,GAAQ,iBAAiB,UAAW,CAAC,CAAC,OAAAoE,EAAQ,KAAAU,CAAI,IAAM,CAClDV,IAAWpE,IAAW8E,IAASF,GACjCC,EAAU,QAAUA,EAAU,MAAM,EAAE,CAE1C,EAAG,EAAK,EAEAE,GAAO,CACbF,EAAU,KAAKE,CAAE,EACjB/E,GAAQ,YAAY4E,EAAO,GAAG,CAChC,IACC,SAAS,YAAK,OAAO,GAAK,CAAC,CAAC,EAAKG,GAAO,WAAWA,CAAE,GAExD,OAAO,cAAiB,WACxBjH,EAAWkC,GAAQ,WAAW,CAChC,EAEMgF,GAAO,OAAO,gBAAmB,YACrC,eAAe,KAAKhF,EAAO,EAAM,OAAO,SAAY,aAAe,QAAQ,UAAYyE,GAKnFQ,GAAc5H,GAAUA,GAAS,MAAQS,EAAWT,EAAMJ,EAAQ,CAAC,EAGlEiI,EAAQ,CACb,QAAAxH,GACA,cAAAK,GACA,SAAAH,GACA,WAAAkB,GACA,kBAAAd,GACA,SAAAE,GACA,SAAAC,GACA,UAAAE,GACA,SAAAD,GACA,cAAAE,GACA,cAAAE,GACA,iBAAAS,GACA,UAAAC,GACA,WAAAC,GACA,UAAAC,GACA,YAAAzB,GACA,OAAAc,GACA,OAAAC,GACA,OAAAC,GACA,SAAAqE,GACA,WAAAlF,EACA,SAAAe,GACA,kBAAAG,GACA,aAAAkD,GACA,WAAAtD,GACA,QAAAU,GACA,MAAAa,GACA,OAAAM,GACA,KAAApB,GACA,SAAAyB,GACA,SAAAE,GACA,aAAAK,GACA,OAAAlE,GACA,WAAAI,GACA,SAAAqE,GACA,QAAAI,GACA,aAAAI,GACA,SAAAG,GACA,WAAAG,GACA,eAAAK,GACA,WAAYA,GACZ,kBAAAE,GACA,cAAAM,GACA,YAAAE,GACA,YAAAd,GACA,KAAAkB,GACA,eAAAC,GACA,QAAAhE,GACA,OAAQE,GACR,iBAAAC,GACA,oBAAA+D,GACA,aAAAC,GACA,UAAAM,GACA,WAAAC,GACA,aAAcC,GACd,KAAAO,GACA,WAAAC,EACF,EC9vBA,SAASE,GAAWC,EAASC,EAAMC,EAAQC,EAASC,EAAU,CAC5D,MAAM,KAAK,IAAI,EAEX,MAAM,kBACR,MAAM,kBAAkB,KAAM,KAAK,WAAW,EAE9C,KAAK,MAAS,IAAI,MAAM,EAAG,MAG7B,KAAK,QAAUJ,EACf,KAAK,KAAO,aACZC,IAAS,KAAK,KAAOA,GACrBC,IAAW,KAAK,OAASA,GACzBC,IAAY,KAAK,QAAUA,GACvBC,IACF,KAAK,SAAWA,EAChB,KAAK,OAASA,EAAS,OAASA,EAAS,OAAS,KAEtD,CAEAC,EAAM,SAASN,GAAY,MAAO,CAChC,OAAQ,UAAkB,CACxB,MAAO,CAEL,QAAS,KAAK,QACd,KAAM,KAAK,KAEX,YAAa,KAAK,YAClB,OAAQ,KAAK,OAEb,SAAU,KAAK,SACf,WAAY,KAAK,WACjB,aAAc,KAAK,aACnB,MAAO,KAAK,MAEZ,OAAQM,EAAM,aAAa,KAAK,MAAM,EACtC,KAAM,KAAK,KACX,OAAQ,KAAK,MACf,CACF,CACF,CAAC,EAED,IAAMC,GAAYP,GAAW,UACvBQ,GAAc,CAAC,EAErB,CACE,uBACA,iBACA,eACA,YACA,cACA,4BACA,iBACA,mBACA,kBACA,eACA,kBACA,iBAEF,EAAE,QAAQN,GAAQ,CAChBM,GAAYN,CAAI,EAAI,CAAC,MAAOA,CAAI,CAClC,CAAC,EAED,OAAO,iBAAiBF,GAAYQ,EAAW,EAC/C,OAAO,eAAeD,GAAW,eAAgB,CAAC,MAAO,EAAI,CAAC,EAG9DP,GAAW,KAAO,CAACS,EAAOP,EAAMC,EAAQC,EAASC,EAAUK,IAAgB,CACzE,IAAMC,EAAa,OAAO,OAAOJ,EAAS,EAE1CD,EAAM,aAAaG,EAAOE,EAAY,SAAgBC,EAAK,CACzD,OAAOA,IAAQ,MAAM,SACvB,EAAGC,GACMA,IAAS,cACjB,EAED,IAAMC,EAAML,GAASA,EAAM,QAAUA,EAAM,QAAU,QAG/CM,EAAUb,GAAQ,MAAQO,EAAQA,EAAM,KAAOP,EACrD,OAAAF,GAAW,KAAKW,EAAYG,EAAKC,EAASZ,EAAQC,EAASC,CAAQ,EAG/DI,GAASE,EAAW,OAAS,MAC/B,OAAO,eAAeA,EAAY,QAAS,CAAE,MAAOF,EAAO,aAAc,EAAK,CAAC,EAGjFE,EAAW,KAAQF,GAASA,EAAM,MAAS,QAE3CC,GAAe,OAAO,OAAOC,EAAYD,CAAW,EAE7CC,CACT,EAEA,IAAOK,EAAQhB,GC5Gf,IAAOiB,GAAQ,KCaf,SAASC,GAAYC,EAAO,CAC1B,OAAOC,EAAM,cAAcD,CAAK,GAAKC,EAAM,QAAQD,CAAK,CAC1D,CASA,SAASE,GAAeC,EAAK,CAC3B,OAAOF,EAAM,SAASE,EAAK,IAAI,EAAIA,EAAI,MAAM,EAAG,EAAE,EAAIA,CACxD,CAWA,SAASC,GAAUC,EAAMF,EAAKG,EAAM,CAClC,OAAKD,EACEA,EAAK,OAAOF,CAAG,EAAE,IAAI,SAAcI,EAAOC,EAAG,CAElD,OAAAD,EAAQL,GAAeK,CAAK,EACrB,CAACD,GAAQE,EAAI,IAAMD,EAAQ,IAAMA,CAC1C,CAAC,EAAE,KAAKD,EAAO,IAAM,EAAE,EALLH,CAMpB,CASA,SAASM,GAAYC,EAAK,CACxB,OAAOT,EAAM,QAAQS,CAAG,GAAK,CAACA,EAAI,KAAKX,EAAW,CACpD,CAEA,IAAMY,GAAaV,EAAM,aAAaA,EAAO,CAAC,EAAG,KAAM,SAAgBW,EAAM,CAC3E,MAAO,WAAW,KAAKA,CAAI,CAC7B,CAAC,EAyBD,SAASC,GAAWC,EAAKC,EAAUC,EAAS,CAC1C,GAAI,CAACf,EAAM,SAASa,CAAG,EACrB,MAAM,IAAI,UAAU,0BAA0B,EAIhDC,EAAWA,GAAY,IAAKE,IAAoB,UAGhDD,EAAUf,EAAM,aAAae,EAAS,CACpC,WAAY,GACZ,KAAM,GACN,QAAS,EACX,EAAG,GAAO,SAAiBE,EAAQC,EAAQ,CAEzC,MAAO,CAAClB,EAAM,YAAYkB,EAAOD,CAAM,CAAC,CAC1C,CAAC,EAED,IAAME,EAAaJ,EAAQ,WAErBK,EAAUL,EAAQ,SAAWM,EAC7BhB,EAAOU,EAAQ,KACfO,EAAUP,EAAQ,QAElBQ,GADQR,EAAQ,MAAQ,OAAO,MAAS,aAAe,OACpCf,EAAM,oBAAoBc,CAAQ,EAE3D,GAAI,CAACd,EAAM,WAAWoB,CAAO,EAC3B,MAAM,IAAI,UAAU,4BAA4B,EAGlD,SAASI,EAAaC,EAAO,CAC3B,GAAIA,IAAU,KAAM,MAAO,GAE3B,GAAIzB,EAAM,OAAOyB,CAAK,EACpB,OAAOA,EAAM,YAAY,EAG3B,GAAIzB,EAAM,UAAUyB,CAAK,EACvB,OAAOA,EAAM,SAAS,EAGxB,GAAI,CAACF,GAAWvB,EAAM,OAAOyB,CAAK,EAChC,MAAM,IAAIC,EAAW,8CAA8C,EAGrE,OAAI1B,EAAM,cAAcyB,CAAK,GAAKzB,EAAM,aAAayB,CAAK,EACjDF,GAAW,OAAO,MAAS,WAAa,IAAI,KAAK,CAACE,CAAK,CAAC,EAAI,OAAO,KAAKA,CAAK,EAG/EA,CACT,CAYA,SAASJ,EAAeI,EAAOvB,EAAKE,EAAM,CACxC,IAAIK,EAAMgB,EAEV,GAAIA,GAAS,CAACrB,GAAQ,OAAOqB,GAAU,UACrC,GAAIzB,EAAM,SAASE,EAAK,IAAI,EAE1BA,EAAMiB,EAAajB,EAAMA,EAAI,MAAM,EAAG,EAAE,EAExCuB,EAAQ,KAAK,UAAUA,CAAK,UAE3BzB,EAAM,QAAQyB,CAAK,GAAKjB,GAAYiB,CAAK,IACxCzB,EAAM,WAAWyB,CAAK,GAAKzB,EAAM,SAASE,EAAK,IAAI,KAAOO,EAAMT,EAAM,QAAQyB,CAAK,GAGrF,OAAAvB,EAAMD,GAAeC,CAAG,EAExBO,EAAI,QAAQ,SAAckB,EAAIC,EAAO,CACnC,EAAE5B,EAAM,YAAY2B,CAAE,GAAKA,IAAO,OAASb,EAAS,OAElDQ,IAAY,GAAOnB,GAAU,CAACD,CAAG,EAAG0B,EAAOvB,CAAI,EAAKiB,IAAY,KAAOpB,EAAMA,EAAM,KACnFsB,EAAaG,CAAE,CACjB,CACF,CAAC,EACM,GAIX,OAAI7B,GAAY2B,CAAK,EACZ,IAGTX,EAAS,OAAOX,GAAUC,EAAMF,EAAKG,CAAI,EAAGmB,EAAaC,CAAK,CAAC,EAExD,GACT,CAEA,IAAMI,EAAQ,CAAC,EAETC,EAAiB,OAAO,OAAOpB,GAAY,CAC/C,eAAAW,EACA,aAAAG,EACA,YAAA1B,EACF,CAAC,EAED,SAASiC,EAAMN,EAAOrB,EAAM,CAC1B,GAAI,CAAAJ,EAAM,YAAYyB,CAAK,EAE3B,IAAII,EAAM,QAAQJ,CAAK,IAAM,GAC3B,MAAM,MAAM,kCAAoCrB,EAAK,KAAK,GAAG,CAAC,EAGhEyB,EAAM,KAAKJ,CAAK,EAEhBzB,EAAM,QAAQyB,EAAO,SAAcE,EAAIzB,EAAK,EAC3B,EAAEF,EAAM,YAAY2B,CAAE,GAAKA,IAAO,OAASP,EAAQ,KAChEN,EAAUa,EAAI3B,EAAM,SAASE,CAAG,EAAIA,EAAI,KAAK,EAAIA,EAAKE,EAAM0B,CAC9D,KAEe,IACbC,EAAMJ,EAAIvB,EAAOA,EAAK,OAAOF,CAAG,EAAI,CAACA,CAAG,CAAC,CAE7C,CAAC,EAED2B,EAAM,IAAI,EACZ,CAEA,GAAI,CAAC7B,EAAM,SAASa,CAAG,EACrB,MAAM,IAAI,UAAU,wBAAwB,EAG9C,OAAAkB,EAAMlB,CAAG,EAEFC,CACT,CAEA,IAAOkB,GAAQpB,GClNf,SAASqB,GAAOC,EAAK,CACnB,IAAMC,EAAU,CACd,IAAK,MACL,IAAK,MACL,IAAK,MACL,IAAK,MACL,IAAK,MACL,MAAO,IACP,MAAO,IACT,EACA,OAAO,mBAAmBD,CAAG,EAAE,QAAQ,mBAAoB,SAAkBE,EAAO,CAClF,OAAOD,EAAQC,CAAK,CACtB,CAAC,CACH,CAUA,SAASC,GAAqBC,EAAQC,EAAS,CAC7C,KAAK,OAAS,CAAC,EAEfD,GAAUE,GAAWF,EAAQ,KAAMC,CAAO,CAC5C,CAEA,IAAME,GAAYJ,GAAqB,UAEvCI,GAAU,OAAS,SAAgBC,EAAMC,EAAO,CAC9C,KAAK,OAAO,KAAK,CAACD,EAAMC,CAAK,CAAC,CAChC,EAEAF,GAAU,SAAW,SAAkBG,EAAS,CAC9C,IAAMC,EAAUD,EAAU,SAASD,EAAO,CACxC,OAAOC,EAAQ,KAAK,KAAMD,EAAOV,EAAM,CACzC,EAAIA,GAEJ,OAAO,KAAK,OAAO,IAAI,SAAca,EAAM,CACzC,OAAOD,EAAQC,EAAK,CAAC,CAAC,EAAI,IAAMD,EAAQC,EAAK,CAAC,CAAC,CACjD,EAAG,EAAE,EAAE,KAAK,GAAG,CACjB,EAEA,IAAOC,GAAQV,GC5Cf,SAASW,GAAOC,EAAK,CACnB,OAAO,mBAAmBA,CAAG,EAC3B,QAAQ,QAAS,GAAG,EACpB,QAAQ,OAAQ,GAAG,EACnB,QAAQ,QAAS,GAAG,EACpB,QAAQ,OAAQ,GAAG,CACvB,CAWe,SAARC,GAA0BC,EAAKC,EAAQC,EAAS,CAErD,GAAI,CAACD,EACH,OAAOD,EAGT,IAAMG,EAAUD,GAAWA,EAAQ,QAAUL,GAEzCO,EAAM,WAAWF,CAAO,IAC1BA,EAAU,CACR,UAAWA,CACb,GAGF,IAAMG,EAAcH,GAAWA,EAAQ,UAEnCI,EAUJ,GARID,EACFC,EAAmBD,EAAYJ,EAAQC,CAAO,EAE9CI,EAAmBF,EAAM,kBAAkBH,CAAM,EAC/CA,EAAO,SAAS,EAChB,IAAIM,GAAqBN,EAAQC,CAAO,EAAE,SAASC,CAAO,EAG1DG,EAAkB,CACpB,IAAME,EAAgBR,EAAI,QAAQ,GAAG,EAEjCQ,IAAkB,KACpBR,EAAMA,EAAI,MAAM,EAAGQ,CAAa,GAElCR,IAAQA,EAAI,QAAQ,GAAG,IAAM,GAAK,IAAM,KAAOM,CACjD,CAEA,OAAON,CACT,CC9DA,IAAMS,GAAN,KAAyB,CACvB,aAAc,CACZ,KAAK,SAAW,CAAC,CACnB,CAUA,IAAIC,EAAWC,EAAUC,EAAS,CAChC,YAAK,SAAS,KAAK,CACjB,UAAAF,EACA,SAAAC,EACA,YAAaC,EAAUA,EAAQ,YAAc,GAC7C,QAASA,EAAUA,EAAQ,QAAU,IACvC,CAAC,EACM,KAAK,SAAS,OAAS,CAChC,CASA,MAAMC,EAAI,CACJ,KAAK,SAASA,CAAE,IAClB,KAAK,SAASA,CAAE,EAAI,KAExB,CAOA,OAAQ,CACF,KAAK,WACP,KAAK,SAAW,CAAC,EAErB,CAYA,QAAQC,EAAI,CACVC,EAAM,QAAQ,KAAK,SAAU,SAAwBC,EAAG,CAClDA,IAAM,MACRF,EAAGE,CAAC,CAER,CAAC,CACH,CACF,EAEOC,GAAQR,GCpEf,IAAOS,GAAQ,CACb,kBAAmB,GACnB,kBAAmB,GACnB,oBAAqB,EACvB,ECHA,IAAOC,GAAQ,OAAO,iBAAoB,YAAc,gBAAkBC,GCD1E,IAAOC,GAAQ,OAAO,UAAa,YAAc,SAAW,KCA5D,IAAOC,GAAQ,OAAO,MAAS,YAAc,KAAO,KCEpD,IAAOC,GAAQ,CACb,UAAW,GACX,QAAS,CACP,gBAAAC,GACA,SAAAC,GACA,KAAAC,EACF,EACA,UAAW,CAAC,OAAQ,QAAS,OAAQ,OAAQ,MAAO,MAAM,CAC5D,ECZA,IAAAC,GAAA,GAAAC,GAAAD,GAAA,mBAAAE,GAAA,0BAAAC,GAAA,mCAAAC,GAAA,cAAAC,GAAA,WAAAC,KAAA,IAAMJ,GAAgB,OAAO,QAAW,aAAe,OAAO,UAAa,YAErEG,GAAa,OAAO,WAAc,UAAY,WAAa,OAmB3DF,GAAwBD,KAC3B,CAACG,IAAc,CAAC,cAAe,eAAgB,IAAI,EAAE,QAAQA,GAAW,OAAO,EAAI,GAWhFD,GAEF,OAAO,mBAAsB,aAE7B,gBAAgB,mBAChB,OAAO,KAAK,eAAkB,WAI5BE,GAASJ,IAAiB,OAAO,SAAS,MAAQ,mBCvCxD,IAAOK,EAAQC,IAAA,GACVC,IACAC,ICCU,SAARC,GAAkCC,EAAMC,EAAS,CACtD,OAAOC,GAAWF,EAAM,IAAIG,EAAS,QAAQ,gBAAmBC,EAAA,CAC9D,QAAS,SAASC,EAAOC,EAAKC,EAAMC,EAAS,CAC3C,OAAIL,EAAS,QAAUM,EAAM,SAASJ,CAAK,GACzC,KAAK,OAAOC,EAAKD,EAAM,SAAS,QAAQ,CAAC,EAClC,IAGFG,EAAQ,eAAe,MAAM,KAAM,SAAS,CACrD,GACGP,EACJ,CACH,CCPA,SAASS,GAAcC,EAAM,CAK3B,OAAOC,EAAM,SAAS,gBAAiBD,CAAI,EAAE,IAAIE,GACxCA,EAAM,CAAC,IAAM,KAAO,GAAKA,EAAM,CAAC,GAAKA,EAAM,CAAC,CACpD,CACH,CASA,SAASC,GAAcC,EAAK,CAC1B,IAAMC,EAAM,CAAC,EACPC,EAAO,OAAO,KAAKF,CAAG,EACxB,EACEG,EAAMD,EAAK,OACbE,EACJ,IAAK,EAAI,EAAG,EAAID,EAAK,IACnBC,EAAMF,EAAK,CAAC,EACZD,EAAIG,CAAG,EAAIJ,EAAII,CAAG,EAEpB,OAAOH,CACT,CASA,SAASI,GAAeC,EAAU,CAChC,SAASC,EAAUC,EAAMC,EAAOC,EAAQC,EAAO,CAC7C,IAAIf,EAAOY,EAAKG,GAAO,EAEvB,GAAIf,IAAS,YAAa,MAAO,GAEjC,IAAMgB,EAAe,OAAO,SAAS,CAAChB,CAAI,EACpCiB,EAASF,GAASH,EAAK,OAG7B,OAFAZ,EAAO,CAACA,GAAQC,EAAM,QAAQa,CAAM,EAAIA,EAAO,OAASd,EAEpDiB,GACEhB,EAAM,WAAWa,EAAQd,CAAI,EAC/Bc,EAAOd,CAAI,EAAI,CAACc,EAAOd,CAAI,EAAGa,CAAK,EAEnCC,EAAOd,CAAI,EAAIa,EAGV,CAACG,KAGN,CAACF,EAAOd,CAAI,GAAK,CAACC,EAAM,SAASa,EAAOd,CAAI,CAAC,KAC/Cc,EAAOd,CAAI,EAAI,CAAC,GAGHW,EAAUC,EAAMC,EAAOC,EAAOd,CAAI,EAAGe,CAAK,GAE3Cd,EAAM,QAAQa,EAAOd,CAAI,CAAC,IACtCc,EAAOd,CAAI,EAAIG,GAAcW,EAAOd,CAAI,CAAC,GAGpC,CAACgB,EACV,CAEA,GAAIf,EAAM,WAAWS,CAAQ,GAAKT,EAAM,WAAWS,EAAS,OAAO,EAAG,CACpE,IAAML,EAAM,CAAC,EAEb,OAAAJ,EAAM,aAAaS,EAAU,CAACV,EAAMa,IAAU,CAC5CF,EAAUZ,GAAcC,CAAI,EAAGa,EAAOR,EAAK,CAAC,CAC9C,CAAC,EAEMA,CACT,CAEA,OAAO,IACT,CAEA,IAAOa,GAAQT,GC1Ef,SAASU,GAAgBC,EAAUC,EAAQC,EAAS,CAClD,GAAIC,EAAM,SAASH,CAAQ,EACzB,GAAI,CACF,OAACC,GAAU,KAAK,OAAOD,CAAQ,EACxBG,EAAM,KAAKH,CAAQ,CAC5B,OAASI,EAAG,CACV,GAAIA,EAAE,OAAS,cACb,MAAMA,CAEV,CAGF,OAAQF,GAAW,KAAK,WAAWF,CAAQ,CAC7C,CAEA,IAAMK,GAAW,CAEf,aAAcC,GAEd,QAAS,CAAC,MAAO,OAAQ,OAAO,EAEhC,iBAAkB,CAAC,SAA0BC,EAAMC,EAAS,CAC1D,IAAMC,EAAcD,EAAQ,eAAe,GAAK,GAC1CE,EAAqBD,EAAY,QAAQ,kBAAkB,EAAI,GAC/DE,EAAkBR,EAAM,SAASI,CAAI,EAQ3C,GANII,GAAmBR,EAAM,WAAWI,CAAI,IAC1CA,EAAO,IAAI,SAASA,CAAI,GAGPJ,EAAM,WAAWI,CAAI,EAGtC,OAAOG,EAAqB,KAAK,UAAUE,GAAeL,CAAI,CAAC,EAAIA,EAGrE,GAAIJ,EAAM,cAAcI,CAAI,GAC1BJ,EAAM,SAASI,CAAI,GACnBJ,EAAM,SAASI,CAAI,GACnBJ,EAAM,OAAOI,CAAI,GACjBJ,EAAM,OAAOI,CAAI,GACjBJ,EAAM,iBAAiBI,CAAI,EAE3B,OAAOA,EAET,GAAIJ,EAAM,kBAAkBI,CAAI,EAC9B,OAAOA,EAAK,OAEd,GAAIJ,EAAM,kBAAkBI,CAAI,EAC9B,OAAAC,EAAQ,eAAe,kDAAmD,EAAK,EACxED,EAAK,SAAS,EAGvB,IAAIM,EAEJ,GAAIF,EAAiB,CACnB,GAAIF,EAAY,QAAQ,mCAAmC,EAAI,GAC7D,OAAOK,GAAiBP,EAAM,KAAK,cAAc,EAAE,SAAS,EAG9D,IAAKM,EAAaV,EAAM,WAAWI,CAAI,IAAME,EAAY,QAAQ,qBAAqB,EAAI,GAAI,CAC5F,IAAMM,EAAY,KAAK,KAAO,KAAK,IAAI,SAEvC,OAAOC,GACLH,EAAa,CAAC,UAAWN,CAAI,EAAIA,EACjCQ,GAAa,IAAIA,EACjB,KAAK,cACP,CACF,CACF,CAEA,OAAIJ,GAAmBD,GACrBF,EAAQ,eAAe,mBAAoB,EAAK,EACzCT,GAAgBQ,CAAI,GAGtBA,CACT,CAAC,EAED,kBAAmB,CAAC,SAA2BA,EAAM,CACnD,IAAMU,EAAe,KAAK,cAAgBZ,GAAS,aAC7Ca,EAAoBD,GAAgBA,EAAa,kBACjDE,EAAgB,KAAK,eAAiB,OAE5C,GAAIhB,EAAM,WAAWI,CAAI,GAAKJ,EAAM,iBAAiBI,CAAI,EACvD,OAAOA,EAGT,GAAIA,GAAQJ,EAAM,SAASI,CAAI,IAAOW,GAAqB,CAAC,KAAK,cAAiBC,GAAgB,CAEhG,IAAMC,EAAoB,EADAH,GAAgBA,EAAa,oBACPE,EAEhD,GAAI,CACF,OAAO,KAAK,MAAMZ,EAAM,KAAK,YAAY,CAC3C,OAASH,EAAG,CACV,GAAIgB,EACF,MAAIhB,EAAE,OAAS,cACPiB,EAAW,KAAKjB,EAAGiB,EAAW,iBAAkB,KAAM,KAAM,KAAK,QAAQ,EAE3EjB,CAEV,CACF,CAEA,OAAOG,CACT,CAAC,EAMD,QAAS,EAET,eAAgB,aAChB,eAAgB,eAEhB,iBAAkB,GAClB,cAAe,GAEf,IAAK,CACH,SAAUe,EAAS,QAAQ,SAC3B,KAAMA,EAAS,QAAQ,IACzB,EAEA,eAAgB,SAAwBC,EAAQ,CAC9C,OAAOA,GAAU,KAAOA,EAAS,GACnC,EAEA,QAAS,CACP,OAAQ,CACN,OAAU,oCACV,eAAgB,MAClB,CACF,CACF,EAEApB,EAAM,QAAQ,CAAC,SAAU,MAAO,OAAQ,OAAQ,MAAO,OAAO,EAAIqB,GAAW,CAC3EnB,GAAS,QAAQmB,CAAM,EAAI,CAAC,CAC9B,CAAC,EAED,IAAOC,GAAQpB,GC1Jf,IAAMqB,GAAoBC,EAAM,YAAY,CAC1C,MAAO,gBAAiB,iBAAkB,eAAgB,OAC1D,UAAW,OAAQ,OAAQ,oBAAqB,sBAChD,gBAAiB,WAAY,eAAgB,sBAC7C,UAAW,cAAe,YAC5B,CAAC,EAgBMC,GAAQC,GAAc,CAC3B,IAAMC,EAAS,CAAC,EACZC,EACAC,EACAC,EAEJ,OAAAJ,GAAcA,EAAW,MAAM,IAAI,EAAE,QAAQ,SAAgBK,EAAM,CACjED,EAAIC,EAAK,QAAQ,GAAG,EACpBH,EAAMG,EAAK,UAAU,EAAGD,CAAC,EAAE,KAAK,EAAE,YAAY,EAC9CD,EAAME,EAAK,UAAUD,EAAI,CAAC,EAAE,KAAK,EAE7B,GAACF,GAAQD,EAAOC,CAAG,GAAKL,GAAkBK,CAAG,KAI7CA,IAAQ,aACND,EAAOC,CAAG,EACZD,EAAOC,CAAG,EAAE,KAAKC,CAAG,EAEpBF,EAAOC,CAAG,EAAI,CAACC,CAAG,EAGpBF,EAAOC,CAAG,EAAID,EAAOC,CAAG,EAAID,EAAOC,CAAG,EAAI,KAAOC,EAAMA,EAE3D,CAAC,EAEMF,CACT,ECjDA,IAAMK,GAAa,OAAO,WAAW,EAErC,SAASC,GAAgBC,EAAQ,CAC/B,OAAOA,GAAU,OAAOA,CAAM,EAAE,KAAK,EAAE,YAAY,CACrD,CAEA,SAASC,GAAeC,EAAO,CAC7B,OAAIA,IAAU,IAASA,GAAS,KACvBA,EAGFC,EAAM,QAAQD,CAAK,EAAIA,EAAM,IAAID,EAAc,EAAI,OAAOC,CAAK,CACxE,CAEA,SAASE,GAAYC,EAAK,CACxB,IAAMC,EAAS,OAAO,OAAO,IAAI,EAC3BC,EAAW,mCACbC,EAEJ,KAAQA,EAAQD,EAAS,KAAKF,CAAG,GAC/BC,EAAOE,EAAM,CAAC,CAAC,EAAIA,EAAM,CAAC,EAG5B,OAAOF,CACT,CAEA,IAAMG,GAAqBJ,GAAQ,iCAAiC,KAAKA,EAAI,KAAK,CAAC,EAEnF,SAASK,GAAiBC,EAAST,EAAOF,EAAQY,EAAQC,EAAoB,CAC5E,GAAIV,EAAM,WAAWS,CAAM,EACzB,OAAOA,EAAO,KAAK,KAAMV,EAAOF,CAAM,EAOxC,GAJIa,IACFX,EAAQF,GAGN,EAACG,EAAM,SAASD,CAAK,EAEzB,IAAIC,EAAM,SAASS,CAAM,EACvB,OAAOV,EAAM,QAAQU,CAAM,IAAM,GAGnC,GAAIT,EAAM,SAASS,CAAM,EACvB,OAAOA,EAAO,KAAKV,CAAK,EAE5B,CAEA,SAASY,GAAad,EAAQ,CAC5B,OAAOA,EAAO,KAAK,EAChB,YAAY,EAAE,QAAQ,kBAAmB,CAACe,EAAGC,EAAMX,IAC3CW,EAAK,YAAY,EAAIX,CAC7B,CACL,CAEA,SAASY,GAAeC,EAAKlB,EAAQ,CACnC,IAAMmB,EAAehB,EAAM,YAAY,IAAMH,CAAM,EAEnD,CAAC,MAAO,MAAO,KAAK,EAAE,QAAQoB,GAAc,CAC1C,OAAO,eAAeF,EAAKE,EAAaD,EAAc,CACpD,MAAO,SAASE,EAAMC,EAAMC,EAAM,CAChC,OAAO,KAAKH,CAAU,EAAE,KAAK,KAAMpB,EAAQqB,EAAMC,EAAMC,CAAI,CAC7D,EACA,aAAc,EAChB,CAAC,CACH,CAAC,CACH,CAEA,IAAMC,GAAN,KAAmB,CACjB,YAAYC,EAAS,CACnBA,GAAW,KAAK,IAAIA,CAAO,CAC7B,CAEA,IAAIzB,EAAQ0B,EAAgBC,EAAS,CACnC,IAAMC,EAAO,KAEb,SAASC,EAAUC,EAAQC,EAASC,EAAU,CAC5C,IAAMC,EAAUlC,GAAgBgC,CAAO,EAEvC,GAAI,CAACE,EACH,MAAM,IAAI,MAAM,wCAAwC,EAG1D,IAAMC,EAAM/B,EAAM,QAAQyB,EAAMK,CAAO,GAEpC,CAACC,GAAON,EAAKM,CAAG,IAAM,QAAaF,IAAa,IAASA,IAAa,QAAaJ,EAAKM,CAAG,IAAM,MAClGN,EAAKM,GAAOH,CAAO,EAAI9B,GAAe6B,CAAM,EAEhD,CAEA,IAAMK,EAAa,CAACV,EAASO,IAC3B7B,EAAM,QAAQsB,EAAS,CAACK,EAAQC,IAAYF,EAAUC,EAAQC,EAASC,CAAQ,CAAC,EAElF,GAAI7B,EAAM,cAAcH,CAAM,GAAKA,aAAkB,KAAK,YACxDmC,EAAWnC,EAAQ0B,CAAc,UACzBvB,EAAM,SAASH,CAAM,IAAMA,EAASA,EAAO,KAAK,IAAM,CAACS,GAAkBT,CAAM,EACvFmC,EAAWC,GAAapC,CAAM,EAAG0B,CAAc,UACtCvB,EAAM,SAASH,CAAM,GAAKG,EAAM,WAAWH,CAAM,EAAG,CAC7D,IAAIkB,EAAM,CAAC,EAAGmB,EAAMH,EACpB,QAAWI,KAAStC,EAAQ,CAC1B,GAAI,CAACG,EAAM,QAAQmC,CAAK,EACtB,MAAM,UAAU,8CAA8C,EAGhEpB,EAAIgB,EAAMI,EAAM,CAAC,CAAC,GAAKD,EAAOnB,EAAIgB,CAAG,GAClC/B,EAAM,QAAQkC,CAAI,EAAI,CAAC,GAAGA,EAAMC,EAAM,CAAC,CAAC,EAAI,CAACD,EAAMC,EAAM,CAAC,CAAC,EAAKA,EAAM,CAAC,CAC5E,CAEAH,EAAWjB,EAAKQ,CAAc,CAChC,MACE1B,GAAU,MAAQ6B,EAAUH,EAAgB1B,EAAQ2B,CAAO,EAG7D,OAAO,IACT,CAEA,IAAI3B,EAAQuC,EAAQ,CAGlB,GAFAvC,EAASD,GAAgBC,CAAM,EAE3BA,EAAQ,CACV,IAAMkC,EAAM/B,EAAM,QAAQ,KAAMH,CAAM,EAEtC,GAAIkC,EAAK,CACP,IAAMhC,EAAQ,KAAKgC,CAAG,EAEtB,GAAI,CAACK,EACH,OAAOrC,EAGT,GAAIqC,IAAW,GACb,OAAOnC,GAAYF,CAAK,EAG1B,GAAIC,EAAM,WAAWoC,CAAM,EACzB,OAAOA,EAAO,KAAK,KAAMrC,EAAOgC,CAAG,EAGrC,GAAI/B,EAAM,SAASoC,CAAM,EACvB,OAAOA,EAAO,KAAKrC,CAAK,EAG1B,MAAM,IAAI,UAAU,wCAAwC,CAC9D,CACF,CACF,CAEA,IAAIF,EAAQwC,EAAS,CAGnB,GAFAxC,EAASD,GAAgBC,CAAM,EAE3BA,EAAQ,CACV,IAAMkC,EAAM/B,EAAM,QAAQ,KAAMH,CAAM,EAEtC,MAAO,CAAC,EAAEkC,GAAO,KAAKA,CAAG,IAAM,SAAc,CAACM,GAAW9B,GAAiB,KAAM,KAAKwB,CAAG,EAAGA,EAAKM,CAAO,GACzG,CAEA,MAAO,EACT,CAEA,OAAOxC,EAAQwC,EAAS,CACtB,IAAMZ,EAAO,KACTa,EAAU,GAEd,SAASC,EAAaX,EAAS,CAG7B,GAFAA,EAAUhC,GAAgBgC,CAAO,EAE7BA,EAAS,CACX,IAAMG,EAAM/B,EAAM,QAAQyB,EAAMG,CAAO,EAEnCG,IAAQ,CAACM,GAAW9B,GAAiBkB,EAAMA,EAAKM,CAAG,EAAGA,EAAKM,CAAO,KACpE,OAAOZ,EAAKM,CAAG,EAEfO,EAAU,GAEd,CACF,CAEA,OAAItC,EAAM,QAAQH,CAAM,EACtBA,EAAO,QAAQ0C,CAAY,EAE3BA,EAAa1C,CAAM,EAGdyC,CACT,CAEA,MAAMD,EAAS,CACb,IAAMG,EAAO,OAAO,KAAK,IAAI,EACzB,EAAIA,EAAK,OACTF,EAAU,GAEd,KAAO,KAAK,CACV,IAAMP,EAAMS,EAAK,CAAC,GACf,CAACH,GAAW9B,GAAiB,KAAM,KAAKwB,CAAG,EAAGA,EAAKM,EAAS,EAAI,KACjE,OAAO,KAAKN,CAAG,EACfO,EAAU,GAEd,CAEA,OAAOA,CACT,CAEA,UAAUG,EAAQ,CAChB,IAAMhB,EAAO,KACPH,EAAU,CAAC,EAEjB,OAAAtB,EAAM,QAAQ,KAAM,CAACD,EAAOF,IAAW,CACrC,IAAMkC,EAAM/B,EAAM,QAAQsB,EAASzB,CAAM,EAEzC,GAAIkC,EAAK,CACPN,EAAKM,CAAG,EAAIjC,GAAeC,CAAK,EAChC,OAAO0B,EAAK5B,CAAM,EAClB,MACF,CAEA,IAAM6C,EAAaD,EAAS9B,GAAad,CAAM,EAAI,OAAOA,CAAM,EAAE,KAAK,EAEnE6C,IAAe7C,GACjB,OAAO4B,EAAK5B,CAAM,EAGpB4B,EAAKiB,CAAU,EAAI5C,GAAeC,CAAK,EAEvCuB,EAAQoB,CAAU,EAAI,EACxB,CAAC,EAEM,IACT,CAEA,UAAUC,EAAS,CACjB,OAAO,KAAK,YAAY,OAAO,KAAM,GAAGA,CAAO,CACjD,CAEA,OAAOC,EAAW,CAChB,IAAM7B,EAAM,OAAO,OAAO,IAAI,EAE9B,OAAAf,EAAM,QAAQ,KAAM,CAACD,EAAOF,IAAW,CACrCE,GAAS,MAAQA,IAAU,KAAUgB,EAAIlB,CAAM,EAAI+C,GAAa5C,EAAM,QAAQD,CAAK,EAAIA,EAAM,KAAK,IAAI,EAAIA,EAC5G,CAAC,EAEMgB,CACT,CAEA,CAAC,OAAO,QAAQ,GAAI,CAClB,OAAO,OAAO,QAAQ,KAAK,OAAO,CAAC,EAAE,OAAO,QAAQ,EAAE,CACxD,CAEA,UAAW,CACT,OAAO,OAAO,QAAQ,KAAK,OAAO,CAAC,EAAE,IAAI,CAAC,CAAClB,EAAQE,CAAK,IAAMF,EAAS,KAAOE,CAAK,EAAE,KAAK,IAAI,CAChG,CAEA,cAAe,CACb,OAAO,KAAK,IAAI,YAAY,GAAK,CAAC,CACpC,CAEA,IAAK,OAAO,WAAW,GAAI,CACzB,MAAO,cACT,CAEA,OAAO,KAAK8C,EAAO,CACjB,OAAOA,aAAiB,KAAOA,EAAQ,IAAI,KAAKA,CAAK,CACvD,CAEA,OAAO,OAAOC,KAAUH,EAAS,CAC/B,IAAMI,EAAW,IAAI,KAAKD,CAAK,EAE/B,OAAAH,EAAQ,QAASK,GAAWD,EAAS,IAAIC,CAAM,CAAC,EAEzCD,CACT,CAEA,OAAO,SAASlD,EAAQ,CAKtB,IAAMoD,GAJY,KAAKtD,EAAU,EAAK,KAAKA,EAAU,EAAI,CACvD,UAAW,CAAC,CACd,GAE4B,UACtBuD,EAAY,KAAK,UAEvB,SAASC,EAAevB,EAAS,CAC/B,IAAME,EAAUlC,GAAgBgC,CAAO,EAElCqB,EAAUnB,CAAO,IACpBhB,GAAeoC,EAAWtB,CAAO,EACjCqB,EAAUnB,CAAO,EAAI,GAEzB,CAEA,OAAA9B,EAAM,QAAQH,CAAM,EAAIA,EAAO,QAAQsD,CAAc,EAAIA,EAAetD,CAAM,EAEvE,IACT,CACF,EAEAwB,GAAa,SAAS,CAAC,eAAgB,iBAAkB,SAAU,kBAAmB,aAAc,eAAe,CAAC,EAGpHrB,EAAM,kBAAkBqB,GAAa,UAAW,CAAC,CAAC,MAAAtB,CAAK,EAAGgC,IAAQ,CAChE,IAAIqB,EAASrB,EAAI,CAAC,EAAE,YAAY,EAAIA,EAAI,MAAM,CAAC,EAC/C,MAAO,CACL,IAAK,IAAMhC,EACX,IAAIsD,EAAa,CACf,KAAKD,CAAM,EAAIC,CACjB,CACF,CACF,CAAC,EAEDrD,EAAM,cAAcqB,EAAY,EAEhC,IAAOiC,EAAQjC,GC3SA,SAARkC,GAA+BC,EAAKC,EAAU,CACnD,IAAMC,EAAS,MAAQC,GACjBC,EAAUH,GAAYC,EACtBG,EAAUC,EAAa,KAAKF,EAAQ,OAAO,EAC7CG,EAAOH,EAAQ,KAEnB,OAAAI,EAAM,QAAQR,EAAK,SAAmBS,EAAI,CACxCF,EAAOE,EAAG,KAAKP,EAAQK,EAAMF,EAAQ,UAAU,EAAGJ,EAAWA,EAAS,OAAS,MAAS,CAC1F,CAAC,EAEDI,EAAQ,UAAU,EAEXE,CACT,CCzBe,SAARG,GAA0BC,EAAO,CACtC,MAAO,CAAC,EAAEA,GAASA,EAAM,WAC3B,CCUA,SAASC,GAAcC,EAASC,EAAQC,EAAS,CAE/CC,EAAW,KAAK,KAAMH,GAAW,KAAO,WAAaA,EAASG,EAAW,aAAcF,EAAQC,CAAO,EACtG,KAAK,KAAO,eACd,CAEAE,EAAM,SAASL,GAAeI,EAAY,CACxC,WAAY,EACd,CAAC,EAED,IAAOE,GAAQN,GCXA,SAARO,GAAwBC,EAASC,EAAQC,EAAU,CACxD,IAAMC,EAAiBD,EAAS,OAAO,eACnC,CAACA,EAAS,QAAU,CAACC,GAAkBA,EAAeD,EAAS,MAAM,EACvEF,EAAQE,CAAQ,EAEhBD,EAAO,IAAIG,EACT,mCAAqCF,EAAS,OAC9C,CAACE,EAAW,gBAAiBA,EAAW,gBAAgB,EAAE,KAAK,MAAMF,EAAS,OAAS,GAAG,EAAI,CAAC,EAC/FA,EAAS,OACTA,EAAS,QACTA,CACF,CAAC,CAEL,CCxBe,SAARG,GAA+BC,EAAK,CACzC,IAAMC,EAAQ,4BAA4B,KAAKD,CAAG,EAClD,OAAOC,GAASA,EAAM,CAAC,GAAK,EAC9B,CCGA,SAASC,GAAYC,EAAcC,EAAK,CACtCD,EAAeA,GAAgB,GAC/B,IAAME,EAAQ,IAAI,MAAMF,CAAY,EAC9BG,EAAa,IAAI,MAAMH,CAAY,EACrCI,EAAO,EACPC,EAAO,EACPC,EAEJ,OAAAL,EAAMA,IAAQ,OAAYA,EAAM,IAEzB,SAAcM,EAAa,CAChC,IAAMC,EAAM,KAAK,IAAI,EAEfC,EAAYN,EAAWE,CAAI,EAE5BC,IACHA,EAAgBE,GAGlBN,EAAME,CAAI,EAAIG,EACdJ,EAAWC,CAAI,EAAII,EAEnB,IAAIE,EAAIL,EACJM,EAAa,EAEjB,KAAOD,IAAMN,GACXO,GAAcT,EAAMQ,GAAG,EACvBA,EAAIA,EAAIV,EASV,GANAI,GAAQA,EAAO,GAAKJ,EAEhBI,IAASC,IACXA,GAAQA,EAAO,GAAKL,GAGlBQ,EAAMF,EAAgBL,EACxB,OAGF,IAAMW,EAASH,GAAaD,EAAMC,EAElC,OAAOG,EAAS,KAAK,MAAMD,EAAa,IAAOC,CAAM,EAAI,MAC3D,CACF,CAEA,IAAOC,GAAQd,GChDf,SAASe,GAASC,EAAIC,EAAM,CAC1B,IAAIC,EAAY,EACZC,EAAY,IAAOF,EACnBG,EACAC,EAEEC,EAAS,CAACC,EAAMC,EAAM,KAAK,IAAI,IAAM,CACzCN,EAAYM,EACZJ,EAAW,KACPC,IACF,aAAaA,CAAK,EAClBA,EAAQ,MAEVL,EAAG,GAAGO,CAAI,CACZ,EAoBA,MAAO,CAlBW,IAAIA,IAAS,CAC7B,IAAMC,EAAM,KAAK,IAAI,EACfC,EAASD,EAAMN,EAChBO,GAAUN,EACbG,EAAOC,EAAMC,CAAG,GAEhBJ,EAAWG,EACNF,IACHA,EAAQ,WAAW,IAAM,CACvBA,EAAQ,KACRC,EAAOF,CAAQ,CACjB,EAAGD,EAAYM,CAAM,GAG3B,EAEc,IAAML,GAAYE,EAAOF,CAAQ,CAEvB,CAC1B,CAEA,IAAOM,GAAQX,GCvCR,IAAMY,GAAuB,CAACC,EAAUC,EAAkBC,EAAO,IAAM,CAC5E,IAAIC,EAAgB,EACdC,EAAeC,GAAY,GAAI,GAAG,EAExC,OAAOC,GAASC,GAAK,CACnB,IAAMC,EAASD,EAAE,OACXE,EAAQF,EAAE,iBAAmBA,EAAE,MAAQ,OACvCG,EAAgBF,EAASL,EACzBQ,EAAOP,EAAaM,CAAa,EACjCE,EAAUJ,GAAUC,EAE1BN,EAAgBK,EAEhB,IAAMK,EAAO,CACX,OAAAL,EACA,MAAAC,EACA,SAAUA,EAASD,EAASC,EAAS,OACrC,MAAOC,EACP,KAAMC,GAAc,OACpB,UAAWA,GAAQF,GAASG,GAAWH,EAAQD,GAAUG,EAAO,OAChE,MAAOJ,EACP,iBAAkBE,GAAS,KAC3B,CAACR,EAAmB,WAAa,QAAQ,EAAG,EAC9C,EAEAD,EAASa,CAAI,CACf,EAAGX,CAAI,CACT,EAEaY,GAAyB,CAACL,EAAOM,IAAc,CAC1D,IAAMC,EAAmBP,GAAS,KAElC,MAAO,CAAED,GAAWO,EAAU,CAAC,EAAE,CAC/B,iBAAAC,EACA,MAAAP,EACA,OAAAD,CACF,CAAC,EAAGO,EAAU,CAAC,CAAC,CAClB,EAEaE,GAAkBC,GAAO,IAAIC,IAASC,EAAM,KAAK,IAAMF,EAAG,GAAGC,CAAI,CAAC,ECzC/E,IAAOE,GAAQC,EAAS,uBAAyB,CAACC,EAAQC,IAAYC,IACpEA,EAAM,IAAI,IAAIA,EAAKH,EAAS,MAAM,EAGhCC,EAAO,WAAaE,EAAI,UACxBF,EAAO,OAASE,EAAI,OACnBD,GAAUD,EAAO,OAASE,EAAI,QAGjC,IAAI,IAAIH,EAAS,MAAM,EACvBA,EAAS,WAAa,kBAAkB,KAAKA,EAAS,UAAU,SAAS,CAC3E,EAAI,IAAM,GCVV,IAAOI,GAAQC,EAAS,sBAGtB,CACE,MAAMC,EAAMC,EAAOC,EAASC,EAAMC,EAAQC,EAAQC,EAAU,CAC1D,GAAI,OAAO,UAAa,YAAa,OAErC,IAAMC,EAAS,CAAC,GAAG,OAAAP,EAAI,KAAI,0BAAmBC,CAAK,EAAG,EAElDO,EAAM,SAASN,CAAO,GACxBK,EAAO,KAAK,WAAW,WAAI,KAAKL,CAAO,EAAE,YAAY,EAAG,EAEtDM,EAAM,SAASL,CAAI,GACrBI,EAAO,KAAK,QAAQ,OAAAJ,EAAM,EAExBK,EAAM,SAASJ,CAAM,GACvBG,EAAO,KAAK,UAAU,OAAAH,EAAQ,EAE5BC,IAAW,IACbE,EAAO,KAAK,QAAQ,EAElBC,EAAM,SAASF,CAAQ,GACzBC,EAAO,KAAK,YAAY,OAAAD,EAAU,EAGpC,SAAS,OAASC,EAAO,KAAK,IAAI,CACpC,EAEA,KAAKP,EAAM,CACT,GAAI,OAAO,UAAa,YAAa,OAAO,KAC5C,IAAMS,EAAQ,SAAS,OAAO,MAAM,IAAI,OAAO,WAAaT,EAAO,UAAU,CAAC,EAC9E,OAAOS,EAAQ,mBAAmBA,EAAM,CAAC,CAAC,EAAI,IAChD,EAEA,OAAOT,EAAM,CACX,KAAK,MAAMA,EAAM,GAAI,KAAK,IAAI,EAAI,MAAU,GAAG,CACjD,CACF,EAKA,CACE,OAAQ,CAAC,EACT,MAAO,CACL,OAAO,IACT,EACA,QAAS,CAAC,CACZ,EC1Ca,SAARU,GAA+BC,EAAK,CAIzC,MAAO,8BAA8B,KAAKA,CAAG,CAC/C,CCJe,SAARC,GAA6BC,EAASC,EAAa,CACxD,OAAOA,EACHD,EAAQ,QAAQ,SAAU,EAAE,EAAI,IAAMC,EAAY,QAAQ,OAAQ,EAAE,EACpED,CACN,CCCe,SAARE,GAA+BC,EAASC,EAAcC,EAAmB,CAC9E,IAAIC,EAAgB,CAACC,GAAcH,CAAY,EAC/C,OAAID,IAAYG,GAAiBD,GAAqB,IAC7CG,GAAYL,EAASC,CAAY,EAEnCA,CACT,CChBA,IAAMK,GAAmBC,GAAUA,aAAiBC,EAAeC,EAAA,GAAKF,GAAUA,EAWnE,SAARG,GAA6BC,EAASC,EAAS,CAEpDA,EAAUA,GAAW,CAAC,EACtB,IAAMC,EAAS,CAAC,EAEhB,SAASC,EAAeC,EAAQC,EAAQC,EAAMC,EAAU,CACtD,OAAIC,EAAM,cAAcJ,CAAM,GAAKI,EAAM,cAAcH,CAAM,EACpDG,EAAM,MAAM,KAAK,CAAC,SAAAD,CAAQ,EAAGH,EAAQC,CAAM,EACzCG,EAAM,cAAcH,CAAM,EAC5BG,EAAM,MAAM,CAAC,EAAGH,CAAM,EACpBG,EAAM,QAAQH,CAAM,EACtBA,EAAO,MAAM,EAEfA,CACT,CAGA,SAASI,EAAoBC,EAAGC,EAAGL,EAAMC,EAAU,CACjD,GAAKC,EAAM,YAAYG,CAAC,GAEjB,GAAI,CAACH,EAAM,YAAYE,CAAC,EAC7B,OAAOP,EAAe,OAAWO,EAAGJ,EAAMC,CAAQ,MAFlD,QAAOJ,EAAeO,EAAGC,EAAGL,EAAMC,CAAQ,CAI9C,CAGA,SAASK,EAAiBF,EAAGC,EAAG,CAC9B,GAAI,CAACH,EAAM,YAAYG,CAAC,EACtB,OAAOR,EAAe,OAAWQ,CAAC,CAEtC,CAGA,SAASE,EAAiBH,EAAGC,EAAG,CAC9B,GAAKH,EAAM,YAAYG,CAAC,GAEjB,GAAI,CAACH,EAAM,YAAYE,CAAC,EAC7B,OAAOP,EAAe,OAAWO,CAAC,MAFlC,QAAOP,EAAe,OAAWQ,CAAC,CAItC,CAGA,SAASG,EAAgBJ,EAAGC,EAAGL,EAAM,CACnC,GAAIA,KAAQL,EACV,OAAOE,EAAeO,EAAGC,CAAC,EACrB,GAAIL,KAAQN,EACjB,OAAOG,EAAe,OAAWO,CAAC,CAEtC,CAEA,IAAMK,EAAW,CACf,IAAKH,EACL,OAAQA,EACR,KAAMA,EACN,QAASC,EACT,iBAAkBA,EAClB,kBAAmBA,EACnB,iBAAkBA,EAClB,QAASA,EACT,eAAgBA,EAChB,gBAAiBA,EACjB,cAAeA,EACf,QAASA,EACT,aAAcA,EACd,eAAgBA,EAChB,eAAgBA,EAChB,iBAAkBA,EAClB,mBAAoBA,EACpB,WAAYA,EACZ,iBAAkBA,EAClB,cAAeA,EACf,eAAgBA,EAChB,UAAWA,EACX,UAAWA,EACX,WAAYA,EACZ,YAAaA,EACb,WAAYA,EACZ,iBAAkBA,EAClB,eAAgBC,EAChB,QAAS,CAACJ,EAAGC,EAAGL,IAASG,EAAoBd,GAAgBe,CAAC,EAAGf,GAAgBgB,CAAC,EAAGL,EAAM,EAAI,CACjG,EAEA,OAAAE,EAAM,QAAQ,OAAO,KAAKV,IAAA,GAAIE,GAAYC,EAAQ,EAAG,SAA4BK,EAAM,CACrF,IAAMU,EAAQD,EAAST,CAAI,GAAKG,EAC1BQ,EAAcD,EAAMhB,EAAQM,CAAI,EAAGL,EAAQK,CAAI,EAAGA,CAAI,EAC3DE,EAAM,YAAYS,CAAW,GAAKD,IAAUF,IAAqBZ,EAAOI,CAAI,EAAIW,EACnF,CAAC,EAEMf,CACT,CChGA,IAAOgB,GAASC,GAAW,CACzB,IAAMC,EAAYC,GAAY,CAAC,EAAGF,CAAM,EAEpC,CAAE,KAAAG,EAAM,cAAAC,EAAe,eAAAC,EAAgB,eAAAC,EAAgB,QAAAC,EAAS,KAAAC,CAAK,EAAIP,EAa7E,GAXAA,EAAU,QAAUM,EAAUE,EAAa,KAAKF,CAAO,EAEvDN,EAAU,IAAMS,GAASC,GAAcV,EAAU,QAASA,EAAU,IAAKA,EAAU,iBAAiB,EAAGD,EAAO,OAAQA,EAAO,gBAAgB,EAGzIQ,GACFD,EAAQ,IAAI,gBAAiB,SAC3B,MAAMC,EAAK,UAAY,IAAM,KAAOA,EAAK,SAAW,SAAS,mBAAmBA,EAAK,QAAQ,CAAC,EAAI,GAAG,CACvG,EAGEI,EAAM,WAAWT,CAAI,GACvB,GAAIU,EAAS,uBAAyBA,EAAS,+BAC7CN,EAAQ,eAAe,MAAS,UACvBK,EAAM,WAAWT,EAAK,UAAU,EAAG,CAE5C,IAAMW,EAAcX,EAAK,WAAW,EAE9BY,EAAiB,CAAC,eAAgB,gBAAgB,EACxD,OAAO,QAAQD,CAAW,EAAE,QAAQ,CAAC,CAACE,EAAKC,CAAG,IAAM,CAC9CF,EAAe,SAASC,EAAI,YAAY,CAAC,GAC3CT,EAAQ,IAAIS,EAAKC,CAAG,CAExB,CAAC,CACH,EAOF,GAAIJ,EAAS,wBACXT,GAAiBQ,EAAM,WAAWR,CAAa,IAAMA,EAAgBA,EAAcH,CAAS,GAExFG,GAAkBA,IAAkB,IAASc,GAAgBjB,EAAU,GAAG,GAAI,CAEhF,IAAMkB,EAAYd,GAAkBC,GAAkBc,GAAQ,KAAKd,CAAc,EAE7Ea,GACFZ,EAAQ,IAAIF,EAAgBc,CAAS,CAEzC,CAGF,OAAOlB,CACT,EChDA,IAAMoB,GAAwB,OAAO,gBAAmB,YAEjDC,GAAQD,IAAyB,SAAUE,EAAQ,CACxD,OAAO,IAAI,QAAQ,SAA4BC,EAASC,EAAQ,CAC9D,IAAMC,EAAUC,GAAcJ,CAAM,EAChCK,EAAcF,EAAQ,KACpBG,EAAiBC,EAAa,KAAKJ,EAAQ,OAAO,EAAE,UAAU,EAChE,CAAC,aAAAK,EAAc,iBAAAC,EAAkB,mBAAAC,CAAkB,EAAIP,EACvDQ,EACAC,EAAiBC,EACjBC,EAAaC,EAEjB,SAASC,GAAO,CACdF,GAAeA,EAAY,EAC3BC,GAAiBA,EAAc,EAE/BZ,EAAQ,aAAeA,EAAQ,YAAY,YAAYQ,CAAU,EAEjER,EAAQ,QAAUA,EAAQ,OAAO,oBAAoB,QAASQ,CAAU,CAC1E,CAEA,IAAIM,EAAU,IAAI,eAElBA,EAAQ,KAAKd,EAAQ,OAAO,YAAY,EAAGA,EAAQ,IAAK,EAAI,EAG5Dc,EAAQ,QAAUd,EAAQ,QAE1B,SAASe,GAAY,CACnB,GAAI,CAACD,EACH,OAGF,IAAME,EAAkBZ,EAAa,KACnC,0BAA2BU,GAAWA,EAAQ,sBAAsB,CACtE,EAGMG,EAAW,CACf,KAHmB,CAACZ,GAAgBA,IAAiB,QAAUA,IAAiB,OAChFS,EAAQ,aAAeA,EAAQ,SAG/B,OAAQA,EAAQ,OAChB,WAAYA,EAAQ,WACpB,QAASE,EACT,OAAAnB,EACA,QAAAiB,CACF,EAEAI,GAAO,SAAkBC,EAAO,CAC9BrB,EAAQqB,CAAK,EACbN,EAAK,CACP,EAAG,SAAiBO,EAAK,CACvBrB,EAAOqB,CAAG,EACVP,EAAK,CACP,EAAGI,CAAQ,EAGXH,EAAU,IACZ,CAEI,cAAeA,EAEjBA,EAAQ,UAAYC,EAGpBD,EAAQ,mBAAqB,UAAsB,CAC7C,CAACA,GAAWA,EAAQ,aAAe,GAQnCA,EAAQ,SAAW,GAAK,EAAEA,EAAQ,aAAeA,EAAQ,YAAY,QAAQ,OAAO,IAAM,IAK9F,WAAWC,CAAS,CACtB,EAIFD,EAAQ,QAAU,UAAuB,CAClCA,IAILf,EAAO,IAAIsB,EAAW,kBAAmBA,EAAW,aAAcxB,EAAQiB,CAAO,CAAC,EAGlFA,EAAU,KACZ,EAGFA,EAAQ,QAAU,SAAqBQ,EAAO,CAIzC,IAAMC,EAAMD,GAASA,EAAM,QAAUA,EAAM,QAAU,gBAC/CF,EAAM,IAAIC,EAAWE,EAAKF,EAAW,YAAaxB,EAAQiB,CAAO,EAEvEM,EAAI,MAAQE,GAAS,KACrBvB,EAAOqB,CAAG,EACVN,EAAU,IACb,EAGAA,EAAQ,UAAY,UAAyB,CAC3C,IAAIU,EAAsBxB,EAAQ,QAAU,cAAgBA,EAAQ,QAAU,cAAgB,mBACxFyB,EAAezB,EAAQ,cAAgB0B,GACzC1B,EAAQ,sBACVwB,EAAsBxB,EAAQ,qBAEhCD,EAAO,IAAIsB,EACTG,EACAC,EAAa,oBAAsBJ,EAAW,UAAYA,EAAW,aACrExB,EACAiB,CAAO,CAAC,EAGVA,EAAU,IACZ,EAGAZ,IAAgB,QAAaC,EAAe,eAAe,IAAI,EAG3D,qBAAsBW,GACxBa,EAAM,QAAQxB,EAAe,OAAO,EAAG,SAA0ByB,EAAKC,EAAK,CACzEf,EAAQ,iBAAiBe,EAAKD,CAAG,CACnC,CAAC,EAIED,EAAM,YAAY3B,EAAQ,eAAe,IAC5Cc,EAAQ,gBAAkB,CAAC,CAACd,EAAQ,iBAIlCK,GAAgBA,IAAiB,SACnCS,EAAQ,aAAed,EAAQ,cAI7BO,IACD,CAACG,EAAmBE,CAAa,EAAIkB,GAAqBvB,EAAoB,EAAI,EACnFO,EAAQ,iBAAiB,WAAYJ,CAAiB,GAIpDJ,GAAoBQ,EAAQ,SAC7B,CAACL,EAAiBE,CAAW,EAAImB,GAAqBxB,CAAgB,EAEvEQ,EAAQ,OAAO,iBAAiB,WAAYL,CAAe,EAE3DK,EAAQ,OAAO,iBAAiB,UAAWH,CAAW,IAGpDX,EAAQ,aAAeA,EAAQ,UAGjCQ,EAAauB,GAAU,CAChBjB,IAGLf,EAAO,CAACgC,GAAUA,EAAO,KAAO,IAAIC,GAAc,KAAMnC,EAAQiB,CAAO,EAAIiB,CAAM,EACjFjB,EAAQ,MAAM,EACdA,EAAU,KACZ,EAEAd,EAAQ,aAAeA,EAAQ,YAAY,UAAUQ,CAAU,EAC3DR,EAAQ,SACVA,EAAQ,OAAO,QAAUQ,EAAW,EAAIR,EAAQ,OAAO,iBAAiB,QAASQ,CAAU,IAI/F,IAAMyB,EAAWC,GAAclC,EAAQ,GAAG,EAE1C,GAAIiC,GAAYE,EAAS,UAAU,QAAQF,CAAQ,IAAM,GAAI,CAC3DlC,EAAO,IAAIsB,EAAW,wBAA0BY,EAAW,IAAKZ,EAAW,gBAAiBxB,CAAM,CAAC,EACnG,MACF,CAIAiB,EAAQ,KAAKZ,GAAe,IAAI,CAClC,CAAC,CACH,ECnMA,IAAMkC,GAAiB,CAACC,EAASC,IAAY,CAC3C,GAAM,CAAC,OAAAC,CAAM,EAAKF,EAAUA,EAAUA,EAAQ,OAAO,OAAO,EAAI,CAAC,EAEjE,GAAIC,GAAWC,EAAQ,CACrB,IAAIC,EAAa,IAAI,gBAEjBC,EAEEC,EAAU,SAAUC,EAAQ,CAChC,GAAI,CAACF,EAAS,CACZA,EAAU,GACVG,EAAY,EACZ,IAAMC,EAAMF,aAAkB,MAAQA,EAAS,KAAK,OACpDH,EAAW,MAAMK,aAAeC,EAAaD,EAAM,IAAIE,GAAcF,aAAe,MAAQA,EAAI,QAAUA,CAAG,CAAC,CAChH,CACF,EAEIG,EAAQV,GAAW,WAAW,IAAM,CACtCU,EAAQ,KACRN,EAAQ,IAAII,EAAW,WAAW,OAAAR,EAAO,mBAAmBQ,EAAW,SAAS,CAAC,CACnF,EAAGR,CAAO,EAEJM,EAAc,IAAM,CACpBP,IACFW,GAAS,aAAaA,CAAK,EAC3BA,EAAQ,KACRX,EAAQ,QAAQY,GAAU,CACxBA,EAAO,YAAcA,EAAO,YAAYP,CAAO,EAAIO,EAAO,oBAAoB,QAASP,CAAO,CAChG,CAAC,EACDL,EAAU,KAEd,EAEAA,EAAQ,QAASY,GAAWA,EAAO,iBAAiB,QAASP,CAAO,CAAC,EAErE,GAAM,CAAC,OAAAO,CAAM,EAAIT,EAEjB,OAAAS,EAAO,YAAc,IAAMC,EAAM,KAAKN,CAAW,EAE1CK,CACT,CACF,EAEOE,GAAQf,GC9CR,IAAMgB,GAAc,UAAWC,EAAOC,EAAW,CACtD,IAAIC,EAAMF,EAAM,WAEhB,GAAI,CAACC,GAAaC,EAAMD,EAAW,CACjC,MAAMD,EACN,MACF,CAEA,IAAIG,EAAM,EACNC,EAEJ,KAAOD,EAAMD,GACXE,EAAMD,EAAMF,EACZ,MAAMD,EAAM,MAAMG,EAAKC,CAAG,EAC1BD,EAAMC,CAEV,EAEaC,GAAY,SAAiBC,EAAUL,EAAW,QAAAM,GAAA,sBAC7D,YAAAC,EAAAC,GAA0BC,GAAWJ,CAAQ,GAA7CK,EAAAC,EAAAC,EAAAF,EAAA,EAAAC,EAAA,UAAAE,GAAAN,EAAA,cAAAG,EAAA,GACE,CADS,IAAMX,EAAjBY,EAAA,MACE,MAAAG,GAAOhB,GAAYC,EAAOC,CAAS,UADrCW,EApBF,CAoBEC,EAAA,CAAAD,UAAA,KAAAD,IAAAC,EAAAJ,EAAA,oBAAAM,GAAAF,EAAA,KAAAJ,YAAA,IAAAK,EAAA,MAAAA,EAAA,IAGF,IAEMH,GAAa,SAAiBM,EAAQ,QAAAT,GAAA,sBAC1C,GAAIS,EAAO,OAAO,aAAa,EAAG,CAChC,MAAAD,GAAOC,GACP,MACF,CAEA,IAAMC,EAASD,EAAO,UAAU,EAChC,GAAI,CACF,OAAS,CACP,GAAM,CAAC,KAAAE,EAAM,MAAAC,CAAK,EAAI,UAAAL,GAAMG,EAAO,KAAK,GACxC,GAAIC,EACF,MAEF,MAAMC,CACR,CACF,QAAE,CACA,UAAAL,GAAMG,EAAO,OAAO,EACtB,CACF,IAEaG,GAAc,CAACJ,EAAQf,EAAWoB,EAAYC,IAAa,CACtE,IAAMC,EAAWlB,GAAUW,EAAQf,CAAS,EAExCuB,EAAQ,EACRN,EACAO,EAAaC,GAAM,CAChBR,IACHA,EAAO,GACPI,GAAYA,EAASI,CAAC,EAE1B,EAEA,OAAO,IAAI,eAAe,CACxB,MAAM,KAAKC,EAAY,CACrB,GAAI,CACF,GAAM,CAAC,KAAAT,EAAM,MAAAC,CAAK,EAAI,MAAMI,EAAS,KAAK,EAE1C,GAAIL,EAAM,CACTO,EAAU,EACTE,EAAW,MAAM,EACjB,MACF,CAEA,IAAIzB,EAAMiB,EAAM,WAChB,GAAIE,EAAY,CACd,IAAIO,EAAcJ,GAAStB,EAC3BmB,EAAWO,CAAW,CACxB,CACAD,EAAW,QAAQ,IAAI,WAAWR,CAAK,CAAC,CAC1C,OAASU,EAAK,CACZ,MAAAJ,EAAUI,CAAG,EACPA,CACR,CACF,EACA,OAAOC,EAAQ,CACb,OAAAL,EAAUK,CAAM,EACTP,EAAS,OAAO,CACzB,CACF,EAAG,CACD,cAAe,CACjB,CAAC,CACH,EC5EA,IAAMQ,GAAqB,GAAK,KAE1B,CAAC,WAAAC,EAAU,EAAIC,EAEfC,IAAkB,CAAC,CAAC,QAAAC,EAAS,SAAAC,CAAQ,KAAO,CAChD,QAAAD,EAAS,SAAAC,CACX,IAAIH,EAAM,MAAM,EAEV,CACJ,eAAAI,GAAgB,YAAAC,EAClB,EAAIL,EAAM,OAGJM,GAAO,CAACC,KAAOC,IAAS,CAC5B,GAAI,CACF,MAAO,CAAC,CAACD,EAAG,GAAGC,CAAI,CACrB,OAASC,EAAG,CACV,MAAO,EACT,CACF,EAEMC,GAAWC,GAAQ,CACvBA,EAAMX,EAAM,MAAM,KAAK,CACrB,cAAe,EACjB,EAAGC,GAAgBU,CAAG,EAEtB,GAAM,CAAC,MAAOC,EAAU,QAAAV,EAAS,SAAAC,CAAQ,EAAIQ,EACvCE,EAAmBD,EAAWb,GAAWa,CAAQ,EAAI,OAAO,OAAU,WACtEE,EAAqBf,GAAWG,CAAO,EACvCa,EAAsBhB,GAAWI,CAAQ,EAE/C,GAAI,CAACU,EACH,MAAO,GAGT,IAAMG,EAA4BH,GAAoBd,GAAWK,EAAc,EAEzEa,EAAaJ,IAAqB,OAAOR,IAAgB,YACzDa,GAAaC,GAAQD,EAAQ,OAAOC,CAAG,GAAG,IAAId,EAAa,EAC7D,MAAOc,GAAQ,IAAI,WAAW,MAAM,IAAIjB,EAAQiB,CAAG,EAAE,YAAY,CAAC,GAGhEC,EAAwBN,GAAsBE,GAA6BV,GAAK,IAAM,CAC1F,IAAIe,EAAiB,GAEfC,EAAiB,IAAIpB,EAAQqB,EAAS,OAAQ,CAClD,KAAM,IAAInB,GACV,OAAQ,OACR,IAAI,QAAS,CACX,OAAAiB,EAAiB,GACV,MACT,CACF,CAAC,EAAE,QAAQ,IAAI,cAAc,EAE7B,OAAOA,GAAkB,CAACC,CAC5B,CAAC,EAEKE,EAAyBT,GAAuBC,GACpDV,GAAK,IAAMN,EAAM,iBAAiB,IAAIG,EAAS,EAAE,EAAE,IAAI,CAAC,EAEpDsB,EAAY,CAChB,OAAQD,IAA4BE,GAAQA,EAAI,KAClD,EAEAb,GACE,CAAC,OAAQ,cAAe,OAAQ,WAAY,QAAQ,EAAE,QAAQc,GAAQ,CACpE,CAACF,EAAUE,CAAI,IAAMF,EAAUE,CAAI,EAAI,CAACD,EAAKE,IAAW,CACtD,IAAIC,EAASH,GAAOA,EAAIC,CAAI,EAE5B,GAAIE,EACF,OAAOA,EAAO,KAAKH,CAAG,EAGxB,MAAM,IAAII,EAAW,kBAAkB,OAAAH,EAAI,sBAAsBG,EAAW,gBAAiBF,CAAM,CACrG,EACF,CAAC,EAGH,IAAMG,EAAgB,MAAOC,GAAS,CACpC,GAAIA,GAAQ,KACV,MAAO,GAGT,GAAIhC,EAAM,OAAOgC,CAAI,EACnB,OAAOA,EAAK,KAGd,GAAIhC,EAAM,oBAAoBgC,CAAI,EAKhC,OAAQ,MAJS,IAAI9B,EAAQqB,EAAS,OAAQ,CAC5C,OAAQ,OACR,KAAAS,CACF,CAAC,EACsB,YAAY,GAAG,WAGxC,GAAIhC,EAAM,kBAAkBgC,CAAI,GAAKhC,EAAM,cAAcgC,CAAI,EAC3D,OAAOA,EAAK,WAOd,GAJIhC,EAAM,kBAAkBgC,CAAI,IAC9BA,EAAOA,EAAO,IAGZhC,EAAM,SAASgC,CAAI,EACrB,OAAQ,MAAMf,EAAWe,CAAI,GAAG,UAEpC,EAEMC,EAAoB,MAAOC,EAASF,IAAS,CACjD,IAAMG,EAASnC,EAAM,eAAekC,EAAQ,iBAAiB,CAAC,EAE9D,OAAOC,GAAU,KAAOJ,EAAcC,CAAI,EAAIG,CAChD,EAEA,MAAO,OAAOP,GAAW,CACvB,GAAI,CACF,IAAAQ,EACA,OAAAP,EACA,KAAAQ,EACA,OAAAC,EACA,YAAAC,EACA,QAAAC,EACA,mBAAAC,EACA,iBAAAC,EACA,aAAAC,EACA,QAAAT,GACA,gBAAAU,GAAkB,cAClB,aAAAC,EACF,EAAIC,GAAclB,CAAM,EAEpBmB,GAASnC,GAAY,MAEzB+B,EAAeA,GAAgBA,EAAe,IAAI,YAAY,EAAI,OAElE,IAAIK,EAAiBC,GAAe,CAACX,EAAQC,GAAeA,EAAY,cAAc,CAAC,EAAGC,CAAO,EAE7FU,GAAU,KAERC,GAAcH,GAAkBA,EAAe,cAAgB,IAAM,CACzEA,EAAe,YAAY,CAC7B,GAEII,GAEJ,GAAI,CACF,GACEV,GAAoBtB,GAAyBS,IAAW,OAASA,IAAW,SAC3EuB,GAAuB,MAAMnB,EAAkBC,GAASG,CAAI,KAAO,EACpE,CACA,IAAIgB,GAAW,IAAInD,EAAQkC,EAAK,CAC9B,OAAQ,OACR,KAAMC,EACN,OAAQ,MACV,CAAC,EAEGiB,GAMJ,GAJItD,EAAM,WAAWqC,CAAI,IAAMiB,GAAoBD,GAAS,QAAQ,IAAI,cAAc,IACpFnB,GAAQ,eAAeoB,EAAiB,EAGtCD,GAAS,KAAM,CACjB,GAAM,CAACE,GAAYC,EAAK,EAAIC,GAC1BL,GACAM,GAAqBC,GAAejB,CAAgB,CAAC,CACvD,EAEAL,EAAOuB,GAAYP,GAAS,KAAMvD,GAAoByD,GAAYC,EAAK,CACzE,CACF,CAEKxD,EAAM,SAAS4C,EAAe,IACjCA,GAAkBA,GAAkB,UAAY,QAKlD,IAAMiB,GAAyB/C,GAAsB,gBAAiBZ,EAAQ,UAExE4D,GAAkBC,EAAAC,EAAA,GACnBnB,IADmB,CAEtB,OAAQG,EACR,OAAQnB,EAAO,YAAY,EAC3B,QAASK,GAAQ,UAAU,EAAE,OAAO,EACpC,KAAMG,EACN,OAAQ,OACR,YAAawB,GAAyBjB,GAAkB,MAC1D,GAEAM,GAAUpC,GAAsB,IAAIZ,EAAQkC,EAAK0B,EAAe,EAEhE,IAAIG,GAAW,MAAOnD,EAAqBiC,GAAOG,GAASL,EAAY,EAAIE,GAAOX,EAAK0B,EAAe,GAEhGI,GAAmB1C,IAA2BmB,IAAiB,UAAYA,IAAiB,YAElG,GAAInB,IAA2BiB,GAAuByB,IAAoBf,IAAe,CACvF,IAAMgB,GAAU,CAAC,EAEjB,CAAC,SAAU,aAAc,SAAS,EAAE,QAAQC,IAAQ,CAClDD,GAAQC,EAAI,EAAIH,GAASG,EAAI,CAC/B,CAAC,EAED,IAAMC,GAAwBrE,EAAM,eAAeiE,GAAS,QAAQ,IAAI,gBAAgB,CAAC,EAEnF,CAACV,GAAYC,EAAK,EAAIf,GAAsBgB,GAChDY,GACAX,GAAqBC,GAAelB,CAAkB,EAAG,EAAI,CAC/D,GAAK,CAAC,EAENwB,GAAW,IAAI9D,EACbyD,GAAYK,GAAS,KAAMnE,GAAoByD,GAAY,IAAM,CAC/DC,IAASA,GAAM,EACfL,IAAeA,GAAY,CAC7B,CAAC,EACDgB,EACF,CACF,CAEAxB,EAAeA,GAAgB,OAE/B,IAAI2B,GAAe,MAAM7C,EAAUzB,EAAM,QAAQyB,EAAWkB,CAAY,GAAK,MAAM,EAAEsB,GAAUrC,CAAM,EAErG,OAACsC,IAAoBf,IAAeA,GAAY,EAEzC,MAAM,IAAI,QAAQ,CAACoB,GAASC,KAAW,CAC5CC,GAAOF,GAASC,GAAQ,CACtB,KAAMF,GACN,QAASI,EAAa,KAAKT,GAAS,OAAO,EAC3C,OAAQA,GAAS,OACjB,WAAYA,GAAS,WACrB,OAAArC,EACA,QAAAsB,EACF,CAAC,CACH,CAAC,CACH,OAASyB,GAAK,CAGZ,MAFAxB,IAAeA,GAAY,EAEvBwB,IAAOA,GAAI,OAAS,aAAe,qBAAqB,KAAKA,GAAI,OAAO,EACpE,OAAO,OACX,IAAI7C,EAAW,gBAAiBA,EAAW,YAAaF,EAAQsB,EAAO,EACvE,CACE,MAAOyB,GAAI,OAASA,EACtB,CACF,EAGI7C,EAAW,KAAK6C,GAAKA,IAAOA,GAAI,KAAM/C,EAAQsB,EAAO,CAC7D,CACF,CACF,EAEM0B,GAAY,IAAI,IAETC,GAAYjD,GAAW,CAClC,IAAIjB,EAAOiB,GAAUA,EAAO,KAAQ,CAAC,EAC/B,CAAC,MAAAkD,EAAO,QAAA5E,EAAS,SAAAC,CAAQ,EAAIQ,EAC7BoE,EAAQ,CACZ7E,EAASC,EAAU2E,CACrB,EAEIE,EAAMD,EAAM,OAAQE,EAAID,EAC1BE,EAAMC,EAAQC,EAAMR,GAEtB,KAAOK,KACLC,EAAOH,EAAME,CAAC,EACdE,EAASC,EAAI,IAAIF,CAAI,EAErBC,IAAW,QAAaC,EAAI,IAAIF,EAAMC,EAAUF,EAAI,IAAI,IAAQvE,GAAQC,CAAG,CAAE,EAE7EyE,EAAMD,EAGR,OAAOA,CACT,EAEME,GAAUR,GAAS,EC9QzB,IAAMS,GAAgB,CACpB,KAAMC,GACN,IAAKC,GACL,MAAO,CACL,IAAkBC,EACpB,CACF,EAGAC,EAAM,QAAQJ,GAAe,CAACK,EAAIC,IAAU,CAC1C,GAAID,EAAI,CACN,GAAI,CACF,OAAO,eAAeA,EAAI,OAAQ,CAAE,MAAAC,CAAM,CAAC,CAC7C,OAASC,EAAG,CAEZ,CACA,OAAO,eAAeF,EAAI,cAAe,CAAE,MAAAC,CAAM,CAAC,CACpD,CACF,CAAC,EAQD,IAAME,GAAgBC,GAAW,KAAK,OAAAA,GAQhCC,GAAoBC,GAAYP,EAAM,WAAWO,CAAO,GAAKA,IAAY,MAAQA,IAAY,GAYnG,SAASC,GAAWC,EAAUC,EAAQ,CACpCD,EAAWT,EAAM,QAAQS,CAAQ,EAAIA,EAAW,CAACA,CAAQ,EAEzD,GAAM,CAAE,OAAAE,CAAO,EAAIF,EACfG,EACAL,EAEEM,EAAkB,CAAC,EAEzB,QAASC,EAAI,EAAGA,EAAIH,EAAQG,IAAK,CAC/BF,EAAgBH,EAASK,CAAC,EAC1B,IAAIC,EAIJ,GAFAR,EAAUK,EAEN,CAACN,GAAiBM,CAAa,IACjCL,EAAUX,IAAemB,EAAK,OAAOH,CAAa,GAAG,YAAY,CAAC,EAE9DL,IAAY,QACd,MAAM,IAAIS,EAAW,oBAAoB,OAAAD,EAAE,IAAG,EAIlD,GAAIR,IAAYP,EAAM,WAAWO,CAAO,IAAMA,EAAUA,EAAQ,IAAIG,CAAM,IACxE,MAGFG,EAAgBE,GAAM,IAAMD,CAAC,EAAIP,CACnC,CAEA,GAAI,CAACA,EAAS,CACZ,IAAMU,EAAU,OAAO,QAAQJ,CAAe,EAC3C,IAAI,CAAC,CAACE,EAAIG,CAAK,IAAM,WAAW,OAAAH,EAAE,MAChCG,IAAU,GAAQ,sCAAwC,gCAC7D,EAEEC,EAAIR,EACLM,EAAQ,OAAS,EAAI,YAAcA,EAAQ,IAAIb,EAAY,EAAE,KAAK,IAAI,EAAI,IAAMA,GAAaa,EAAQ,CAAC,CAAC,EACxG,0BAEF,MAAM,IAAID,EACR,wDAA0DG,EAC1D,iBACF,CACF,CAEA,OAAOZ,CACT,CAKA,IAAOa,GAAQ,CAKb,WAAAZ,GAMA,SAAUZ,EACZ,EC7GA,SAASyB,GAA6BC,EAAQ,CAK5C,GAJIA,EAAO,aACTA,EAAO,YAAY,iBAAiB,EAGlCA,EAAO,QAAUA,EAAO,OAAO,QACjC,MAAM,IAAIC,GAAc,KAAMD,CAAM,CAExC,CASe,SAARE,GAAiCF,EAAQ,CAC9C,OAAAD,GAA6BC,CAAM,EAEnCA,EAAO,QAAUG,EAAa,KAAKH,EAAO,OAAO,EAGjDA,EAAO,KAAOI,GAAc,KAC1BJ,EACAA,EAAO,gBACT,EAEI,CAAC,OAAQ,MAAO,OAAO,EAAE,QAAQA,EAAO,MAAM,IAAM,IACtDA,EAAO,QAAQ,eAAe,oCAAqC,EAAK,EAG1DK,GAAS,WAAWL,EAAO,SAAWM,GAAS,QAASN,CAAM,EAE/DA,CAAM,EAAE,KAAK,SAA6BO,EAAU,CACjE,OAAAR,GAA6BC,CAAM,EAGnCO,EAAS,KAAOH,GAAc,KAC5BJ,EACAA,EAAO,kBACPO,CACF,EAEAA,EAAS,QAAUJ,EAAa,KAAKI,EAAS,OAAO,EAE9CA,CACT,EAAG,SAA4BC,EAAQ,CACrC,OAAKC,GAASD,CAAM,IAClBT,GAA6BC,CAAM,EAG/BQ,GAAUA,EAAO,WACnBA,EAAO,SAAS,KAAOJ,GAAc,KACnCJ,EACAA,EAAO,kBACPQ,EAAO,QACT,EACAA,EAAO,SAAS,QAAUL,EAAa,KAAKK,EAAO,SAAS,OAAO,IAIhE,QAAQ,OAAOA,CAAM,CAC9B,CAAC,CACH,CChFO,IAAME,GAAU,SCKvB,IAAMC,GAAa,CAAC,EAGpB,CAAC,SAAU,UAAW,SAAU,WAAY,SAAU,QAAQ,EAAE,QAAQ,CAACC,EAAMC,IAAM,CACnFF,GAAWC,CAAI,EAAI,SAAmBE,EAAO,CAC3C,OAAO,OAAOA,IAAUF,GAAQ,KAAOC,EAAI,EAAI,KAAO,KAAOD,CAC/D,CACF,CAAC,EAED,IAAMG,GAAqB,CAAC,EAW5BJ,GAAW,aAAe,SAAsBK,EAAWC,EAASC,EAAS,CAC3E,SAASC,EAAcC,EAAKC,EAAM,CAChC,MAAO,WAAaC,GAAU,0BAA6BF,EAAM,IAAOC,GAAQH,EAAU,KAAOA,EAAU,GAC7G,CAGA,MAAO,CAACK,EAAOH,EAAKI,IAAS,CAC3B,GAAIR,IAAc,GAChB,MAAM,IAAIS,EACRN,EAAcC,EAAK,qBAAuBH,EAAU,OAASA,EAAU,GAAG,EAC1EQ,EAAW,cACb,EAGF,OAAIR,GAAW,CAACF,GAAmBK,CAAG,IACpCL,GAAmBK,CAAG,EAAI,GAE1B,QAAQ,KACND,EACEC,EACA,+BAAiCH,EAAU,yCAC7C,CACF,GAGKD,EAAYA,EAAUO,EAAOH,EAAKI,CAAI,EAAI,EACnD,CACF,EAEAb,GAAW,SAAW,SAAkBe,EAAiB,CACvD,MAAO,CAACH,EAAOH,KAEb,QAAQ,KAAK,GAAG,OAAAA,EAAG,gCAA+B,OAAAM,EAAiB,EAC5D,GAEX,EAYA,SAASC,GAAcC,EAASC,EAAQC,EAAc,CACpD,GAAI,OAAOF,GAAY,SACrB,MAAM,IAAIH,EAAW,4BAA6BA,EAAW,oBAAoB,EAEnF,IAAMM,EAAO,OAAO,KAAKH,CAAO,EAC5Bf,EAAIkB,EAAK,OACb,KAAOlB,KAAM,GAAG,CACd,IAAMO,EAAMW,EAAKlB,CAAC,EACZG,EAAYa,EAAOT,CAAG,EAC5B,GAAIJ,EAAW,CACb,IAAMO,EAAQK,EAAQR,CAAG,EACnBY,EAAST,IAAU,QAAaP,EAAUO,EAAOH,EAAKQ,CAAO,EACnE,GAAII,IAAW,GACb,MAAM,IAAIP,EAAW,UAAYL,EAAM,YAAcY,EAAQP,EAAW,oBAAoB,EAE9F,QACF,CACA,GAAIK,IAAiB,GACnB,MAAM,IAAIL,EAAW,kBAAoBL,EAAKK,EAAW,cAAc,CAE3E,CACF,CAEA,IAAOQ,GAAQ,CACb,cAAAN,GACA,WAAAhB,EACF,ECvFA,IAAMuB,GAAaC,GAAU,WASvBC,GAAN,KAAY,CACV,YAAYC,EAAgB,CAC1B,KAAK,SAAWA,GAAkB,CAAC,EACnC,KAAK,aAAe,CAClB,QAAS,IAAIC,GACb,SAAU,IAAIA,EAChB,CACF,CAUA,MAAM,QAAQC,EAAaC,EAAQ,CACjC,GAAI,CACF,OAAO,MAAM,KAAK,SAASD,EAAaC,CAAM,CAChD,OAASC,EAAK,CACZ,GAAIA,aAAe,MAAO,CACxB,IAAIC,EAAQ,CAAC,EAEb,MAAM,kBAAoB,MAAM,kBAAkBA,CAAK,EAAKA,EAAQ,IAAI,MAGxE,IAAMC,EAAQD,EAAM,MAAQA,EAAM,MAAM,QAAQ,QAAS,EAAE,EAAI,GAC/D,GAAI,CACGD,EAAI,MAGEE,GAAS,CAAC,OAAOF,EAAI,KAAK,EAAE,SAASE,EAAM,QAAQ,YAAa,EAAE,CAAC,IAC5EF,EAAI,OAAS,KAAOE,GAHpBF,EAAI,MAAQE,CAKhB,OAASC,EAAG,CAEZ,CACF,CAEA,MAAMH,CACR,CACF,CAEA,SAASF,EAAaC,EAAQ,CAGxB,OAAOD,GAAgB,UACzBC,EAASA,GAAU,CAAC,EACpBA,EAAO,IAAMD,GAEbC,EAASD,GAAe,CAAC,EAG3BC,EAASK,GAAY,KAAK,SAAUL,CAAM,EAE1C,GAAM,CAAC,aAAAM,EAAc,iBAAAC,EAAkB,QAAAC,CAAO,EAAIR,EAE9CM,IAAiB,QACnBX,GAAU,cAAcW,EAAc,CACpC,kBAAmBZ,GAAW,aAAaA,GAAW,OAAO,EAC7D,kBAAmBA,GAAW,aAAaA,GAAW,OAAO,EAC7D,oBAAqBA,GAAW,aAAaA,GAAW,OAAO,CACjE,EAAG,EAAK,EAGNa,GAAoB,OAClBE,EAAM,WAAWF,CAAgB,EACnCP,EAAO,iBAAmB,CACxB,UAAWO,CACb,EAEAZ,GAAU,cAAcY,EAAkB,CACxC,OAAQb,GAAW,SACnB,UAAWA,GAAW,QACxB,EAAG,EAAI,GAKPM,EAAO,oBAAsB,SAEtB,KAAK,SAAS,oBAAsB,OAC7CA,EAAO,kBAAoB,KAAK,SAAS,kBAEzCA,EAAO,kBAAoB,IAG7BL,GAAU,cAAcK,EAAQ,CAC9B,QAASN,GAAW,SAAS,SAAS,EACtC,cAAeA,GAAW,SAAS,eAAe,CACpD,EAAG,EAAI,EAGPM,EAAO,QAAUA,EAAO,QAAU,KAAK,SAAS,QAAU,OAAO,YAAY,EAG7E,IAAIU,EAAiBF,GAAWC,EAAM,MACpCD,EAAQ,OACRA,EAAQR,EAAO,MAAM,CACvB,EAEAQ,GAAWC,EAAM,QACf,CAAC,SAAU,MAAO,OAAQ,OAAQ,MAAO,QAAS,QAAQ,EACzDE,GAAW,CACV,OAAOH,EAAQG,CAAM,CACvB,CACF,EAEAX,EAAO,QAAUY,EAAa,OAAOF,EAAgBF,CAAO,EAG5D,IAAMK,EAA0B,CAAC,EAC7BC,EAAiC,GACrC,KAAK,aAAa,QAAQ,QAAQ,SAAoCC,EAAa,CAC7E,OAAOA,EAAY,SAAY,YAAcA,EAAY,QAAQf,CAAM,IAAM,KAIjFc,EAAiCA,GAAkCC,EAAY,YAE/EF,EAAwB,QAAQE,EAAY,UAAWA,EAAY,QAAQ,EAC7E,CAAC,EAED,IAAMC,EAA2B,CAAC,EAClC,KAAK,aAAa,SAAS,QAAQ,SAAkCD,EAAa,CAChFC,EAAyB,KAAKD,EAAY,UAAWA,EAAY,QAAQ,CAC3E,CAAC,EAED,IAAIE,EACAC,EAAI,EACJC,EAEJ,GAAI,CAACL,EAAgC,CACnC,IAAMM,EAAQ,CAACC,GAAgB,KAAK,IAAI,EAAG,MAAS,EAOpD,IANAD,EAAM,QAAQ,GAAGP,CAAuB,EACxCO,EAAM,KAAK,GAAGJ,CAAwB,EACtCG,EAAMC,EAAM,OAEZH,EAAU,QAAQ,QAAQjB,CAAM,EAEzBkB,EAAIC,GACTF,EAAUA,EAAQ,KAAKG,EAAMF,GAAG,EAAGE,EAAMF,GAAG,CAAC,EAG/C,OAAOD,CACT,CAEAE,EAAMN,EAAwB,OAE9B,IAAIS,EAAYtB,EAEhB,KAAOkB,EAAIC,GAAK,CACd,IAAMI,EAAcV,EAAwBK,GAAG,EACzCM,EAAaX,EAAwBK,GAAG,EAC9C,GAAI,CACFI,EAAYC,EAAYD,CAAS,CACnC,OAASG,EAAO,CACdD,EAAW,KAAK,KAAMC,CAAK,EAC3B,KACF,CACF,CAEA,GAAI,CACFR,EAAUI,GAAgB,KAAK,KAAMC,CAAS,CAChD,OAASG,EAAO,CACd,OAAO,QAAQ,OAAOA,CAAK,CAC7B,CAKA,IAHAP,EAAI,EACJC,EAAMH,EAAyB,OAExBE,EAAIC,GACTF,EAAUA,EAAQ,KAAKD,EAAyBE,GAAG,EAAGF,EAAyBE,GAAG,CAAC,EAGrF,OAAOD,CACT,CAEA,OAAOjB,EAAQ,CACbA,EAASK,GAAY,KAAK,SAAUL,CAAM,EAC1C,IAAM0B,EAAWC,GAAc3B,EAAO,QAASA,EAAO,IAAKA,EAAO,iBAAiB,EACnF,OAAO4B,GAASF,EAAU1B,EAAO,OAAQA,EAAO,gBAAgB,CAClE,CACF,EAGAS,EAAM,QAAQ,CAAC,SAAU,MAAO,OAAQ,SAAS,EAAG,SAA6BE,EAAQ,CAEvFf,GAAM,UAAUe,CAAM,EAAI,SAASkB,EAAK7B,EAAQ,CAC9C,OAAO,KAAK,QAAQK,GAAYL,GAAU,CAAC,EAAG,CAC5C,OAAAW,EACA,IAAAkB,EACA,MAAO7B,GAAU,CAAC,GAAG,IACvB,CAAC,CAAC,CACJ,CACF,CAAC,EAEDS,EAAM,QAAQ,CAAC,OAAQ,MAAO,OAAO,EAAG,SAA+BE,EAAQ,CAG7E,SAASmB,EAAmBC,EAAQ,CAClC,OAAO,SAAoBF,EAAKG,EAAMhC,EAAQ,CAC5C,OAAO,KAAK,QAAQK,GAAYL,GAAU,CAAC,EAAG,CAC5C,OAAAW,EACA,QAASoB,EAAS,CAChB,eAAgB,qBAClB,EAAI,CAAC,EACL,IAAAF,EACA,KAAAG,CACF,CAAC,CAAC,CACJ,CACF,CAEApC,GAAM,UAAUe,CAAM,EAAImB,EAAmB,EAE7ClC,GAAM,UAAUe,EAAS,MAAM,EAAImB,EAAmB,EAAI,CAC5D,CAAC,EAED,IAAOG,GAAQrC,GCpOf,IAAMsC,GAAN,MAAMC,CAAY,CAChB,YAAYC,EAAU,CACpB,GAAI,OAAOA,GAAa,WACtB,MAAM,IAAI,UAAU,8BAA8B,EAGpD,IAAIC,EAEJ,KAAK,QAAU,IAAI,QAAQ,SAAyBC,EAAS,CAC3DD,EAAiBC,CACnB,CAAC,EAED,IAAMC,EAAQ,KAGd,KAAK,QAAQ,KAAKC,GAAU,CAC1B,GAAI,CAACD,EAAM,WAAY,OAEvB,IAAIE,EAAIF,EAAM,WAAW,OAEzB,KAAOE,KAAM,GACXF,EAAM,WAAWE,CAAC,EAAED,CAAM,EAE5BD,EAAM,WAAa,IACrB,CAAC,EAGD,KAAK,QAAQ,KAAOG,GAAe,CACjC,IAAIC,EAEEC,EAAU,IAAI,QAAQN,GAAW,CACrCC,EAAM,UAAUD,CAAO,EACvBK,EAAWL,CACb,CAAC,EAAE,KAAKI,CAAW,EAEnB,OAAAE,EAAQ,OAAS,UAAkB,CACjCL,EAAM,YAAYI,CAAQ,CAC5B,EAEOC,CACT,EAEAR,EAAS,SAAgBS,EAASC,EAAQC,EAAS,CAC7CR,EAAM,SAKVA,EAAM,OAAS,IAAIS,GAAcH,EAASC,EAAQC,CAAO,EACzDV,EAAeE,EAAM,MAAM,EAC7B,CAAC,CACH,CAKA,kBAAmB,CACjB,GAAI,KAAK,OACP,MAAM,KAAK,MAEf,CAMA,UAAUU,EAAU,CAClB,GAAI,KAAK,OAAQ,CACfA,EAAS,KAAK,MAAM,EACpB,MACF,CAEI,KAAK,WACP,KAAK,WAAW,KAAKA,CAAQ,EAE7B,KAAK,WAAa,CAACA,CAAQ,CAE/B,CAMA,YAAYA,EAAU,CACpB,GAAI,CAAC,KAAK,WACR,OAEF,IAAMC,EAAQ,KAAK,WAAW,QAAQD,CAAQ,EAC1CC,IAAU,IACZ,KAAK,WAAW,OAAOA,EAAO,CAAC,CAEnC,CAEA,eAAgB,CACd,IAAMC,EAAa,IAAI,gBAEjBC,EAASC,GAAQ,CACrBF,EAAW,MAAME,CAAG,CACtB,EAEA,YAAK,UAAUD,CAAK,EAEpBD,EAAW,OAAO,YAAc,IAAM,KAAK,YAAYC,CAAK,EAErDD,EAAW,MACpB,CAMA,OAAO,QAAS,CACd,IAAIX,EAIJ,MAAO,CACL,MAJY,IAAIL,EAAY,SAAkBmB,EAAG,CACjDd,EAASc,CACX,CAAC,EAGC,OAAAd,CACF,CACF,CACF,EAEOe,GAAQrB,GC/GA,SAARsB,GAAwBC,EAAU,CACvC,OAAO,SAAcC,EAAK,CACxB,OAAOD,EAAS,MAAM,KAAMC,CAAG,CACjC,CACF,CChBe,SAARC,GAA8BC,EAAS,CAC5C,OAAOC,EAAM,SAASD,CAAO,GAAMA,EAAQ,eAAiB,EAC9D,CCbA,IAAME,GAAiB,CACrB,SAAU,IACV,mBAAoB,IACpB,WAAY,IACZ,WAAY,IACZ,GAAI,IACJ,QAAS,IACT,SAAU,IACV,4BAA6B,IAC7B,UAAW,IACX,aAAc,IACd,eAAgB,IAChB,YAAa,IACb,gBAAiB,IACjB,OAAQ,IACR,gBAAiB,IACjB,iBAAkB,IAClB,MAAO,IACP,SAAU,IACV,YAAa,IACb,SAAU,IACV,OAAQ,IACR,kBAAmB,IACnB,kBAAmB,IACnB,WAAY,IACZ,aAAc,IACd,gBAAiB,IACjB,UAAW,IACX,SAAU,IACV,iBAAkB,IAClB,cAAe,IACf,4BAA6B,IAC7B,eAAgB,IAChB,SAAU,IACV,KAAM,IACN,eAAgB,IAChB,mBAAoB,IACpB,gBAAiB,IACjB,WAAY,IACZ,qBAAsB,IACtB,oBAAqB,IACrB,kBAAmB,IACnB,UAAW,IACX,mBAAoB,IACpB,oBAAqB,IACrB,OAAQ,IACR,iBAAkB,IAClB,SAAU,IACV,gBAAiB,IACjB,qBAAsB,IACtB,gBAAiB,IACjB,4BAA6B,IAC7B,2BAA4B,IAC5B,oBAAqB,IACrB,eAAgB,IAChB,WAAY,IACZ,mBAAoB,IACpB,eAAgB,IAChB,wBAAyB,IACzB,sBAAuB,IACvB,oBAAqB,IACrB,aAAc,IACd,YAAa,IACb,8BAA+B,IAC/B,gBAAiB,IACjB,mBAAoB,IACpB,oBAAqB,IACrB,gBAAiB,IACjB,mBAAoB,IACpB,sBAAuB,GACzB,EAEA,OAAO,QAAQA,EAAc,EAAE,QAAQ,CAAC,CAACC,EAAKC,CAAK,IAAM,CACvDF,GAAeE,CAAK,EAAID,CAC1B,CAAC,EAED,IAAOE,GAAQH,GCjDf,SAASI,GAAeC,EAAe,CACrC,IAAMC,EAAU,IAAIC,GAAMF,CAAa,EACjCG,EAAWC,GAAKF,GAAM,UAAU,QAASD,CAAO,EAGtD,OAAAI,EAAM,OAAOF,EAAUD,GAAM,UAAWD,EAAS,CAAC,WAAY,EAAI,CAAC,EAGnEI,EAAM,OAAOF,EAAUF,EAAS,KAAM,CAAC,WAAY,EAAI,CAAC,EAGxDE,EAAS,OAAS,SAAgBG,EAAgB,CAChD,OAAOP,GAAeQ,GAAYP,EAAeM,CAAc,CAAC,CAClE,EAEOH,CACT,CAGA,IAAMK,EAAQT,GAAeU,EAAQ,EAGrCD,EAAM,MAAQN,GAGdM,EAAM,cAAgBE,GACtBF,EAAM,YAAcG,GACpBH,EAAM,SAAWI,GACjBJ,EAAM,QAAUK,GAChBL,EAAM,WAAaM,GAGnBN,EAAM,WAAaO,EAGnBP,EAAM,OAASA,EAAM,cAGrBA,EAAM,IAAM,SAAaQ,EAAU,CACjC,OAAO,QAAQ,IAAIA,CAAQ,CAC7B,EAEAR,EAAM,OAASS,GAGfT,EAAM,aAAeU,GAGrBV,EAAM,YAAcD,GAEpBC,EAAM,aAAeW,EAErBX,EAAM,WAAaY,GAASC,GAAehB,EAAM,WAAWe,CAAK,EAAI,IAAI,SAASA,CAAK,EAAIA,CAAK,EAEhGZ,EAAM,WAAac,GAAS,WAE5Bd,EAAM,eAAiBe,GAEvBf,EAAM,QAAUA,EAGhB,IAAOgB,GAAQhB,ECnFf,GAAM,CACJ,MAAAiB,GACA,WAAAC,GACA,cAAAC,GACA,SAAAC,GACA,YAAAC,GACA,QAAAC,GACA,IAAAC,GACA,OAAAC,GACA,aAAAC,GACA,OAAAC,GACA,WAAAC,GACA,aAAAC,GACA,eAAAC,GACA,WAAAC,GACA,WAAAC,GACA,YAAAC,EACF,EAAIC,GCAG,IAAMC,GAAN,KAAgB,CAUnB,YAAYC,EAAyB,CARrC,KAAQ,aAA8B,KACtC,KAAQ,cAAsC,KAG9C,KAAQ,eAA2E,IAAI,IACvF,KAAiB,UAAY,IAC7B,KAAiB,aAAe,GAG5B,KAAK,MAAQC,GAAM,OAAO,CACtB,QAASD,EAAO,QAChB,QAASA,EAAO,SAAW,IAC3B,QAASE,EAAA,CACL,eAAgB,oBACbF,EAAO,QAElB,CAAC,EAGG,OAAO,aAAgB,aACvB,YAAY,IAAM,KAAK,eAAe,EAAG,GAAK,EAIlD,KAAK,MAAM,aAAa,QAAQ,IAC5B,MAAOA,GAAuC,CAjD1D,IAAAG,EAAAC,EAmDgB,GAAIJ,EAAO,IACP,GAAI,CACA,KAAK,kBAAkB,GAAG,QAAAG,EAAAH,EAAO,SAAP,YAAAG,EAAe,cAAa,KAAI,OAAAH,EAAO,IAAK,CAC1E,OAASK,EAAO,CACZ,eAAQ,MAAM,sDAAgDA,CAAK,EAC5D,QAAQ,OAAOA,CAAK,CAC/B,CAIJ,GAAI,CAACL,EAAO,UAAY,CAAC,KAAK,cAAgB,KAAK,cAC/C,GAAI,CACA,QAAQ,IAAI,4BAA4B,EACxC,IAAMM,EAAQ,MAAM,KAAK,cAAc,EACnCA,IACA,KAAK,YAAYA,CAAK,EAEtBN,EAAO,QAAQ,aAAa,EAAIM,EAExC,OAASD,EAAO,CACZ,QAAQ,MAAM,2CAA4CA,CAAK,CACnE,CAIJ,MAAI,CAACL,EAAO,UAAY,KAAK,eACzBA,EAAO,QAAQ,aAAa,EAAI,KAAK,cAGzC,QAAQ,IAAI,gBAAgB,QAAAI,EAAAJ,EAAO,SAAP,YAAAI,EAAe,cAAa,iBAAgB,OAAAJ,EAAO,SAAW,IAAK,OAAAA,EAAO,IAAK,EAGpGA,CACX,EACCK,IACG,QAAQ,MAAM,uBAAwBA,CAAK,EACpC,QAAQ,OAAOA,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,CAAC,CAAC,EAEvF,EAGA,KAAK,MAAM,aAAa,SAAS,IAC5BE,GAEUA,EAEVF,IACG,QAAQ,MAAM,wBAAyBA,EAAM,OAAO,EAC7C,QAAQ,OAAOA,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,CAAC,CAAC,EAEvF,CACJ,CAIA,iBAAiBG,EAAyB,CACtC,KAAK,cAAgBA,CACzB,CAGA,MAAM,IAAiBC,EAAaT,EAAyC,CAEzE,OADiB,MAAM,KAAK,MAAM,IAAOS,EAAKT,CAAM,GACpC,IACpB,CAEA,MAAM,KAAkBS,EAAaC,EAAgBV,EAAyC,CAE1F,OADiB,MAAM,KAAK,MAAM,KAAQS,EAAKC,EAAMV,CAAM,GAC3C,IACpB,CAEA,MAAM,IAAiBS,EAAaC,EAAgBV,EAAyC,CAEzF,OADiB,MAAM,KAAK,MAAM,IAAOS,EAAKC,EAAMV,CAAM,GAC1C,IACpB,CAEA,MAAM,MAAmBS,EAAaC,EAAgBV,EAAyC,CAE3F,OADiB,MAAM,KAAK,MAAM,MAASS,EAAKC,EAAMV,CAAM,GAC5C,IACpB,CAEA,MAAM,OAAoBS,EAAaT,EAAyC,CAE5E,OADiB,MAAM,KAAK,MAAM,OAAUS,EAAKT,CAAM,GACvC,IACpB,CAGA,UAAUW,EAAaC,EAAe,CAClC,KAAK,MAAM,SAAS,QAAQ,OAAOD,CAAG,EAAIC,CAC9C,CAEA,aAAaD,EAAa,CACtB,OAAO,KAAK,MAAM,SAAS,QAAQ,OAAOA,CAAG,CACjD,CAGA,YAAYL,EAAsB,CAC9B,KAAK,aAAeA,EAChBA,EACA,KAAK,UAAU,cAAeA,CAAK,GAGnC,KAAK,aAAa,aAAa,EAC/B,QAAQ,IAAI,oCAAoC,EAExD,CAEA,iBAAiC,CAC7B,OAAO,KAAK,YAChB,CAGA,aAAaN,EAAkC,CACvCA,EAAO,UACP,KAAK,MAAM,SAAS,QAAUA,EAAO,SAErCA,EAAO,UACP,KAAK,MAAM,SAAS,QAAUA,EAAO,SAErCA,EAAO,SACP,OAAO,OAAO,KAAK,MAAM,SAAS,QAAQ,OAAQA,EAAO,OAAO,EAEpE,QAAQ,IAAI,uCAAuC,CACvD,CAGQ,kBAAkBW,EAAa,CACnC,IAAME,EAAM,KAAK,IAAI,EACfC,EAAU,KAAK,eAAe,IAAIH,CAAG,EAE3C,GAAI,CAACG,EAAS,CACV,KAAK,eAAe,IAAIH,EAAK,CAAE,MAAO,EAAG,iBAAkBE,CAAI,CAAC,EAChE,MACJ,CAEA,GAAIA,EAAMC,EAAQ,iBAAmB,KAAK,UAAW,CAEjD,KAAK,eAAe,IAAIH,EAAK,CAAE,MAAO,EAAG,iBAAkBE,CAAI,CAAC,EAChE,MACJ,CAGA,GADAC,EAAQ,QACJA,EAAQ,MAAQ,KAAK,aAAc,CACnC,IAAMT,EAAQ,IAAI,MAAM,yCAAyC,OAAAM,EAAG,MAAK,OAAAG,EAAQ,MAAK,QAAO,YAAK,UAAS,MAAK,EAEhH,MAACT,EAAc,iBAAmB,GAC5BA,CACV,CACJ,CAEQ,gBAAiB,CACrB,IAAMQ,EAAM,KAAK,IAAI,EACrB,OAAW,CAACF,EAAKG,CAAO,IAAK,KAAK,eAAe,QAAQ,EACjDD,EAAMC,EAAQ,iBAAmB,KAAK,WACtC,KAAK,eAAe,OAAOH,CAAG,CAG1C,CACJ,ECzLI,IAAII,GAAc,QACdC,GAAgB,IAChBC,GAAc,aACdC,GAAc,GACdC,GAAc,IACdC,EAAS,CACL,SAAc,WACd,OAAc,SACd,OAAc,SACd,UAAc,WAClB,EAGAC,EAAc,UACdC,GAAc,MACdC,GAAc,SACdC,GAAc,SACdC,EAAc,KACdC,GAAc,SAEdC,EAAc,OACdC,EAAc,OACdC,EAAc,SACdC,EAAc,UACdC,EAAc,eACdC,GAAc,QACdC,EAAc,QAGdC,GAAc,UACdC,EAAc,SACdC,EAAc,SACdC,EAAc,UACdC,GAAc,WACdC,GAAc,KACdC,GAAc,WAGdC,GAAc,QAGdC,GAAc,SACdC,GAAc,cACdC,GAAc,kBACdC,GAAc,WACdC,GAAc,kBACdC,GAAc,UACdC,GAAc,YACdC,GAAkBD,GAAK,qBACvBE,GAAkBF,GAAK,QACvBG,GAAkBH,GAAK,IAAMD,GAC7BK,GAAkBJ,GAAK,gBACvBK,GAAkBL,GAAK,IAAMb,EAC7BmB,GAAkBN,GAAK,IAAMf,EAC7BsB,GAAkBP,GAAK,IAAMH,GAC7BW,GAAkBD,GAAc,WAChCE,GAAkB,CAACf,GAAQE,GAAaT,EAAQF,EAAOY,GAAUC,GAAaf,EAAcY,GAAaI,EAAO,EAGhHW,GAAc,SACdC,GAAc,QACdC,GAAc,OACdC,GAAc,aACdC,GAAc,SACdC,GAAc,SACdC,GAAc,SACdC,GAAc,QACdC,GAAc,KACdC,GAAc,YACdC,GAAc,WACdC,GAAc,SACdC,GAAc,UACdC,GAAc,OACdC,GAAc,UACdC,GAAc,QACdC,GAAc,OACdC,GAAc,SACdC,GAAc,QAGdC,GAAc,SACdC,GAAc,WACdC,GAAc,aACdC,GAAc,OACdC,GAAc,UACdC,GAAc,QACdC,GAAc,WACdC,GAAc,QAEdC,GAAiB,UACjBC,GAAiB,WAGjBC,GAAc,UAEdC,GAAsB,OAAO,SAAWpE,EAAO,UAC/CqE,EAAuBD,IAAY,OAAO,UAClB,OAAO,UACP,OACxBE,GAAuBD,GAAaA,EAAU,cACtBA,EAAU,cACV,OAMxBE,GAAS,SAAUC,EAAYC,EAAY,CACvC,IAAIC,EAAY,CAAC,EACbC,EAAWF,EACf,GAAI,CAACG,GAAaH,CAAU,EAAG,CAC3BE,EAAW,CAAC,EACZ,QAASE,KAAKJ,EACV,QAASK,KAAKL,EAAWI,CAAC,EACtBF,EAASG,CAAC,EAAIL,EAAWI,CAAC,EAAEC,CAAC,EAAE,OAAOH,EAASG,CAAC,EAAIH,EAASG,CAAC,EAAI,CAAC,CAAC,CAGhF,CACA,QAASC,KAAKP,EACVE,EAAUK,CAAC,EAAIJ,EAASI,CAAC,GAAKJ,EAASI,CAAC,EAAE,OAAS,IAAM,EAAIJ,EAASI,CAAC,EAAE,OAAOP,EAAWO,CAAC,CAAC,EAAIP,EAAWO,CAAC,EAEjH,OAAOL,CACX,EACAM,GAAY,SAAUC,EAAK,CAEvB,QADIC,EAAQ,CAAC,EACJL,EAAE,EAAGA,EAAEI,EAAI,OAAQJ,IACxBK,EAAMD,EAAIJ,CAAC,EAAE,YAAY,CAAC,EAAII,EAAIJ,CAAC,EAEvC,OAAOK,CACX,EACAC,GAAM,SAAUC,EAAMC,EAAM,CACxB,GAAI,OAAOD,IAASpF,EAAO,QAAUoF,EAAK,OAAS,EAAG,CAClD,QAASP,KAAKO,EACV,GAAIE,GAASD,CAAI,GAAKC,GAASF,EAAKP,CAAC,CAAC,EAAG,MAAO,GAEpD,MAAO,EACX,CACA,OAAOU,GAASH,CAAI,EAAIE,GAASD,CAAI,GAAKC,GAASF,CAAI,EAAI,EAC/D,EACAR,GAAe,SAAUY,EAAKC,EAAM,CAChC,QAASC,KAAQF,EACb,MAAO,mCAAmC,KAAKE,CAAI,IAAMD,EAAOb,GAAaY,EAAIE,CAAI,CAAC,EAAI,GAElG,EACAH,GAAW,SAAUI,EAAK,CACtB,OAAO,OAAOA,IAAQ3F,EAAO,MACjC,EACA4F,GAAkB,SAAUC,EAAQ,CAChC,GAAKA,EAGL,SAFIZ,EAAM,CAAC,EACPa,EAASC,GAAM,SAAUF,CAAM,EAAE,MAAM,GAAG,EACrC,EAAI,EAAG,EAAIC,EAAO,OAAQ,IAC/B,GAAIA,EAAO,CAAC,EAAE,QAAQ,GAAG,EAAI,GAAI,CAC7B,IAAIE,EAAQC,GAAKH,EAAO,CAAC,CAAC,EAAE,MAAM,KAAK,EACvCb,EAAI,CAAC,EAAI,CAAE,MAAQe,EAAM,CAAC,EAAG,QAAUA,EAAM,CAAC,CAAE,CACpD,MACIf,EAAI,CAAC,EAAIgB,GAAKH,EAAO,CAAC,CAAC,EAG/B,OAAOb,EACX,EACAK,GAAW,SAAUY,EAAK,CACtB,OAAOX,GAASW,CAAG,EAAIA,EAAI,YAAY,EAAIA,CAC/C,EACAC,GAAW,SAAUC,EAAS,CAC1B,OAAOb,GAASa,CAAO,EAAIL,GAAM,WAAYK,CAAO,EAAE,MAAM,GAAG,EAAE,CAAC,EAAI,MAC1E,EACAC,GAAW,SAAUpB,EAAK,CACtB,QAASJ,KAAKI,EACV,GAAKA,EAAI,eAAeJ,CAAC,EAEzB,KAAIyB,EAAWrB,EAAIJ,CAAC,EAChB,OAAOyB,GAAYtG,EAAO,QAAUsG,EAAS,QAAU,EACvD,KAAKA,EAAS,CAAC,CAAC,EAAIA,EAAS,CAAC,EAE9B,KAAKA,CAAQ,EAAI,OAGzB,OAAO,IACX,EACAP,GAAQ,SAAUQ,EAASL,EAAK,CAC5B,OAAOX,GAASW,CAAG,EAAIA,EAAI,QAAQK,EAASzG,EAAK,EAAIoG,CACzD,EACAM,GAAc,SAAUN,EAAK,CACzB,OAAOH,GAAM,SAAUG,CAAG,CAC9B,EACAD,GAAO,SAAUC,EAAKO,EAAK,CACvB,OAAAP,EAAMH,GAAM,SAAU,OAAOG,CAAG,CAAC,EAC1B,OAAOO,IAAQzG,EAAO,UAAYkG,EAAMA,EAAI,UAAU,EAAGO,CAAG,CAC3E,EAMIC,GAAY,SAAUC,EAAIC,EAAQ,CAE9B,GAAG,GAACD,GAAM,CAACC,GAKX,QAHI/B,EAAI,EAAGC,EAAGC,EAAG8B,EAAGC,EAAGC,EAASC,EAGzBnC,EAAI+B,EAAO,QAAU,CAACG,GAAS,CAElC,IAAIE,EAAQL,EAAO/B,CAAC,EAChBqC,EAAQN,EAAO/B,EAAI,CAAC,EAIxB,IAHAC,EAAIC,EAAI,EAGDD,EAAImC,EAAM,QAAU,CAACF,GAEnBE,EAAMnC,CAAC,GAGZ,GAFAiC,EAAUE,EAAMnC,GAAG,EAAE,KAAK6B,CAAE,EAEtBI,EACF,IAAKF,EAAI,EAAGA,EAAIK,EAAM,OAAQL,IAC1BG,EAAQD,EAAQ,EAAEhC,CAAC,EACnB+B,EAAII,EAAML,CAAC,EAEP,OAAOC,IAAM9G,EAAO,QAAU8G,EAAE,OAAS,EACrCA,EAAE,SAAW,EACT,OAAOA,EAAE,CAAC,GAAK9G,EAAO,SAEtB,KAAK8G,EAAE,CAAC,CAAC,EAAIA,EAAE,CAAC,EAAE,KAAK,KAAME,CAAK,EAGlC,KAAKF,EAAE,CAAC,CAAC,EAAIA,EAAE,CAAC,EAEbA,EAAE,QAAU,IAEf,OAAOA,EAAE,CAAC,IAAM9G,EAAO,UAAY,EAAE8G,EAAE,CAAC,EAAE,MAAQA,EAAE,CAAC,EAAE,MACnDA,EAAE,OAAS,EACX,KAAKA,EAAE,CAAC,CAAC,EAAIE,EAAQF,EAAE,CAAC,EAAE,MAAM,KAAMA,EAAE,MAAM,CAAC,CAAC,EAAI,OAGpD,KAAKA,EAAE,CAAC,CAAC,EAAIE,EAAQF,EAAE,CAAC,EAAE,KAAK,KAAME,EAAOF,EAAE,CAAC,CAAC,EAAI,OAGpDA,EAAE,QAAU,EAEZ,KAAKA,EAAE,CAAC,CAAC,EAAIE,EAAQA,EAAM,QAAQF,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EAAI,OAC1CA,EAAE,QAAU,EACnB,KAAKA,EAAE,CAAC,CAAC,EAAIE,EAAQF,EAAE,CAAC,EAAE,KAAK,KAAME,EAAM,QAAQF,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,CAAC,EAAI,OAC3DA,EAAE,OAAS,IAClB,KAAKA,EAAE,CAAC,CAAC,EAAIE,EAAQF,EAAE,CAAC,EAAE,MAAM,KAAM,CAACE,EAAM,QAAQF,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,CAAC,EAAE,OAAOA,EAAE,MAAM,CAAC,CAAC,CAAC,EAAI,SAKpG,KAAKA,CAAC,EAAIE,GAAgB,OAK1CnC,GAAK,CACT,CACJ,EAEAsC,GAAY,SAAUjB,EAAKkB,EAAK,CAE5B,QAASvC,KAAKuC,EAEV,GAAI,OAAOA,EAAIvC,CAAC,IAAM7E,EAAO,QAAUoH,EAAIvC,CAAC,EAAE,OAAS,GACnD,QAASC,EAAI,EAAGA,EAAIsC,EAAIvC,CAAC,EAAE,OAAQC,IAC/B,GAAIK,GAAIiC,EAAIvC,CAAC,EAAEC,CAAC,EAAGoB,CAAG,EAClB,OAAQrB,IAAM9E,GAAW,OAAY8E,UAGtCM,GAAIiC,EAAIvC,CAAC,EAAGqB,CAAG,EACtB,OAAQrB,IAAM9E,GAAW,OAAY8E,EAG7C,OAAOuC,EAAI,eAAe,GAAG,EAAIA,EAAI,GAAG,EAAIlB,CACpD,EAMImB,GAAoB,CAChB,GAAU,OACV,UAAW,OACX,SAAU,MACV,IAAU,CAAC,MAAO,MAAM,EACxB,GAAU,CAAC,MAAO,KAAK,EACvB,MAAU,MACV,EAAU,MACV,EAAU,MACV,MAAU,MACV,GAAU,CAAC,MAAO,MAAM,EACxB,GAAU,EACd,EAEAC,GAAiB,CACb,SAAc,aACd,OAAc,SACd,OAAc,CAAC,SAAU,MAAM,EAC/B,QAAc,KACd,SAAc,QACd,GAAc,CAAC,KAAM,IAAI,EACzB,IAAc,CAAC,UAAW,SAAS,EACnC,IAAc,MAClB,EAEAC,GAAkB,CACd,OAAkB,gBAClB,KAAkB,iBAClB,gBAAkB,0BAClB,iBAAkB,kBAClB,kBAAkB,iBAClB,iBAAkB,gBAClB,eAAkB,eAClB,aAAkB,cAClB,OAAkB,WAC1B,EAMIC,GAAiB,CAEjB,QAAU,CAAC,CAGP,8BACA,EAAG,CAAC9G,EAAS,CAACH,EAAM0D,GAAgB,QAAQ,CAAC,EAAG,CAChD,2BACA,EAAG,CAACvD,EAAS,CAACH,EAAMqD,GAAK,UAAU,CAAC,EAAG,CACvC,6BACA,EAAG,CAAClD,EAAS,CAACH,EAAM,MAAM,CAAC,EAAG,CAG9B,4BACA,mDACA,yCACA,EAAG,CAACA,EAAMG,CAAO,EAAG,CACpB,uBACA,EAAG,CAACA,EAAS,CAACH,EAAMuD,GAAM,OAAO,CAAC,EAAG,CACrC,0BACA,EAAG,CAACpD,EAAS,CAACH,EAAMuD,GAAM,KAAK,CAAC,EAAG,CACnC,mBACA,EAAG,CAACpD,EAAS,CAACH,EAAMuD,EAAK,CAAC,EAAG,CAG7B,wDACA,EAAG,CAACpD,EAAS,CAACH,EAAM,OAAO,CAAC,EAAG,CAC/B,6CACA,EAAG,CAACG,EAAS,CAACH,EAAM,SAAS,CAAC,EAAG,CACjC,uBACA,uEAGA,4DACA,2BAGA,yQAEA,iDACA,oCACA,sCACA,EAAG,CAACA,EAAMG,CAAO,EAAG,CACpB,2BACA,EAAG,CAACA,EAAS,CAACH,EAAM,OAAO,CAAC,EAAG,CAC/B,mBACA,EAAG,CAACG,EAAS,CAACH,EAAM,YAAY,CAAC,EAAG,CACpC,mDACA,EAAG,CAACG,EAAS,CAACH,EAAM,WAAW,CAAC,EAAG,CACnC,+BACA,+BACA,4BACA,EAAG,CAACG,EAAS,CAACH,EAAM,QAAQ,CAAC,EAAG,CAChC,uBACA,EAAG,CAACG,EAAS,CAACH,EAAM,WAAW,CAAC,EAAG,CACnC,6CACA,EAAG,CAACG,EAAS,CAACH,EAAM,IAAI,CAAC,EAAG,CAC5B,kCACA,EAAG,CAACG,EAAS,CAACH,EAAM,QAAQ,CAAC,EAAG,CAChC,uBACA,EAAG,CAACG,EAAS,CAACH,EAAM,SAAWqC,GAASsB,EAAc,CAAC,EAAG,CAC1D,yBACA,EAAG,CAAC,CAAC3D,EAAM,OAAQ,YAAc2D,EAAc,EAAGxD,CAAO,EAAG,CAC5D,qBACA,EAAG,CAACA,EAAS,CAACH,EAAMsD,GAAQ,QAAQ,CAAC,EAAG,CACxC,mBACA,EAAG,CAACnD,EAAS,CAACH,EAAMuD,GAAM,QAAQ,CAAC,EAAG,CACtC,wBACA,EAAG,CAACpD,EAAS,CAACH,EAAM,SAAS,CAAC,EAAG,CACjC,oBACA,EAAG,CAACG,EAAS,CAACH,EAAM,SAAS,CAAC,EAAG,CACjC,mBACA,EAAG,CAACG,EAAS,CAACH,EAAMuD,GAAM,QAAQ,CAAC,EAAG,CACtC,yBACA,EAAG,CAACpD,EAAS,CAACH,EAAM,OAAS2D,EAAc,CAAC,EAAG,CAC/C,oBACA,EAAG,CAACxD,EAAS,CAACH,EAAM0D,GAAgBJ,EAAO,CAAC,EAAG,CAC/C,6BACA,EAAG,CAACnD,EAAS,CAACH,EAAM,KAAK,CAAC,EAAG,CAC7B,oBACA,EAAG,CAAC,CAACA,EAAM,OAAQ,WAAW,EAAGG,CAAO,EAAG,CAC3C,uDACA,EAAG,CAAC,CAACH,EAAM,OAAQ,KAAO2D,EAAc,EAAGxD,CAAO,EAAG,CACrD,4BACA,EAAG,CAACA,EAAS,CAACH,EAAM6C,GAAU,WAAW,CAAC,EAAG,CAC7C,wBACA,EAAG,CAAC1C,EAAS,CAACH,EAAMyD,GAAQ,WAAW,CAAC,EAAG,CAC3C,0BACA,EAAG,CAAC,CAACzD,EAAMyD,GAAQ,SAAS,EAAGtD,CAAO,EAAG,CACzC,gCACA,iDACA,oEACA,EAAG,CAACH,EAAMG,CAAO,EAAG,CACpB,qBACA,EAAG,CAACH,CAAI,EAAG,CACX,kCACA,kCACA,EAAG,CAACG,EAASH,CAAI,EAAG,CAGpB,6DACA,EAAG,CAAC,CAACA,EAAMwD,EAAQ,EAAGrD,EAAS,CAACF,EAAMa,EAAK,CAAC,EAAG,CAC/C,uCACA,kCACA,4BACA,4BACA,4BACA,6BACA,qCACA,qCACA,6CACA,EAAG,CAACd,EAAMG,EAAS,CAACF,EAAMa,EAAK,CAAC,EAAG,CACnC,8BACA,EAAG,CAACX,EAAS,CAACH,EAAM,KAAK,EAAG,CAACC,EAAMa,EAAK,CAAC,EAAG,CAC5C,4CACA,EAAG,CAACX,EAAS,CAACH,EAAM,QAAQ,EAAG,CAACC,EAAMa,EAAK,CAAC,EAAG,CAC/C,oBACA,EAAG,CAACd,EAAM,CAACC,EAAMa,EAAK,CAAC,EAAG,CAC1B,qCACA,EAAG,CAAC,CAACd,EAAM,OAAQ,MAAM,EAAGG,EAAS,CAACF,EAAMa,EAAK,CAAC,EAAG,CAErD,4BACA,EAAG,CAACd,EAAMG,CAAO,EAAG,CAEpB,kCACA,EAAG,CAACA,EAAS,CAACH,EAAMkD,GAAO,WAAW,CAAC,EAAG,CAE1C,kCACA,EAAG,CAAC/C,EAAS,CAACH,EAAMqD,GAAK,WAAW,CAAC,EAAG,CAExC,6BACA,EAAG,CAAC,CAACrD,EAAMkD,GAAO,UAAU,EAAG/C,CAAO,EAAG,CAEzC,yDACA,EAAG,CAACA,EAAS,CAACH,EAAM,UAAY2D,EAAc,CAAC,EAAG,CAElD,2BACA,EAAG,CAACxD,EAAS,CAACH,EAAM0D,GAAgB,QAAQ,CAAC,EAAG,CAEhD,6DACA,EAAG,CAAC1D,EAAMG,CAAO,EAAG,CAEpB,mDACA,EAAG,CAACA,EAAS,CAACH,EAAM0D,GAAgB,QAAQ,CAAC,EAAG,CAChD,qCACA,EAAG,CAAC,CAAC1D,EAAM0D,GAAgB,QAAQ,CAAC,EAAG,CACvC,kCACA,EAAG,CAACvD,EAASH,CAAI,EAAG,CACpB,8CACA,EAAG,CAACA,EAAM,CAACG,EAAS,GAAG,CAAC,EAAG,CAE3B,4BACA,EAAG,CAACH,EAAMG,CAAO,EAAG,CAGpB,4CACA,EAAG,CAAC,CAACH,EAAM0D,GAAgBJ,EAAO,EAAGnD,CAAO,EAAG,CAC/C,sCACA,EAAG,CAAC,CAACH,EAAM,UAAU,EAAGG,CAAO,EAAG,CAClC,gCACA,EAAG,CAACH,EAAMG,CAAO,EAAG,CACpB,qCACA,EAAG,CAACA,EAAS,CAACH,EAAMsD,GAAQ,UAAU,CAAC,EAAG,CAC1C,6BACA,cACA,8FAEA,sFAEA,wBACA,4EAGA,wHAEA,wBACA,EAAG,CAACtD,EAAM,CAACG,EAAS,KAAM,GAAG,CAAC,EAAG,CAEjC,sBACA,EAAG,CAACH,EAAM,CAACG,EAAS,YAAaZ,EAAK,CAAC,CAC3C,EAEA,IAAM,CAAC,CAEH,mCACA,EAAG,CAAC,CAACa,EAAc,OAAO,CAAC,EAAG,CAE9B,eACA,0BACA,EAAG,CAAC,CAACA,EAAc,MAAM,CAAC,EAAG,CAE7B,qCACA,EAAG,CAAC,CAACA,EAAc,OAAO,CAAC,EAAG,CAE9B,+BACA,EAAG,CAAC,CAACA,EAAc,OAAO,CAAC,EAAG,CAG9B,sCACA,EAAG,CAAC,CAACA,EAAc,KAAK,CAAC,EAAG,CAE5B,eACA,EAAG,CAAC,CAACA,EAAc,OAAO,CAAC,EAAG,CAE9B,oGACA,mCACA,qCACA,EAAG,CAAC,CAACA,EAAc,OAAQb,GAAOwF,EAAQ,CAAC,EAAG,CAC9C,UACA,EAAG,CAAC,CAAC3E,EAAc,KAAK,CAAC,EAAG,CAC5B,eACA,EAAG,CAAC,CAACA,EAAc,OAAO,CAAC,CAC/B,EAEA,OAAS,CAAC,CAON,iFACA,EAAG,CAACE,EAAO,CAACJ,EAAQ2C,EAAO,EAAG,CAAC5C,EAAMQ,CAAM,CAAC,EAAG,CAC/C,iEACA,0CACA,eACA,EAAG,CAACH,EAAO,CAACJ,EAAQ2C,EAAO,EAAG,CAAC5C,EAAMO,CAAM,CAAC,EAAG,CAG/C,yCACA,EAAG,CAACF,EAAO,CAACJ,EAAQ8B,EAAK,EAAG,CAAC/B,EAAMO,CAAM,CAAC,EAAG,CAC7C,sCACA,yCACA,EAAG,CAACF,EAAO,CAACJ,EAAQ8B,EAAK,EAAG,CAAC/B,EAAMQ,CAAM,CAAC,EAAG,CAC7C,eACA,EAAG,CAACH,EAAO,CAACJ,EAAQ8B,EAAK,CAAC,EAAG,CAG7B,+BACA,EAAG,CAAC1B,EAAO,CAACJ,EAAQ4C,EAAK,EAAG,CAAC7C,EAAMO,CAAM,CAAC,EAAG,CAG7C,4FACA,EAAG,CAACF,EAAO,CAACJ,EAAQoC,EAAK,EAAG,CAACrC,EAAMQ,CAAM,CAAC,EAAG,CAC7C,sBACA,EAAG,CAACH,EAAO,CAACJ,EAAQoC,EAAK,EAAG,CAACrC,EAAMO,CAAM,CAAC,EAAG,CAG7C,+OACA,EAAG,CAACF,EAAO,CAACJ,EAAQkC,EAAM,EAAG,CAACnC,EAAMQ,CAAM,CAAC,EAAG,CAC9C,8BACA,iEACA,EAAG,CAACH,EAAO,CAACJ,EAAQkC,EAAM,EAAG,CAACnC,EAAMO,CAAM,CAAC,EAAG,CAG9C,wEACA,qDACA,EAAE,CAAC,CAACF,EAAO,KAAM,GAAG,EAAG,CAACJ,EAAQ8C,EAAM,EAAG,CAAC/C,EAAMQ,CAAM,CAAC,EAAG,CAE1D,kDACA,yBACA,uCACA,iDACA,4DACA,sHACA,uBACA,EAAG,CAAC,CAACH,EAAO,KAAM,GAAG,EAAG,CAACJ,EAAQ8C,EAAM,EAAG,CAAC/C,EAAMO,CAAM,CAAC,EAAG,CAG3D,6GACA,wCACA,EAAG,CAACF,EAAO,CAACJ,EAAQyC,EAAO,EAAG,CAAC1C,EAAMO,CAAM,CAAC,EAAG,CAG/C,sBACA,iEACA,EAAG,CAACF,EAAO,CAACJ,EAAQ0C,EAAI,EAAG,CAAC3C,EAAMO,CAAM,CAAC,EAAG,CAC5C,+BACA,EAAG,CAACF,EAAO,CAACJ,EAAQ0G,GAAW,CAAE,QAAY,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EAAG,IAAMhE,EAAK,CAAC,EAAG,CAAC3C,EAAMQ,CAAM,CAAC,EAAG,CAGzH,8DACA,EAAG,CAACH,EAAO,CAACJ,EAAQ,KAAK,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CAG7C,2BACA,kCACA,EAAG,CAACF,EAAO,CAACJ,EAAQ,MAAM,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CAG9C,iCACA,EAAG,CAACF,EAAO,CAACJ,EAAQ,QAAQ,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CAGhD,8IACA,0EACA,EAAG,CAACF,EAAO,CAACJ,EAAQmC,EAAM,EAAG,CAACpC,EAAMQ,CAAM,CAAC,EAAG,CAC9C,uCACA,EAAG,CAACH,EAAO,CAACJ,EAAQmC,EAAM,EAAG,CAACpC,EAAMO,CAAM,CAAC,EAAG,CAG9C,iFACA,yCACA,8EACA,EAAG,CAACF,EAAO,CAACJ,EAAQuC,EAAQ,EAAG,CAACxC,EAAMO,CAAM,CAAC,EAAG,CAChD,mCACA,EAAG,CAACF,EAAO,CAACJ,EAAQuC,EAAQ,EAAG,CAACxC,EAAMQ,CAAM,CAAC,EAAG,CAGhD,+DACA,EAAG,CAACH,EAAO,CAACJ,EAAQqC,EAAE,EAAG,CAACtC,EAAMQ,CAAM,CAAC,EAAG,CAC1C,sDACA,sEACA,sBACA,EAAG,CAACH,EAAO,CAACJ,EAAQqC,EAAE,EAAG,CAACtC,EAAMO,CAAM,CAAC,EAAG,CAG1C,sBACA,EAAG,CAACN,EAAQI,EAAO,CAACL,EAAMQ,CAAM,CAAC,EAAG,CACpC,4CACA,0CACA,EAAG,CAAC,CAACH,EAAO,KAAM,GAAG,EAAG,CAACL,EAAMO,CAAM,EAAG,CAACN,EAAQ,OAAO,CAAC,EAAG,CAG5D,uBACA,EAAG,CAACI,EAAO,CAACJ,EAAQiC,EAAM,EAAG,CAAClC,EAAMQ,CAAM,CAAC,EAAG,CAE9C,sNACA,EAAG,CAACH,EAAO,CAACJ,EAAQiC,EAAM,EAAG,CAAClC,EAAMO,CAAM,CAAC,EAAG,CAC9C,6BACA,EAAG,CAACN,EAAQI,CAAK,EAAG,CAGpB,qGACA,EAAG,CAACA,EAAO,CAACJ,EAAQ6C,EAAI,EAAG,CAAC9C,EAAMO,CAAM,CAAC,EAAG,CAC5C,oBACA,+BACA,EAAG,CAAC,CAACF,EAAO,eAAe,EAAG,CAACJ,EAAQ6C,EAAI,EAAG,CAAC9C,EAAMQ,CAAM,CAAC,EAAG,CAG/D,eACA,yCACA,8BACA,EAAG,CAACH,EAAO,CAACJ,EAAQ6B,EAAM,EAAG,CAAC9B,EAAMQ,CAAM,CAAC,EAAG,CAC9C,+CACA,EAAG,CAAC,CAACH,EAAO,QAAS,eAAe,EAAG,CAACJ,EAAQ6B,EAAM,EAAG,CAAC9B,EAAMO,CAAM,CAAC,EAAG,CAG1E,8BACA,EAAG,CAACF,EAAOJ,EAAQ,CAACD,EAAMQ,CAAM,CAAC,EAAG,CACpC,gCACA,+BACA,EAAG,CAACH,EAAO,CAACJ,EAAQgC,EAAU,EAAG,CAACjC,EAAMO,CAAM,CAAC,EAAG,CAGlD,mFACA,EAAG,CAACF,EAAO,CAACJ,EAAQ+B,EAAI,EAAG,CAAChC,EAAMQ,CAAM,CAAC,EAAG,CAC5C,+CACA,EAAG,CAACH,EAAO,CAACJ,EAAQ+B,EAAI,EAAG,CAAChC,EAAMO,CAAM,CAAC,EAAG,CAG5C,YACA,EAAG,CAACF,EAAO,CAACJ,EAAQ,KAAK,EAAG,CAACD,EAAMQ,CAAM,CAAC,EAAG,CAC7C,2CAGA,oCACA,+EACA,EAAG,CAACP,EAAQ,CAACI,EAAO,KAAM,GAAG,EAAG,CAACL,EAAMO,CAAM,CAAC,EAAG,CAGjD,oBACA,0HACA,EAAG,CAACF,EAAO,CAACJ,EAAQ,KAAK,EAAG,CAACD,EAAMQ,CAAM,CAAC,EAAG,CAC7C,8RACA,EAAG,CAACH,EAAO,CAACJ,EAAQ,KAAK,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CAG7C,iBACA,EAAG,CAAC,CAACN,EAAQ6E,EAAQ,EAAGzE,EAAO,CAACL,EAAM2G,GAAW,CAAE,OAAW,CAAC,UAAW,OAAO,EAAG,IAAM,QAAS,CAAC,CAAC,EAAG,CAGxG,qCACA,EAAG,CAACtG,EAAO,CAACJ,EAAQ,MAAM,EAAG,CAACD,EAAMQ,CAAM,CAAC,EAAG,CAG9C,8BACA,mBACA,EAAG,CAACH,EAAO,CAACJ,EAAQ,OAAO,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CAG/C,gDACA,EAAG,CAACF,EAAO,CAACJ,EAAQ,SAAS,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CAGjD,8BACA,kCACA,EAAG,CAACF,EAAO,CAACJ,EAAQ,WAAW,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CAGnD,gBACA,6CACA,EAAG,CAACF,EAAO,CAACJ,EAAQ,KAAK,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CAG7C,wCACA,EAAG,CAACF,EAAO,CAACJ,EAAQ,WAAW,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CAGnD,0CACA,EAAG,CAACF,EAAO,CAACJ,EAAQ,SAAS,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CAGjD,+CACA,gEACA,EAAG,CAACF,EAAO,CAACJ,EAAQ,QAAQ,EAAG,CAACD,EAAMQ,CAAM,CAAC,EAAG,CAChD,0BACA,8BACA,EAAG,CAACH,EAAO,CAACJ,EAAQ,QAAQ,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CAGhD,YACA,EAAG,CAACF,EAAO,CAACJ,EAAQ,KAAK,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CAG7C,mBACA,4EACA,EAAG,CAACN,EAAQI,EAAO,CAACL,EAAMQ,CAAM,CAAC,EAAG,CAEpC,sIAGA,+EACA,mBACA,8BACA,wBACA,6BACA,kDACA,EAAG,CAACP,EAAQI,EAAO,CAACL,EAAMO,CAAM,CAAC,EAAG,CAEpC,2BACA,uCACA,sBACA,EAAG,CAACN,EAAQI,EAAO,CAACL,EAAMQ,CAAM,CAAC,EAAG,CAEpC,gBACA,EAAG,CAACH,EAAO,CAACJ,EAAQsC,EAAS,EAAG,CAACvC,EAAMQ,CAAM,CAAC,EAAG,CACjD,mCACA,EAAG,CAACH,EAAO,CAACJ,EAAQ,WAAW,EAAG,CAACD,EAAMO,CAAM,CAAC,EAAG,CACnD,sDACA,EAAG,CAACF,EAAO,CAACJ,EAAQwC,EAAM,EAAG,CAACzC,EAAMQ,CAAM,CAAC,EAAG,CAC9C,iBACA,EAAG,CAACP,EAAQI,EAAO,CAACL,EAAMO,CAAM,CAAC,EAAG,CACpC,oBACA,EAAG,CAAC,CAACF,EAAO,MAAO,GAAG,EAAG,CAACJ,EAAQsC,EAAS,EAAG,CAACvC,EAAMO,CAAM,CAAC,EAAG,CAC/D,qDACA,EAAG,CAACF,EAAO,CAACJ,EAAQ+C,EAAK,EAAG,CAAChD,EAAMQ,CAAM,CAAC,EAAG,CAC7C,uCACA,EAAG,CAACH,EAAO,CAACJ,EAAQ+C,EAAK,EAAG,CAAChD,EAAMO,CAAM,CAAC,EAAG,CAM7C,qBACA,sBACA,EAAG,CAACN,EAAQ,CAACD,EAAMS,CAAO,CAAC,EAAG,CAC9B,qBACA,EAAG,CAAC,CAACJ,EAAO,IAAK,SAAS,EAAG,CAACJ,EAAQ2C,EAAO,EAAG,CAAC5C,EAAMS,CAAO,CAAC,EAAG,CAClE,mCACA,0BACA,EAAG,CAACR,EAAQI,EAAO,CAACL,EAAMS,CAAO,CAAC,EAAG,CACrC,4DACA,EAAG,CAAC,CAACR,EAAQqC,EAAE,EAAG,CAACtC,EAAMS,CAAO,CAAC,EAAG,CACpC,cACA,EAAG,CAACR,EAAQ,CAACI,EAAO0B,GAAM,KAAK,EAAG,CAAC/B,EAAMS,CAAO,CAAC,EAAG,CACpD,gCACA,EAAG,CAAC,CAACJ,EAAO8C,GAAW,mBAAmB,EAAG,CAAClD,EAAQiC,EAAM,EAAG,CAAClC,EAAMS,CAAO,CAAC,EAAG,CACjF,6BACA,EAAG,CAAC,CAACJ,EAAO,IAAK,aAAa,EAAG,CAACJ,EAAQiC,EAAM,EAAG,CAAClC,EAAMS,CAAO,CAAC,EAAG,CACrE,iBACA,EAAG,CAAC,CAACJ,EAAO8C,GAAW,WAAW,EAAG,CAAClD,EAAQiC,EAAM,EAAG,CAAClC,EAAMS,CAAO,CAAC,EAAG,CACzE,QACA,EAAG,CAAC,CAACJ,EAAO8C,EAAU,EAAG,CAAClD,EAAQiC,EAAM,EAAG,CAAClC,EAAMS,CAAO,CAAC,EAAG,CAC7D,aACA,EAAG,CAACJ,EAAO,CAACJ,EAAQsD,EAAQ,EAAG,CAACvD,EAAMS,CAAO,CAAC,EAAG,CACjD,2BACA,EAAG,CAACJ,EAAO,CAACJ,EAAQ6B,EAAM,EAAG,CAAC9B,EAAMS,CAAO,CAAC,EAAG,CAC/C,kBACA,EAAG,CAACJ,EAAO,CAACJ,EAAQwC,EAAM,EAAG,CAACzC,EAAMS,CAAO,CAAC,EAAG,CAC/C,uBACA,qBACA,EAAG,CAACJ,EAAO,CAACJ,EAAQ4C,EAAK,EAAG,CAAC7C,EAAMS,CAAO,CAAC,EAAE,CAC7C,0BACA,EAAG,CAACJ,EAAO,CAACJ,EAAQ6C,EAAI,EAAG,CAAC9C,EAAMS,CAAO,CAAC,EAAG,CAC7C,wBACA,EAAG,CAACJ,EAAO,CAACJ,EAAQ8C,EAAM,EAAG,CAAC/C,EAAMS,CAAO,CAAC,EAAG,CAC/C,2BACA,EAAG,CAACR,EAAQI,EAAO,CAACL,EAAMS,CAAO,CAAC,EAAG,CACrC,0CACA,2DACA,EAAG,CAAC,CAACR,EAAQ,YAAa,KAAM0G,GAAW,CAAC,GAAK,KAAK,CAAC,EAAG,CAACtG,EAAOoF,EAAI,EAAG,CAACzF,EAAMS,CAAO,CAAC,EAAG,CAM3F,oBACA,EAAG,CAACJ,EAAO,CAACJ,EAAQ6C,EAAI,EAAG,CAAC9C,EAAMM,EAAO,CAAC,EAAG,CAC7C,oCACA,EAAG,CAACD,EAAO,CAACJ,EAAQsC,EAAS,EAAG,CAACvC,EAAMM,EAAO,CAAC,EAAG,CAClD,UACA,oBACA,8BACA,EAAG,CAACL,EAAQI,EAAO,CAACL,EAAMM,EAAO,CAAC,EAAG,CACrC,6BACA,EAAG,CAACD,EAAO,CAACJ,EAAQwC,EAAM,EAAG,CAACzC,EAAMM,EAAO,CAAC,EAAG,CAM/C,6CACA,EAAG,CAACD,EAAO,CAACJ,EAAQ2C,EAAO,EAAG,CAAC5C,EAAMU,EAAQ,CAAC,EAAG,CACjD,iBACA,4DACA,EAAG,CAACT,EAAQI,EAAO,CAACL,EAAMU,EAAQ,CAAC,EAAG,CACtC,8BACA,EAAG,CAACL,EAAO,CAACJ,EAAQ0C,EAAI,EAAG,CAAC3C,EAAMU,EAAQ,CAAC,EAAG,CAC9C,sCACA,EAAG,CAACL,EAAO,CAACJ,EAAQ8B,EAAK,EAAG,CAAC/B,EAAMU,EAAQ,CAAC,EAAG,CAC/C,eACA,EAAG,CAACL,EAAO,CAACJ,EAAQyC,EAAO,EAAG,CAAC1C,EAAMU,EAAQ,CAAC,EAAG,CACjD,aACA,EAAG,CAACL,EAAO,CAACJ,EAAQuC,EAAQ,EAAG,CAACxC,EAAMU,EAAQ,CAAC,EAAG,CAClD,iBACA,EAAG,CAACL,EAAO,CAACJ,EAAQ6C,EAAI,EAAG,CAAC9C,EAAMU,EAAQ,CAAC,EAAG,CAC9C,cACA,EAAG,CAACL,EAAO,CAACJ,EAAQqC,EAAE,EAAG,CAACtC,EAAMU,EAAQ,CAAC,EAAG,CAC5C,2BACA,EAAG,CAACL,EAAO,CAACJ,EAAQ+C,EAAK,EAAG,CAAChD,EAAMU,EAAQ,CAAC,EAAG,CAM/C,sBACA,EAAG,CAACL,EAAO,CAACJ,EAAQiC,EAAM,EAAG,CAAClC,EAAMW,EAAE,CAAC,EAAG,CAC1C,uBACA,EAAG,CAACV,EAAQI,EAAO,CAACL,EAAMW,EAAE,CAAC,EAAG,CAChC,2BACA,EAAG,CAACN,EAAO,CAACJ,EAAQsD,EAAQ,EAAG,CAACvD,EAAMW,EAAE,CAAC,EAAG,CAC5C,yBACA,EAAG,CAAC,CAACX,EAAMW,EAAE,CAAC,EAAG,CAMjB,sCACA,EAAG,CAACV,EAAQ,CAACD,EAAMY,EAAQ,CAAC,EAAG,CAC/B,YACA,EAAG,CAACP,EAAO,CAACJ,EAAQ6B,EAAM,EAAG,CAAC9B,EAAMY,EAAQ,CAAC,EAAG,CAChD,oBACA,EAAG,CAACP,EAAO,CAACJ,EAAQ8B,EAAK,EAAG,CAAC/B,EAAMY,EAAQ,CAAC,EAAG,CAC/C,cACA,EAAG,CAAC,CAACZ,EAAMY,EAAQ,CAAC,EAAG,CAMvB,sDACA,EAAG,CAACP,EAAO,CAACL,EAAMS,CAAO,CAAC,EAAG,CAC7B,yEACA,EAAG,CAAC,CAACT,EAAMS,CAAO,CAAC,EAAG,CACtB,8EACA,EAAG,CAACJ,EAAO,CAACL,EAAM2G,GAAW,CAAE,OAAW,SAAU,GAAO,KAAM,IAAMnG,CAAO,CAAC,CAAC,EAAG,CACnF,8CACA,EAAG,CAAC,CAACR,EAAMQ,CAAM,CAAC,EAAG,CACrB,gEACA,EAAG,CAAC,CAACR,EAAMO,CAAM,CAAC,EAAG,CACrB,kCACA,EAAG,CAACF,EAAO,CAACJ,EAAQ,SAAS,CAAC,CAClC,EAEA,OAAS,CAAC,CAEN,4BACA,EAAG,CAACC,EAAS,CAACH,EAAMqD,GAAK,MAAM,CAAC,EAAG,CAEnC,sBACA,EAAG,CAACrD,EAAMG,CAAO,EAAG,CAEpB,2CACA,EAAG,CAACA,EAAS,CAACH,EAAM,OAAO,CAAC,EAAG,CAE/B,uBACA,4EACA,0BACA,yCACA,8BAEA,aACA,EAAG,CAACA,EAAMG,CAAO,EAAG,CACpB,aACA,EAAG,CAAC,CAACH,EAAM,QAAQ,CAAC,EAAG,CAEvB,+BACA,EAAG,CAACG,EAASH,CAAI,CACrB,EAEA,GAAK,CAAC,CAGF,8BACA,EAAG,CAAC,CAACA,EAAM,IAAK,GAAG,EAAG,CAACG,EAASyG,GAAWE,EAAiB,CAAC,EAAG,CAChE,+DAEA,kFACA,EAAG,CAAC9G,EAAMG,CAAO,EAAG,CACpB,qCACA,yCACA,EAAG,CAAC,CAACA,EAAS,UAAW,GAAIyG,GAAWE,EAAiB,EAAG,CAAC9G,EAAM4D,EAAO,CAAC,EAAG,CAC9E,2BACA,EAAG,CAAC5D,EAAMG,CAAO,EAAG,CAGpB,uDACA,sFACA,sBACA,EAAG,CAAC,CAACA,EAAS,KAAM,GAAG,EAAG,CAACH,EAAM,KAAK,CAAC,EAAG,CAC1C,0BACA,iDACA,EAAG,CAAC,CAACA,EAAM,OAAO,EAAG,CAACG,EAAS,KAAM,GAAG,CAAC,EAAG,CAG5C,2BACA,EAAG,CAACA,EAAS,CAACH,EAAMoD,GAAa,UAAU,CAAC,EAAG,CAC/C,4BACA,EAAG,CAACjD,EAAS,CAACH,EAAMoD,GAAa,UAAU,CAAC,EAAG,CAC/C,6CACA,EAAG,CAACjD,EAAS,CAACH,EAAMoD,GAAa,eAAe,CAAC,EAAG,CACpD,0BACA,EAAG,CAACjD,EAAS,CAACH,EAAMoD,GAAa,QAAQ,CAAC,EAAG,CAC7C,mBACA,EAAG,CAACjD,EAAS,CAACH,EAAMoD,EAAU,CAAC,EAAG,CAGlC,sCACA,EAAG,CAACjD,EAASH,CAAI,EAAG,CACpB,kCACA,EAAG,CAAC,CAACA,EAAM,OAAQ,UAAU,EAAGG,CAAO,EAAG,CAC1C,8BAEA,kIACA,EAAG,CAACH,EAAMG,CAAO,EAAG,CACpB,YACA,EAAG,CAACA,EAAS,CAACH,EAAMkC,EAAU,CAAC,EAAG,CAClC,6DACA,EAAG,CAAC/B,EAAS,CAACH,EAAM,SAAS,CAAC,EAAG,CACjC,iFACA,EAAG,CAACG,EAAS,CAACH,EAAMsD,GAAQ,KAAK,CAAC,EAAG,CACrC,uCACA,+CACA,EAAG,CAACnD,EAAS,CAACH,EAAM,OAAO,CAAC,EAAG,CAC/B,uCAEA,EAAG,CAAC,CAACG,EAASyG,GAAW,CAAC,GAAK,MAAM,GAAK,MAAM,GAAK,KAAK,GAAK,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,MAAM,EAAI,MAAM,IAAI,IAAI,CAAC,EAAG,CAAC5G,EAAM,OAAO,CAAC,EAAG,CAC1J,sCACA,EAAG,CAACG,EAAS,CAACH,EAAM,SAAS,CAAC,EAAG,CAGjC,kCACA,EAAG,CAAC,CAACA,EAAM,WAAW,EAAGG,CAAO,EAAE,CAGlC,qBACA,iBACA,2BAGA,gCACA,2BACA,wBAGA,wCACA,oCACA,qEACA,0SAEA,sCACA,6BACA,2DACA,oBACA,6EACA,kBACA,EAAG,CAACH,EAAMG,CAAO,EAAG,CACpB,qBACA,EAAG,CAAC,CAACH,EAAM,SAAS,EAAGG,CAAO,EAAG,CACjC,mDACA,oBACA,EAAG,CAACH,EAAMG,CAAO,CACrB,CACJ,EAMI+G,GAAgB,UAAY,CACxB,IAAIP,EAAQ,CAAE,KAAO,CAAC,EAAG,SAAW,CAAC,EAAG,YAAc,CAAC,EAAG,SAAW,CAAC,CAAC,EACvE,OAAAb,GAAS,KAAKa,EAAM,KAAM,CACtB,CAACjH,EAAS,CAACM,EAAMG,EAASE,GAAOJ,CAAI,CAAC,EACtC,CAACN,GAAK,CAACS,CAAY,CAAC,EACpB,CAACR,GAAQ,CAACK,EAAMK,EAAOJ,CAAM,CAAC,EAC9B,CAACL,GAAQ,CAACG,EAAMG,CAAO,CAAC,EACxB,CAACL,EAAI,CAACE,EAAMG,CAAO,CAAC,CACxB,CAAC,EACD2F,GAAS,KAAKa,EAAM,SAAU,CAC1B,CAACjH,EAAS,CAACS,EAASE,EAAK,CAAC,EAC1B,CAACR,GAAQ,CAACM,CAAO,CAAC,EAClB,CAACL,EAAI,CAACK,CAAO,CAAC,CAClB,CAAC,EACD2F,GAAS,KAAKa,EAAM,YAAa,CAC7B,CAACjH,EAAS,aAAa,EACvB,CAACI,EAAI,QAAQ,CACjB,CAAC,EACDgG,GAAS,KAAKa,EAAM,SAAU,CAC1B,CAACjH,EAAS,CAACM,EAAMG,CAAO,CAAC,EACzB,CAACR,GAAK,CAACS,CAAY,CAAC,EACpB,CAACR,GAAQ,CAACM,EAAQI,CAAK,CAAC,EACxB,CAACT,GAAQ,CAACG,EAAMG,CAAO,CAAC,EACxB,CAACL,EAAI,CAACE,EAAMG,CAAO,CAAC,CACxB,CAAC,EACMwG,CACf,EAAG,EAECQ,GAAc,SAAUC,EAAMC,EAAU,CAExC,IAAIC,EAAaJ,GAAa,KAAKG,CAAQ,EACvCE,EAAiBL,GAAa,SAASG,CAAQ,GAAK,EACpDG,EAAeN,GAAa,YAAYG,CAAQ,GAAK,EACrDI,EAAiBP,GAAa,SAASG,CAAQ,GAAK,EAExD,SAASK,GAAS,CACd5B,GAAS,KAAK,KAAMwB,CAAU,CAClC,CAEA,OAAAI,EAAM,UAAU,QAAU,UAAY,CAClC,OAAON,CACX,EAEAM,EAAM,UAAU,gBAAkB,UAAY,CAG1C,OAAK3D,GAOEA,GACE,qBAAqBjC,EAAa,EAClC,KAAK,SAAU6F,EAAK,CACjB,OAAOP,EACE,MAAM,IAAIQ,GAASD,EAAK,EAAK,CAAC,EAC9B,QAAQ,EACR,IAAI,CACzB,CAAC,EAbUP,EACE,QAAQ,EACR,IAAI,CAYrB,EAEAM,EAAM,UAAU,iBAAmB,UAAY,CAC3C,OAAON,EAAK,cAAc,EAAE,IAAI,CACpC,EAEIC,GAAYtH,KACZ2H,EAAM,UAAU,GAAK,SAAUG,EAAY,CACvC,IAAIC,EAAK,GACT,QAASxD,KAAK,KACV,GAAI,KAAK,eAAeA,CAAC,GAAK,CAACM,GAAI2C,EAAgBjD,CAAC,GAAKS,GAASyC,EAAehC,GAAMgC,EAAc,KAAKlD,CAAC,CAAC,EAAI,KAAKA,CAAC,CAAC,GAAKS,GAASyC,EAAehC,GAAMgC,EAAcK,CAAU,EAAIA,CAAU,GAE5L,GADAC,EAAK,GACDD,GAAcpI,EAAO,UAAW,cAC7BoI,GAAcpI,EAAO,WAAaqI,EAAI,CAC7CA,EAAK,CAACA,EACN,KACJ,CAEJ,OAAOA,CACX,EACAJ,EAAM,UAAU,SAAW,UAAY,CACnC,IAAI/B,EAAMpG,GACV,QAAS+E,KAAKmD,EACN,OAAO,KAAKA,EAAenD,CAAC,CAAC,IAAO7E,EAAO,YAC3CkG,IAAQA,EAAM,IAAMpG,IAAS,KAAKkI,EAAenD,CAAC,CAAC,GAG3D,OAAOqB,GAAOlG,EAAO,SACzB,GAGCsE,KACD2D,EAAM,UAAU,KAAO,SAAUK,EAAI,CACjC,IAAIC,EAAO,KACPC,EAAe,UAAY,CAC3B,QAAS9C,KAAQ6C,EACTA,EAAK,eAAe7C,CAAI,IACxB,KAAKA,CAAI,EAAI6C,EAAK7C,CAAI,EAGlC,EACA8C,EAAa,UAAY,CACrB,GAAKP,EAAM,UAAU,GACrB,SAAWA,EAAM,UAAU,QAC/B,EACA,IAAIQ,EAAc,IAAID,EACtB,OAAAF,EAAGG,CAAW,EACPA,CACX,GAGG,IAAIR,CACf,EAMA,SAASE,GAAUO,EAAMC,EAAY,CAGjC,GAFAD,EAAOA,GAAQ,CAAC,EAChBrC,GAAS,KAAK,KAAMhE,EAAa,EAC7BsG,EACAtC,GAAS,KAAK,KAAM,CAChB,CAAC/E,GAAQsE,GAAgB8C,EAAK9G,EAAE,CAAC,CAAC,EAClC,CAACJ,GAAaoE,GAAgB8C,EAAK7G,EAAgB,CAAC,CAAC,EACrD,CAACd,EAAQ,MAAM,KAAK2H,EAAKzG,EAAS,CAAC,CAAC,EACpC,CAACpB,EAAO2F,GAAYkC,EAAKxG,EAAQ,CAAC,CAAC,EACnC,CAACT,GAAU+E,GAAYkC,EAAKvG,EAAW,CAAC,CAAC,EACzC,CAACT,GAAa8E,GAAYkC,EAAKtG,EAAe,CAAC,CAAC,EAChD,CAACzB,EAAc6F,GAAYkC,EAAK5G,EAAO,CAAC,CAAC,EACzC,CAACP,GAAaqE,GAAgB8C,EAAK1G,EAAe,CAAC,CAAC,EACpD,CAACL,GAAS6E,GAAYkC,EAAK3G,EAAU,CAAC,CAAC,CAC3C,CAAC,MAED,SAAS2D,KAAQgD,EACV,KAAK,eAAehD,CAAI,GAAK,OAAOgD,EAAKhD,CAAI,IAAM1F,EAAO,YAAW,KAAK0F,CAAI,EAAIgD,EAAKhD,CAAI,EAG1G,CAEA,SAASkD,GAAQhB,EAAUjB,EAAIkC,EAAQC,EAAM,CAEzC,YAAK,IAAM,SAAUpD,EAAM,CACvB,OAAKA,EACE,KAAK,KAAK,eAAeA,CAAI,EAAI,KAAK,KAAKA,CAAI,EAAI,OADxC,KAAK,IAE3B,EAEA,KAAK,IAAM,SAAUA,EAAMC,EAAK,CAC5B,YAAK,KAAKD,CAAI,EAAIC,EACX,IACX,EAEA,KAAK,MAAQ,SAAUoD,EAAI,CACvB,YAAK,KAAOA,EACL,IACX,EAEA,KAAK,cAAgB,UAAY,CAC7B,GAAI1E,GAAaA,EAAU,WAAa,KAAK,GACzC,OAAQ,KAAK,SAAU,CACnB,KAAKpE,EAEGoE,EAAU,OAAS,OAAOA,EAAU,MAAM,SAAWrE,EAAO,UAC5D,KAAK,IAAIO,EAAM,OAAO,EAE1B,MACJ,KAAKJ,GAEG,CAAC,KAAK,IAAIK,CAAI,GAAK8D,IAAoBA,GAAiBvD,CAAM,GAC9D,KAAK,IAAIP,EAAMO,CAAM,EAGrB,KAAK,IAAIF,CAAK,GAAK,aAAewD,GAAa,OAAOA,EAAU,aAAerE,EAAO,WAAaqE,EAAU,gBAAkBA,EAAU,eAAiB,GAC1J,KAAK,IAAIxD,EAAO,MAAM,EACjB,IAAIL,EAAMQ,CAAM,EAEzB,MACJ,KAAKX,EAEG,CAAC,KAAK,IAAIE,CAAI,GAAK+D,IAAoBA,GAAiB7C,EAAQ,GAChE,KAAK,IAAIlB,EAAM+D,GAAiB7C,EAAQ,CAAC,EAE7C,MACJ,KAAKnB,GACD,IAAI0I,EAAO,KAAK,KACZC,EAAS,SAAUrB,EAAU,CAC7B,OAAOoB,EAAKpB,CAAQ,EACX,QAAQ,EACR,cAAc,EACd,IAAI,CACjB,EACA,KAAK,IAAI3H,EAASgJ,EAAOhJ,CAAO,CAAC,EAC5B,IAAIC,GAAK+I,EAAO/I,EAAG,CAAC,EACpB,IAAIC,GAAQ8I,EAAO9I,EAAM,CAAC,EAC1B,IAAIC,GAAQ6I,EAAO7I,EAAM,CAAC,EAC1B,IAAIC,EAAI4I,EAAO5I,CAAE,CAAC,CAC/B,CAEJ,OAAO,IACX,EAEA,KAAK,QAAU,UAAY,CAIvB,OAHI,KAAK,UAAYC,IACjBoG,GAAU,KAAK,KAAK,KAAM,KAAK,GAAI,KAAK,MAAM,EAE1C,KAAK,SAAU,CACnB,KAAKzG,EACD,KAAK,IAAIW,GAAOuF,GAAS,KAAK,IAAIzF,CAAO,CAAC,CAAC,EAC3C,MACJ,KAAKL,EACD,GAAI,KAAK,IAAIE,CAAI,GAAK,OAAS,KAAK,IAAIG,CAAO,GAAK,OAAQ,CAExD,IAAIwI,EAAc,wBAAwB,KAAK,KAAK,EAAE,EAClDA,GAAe,SAASA,EAAY,CAAC,EAAE,UAAU,EAAE,CAAC,EAAG,EAAE,GAAK,IAC9D,KAAK,IAAIxI,EAASwI,EAAY,CAAC,CAAC,CAExC,CACA,KACR,CACA,OAAO,IACX,EAEA,KAAK,QAAU,UAAY,CACvB,IAAIJ,EAAO,KAAK,KACZD,EAAS,KAAK,OAElB,OAAQ,KAAK,SAAU,CACnB,KAAK5I,EACL,KAAKG,GACD,IAAI+I,EAASL,EAAKtH,EAAW,GAAKsH,EAAKxH,EAAM,EAAG8H,EAChD,GAAID,EACA,QAAStE,EAAE,EAAGA,EAAEsE,EAAO,OAAQtE,IAAK,CAChC,IAAIwE,EAAYF,EAAOtE,CAAC,EAAE,OAASsE,EAAOtE,CAAC,EACvCyE,EAAeH,EAAOtE,CAAC,EAAE,QACzB,KAAK,UAAY5E,GACjB,CAAC,eAAe,KAAKoJ,CAAS,IAC7B,CAACD,GACG,QAAQ,KAAKA,CAAQ,GAAKC,GAAa3F,IACvC0F,GAAYxF,IAAQ,WAAW,KAAKyF,CAAS,KAE9CA,EAAYlC,GAAUkC,EAAW9B,EAAe,EAChD6B,EAAW,KAAK,IAAI7I,CAAI,EAClB6I,GAAY,CAAC,QAAQ,KAAKA,CAAQ,GAAK,QAAQ,KAAKC,CAAS,GAC/D,KAAK,IAAI9I,EAAM8I,CAAS,EACnB,IAAI3I,EAAS4I,CAAY,EACzB,IAAI1I,GAAOuF,GAASmD,CAAY,CAAC,EAE1CF,EAAWC,GAEf,KAAK,UAAYjJ,IAAUiJ,GAAa3F,IACxC,KAAK,IAAIhD,EAAS4I,CAAY,CAEtC,CAEJ,MACJ,KAAKpJ,GACD,IAAIqJ,EAAWT,EAAKnI,CAAY,EAC5B4I,IACIA,GAAYT,EAAKnH,EAAO,GAAK,OAAM4H,GAAY,MACnD7C,GAAU,KAAK,KAAK,KAAM6C,EAAW,IAAKV,CAAM,GAEpD,MACJ,KAAK1I,GAID,GAHI2I,EAAK/H,CAAM,GACX,KAAK,IAAIP,EAAMO,CAAM,EAErB+H,EAAKjI,CAAK,IACV,KAAK,IAAIA,EAAOiI,EAAKjI,CAAK,CAAC,EACvB,CAAC,KAAK,IAAIL,CAAI,GAAK,CAAC,KAAK,IAAIC,CAAM,GAAG,CACtC,IAAI+I,EAAU,CAAC,EACf9C,GAAU,KAAK8C,EAAS,YAAcV,EAAKjI,CAAK,EAAI,IAAKgI,CAAM,EAC3D,CAAC,KAAK,IAAIrI,CAAI,GAAOgJ,EAAQ,MAC7B,KAAK,IAAIhJ,EAAMgJ,EAAQ,IAAI,EAE3B,CAAC,KAAK,IAAI/I,CAAM,GAAO+I,EAAQ,QAC/B,KAAK,IAAI/I,EAAQ+I,EAAQ,MAAM,CAEvC,CAEJ,GAAIV,EAAKvH,EAAW,EAAG,CACnB,IAAIkI,EACJ,GAAI,OAAOX,EAAKvH,EAAW,GAAM,SAE7B,QADImI,EAAM,EACH,CAACD,GAAMC,EAAMZ,EAAKvH,EAAW,EAAE,QAClCkI,EAAKtC,GAAU2B,EAAKvH,EAAW,EAAEmI,GAAK,EAAGpC,EAAc,OAG3DmC,EAAKtC,GAAU2B,EAAKvH,EAAW,EAAG+F,EAAc,EAEpD,KAAK,IAAI9G,EAAMiJ,CAAE,CACrB,CACA,MACJ,KAAKpJ,EACD,IAAIsJ,EAASb,EAAKrH,EAAQ,EAC1B,GAAGkI,EAAQ,CACP,IAAIC,EAAYd,EAAKpH,EAAW,EAC5BiI,GAAUxF,KAASyF,EAAa,SAASzD,GAASyD,CAAS,EAAG,EAAE,GAAK,GAAK,KAAO,MACrF,KAAK,IAAIrJ,EAAMoJ,CAAM,EAChB,IAAIjJ,EAASkJ,CAAS,CAC/B,CAEI,KAAK,IAAIrJ,CAAI,GAAK4D,IAAW2E,EAAKjI,CAAK,GAAK,QAC5C,KAAK,IAAIN,EAAM,MAAM,EAChB,IAAIG,EAAS,MAAS,EAE/B,MACJ,KAAKJ,GACD,IAAI0I,EAAO,KAAK,KACZa,EAAQ,SAAUjC,EAAU,CAC5B,OAAOoB,EAAKpB,CAAQ,EACX,QAAQ,EACR,MAAMkB,CAAI,EACV,QAAQ,EACR,IAAI,CACjB,EACA,KAAK,IAAI7I,EAAS4J,EAAM5J,CAAO,CAAC,EAC3B,IAAIC,GAAK2J,EAAM3J,EAAG,CAAC,EACnB,IAAIC,GAAQ0J,EAAM1J,EAAM,CAAC,EACzB,IAAIC,GAAQyJ,EAAMzJ,EAAM,CAAC,EACzB,IAAIC,EAAIwJ,EAAMxJ,CAAE,CAAC,CAC9B,CACA,OAAO,IACX,EAEAgG,GAAS,KAAK,KAAM,CAChB,CAAC,WAAYuB,CAAQ,EACrB,CAAC,KAAMjB,CAAE,EACT,CAAC,OAAQmC,CAAI,EACb,CAAC,SAAUD,CAAM,EACjB,CAAC,OAAQnB,GAAY,KAAME,CAAQ,CAAC,CACxC,CAAC,EAEM,IACX,CAEA,SAASkC,GAAUnD,EAAIlC,EAAYsF,EAAS,CAkBxC,GAhBI,OAAOpD,IAAO3G,EAAO,QACjB4E,GAAa+B,EAAI,EAAI,GACjB,OAAOlC,IAAezE,EAAO,SAC7B+J,EAAUtF,GAEdA,EAAakC,IAEboD,EAAUpD,EACVlC,EAAa,QAEjBkC,EAAK,QACE,OAAOA,IAAO3G,EAAO,QAAU,CAAC4E,GAAaH,EAAY,EAAI,IACpEsF,EAAUtF,EACVA,EAAa,QAGbsF,EACA,GAAI,OAAOA,EAAQ,SAAW/J,EAAO,SAAU,CAE3C,IAAIgK,EAAK,CAAC,EACVD,EAAQ,QAAQ,SAAUE,EAAGlF,EAAG,CAAEiF,EAAG,OAAOjF,CAAC,EAAE,YAAY,CAAC,EAAIkF,CAAG,CAAC,EACpEF,EAAUC,CACd,KAAO,CAEH,IAAIE,EAAa,CAAC,EAClB,QAASrE,KAAUkE,EACXA,EAAQ,eAAelE,CAAM,IAC7BqE,EAAW,OAAOrE,CAAM,EAAE,YAAY,CAAC,EAAIkE,EAAQlE,CAAM,GAGjEkE,EAAUG,CACd,CAGJ,GAAI,EAAE,gBAAgBJ,IAClB,OAAO,IAAIA,GAASnD,EAAIlC,EAAYsF,CAAO,EAAE,UAAU,EAG3D,IAAII,EAAY,OAAOxD,IAAO3G,EAAO,OAAS2G,EACrBoD,GAAWA,EAAQlK,EAAU,EAAIkK,EAAQlK,EAAU,EAClDwE,GAAaA,EAAU,UAAaA,EAAU,UAC5CvE,GAExBsK,EAAW,IAAIjC,GAAS4B,EAAS,EAAI,EACrCM,EAAW5F,EACCF,GAAOiD,GAAgB/C,CAAU,EACjC+C,GAEZ8C,EAAiB,SAAU1C,EAAU,CACjC,OAAIA,GAAYtH,GACL,UAAY,CACf,OAAO,IAAIsI,GAAOhB,EAAUuC,EAAWE,EAAUD,CAAQ,EAC5C,IAAI,KAAMD,CAAS,EACnB,IAAIlK,EAAS,KAAK,WAAW,CAAC,EAC9B,IAAIC,GAAK,KAAK,OAAO,CAAC,EACtB,IAAIC,GAAQ,KAAK,UAAU,CAAC,EAC5B,IAAIC,GAAQ,KAAK,UAAU,CAAC,EAC5B,IAAIC,EAAI,KAAK,MAAM,CAAC,EACpB,IAAI,CACrB,EAEO,UAAY,CACf,OAAO,IAAIuI,GAAOhB,EAAUuC,EAAWE,EAASzC,CAAQ,EAAGwC,CAAQ,EACtD,QAAQ,EACR,IAAI,CACrB,CAER,EAGJ,OAAA/D,GAAS,KAAK,KAAM,CAChB,CAAC,aAAciE,EAAerK,CAAO,CAAC,EACtC,CAAC,SAAUqK,EAAepK,EAAG,CAAC,EAC9B,CAAC,YAAaoK,EAAenK,EAAM,CAAC,EACpC,CAAC,YAAamK,EAAelK,EAAM,CAAC,EACpC,CAAC,QAASkK,EAAejK,CAAE,CAAC,EAC5B,CAAC,YAAaiK,EAAehK,EAAM,CAAC,EACpC,CAAC,QAAS,UAAY,CAAE,OAAO6J,CAAW,CAAC,EAC3C,CAAC,QAAS,SAAUxD,EAAI,CACpB,OAAIpB,GAASoB,CAAE,IAAGwD,EAAYlE,GAAKU,EAAI/G,EAAa,GAC7C,IACX,CAAC,CACL,CAAC,EACA,MAAMuK,CAAS,EAET,IACX,CAEAL,GAAS,QAAUnK,GACnBmK,GAAS,QAAW9E,GAAU,CAACzE,EAAMG,EAASE,GAAOJ,CAAI,CAAC,EAC1DsJ,GAAS,IAAM9E,GAAU,CAACrE,CAAY,CAAC,EACvCmJ,GAAS,OAAS9E,GAAU,CAACnE,EAAOJ,EAAQD,EAAMM,GAASC,EAAQE,EAASD,EAAQE,GAAUE,EAAQ,CAAC,EACvG0I,GAAS,OAASA,GAAS,GAAK9E,GAAU,CAACzE,EAAMG,CAAO,CAAC,EC/7C7D,IAAM6J,GAAc,OAAO,OAAO,CAC9B,IAAO,MACP,KAAQ,OACR,IAAO,MACP,OAAQ,SACR,MAAO,QACP,QAAS,kBACT,MAAO,QACP,MAAO,QACP,MAAO,uBACP,IAAK,qBACL,MAAO,gBACP,SAAU,WACV,KAAM,OACN,OAAQ,SACR,KAAM,OACN,OAAQ,SACR,MAAO,QACP,OAAQ,SACR,QAAS,UACT,OAAQ,SACR,gBAAiB,kBACjB,cAAe,gBACf,eAAgB,iBAChB,SAAU,WACV,OAAQ,SACR,QAAS,UACT,SAAU,WACV,KAAM,OACN,MAAO,QACP,QAAS,UACT,OAAQ,SACR,MAAO,QACP,OAAQ,SACR,WAAY,aACZ,OAAQ,SACR,KAAM,OACN,aAAc,eACd,cAAe,gBACf,SAAU,WACV,SAAU,WACV,OAAQ,SACR,SAAU,WACV,QAAS,UACT,cAAe,gBACf,eAAgB,iBAChB,gBAAiB,kBACjB,OAAQ,SACR,MAAO,QACP,KAAM,OACN,GAAI,YACJ,cAAe,MACf,MAAO,QACP,OAAQ,SACR,MAAO,QACP,OAAQ,iBACR,KAAM,OACN,IAAK,cACL,OAAQ,SACR,OAAQ,SACR,UAAW,YACX,UAAW,YACX,GAAI,KACJ,UAAW,YACX,QAAS,UACT,KAAM,OACN,QAAS,UACT,UAAW,YACX,MAAO,YACP,MAAO,QACP,SAAU,WACV,KAAM,OACN,OAAQ,SACR,OAAQ,SACR,OAAQ,uBACR,SAAU,WACV,GAAI,aACJ,UAAW,YACX,OAAQ,YACR,KAAM,OACN,SAAU,WACV,MAAO,QACP,UAAW,YACX,KAAM,OACN,MAAO,gBACP,QAAS,UACT,OAAQ,SACR,OAAQ,SACR,KAAM,eACN,QAAS,UACT,OAAQ,SACR,MAAO,QACP,SAAU,WACV,SAAU,WACV,QAAS,UACT,MAAO,gBACP,MAAO,QACP,OAAQ,iBACR,QAAS,UACT,MAAO,QACP,YAAa,cACb,SAAU,WACV,WAAY,aACZ,WAAY,aACZ,aAAc,eACd,YAAa,cACb,MAAO,QACP,IAAK,aACL,SAAU,WACV,UAAW,YACX,QAAS,UACT,YAAa,eACb,QAAS,UACT,OAAQ,SACR,GAAI,YACJ,QAAS,gBACT,MAAO,QACP,SAAU,WACV,YAAa,cACb,MAAO,QACP,OAAQ,SACR,SAAU,WACV,OAAQ,SACR,cAAe,gBACf,SAAU,mBACV,QAAS,mBACT,UAAW,YACX,KAAM,OACN,QAAS,UACT,SAAU,WACV,SAAU,WACV,YAAa,cACb,QAAS,UACT,SAAU,WACV,eAAgB,iBAChB,aAAc,eACd,KAAM,OACN,SAAU,WACV,MAAO,QACP,OAAQ,SACR,MAAO,gBACP,QAAS,UACT,GAAI,YACJ,GAAI,aACJ,QAAS,UACT,KAAM,eACN,IAAK,MACL,SAAU,WACV,OAAQ,SACR,OAAQ,SACR,MAAO,QACP,MAAO,QACP,OAAQ,SACR,OAAQ,SACR,KAAM,MAGV,CAAC,EAMD,IAAMC,GAAc,OAAO,OAAO,CAC9B,QAAS,UACT,IAAK,MACL,MAAO,QACP,QAAS,UACT,MAAO,QACP,YAAa,cACb,QAAS,SACb,CAAC,EAEKC,GAAU,OAAO,OAAO,CAC1B,MAAO,MACP,MAAO,QACP,IAAM,MACN,OAAQ,QACR,OAAQ,QACR,IAAK,MACL,OAAQ,QACR,KAAM,OACN,KAAM,OACN,QAAS,SACT,KAAM,OACN,QAAS,SACT,QAAS,UACT,IAAK,MACL,MAAO,QACP,SAAU,UACV,IAAK,OACL,OAAQ,OACZ,CAAC,EAMD,IAAMC,GAAa,OAAO,OAAO,CAC7B,QAAS,UACT,QAAS,UACT,SAAU,WACV,OAAQ,SACR,QAAS,UACT,OAAQ,SACR,SAAU,WACV,GAAI,IACR,CAAC,EAMD,IAAMC,GAAe,OAAO,OAAO,CAC/B,KAAM,OACN,MAAO,QACP,QAAS,UACT,MAAO,QACP,OAAQ,SACR,OAAQ,SACR,KAAM,OACN,IAAK,OACL,KAAM,OACN,WAAY,aACZ,IAAK,MACL,IAAK,MACL,KAAM,OACN,UAAW,YACX,UAAW,YACX,SAAU,WACV,UAAW,YACX,WAAY,aACZ,QAAS,UACT,OAAQ,SACR,QAAS,UACT,IAAK,MACL,GAAI,KACJ,IAAK,MACL,OAAQ,SACR,IAAK,MACL,QAAS,UACT,KAAM,OACN,MAAO,QACP,KAAM,OACN,KAAM,OACN,OAAQ,SACR,GAAI,KACJ,MAAO,QACP,SAAU,WACV,UAAW,YACX,SAAU,WACV,OAAQ,SACR,SAAU,WACV,MAAO,QACP,QAAS,UACT,OAAQ,SACR,QAAS,UACT,KAAM,OACN,KAAM,OACN,KAAM,OACN,UAAW,YACX,OAAQ,SACR,QAAS,UACT,KAAM,OACN,SAAU,WACV,OAAQ,SACR,QAAS,UACT,IAAK,MACL,KAAM,OACN,QAAS,UACT,MAAO,QACP,QAAS,UACT,UAAW,YACX,KAAM,OACN,OAAQ,SACR,IAAK,MACL,UAAW,YACX,MAAO,QACP,MAAO,QACP,QAAS,UACT,KAAM,OACN,MAAO,QACP,SAAU,WACV,KAAM,OACN,KAAM,OACN,OAAQ,SACR,MAAO,QACP,IAAK,KAGT,CAAC,EAMD,IAAMC,GAAa,OAAO,OAAO,CAC7B,MAAO,QACP,OAAQ,SACR,MAAO,QACP,SAAU,WACV,KAAM,OACN,MAAO,QACP,OAAQ,SACR,KAAM,OACN,MAAO,QACP,OAAQ,SACR,MAAO,QACP,KAAM,OACN,SAAU,WACV,QAAS,UACT,OAAQ,SACR,MAAO,QACP,OAAQ,SACR,QAAS,UACT,IAAK,MACL,OAAQ,QACZ,CAAC,EAMD,IAAMC,GAAS,OAAO,OAAO,CACzB,IAAK,MACL,SAAU,WACV,QAAS,UACT,YAAa,cACb,OAAQ,SACR,KAAM,OACN,KAAM,OACN,KAAM,OACN,WAAY,aACZ,OAAQ,SACR,UAAW,YACX,WAAY,aACZ,mBAAoB,qBACpB,mBAAoB,qBACpB,iBAAkB,mBAClB,wBAAyB,0BACzB,QAAS,UACT,OAAQ,SACR,OAAQ,SACR,UAAW,YACX,cAAe,gBACf,OAAQ,SACR,WAAY,aACZ,QAAS,UACT,QAAS,UACT,OAAQ,SACR,SAAU,WACV,IAAK,MACL,MAAO,QACP,UAAW,YACX,MAAO,QACP,KAAM,OACN,IAAK,MACL,KAAM,OACN,MAAO,QACP,QAAS,UACT,QAAS,UACT,OAAQ,SACR,SAAU,WACV,MAAO,QACP,MAAO,QACP,MAAO,QACP,OAAQ,SACR,SAAU,WACV,QAAS,UACT,MAAO,QACP,MAAO,QACP,KAAM,OACN,SAAU,WACV,OAAQ,SACR,SAAU,WACV,MAAO,QACP,SAAU,WACV,YAAa,cACb,QAAS,UACT,QAAS,UACT,IAAK,OACL,KAAM,OACN,OAAQ,SACR,UAAW,YACX,KAAM,OACN,MAAO,QACP,YAAa,cACb,IAAK,MACL,SAAU,WACV,OAAQ,SACR,cAAe,gBACf,QAAS,UACT,QAAS,UACT,SAAU,WACV,WAAY,aACZ,SAAU,WACV,UAAW,YACX,QAAS,UACT,KAAM,OACN,QAAS,UACT,MAAO,QACP,OAAQ,SACR,aAAc,eACd,KAAM,OACN,YAAa,cACb,QAAS,UACT,MAAO,QACP,QAAS,UACT,WAAY,aACZ,YAAa,cACb,eAAgB,iBAChB,cAAe,gBACf,WAAY,aACZ,KAAM,OACN,QAAS,UACT,QAAS,SAGb,CAAC,EAUD,IAAMC,GAAY,OAAO,OAAO,CAC5B,YAAa,CACT,IAAK,CACD,KAAM,OACN,OAAQ,SACR,OAAQ,SACR,KAAM,OACN,KAAM,MACV,EACA,QAAS,CACL,WAAY,YACZ,QAAS,SACT,UAAW,WACX,gBAAiB,kBACjB,UAAW,WACX,mBAAoB,oBACpB,UAAW,QACX,WAAY,YACZ,gBAAiB,WACjB,aAAc,eACd,qBAAsB,YACtB,2BAA4B,mBAC5B,qBAAsB,aACtB,eAAgB,kBAChB,UAAW,YACX,aAAc,cACd,iBAAkB,kBAClB,kBAAmB,mBACnB,kBAAmB,mBACnB,mBAAoB,oBACpB,kBAAmB,mBACnB,oBAAqB,qBACrB,mBAAoB,oBACpB,SAAU,UACV,OAAQ,SACR,UAAW,WACX,qBAAsB,aACtB,uBAAwB,eACxB,mBAAoB,QACpB,eAAgB,gBAChB,iBAAkB,kBAClB,6BAA8B,+BAC9B,SAAU,WACV,UAAW,WACX,WAAY,YACZ,eAAgB,gBAChB,KAAM,OACN,YAAa,SACb,kBAAmB,eACnB,aAAc,cACd,QAAS,UACT,eAAgB,cAChB,wBAAyB,0BACzB,QAAS,UACT,qBAAsB,WACtB,eAAgB,SAChB,gBAAiB,iBACjB,UAAW,YACX,cAAe,gBACf,qBAAsB,uBACtB,eAAgB,UAChB,YAAa,cACb,WAAY,YACZ,iBAAkB,kBAClB,gBAAiB,iBACjB,iBAAkB,kBAClB,sBAAuB,wBACvB,gBAAiB,kBACjB,sBAAuB,wBACvB,aAAc,cACd,mBAAoB,oBACpB,mBAAoB,oBACpB,cAAe,gBACf,gBAAiB,kBACjB,kBAAmB,eACnB,gBAAiB,WACjB,gBAAiB,WACjB,gBAAiB,kBACjB,6BAA8B,wBAC9B,YAAa,cACb,SAAU,UACV,SAAU,UACV,aAAc,eACd,YAAa,aACb,aAAc,cACd,eAAgB,iBAChB,WAAY,aACZ,mBAAoB,qBACpB,iBAAkB,cAClB,qBAAsB,kBACtB,yBAA0B,sBAC1B,iBAAkB,UAClB,kBAAmB,UACnB,iBAAkB,SAClB,mBAAoB,WACpB,WAAY,YACZ,WAAY,SACZ,QAAS,UACT,mBAAoB,qBACpB,cAAe,SACf,kBAAmB,gBACnB,eAAgB,gBAChB,iBAAkB,YAClB,UAAW,WACX,eAAgB,gBAChB,cAAe,gBACf,WAAY,aACZ,kBAAmB,kBACnB,aAAc,cACd,YAAa,aACb,qBAAsB,gBACtB,yBAA0B,kBAC1B,wBAAyB,gBACzB,WAAY,YACZ,YAAa,cACb,iBAAkB,mBAClB,iBAAkB,mBAClB,UAAW,YACX,UAAW,cACX,UAAW,WACX,aAAc,eACd,aAAc,cACd,WAAY,YACZ,aAAc,QACd,OAAQ,SACR,gBAAiB,kBACjB,cAAe,SACf,kBAAmB,YACnB,QAAS,UACT,YAAa,UACb,YAAa,eACb,yBAA0B,yBAC1B,sBAAuB,sBACvB,aAAc,cACd,aAAc,cACd,WAAY,YACZ,0BAA2B,2BAC3B,cAAe,eACf,gBAAiB,iBACjB,qBAAsB,qBACtB,cAAe,eACf,cAAe,eACf,aAAc,cACd,eAAgB,gBAChB,kBAAmB,kBACnB,6BAA8B,4BAC9B,YAAa,aACb,cAAe,eACf,kBAAmB,kBACnB,eAAgB,gBAChB,WAAY,YACZ,2BAA4B,2BAC5B,sBAAuB,sBACvB,iBAAkB,iBAClB,eAAgB,gBAChB,iBAAkB,kBAClB,cAAe,eACf,aAAc,cACd,oBAAqB,oBACrB,iBAAkB,kBAClB,QAAS,SACT,KAAM,OACN,aAAc,cACd,QAAS,SACT,qBAAsB,iBACtB,QAAS,QACb,EACA,MAAO,CACH,QAAS,UACT,WAAY,OACZ,SAAU,WACV,UAAW,WACX,UAAW,YACX,UAAW,YACX,QAAS,UACT,MAAO,QACP,OAAQ,SACR,QAAS,UACT,kBAAmB,oBACnB,sBAAuB,aACvB,cAAe,eACf,SAAU,WACV,YAAa,aACb,WAAY,eACZ,QAAS,UACT,YAAa,cACb,WAAY,QACZ,OAAQ,SACR,UAAW,kBACf,EACA,QAAS,CACL,iBAAkB,kBAClB,sBAAuB,cACvB,MAAO,QACP,kBAAmB,oBACnB,UAAW,WACX,QAAS,UACT,sBAAuB,uBACvB,UAAW,YACX,YAAa,aACb,qBAAsB,gBACtB,yBAA0B,oBAC1B,mBAAoB,qBACpB,4BAA6B,uBAC7B,kBAAmB,mBACnB,oBAAqB,sBACrB,kBAAmB,oBACnB,gBAAiB,iBACjB,yBAA0B,2BAC1B,qBAAsB,uBACtB,SAAU,WACV,gBAAiB,kBACjB,YAAa,aACb,qBAAsB,uBACtB,cAAe,WACf,sBAAuB,cACvB,kBAAmB,mBACnB,eAAgB,iBAChB,aAAc,SACd,iBAAkB,WAClB,oBAAqB,eACrB,gBAAiB,kBACjB,cAAe,eACf,qBAAsB,eACtB,UAAW,WACX,wBAAyB,yBACzB,eAAgB,iBAChB,iBAAkB,mBAClB,iBAAkB,kBAClB,aAAc,cACd,YAAa,cACb,mBAAoB,qBACpB,sBAAuB,wBACvB,WAAY,YACZ,aAAc,cACd,eAAgB,gBAChB,aAAc,aACd,gBAAiB,iBACjB,cAAe,eACf,iBAAkB,kBAClB,qBAAsB,kBACtB,iBAAkB,kBAClB,mBAAoB,oBACpB,kBAAmB,mBACnB,iBAAkB,kBAClB,iBAAkB,kBAClB,aAAc,SAClB,EACA,MAAO,CACH,QAAS,UACT,SAAU,WACV,MAAO,QACP,UAAW,YACX,WAAY,aACZ,MAAO,QACP,OAAQ,SACR,QAAS,UACT,OAAQ,SACR,WAAY,cACZ,MAAO,QACP,YAAa,cACb,OAAQ,UACR,YAAa,cACjB,EACA,QAAS,CACL,UAAW,WACX,QAAS,UACT,kBAAmB,oBACnB,MAAO,QACP,eAAgB,iBAChB,IAAK,MACL,WAAY,aACZ,KAAM,OACN,gBAAiB,mBACjB,MAAO,QACP,YAAa,cACb,eAAgB,iBAChB,OAAQ,SACR,MAAO,QACP,OAAQ,SACR,WAAY,aACZ,gBAAiB,kBACjB,SAAU,WACV,gBAAiB,iBACjB,aAAc,eACd,cAAe,gBACf,eAAgB,iBAChB,gBAAiB,kBACjB,OAAQ,QACZ,CACJ,EACA,aAAc,CACV,QAAS,CACL,IAAK,MACL,IAAK,MACL,KAAM,OACN,OAAQ,SACR,MAAO,QACP,MAAO,OACX,CACJ,CACJ,CAAC,ECztBD,IAAMC,EAAY,QACZC,EAAY,OACZC,EAAY,OACZC,EAAY,SACZC,EAAY,UACZC,GAAY,SACZC,EAAY,SACZC,GAAY,UACZC,GAAY,MACZC,GAAY,QACZC,GAAY,UACZC,GAAY,QACZC,GAAc,cACdC,GAAa,UAMbC,GAAO,OAAO,OAAO,CACvB,QAAU,CAEN,CAAC,mDAAmD,EAAG,CAACb,EAAMG,EAAS,CAACF,EAAMM,EAAG,CAAC,CACtF,CACJ,CAAC,EAMKO,GAAW,OAAO,OAAO,CAC3B,QAAU,CACN,CA2BI,0PAGA,mDAGA,wCAGA,oDAGA,4DAGA,wCAGA,0CAIA,mEAGA,6FAGA,8CAGA,+BAGA,0CAGA,2DAGA,yDAGA,uDAGA,4QAGA,qBAKA,gUACJ,EACA,CAACd,EAAMG,EAAS,CAACF,EAAMK,EAAO,CAAC,EAE/B,CAEI,yCACJ,EACA,CAAC,CAACN,EAAM,UAAW,EAAE,EAAGG,EAAS,CAACF,EAAMK,EAAO,CAAC,EAEhD,CAEI,uGAWA,0PACJ,EACA,CAACN,EAAM,CAACC,EAAMK,EAAO,CAAC,CAC1B,CACJ,CAAC,EAMKS,GAAe,OAAO,OAAO,CAC/B,OAAS,CAAC,CACN,4BACA,iCACA,kCACA,8BACA,gCACA,iCACA,EAAG,CAACb,EAAQH,EAAO,CAACE,EAAMI,CAAM,CAAC,EAAG,CAEpC,WACA,EAAG,CAACN,EAAO,CAACG,EAAQ,MAAM,EAAG,CAACD,EAAMG,EAAM,CAAC,EAAG,CAE9C,cACA,EAAG,CAACL,EAAO,CAACG,EAAQ,SAAS,EAAG,CAACD,EAAMG,EAAM,CAAC,EAAG,CAEjD,eACA,EAAG,CAACL,EAAO,CAACG,EAAQ,KAAK,EAAG,CAACD,EAAMI,CAAM,CAAC,EAAG,CAE7C,wBACA,EAAG,CAACN,EAAO,CAACG,EAAQ,MAAM,EAAG,CAACD,EAAMI,CAAM,CAAC,EAAG,CAE9C,sBACA,EAAG,CAACN,EAAO,CAACG,EAAQ,SAAS,EAAG,CAACD,EAAMI,CAAM,CAAC,EAAG,CAEjD,6CACA,EAAG,CAACN,EAAO,CAACG,EAAQ,gBAAgB,EAAG,CAACD,EAAMI,CAAM,CAAC,EAAG,CAExD,mBACA,EAAG,CAACN,EAAO,CAACG,EAAQ,UAAU,EAAG,CAACD,EAAMI,CAAM,CAAC,EAAG,CAElD,YACA,EAAG,CAACN,EAAO,CAACG,EAAQ,KAAK,EAAG,CAACD,EAAMI,CAAM,CAAC,EAAG,CAE7C,iBACA,EAAG,CAACN,EAAO,CAACG,EAAQ,KAAK,EAAG,CAACD,EAAMG,EAAM,CAAC,EAAG,CAE7C,sBACA,EAAG,CAACL,EAAO,CAACG,EAAQ,OAAO,EAAG,CAACD,EAAMG,EAAM,CAAC,EAAG,CAE/C,iBACA,EAAG,CAACL,EAAO,CAACG,EAAQ,OAAO,EAAG,CAACD,EAAMI,CAAM,CAAC,EAAG,CAE/C,qBACA,EAAG,CAACN,EAAO,CAACG,EAAQ,MAAM,EAAG,CAACD,EAAMI,CAAM,CAAC,EAAG,CAE9C,mBACA,sCACA,EAAG,CAACN,EAAO,CAACG,EAAQ,cAAc,EAAG,CAACD,EAAMI,CAAM,CAAC,EAAG,CAEtD,oBACA,EAAG,CAACN,EAAO,CAACG,EAAQ,UAAU,EAAG,CAACD,EAAMI,CAAM,CAAC,EAAG,CAElD,4BACA,EAAG,CAACN,EAAO,CAACG,EAAQ,UAAU,EAAG,CAACD,EAAMI,CAAM,CAAC,EAAG,CAElD,kDACA,EAAG,CAAC,CAACH,EAAQ,OAAO,EAAGH,EAAO,CAACE,EAAMG,EAAM,CAAC,EAAG,CAE/C,yBACA,EAAG,CAAC,CAACF,EAAQ,OAAO,EAAGH,EAAO,CAACE,EAAMG,EAAM,CAAC,EAAG,CAE/C,YACA,EAAG,CAACL,EAAO,CAACG,EAAQ,WAAW,EAAG,CAACD,EAAMG,EAAM,CAAC,EAAG,CAEnD,qCACA,EAAG,CAACL,EAAO,CAACG,EAAQ,SAAS,EAAG,CAACD,EAAMI,CAAM,CAAC,EAAG,CAEjD,sBACA,EAAG,CAACN,EAAO,CAACG,EAAQ,WAAW,EAAG,CAACD,EAAMI,CAAM,CAAC,EAAG,CAEnD,gBACA,EAAG,CAACN,EAAO,CAACG,EAAQ,OAAO,EAAG,CAACD,EAAMI,CAAM,CAAC,CAChD,CACJ,CAAC,EAMKW,GAAS,OAAO,OAAO,CACzB,QAAU,CACN,CAIA,iOAGA,uBACA,EAAG,CAAChB,EAAMG,EAAS,CAACF,EAAMO,EAAK,CAAC,EAAG,CAGnC,sBACA,EAAG,CAACL,EAAS,CAACH,EAAM,QAAQ,EAAG,CAACC,EAAMO,EAAK,CAAC,CAChD,CACJ,CAAC,EAMKS,GAAW,OAAO,OAAO,CAC3B,QAAU,CACN,CAWI,ibAGA,+BAGA,wCAGA,0DAGA,wBACJ,EACA,CAACjB,EAAMG,EAAS,CAACF,EAAMQ,EAAO,CAAC,EAE/B,CAEI,mQACJ,EACA,CAACT,EAAM,CAACC,EAAMQ,EAAO,CAAC,CAC1B,EAEA,GAAK,CACD,CAAC,0BAA0B,EAC3B,CAAC,CAACT,EAAMkB,GAAMA,GAAM,IAAM,UAAY,KAAM,CAAC,CACjD,CACJ,CAAC,EAMKC,GAAS,OAAO,OAAO,CACzB,QAAU,CAAC,CAEP,6GACA,yBACA,EAAG,CAACnB,EAAMG,EAAS,CAACF,EAAMS,EAAK,CAAC,EAAG,CAGnC,kBACA,0BACA,EAAG,CAACV,EAAM,CAACC,EAAMS,EAAK,CAAC,EAAG,CAG1B,sBAAsB,EACtB,CAACP,EAAS,CAACH,EAAM,OAAO,EAAG,CAACC,EAAMS,EAAK,CAAC,EAAG,CAG3C,mCAAmC,EACnC,CAACP,EAAS,CAACH,EAAM,aAAa,EAAG,CAACC,EAAMS,EAAK,CAAC,EAAG,CAGjD,iCAAiC,EACjC,CAACP,EAAS,CAACH,EAAM,SAAS,EAAG,CAACC,EAAMS,EAAK,CAAC,EAAG,CAG7C,0DAA0D,EAC1D,CAACP,EAAS,CAACH,EAAM,cAAc,EAAG,CAACC,EAAMS,EAAK,CAAC,CACnD,CACJ,CAAC,EAMKU,GAAe,OAAO,OAAO,CAC/B,QAAU,CAAC,CACP,uCACA,2BAEA,uEAQA,sSACA,mCACA,4CACA,gDACA,8CACA,mBAEA,0EACA,2BACA,2CACA,kDACA,uCACA,sCACA,2CAEA,yEACA,EAAG,CAACpB,EAAMG,EAAS,CAACF,EAAMU,EAAW,CAAC,EAAG,CAEzC,qBACA,EAAG,CAAC,CAACX,EAAM,aAAa,EAAGG,EAAS,CAACF,EAAMU,EAAW,CAAC,EAAG,CAK1D,iJACA,EAAG,CAACX,EAAM,CAACC,EAAMU,EAAW,CAAC,EAAG,CAEhC,wDACA,EAAG,CAAC,CAACX,EAAM,QAAS,GAAG,EAAGG,EAAS,CAACF,EAAMU,EAAW,CAAC,EAAG,CAEzD,wCACA,EAAG,CAAC,CAACX,EAAM,QAAQ,EAAGG,EAAS,CAACF,EAAMU,EAAW,CAAC,CACtD,CACJ,CAAC,EAMKU,GAAY,OAAO,OAAO,CAC5B,QAAU,CAEN,CACI,6NACA,uCACA,4BACA,sBACJ,EAAG,CAACrB,EAAMG,EAAS,CAACF,EAAMW,EAAO,CAAC,CACtC,CACJ,CAAC,EAMKU,GAAW,OAAO,OAAO,CAC3B,OAAS,CACL,CAAC,cAAc,EACf,CAAC,CAACpB,EAAQ,KAAK,CAAC,EAEhB,CAAC,qBAAqB,EACtB,CAACA,CAAM,EAEP,CAAC,cAAc,EACf,CAAC,CAACA,EAAQ,MAAM,EAAG,CAACH,EAAO,UAAU,CAAC,EAEtC,CAAC,iBAAiB,EAClB,CAACG,EAAQH,CAAK,EAEd,CAAC,gBAAgB,EACjB,CAAC,CAACG,EAAQ,OAAO,CAAC,CACtB,CACJ,CAAC,EAMKqB,GAAO,OAAO,OAAO,CACvB,QAAU,CACN,GAAGV,GAAK,QACR,GAAGI,GAAS,QACZ,GAAGH,GAAS,QACZ,GAAGO,GAAU,OACjB,EACA,GAAK,CACD,GAAGJ,GAAS,EAChB,CACJ,CAAC,ECrbD,IAAMO,EAAW,CACb,QAAS,CACL,QAAS,gBACb,EACA,QAAS,CACL,OAAQ,eACZ,EACA,QAAS,CACL,SAAU,iBACd,EACA,SAAU,CACN,MAAO,cACX,EACA,QAAS,CACL,OAAQ,eACZ,EACA,OAAQ,CACJ,eAAgB,iBAChB,aAAc,eACd,UAAW,gBACf,EACA,QAAS,CACL,OAAQ,eACZ,EACA,QAAS,CACL,WAAY,oBACZ,MAAO,gBACX,EACA,QAAS,CACL,QAAS,gBACb,EACA,QAAS,CACL,SAAU,kBACV,UAAW,kBACf,EACA,OAAQ,CACJ,MAAO,eACP,QAAS,kBACT,WAAY,qBACZ,QAAS,kBACT,WAAY,qBACZ,QAAS,iBACT,QAAS,gBACb,EACA,QAAS,CACL,OAAQ,gBACR,SAAU,iBACd,EACA,OAAQ,CACJ,OAAQ,eACZ,EACA,QAAS,CACL,SAAU,iBACd,EACA,QAAS,CACL,UAAW,oBACf,EACA,QAAS,CACL,OAAQ,eACZ,EACA,MAAO,CACH,KAAM,aACV,EACA,OAAQ,CACJ,KAAM,aACV,EACA,cAAe,CACX,MAAO,cACX,EACA,UAAW,CACP,QAAS,gBACb,EACA,WAAY,CACR,WAAY,mBAChB,EACA,MAAO,CACH,MAAO,cACX,EACA,OAAQ,CACJ,OAAQ,eACZ,EACA,YAAa,CACT,UAAW,mBACX,MAAO,gBACP,QAAS,kBACT,WAAY,qBACZ,cAAe,uBACnB,EACA,OAAQ,CACJ,KAAM,cACN,UAAW,qBACX,aAAc,qBAClB,EACA,OAAQ,CACJ,OAAQ,eACZ,EACA,SAAU,CACN,OAAQ,gBACR,OAAQ,kBACR,QAAS,kBACb,EACA,QAAS,CACL,UAAW,kBACf,EACA,WAAY,CACR,WAAY,mBAChB,EACA,SAAU,CACN,WAAY,mBAChB,EACA,SAAU,CACN,UAAW,kBACf,EACA,MAAO,CACH,OAAQ,gBACR,OAAQ,kBACR,MAAO,cACX,EACA,OAAQ,CACJ,UAAW,kBACf,EACA,YAAa,CACT,OAAQ,eACZ,EACA,QAAS,CACL,QAAS,gBACb,CACJ,EACMC,GAAc,CAChBD,EAAS,QAAQ,OACjBA,EAAS,QAAQ,SACjBA,EAAS,SAAS,MAClBA,EAAS,QAAQ,OACjBA,EAAS,OAAO,eAChBA,EAAS,OAAO,aAChBA,EAAS,OAAO,UAChBA,EAAS,QAAQ,OACjBA,EAAS,QAAQ,WACjBA,EAAS,QAAQ,QACjBA,EAAS,QAAQ,SACjBA,EAAS,QAAQ,UACjBA,EAAS,OAAO,MAChBA,EAAS,QAAQ,OACjBA,EAAS,OAAO,OAChBA,EAAS,QAAQ,SACjBA,EAAS,QAAQ,OACjBA,EAAS,MAAM,KACfA,EAAS,OAAO,KAChBA,EAAS,UAAU,QACnBA,EAAS,WAAW,WACpBA,EAAS,MAAM,MACfA,EAAS,YAAY,UACrBA,EAAS,OAAO,OAChBA,EAAS,SAAS,OAClBA,EAAS,QAAQ,UACjBA,EAAS,SAAS,WAClBA,EAAS,SAAS,UAClBA,EAAS,MAAM,OACfA,EAAS,OAAO,UAChBA,EAAS,OAAO,QAChBA,EAAS,OAAO,WAChBA,EAAS,OAAO,QAChBA,EAAS,OAAO,WAChBA,EAAS,OAAO,QAChBA,EAAS,OAAO,QAChBA,EAAS,SAAS,OAClBA,EAAS,SAAS,QAClBA,EAAS,MAAM,MACnB,EACME,GAAoB,CACtBF,EAAS,QAAQ,UACjBA,EAAS,cAAc,MACvBA,EAAS,OAAO,KAChBA,EAAS,OAAO,SACpB,EACMG,GAAe,CACjB,GAAGF,GACH,GAAGC,EACP,EACME,GAAgB,CAClBJ,EAAS,YAAY,OACrB,GAAGE,EACP,EACMG,GAAoB,CACtBL,EAAS,QAAQ,OACjBA,EAAS,QAAQ,SACjBA,EAAS,SAAS,MAClBA,EAAS,QAAQ,OACjBA,EAAS,QAAQ,OACjBA,EAAS,QAAQ,WACjBA,EAAS,QAAQ,QACjBA,EAAS,QAAQ,SACjBA,EAAS,QAAQ,UACjBA,EAAS,OAAO,MAChBA,EAAS,QAAQ,OACjBA,EAAS,OAAO,OAChBA,EAAS,QAAQ,SACjBA,EAAS,MAAM,KACfA,EAAS,OAAO,KAChBA,EAAS,UAAU,QACnBA,EAAS,WAAW,WACpBA,EAAS,MAAM,MACfA,EAAS,YAAY,UACrBA,EAAS,OAAO,OAChBA,EAAS,SAAS,OAClBA,EAAS,SAAS,OAClBA,EAAS,SAAS,QAClBA,EAAS,QAAQ,UACjBA,EAAS,SAAS,WAClBA,EAAS,SAAS,UAClBA,EAAS,MAAM,OACfA,EAAS,MAAM,OACfA,EAAS,OAAO,UAChBA,EAAS,QAAQ,QACjBA,EAAS,QAAQ,SACjBA,EAAS,QAAQ,UACjBA,EAAS,cAAc,MACvBA,EAAS,OAAO,OAChBA,EAAS,OAAO,KAChBA,EAAS,WAAW,WACpBA,EAAS,MAAM,MACfA,EAAS,YAAY,OACrBA,EAAS,QAAQ,OACrB,EC/NO,SAASM,IAAkB,CAC9B,IAAIC,EACJ,OAAO,OAAO,QAAW,eACnB,QAAW,KAA4B,OAAS,OAAO,WAAW,4BAA4B,EAAE,YAC5FA,EAAK,OAAO,aAAe,MAAQA,IAAO,OAAS,OAASA,EAAG,aACjE,SAAS,SAAS,WAAW,gBAAgB,IAC5C,QAAW,KAA4B,OAAS,OAAO,UACxD,kCAAkC,KAAK,UAAU,SAAS,GAC1D,SAAS,SAAS,WAAW,qCAAqC,EAC9E,CCKA,GAAM,CAAE,QAAAC,EAAQ,EAAIC,GAAU,YAExBC,GAAW,CAACC,EAAOC,EAAMC,IAAQ,OAAOF,GAAU,SAAWG,GAASH,EAAOC,EAAMC,CAAG,EAAIF,EAIhG,IAAMI,GAAkBC,GAAe,CACnC,IAAMC,EAAMC,GAASF,CAAU,EAC/B,GAAIC,EAAI,GAAG,GAAGE,GAAO,KAAK,EAAG,CACzB,GAAIF,EAAI,IAAI,GAAGG,GAAQ,GAAG,EACtB,MAAO,GAEX,GAAI,OAAOJ,GAAe,UAAY,OAAO,QAAW,YACpD,GAAI,CACA,IAAMK,EAAS,SAAS,cAAc,QAAQ,EACxCC,EAAQD,EAAO,WAAW,QAAQ,GAAKA,EAAO,WAAW,OAAO,GAAKA,EAAO,WAAW,oBAAoB,EAC3GE,EAAQD,EAAM,aAAa,2BAA2B,EAE5D,GADiBA,EAAM,aAAaC,EAAM,uBAAuB,EACpD,MAAM,YAAY,EAC3B,MAAO,EAEf,OAAQC,EAAA,CACJ,MAAO,EACX,CAER,CACA,MAAO,EACX,EAwHA,IAAMC,GAASC,GAAe,CAC1BC,GAAY,IACZA,GAAY,QACZA,GAAY,QACZA,GAAY,OACZ,EAAE,SAASC,GAASF,EAAYG,EAAI,EAAE,QAAQ,IAAI,EAEhDC,GAAkBJ,GAAeE,GAASF,CAAU,EAAE,OAAO,GAAGK,GAAW,KAAK,EC1HtF,SAASC,IAAyD,CAChE,MAAO,CACL,MAAO,OAAO,OAAO,MACrB,OAAQ,OAAO,OAAO,MACxB,CACF,CAKA,SAASC,IAAsB,CAC7B,GAAI,CACF,OAAO,KAAK,eAAe,EAAE,gBAAgB,EAAE,QACjD,OAASC,EAAO,CACd,eAAQ,MAAM,0BAA2BA,CAAK,EACvC,KACT,CACF,CAKO,SAASC,IAA2B,CACzC,GAAI,CACF,OAAO,UAAU,UAAY,OAC/B,OAASD,EAAO,CACd,eAAQ,MAAM,gCAAiCA,CAAK,EAC7C,OACT,CACF,CAKO,SAASE,IAAgC,CAC9C,GAAI,OAAO,QAAW,YAEpB,MAAO,CACL,UAAW,CACT,KAAM,GACN,QAAS,CAAE,MAAO,GAAI,KAAM,GAAI,QAAS,EAAG,EAC5C,GAAI,CAAE,KAAM,GAAI,QAAS,EAAG,EAC5B,OAAQ,OACR,OAAQ,CAAE,KAAM,GAAI,QAAS,EAAG,EAChC,IAAK,CAAE,aAAc,EAAG,CAC1B,EACA,iBAAkB,CAAE,MAAO,EAAG,OAAQ,CAAE,EACxC,SAAU,MACV,MAAO,CACL,MAAO,GACP,eAAgB,GAChB,gBAAiB,GACjB,eAAgB,EAClB,CACF,EAIF,IAAMC,EADS,IAAIC,GAAS,EACN,UAAU,EAG5BC,EACJ,GAAI,CACFA,EAAQ,CACN,MAAOC,GAAMH,CAAM,EACnB,eAAgBI,GAAeJ,CAAM,EACrC,gBAAiBK,GAAgB,EACjC,eAAgBC,GAAeN,CAAM,CACvC,CACF,OAASH,EAAO,CACd,QAAQ,MAAM,kCAAmCA,CAAK,EACtDK,EAAQ,CACN,MAAO,GACP,eAAgB,GAChB,gBAAiB,GACjB,eAAgB,EAClB,CACF,CAEA,MAAO,CACL,UAAW,CACT,KAAMF,EAAO,GACb,QAAS,CACP,MAAOA,EAAO,QAAQ,OAAS,GAC/B,KAAMA,EAAO,QAAQ,MAAQ,GAC7B,QAASA,EAAO,QAAQ,SAAW,GACnC,KAAMA,EAAO,QAAQ,IACvB,EACA,GAAI,CACF,KAAMA,EAAO,GAAG,MAAQ,GACxB,QAASA,EAAO,GAAG,SAAW,EAChC,EACA,OAAQA,EAAO,OAAO,OAASA,EAAO,OAAO,MAAQA,EAAO,OAAO,OAC/D,CACA,MAAOA,EAAO,OAAO,MACrB,KAAMA,EAAO,OAAO,KACpB,OAAQA,EAAO,OAAO,MACxB,EACE,OACJ,OAAQ,CACN,KAAMA,EAAO,OAAO,MAAQ,GAC5B,QAASA,EAAO,OAAO,SAAW,EACpC,EACA,IAAK,CACH,aAAcA,EAAO,IAAI,cAAgB,EAC3C,CACF,EACA,iBAAkBL,GAAoB,EACtC,SAAUC,GAAY,EACtB,MAAAM,CACF,CACF,CAKO,SAASK,IAMd,CACA,GAAI,OAAO,QAAW,YACpB,MAAO,CAAC,EAGV,IAAMC,EAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAEzD,MAAO,CACL,OAAQA,EAAO,IAAI,QAAQ,GAAK,OAChC,SAAUA,EAAO,IAAI,UAAU,GAAK,OACpC,UAAWA,EAAO,IAAI,YAAY,GAAK,OACvC,UAAWA,EAAO,IAAI,YAAY,GAAK,OACvC,YAAaA,EAAO,IAAI,cAAc,GAAK,MAC7C,CACF,CCtLO,IAAMC,GAAN,KAAe,CAAf,cACL,KAAQ,UAA6C,IAAI,IAEzD,GAAYC,EAAeC,EAAwC,CACjE,OAAK,KAAK,UAAU,IAAID,CAAK,GAC3B,KAAK,UAAU,IAAIA,EAAO,IAAI,GAAK,EAErC,KAAK,UAAU,IAAIA,CAAK,EAAG,IAAIC,CAAQ,EAChC,IAAM,KAAK,IAAID,EAAOC,CAAQ,CACvC,CAEA,IAAaD,EAAeC,EAAkC,CACxD,KAAK,UAAU,IAAID,CAAK,GAC1B,KAAK,UAAU,IAAIA,CAAK,EAAG,OAAOC,CAAQ,CAE9C,CAEA,MAAM,KAAcD,EAAeE,EAAyB,CAC1D,GAAI,KAAK,UAAU,IAAIF,CAAK,EAAG,CAC7B,IAAMG,EAAY,MAAM,KAAK,KAAK,UAAU,IAAIH,CAAK,CAAE,EACvD,MAAM,QAAQ,IAAIG,EAAU,IAAIC,GAAM,CACpC,GAAI,CACF,OAAO,QAAQ,QAAQA,EAAGF,CAAI,CAAC,CACjC,OAASG,EAAG,CACV,eAAQ,MAAM,2CAA2C,OAAAL,EAAK,MAAMK,CAAC,EAC9D,QAAQ,QAAQ,CACzB,CACF,CAAC,CAAC,CACJ,CACF,CAEA,OAAc,CACZ,KAAK,UAAU,MAAM,CACvB,CACF,E3DtBAC,K4DEO,SAASC,GAAgBC,EAA+B,CAC7D,GAAI,CAEF,IAAMC,EAAQD,EAAM,MAAM,GAAG,EAC7B,GAAIC,EAAM,SAAW,EACnB,eAAQ,MAAM,0BAA0B,EACjC,KAIT,IAAMC,EAAUD,EAAM,CAAC,EAGjBE,EAAgBD,EAAU,IAAI,QAAQ,EAAKA,EAAQ,OAAS,GAAM,CAAC,EAGnEE,EAAU,KAAKD,CAAa,EAG5BE,EAA4B,KAAK,MAAMD,CAAO,EAGpD,OAAIC,EAAc,KAAO,KAAK,IAAI,GAAKA,EAAc,IAAM,KACzD,QAAQ,KAAK,sBAAsB,EAC5B,MAIF,CACL,UAAWA,EAAc,UACzB,QAASA,EAAc,QACvB,UAAWA,EAAc,UACzB,WAAYA,EAAc,WAC1B,KAAMA,EAAc,KACpB,QAAS,GACT,UAAW,EACb,CACF,OAASC,EAAO,CACd,eAAQ,MAAM,8BAA+BA,CAAK,EAC3C,IACT,CACF,CAKO,SAASC,GAAeP,EAAwB,CACrD,GAAI,CACF,IAAMC,EAAQD,EAAM,MAAM,GAAG,EAC7B,GAAIC,EAAM,SAAW,EAAG,MAAO,GAE/B,IAAMC,EAAUD,EAAM,CAAC,EACjBE,EAAgBD,EAAU,IAAI,QAAQ,EAAKA,EAAQ,OAAS,GAAM,CAAC,EACnEE,EAAU,KAAKD,CAAa,EAC5BE,EAA4B,KAAK,MAAMD,CAAO,EAEpD,OAAIC,EAAc,IACT,KAAK,IAAI,GAAKA,EAAc,IAAM,IAGpC,EACT,OAASC,EAAO,CACd,eAAQ,MAAM,oCAAqCA,CAAK,EACjD,EACT,CACF,CC/EAE,KCLA,IAAAC,GAAA,GAAMC,GAAmB,CAAC,GAAI,QAAS,aAAc,cAAc,EAM5D,SAASC,GAAgBC,EAAaC,EAAqBH,GAAsC,CANxG,IAAAI,EAAAC,EAAAC,EAOI,QAAWC,KAAUJ,EAAU,CAC3B,IAAMK,EAASD,EAAS,GAAG,OAAAA,GAAS,OAAAL,GAAQA,EAE5C,GAAI,OAAO,SAAY,eAAeE,EAAA,6BAAS,MAAT,MAAAA,EAAeI,IACjD,eAAQ,IAAI,eAAe,OAAAA,EAAM,KAAK,QAAQ,IAAIA,CAAM,CAAC,EAClD,QAAQ,IAAIA,CAAM,EAG7B,GAAI,OAAOT,IAAgB,eAAgBM,EAAAN,IAAA,YAAAA,GAAqB,MAArB,MAAAM,EAA2BG,IAClE,eAAQ,IAAI,mBAAmB,OAAAA,EAAM,KAAMT,GAAoB,IAAIS,CAAM,CAAC,EAClET,GAAoB,IAAIS,CAAM,EAG1C,GAAI,OAAO,QAAW,eAAgBF,EAAA,2BAAgB,iBAAhB,MAAAA,EAAiCE,IACnE,eAAQ,IAAI,yBAAyB,OAAAA,EAAM,KAAM,OAAe,eAAeA,CAAM,CAAC,EAC9E,OAAe,eAAeA,CAAM,CAEpD,CAGJ,CDOA,IAAMC,GAAqB,MAAOC,EAAgB,YAA4C,CAC1F,GAAI,CAUA,IARYC,GAAgB,YAAY,GAAKA,GAAgB,oBAAoB,KACrE,cAOR,CAACC,GAAmB,EAAI,EACxB,OAAO,KAIX,IAAMC,EAAgB,MAAM,MAAM,cAAc,EAChD,GAAI,CAACA,EAAc,GACf,OAAO,KAEX,IAAMC,EAAc,MAAMD,EAAc,KAAK,EAGzCE,EAA8B,CAAC,EAC/BC,EAAe,GAEnB,GAAI,CAEA,IAAIC,EAAqB,MAAM,MAAM,WAAW,OAAAP,EAAa,YAAW,EACnEO,EAAmB,KACpBA,EAAqB,MAAM,MAAM,WAAW,OAAAP,EAAa,QAAO,GAGhEO,EAAmB,KACnBF,EAAS,MAAME,EAAmB,KAAK,EACvCD,EAAe,GAEvB,OAAQE,EAAA,CAER,CAGA,GAAI,CAACF,GAAgBN,IAAkB,UAAW,CAC9C,QAAQ,KAAK,gCAAsB,OAAAA,EAAa,yCAAwC,EACxF,GAAI,CACA,IAAIS,EAAkB,MAAM,MAAM,0BAA0B,EACvDA,EAAgB,KACjBA,EAAkB,MAAM,MAAM,sBAAsB,GAGpDA,EAAgB,KAChBJ,EAAS,MAAMI,EAAgB,KAAK,EACpCH,EAAe,GACf,QAAQ,IAAI,gDAA2C,EAE/D,OAAQE,EAAA,CAER,CACJ,CAGKF,GAEG,QAAQ,KADRN,IAAkB,UACL,0EAEA,yBAAe,OAAAA,EAAa,gEAFmC,EAMpF,IAAMU,EAAS,CACX,QAASN,EAAY,QACrB,UAAWA,EAAY,UACvB,SAAUA,EAAY,SACtB,OAAAC,CACJ,EAEA,eAAQ,IAAI,yDAA8CK,CAAM,EAEzDA,CACX,OAAQ,GACJ,OAAO,IACX,CACJ,EASMC,GAAsB,SAAiD,CACzE,GAAI,CASA,IAPYV,GAAgB,YAAY,GAAKA,GAAgB,oBAAoB,KACrE,cAMR,CAACC,GAAmB,EAAI,EACxB,OAAO,KAOX,GAAI,CACA,QAAQ,IAAI,sEAA0D,EACtE,IAAMU,EAAiB,MAAM,MAAM,2BAA2B,EAC9D,GAAIA,EAAe,GAAI,CACnB,IAAMC,EAAe,MAAMD,EAAe,KAAK,EAC/C,QAAQ,IAAI,uEAAuDC,CAAY,EAI/E,GAAM,CAAE,sBAAAC,CAAsB,EAAI,KAAM,uCAKxC,GAJA,MAAMA,EAAsB,EAIxBD,EAAa,gBAAiB,CAE9B,IAAME,EAAmC,CAAC,EAC1C,OAAW,CAACC,EAAKC,CAAK,IAAK,OAAO,QAAQJ,EAAa,eAAe,EAClEE,EAAYC,CAAG,EAAI,CAAE,GAAIC,CAAM,EAEnC,OAAOF,CACX,CACA,OAAO,IACX,CACJ,OAASP,EAAG,CACR,QAAQ,IAAI,2EAA+D,CAC/E,CAKA,QAAQ,IAAI,mFAAuE,EACnF,IAAMU,EAAW,MAAM,MAAM,+BAA+B,EAC5D,GAAI,CAACA,EAAS,GACV,eAAQ,IAAI,sDAA0C,EAC/C,KAGX,IAAMC,EAAkB,MAAMD,EAAS,KAAK,EAC5C,eAAQ,IAAI,8DAA8CC,CAAe,EAClEA,CACX,OAASC,EAAO,CACZ,eAAQ,MAAM,8DAA8CA,CAAK,EAC1D,IACX,CACJ,EAKMC,GAAkBC,GAAqC,CACzD,GAAI,OAAO,UAAa,YAAa,OACrC,IAAMC,EAAU,SAAS,cAAc,cAAc,OAAAD,EAAI,KAAI,EAC7D,OAAOC,GAAA,YAAAA,EAAS,aAAa,aAAc,MAC/C,EAsCA,IAAMC,GAAuB,SAA0C,CACnE,GAAI,CAEA,GAAI,OAAO,UAAa,YACpB,OAAO,KAIX,IAAMC,EAAUC,GAAe,mBAAmB,EAC5CC,EAAYD,GAAe,qBAAqB,EAGtD,GAAI,CAACD,EACD,OAAO,KAGX,IAAMG,EAAWF,GAAe,oBAAoB,GAAK,IAGrDG,EAA8B,CAAC,EACnC,GAAI,CACA,IAAMC,EAAgBJ,GAAe,iBAAiB,EACtD,GAAII,EAAe,CACf,IAAMC,EAAgB,mBAAmBD,CAAa,EACtDD,EAAS,KAAK,MAAME,CAAa,CACrC,CACJ,OAASC,EAAO,CACZ,QAAQ,KAAK,4DAAmDA,CAAK,CACzE,CAGKL,GACD,QAAQ,KAAK,+DAAqD,EAGtE,IAAMM,EAAS,CAAE,QAAAR,EAAS,UAAAE,EAAW,SAAAC,EAAU,OAAAC,CAAO,EACtD,eAAQ,IAAI,8FAAwF,CAChG,QAAAJ,EACA,UAAAE,EACA,SAAAC,EACA,WAAY,OAAO,KAAKC,CAAM,EAC9B,WAAY,KAAK,UAAUA,CAAM,EAAE,MACvC,CAAC,EAEMI,CACX,OAASD,EAAO,CACZ,eAAQ,KAAK,+DAAsDA,CAAK,EACjE,IACX,CACJ,EAYaE,GAAmB,MAC5BC,EAAgB,UAChBC,IACwB,CA3S5B,IAAAC,EAAAC,EA4SI,QAAQ,IAAI,uDAAiDH,CAAa,EAG1E,IAAMI,EAAkB,MAAMC,GAAoB,EAM5CC,EAAmB,MAAMjB,GAAqB,EACpD,GAAIiB,EAAkB,CAClB,IAAMR,EAASS,EAAAC,EAAA,GACRF,GADQ,CAEX,gBAAiBF,GAAA,KAAAA,EAAmB,MACxC,GACA,eAAQ,IAAI,qEAAgE,EACrEN,CACX,CAKA,GAAIG,EAAW,CACX,IAAMH,EAAS,CACX,QAASG,EAAU,QACnB,UAAWA,EAAU,UACrB,UAAUC,EAAAD,EAAU,WAAV,KAAAC,EAAsB,IAChC,QAAQC,EAAAF,EAAU,SAAV,KAAAE,EAAoB,CAAC,EAC7B,gBAAiBC,GAAA,KAAAA,EAAmB,MACxC,EACA,eAAQ,IAAI,qDAAgD,EACrDN,CACX,CAMA,IAAMW,EAAY,MAAMC,GAAsB,EAC9C,GAAID,EAAW,CACX,IAAMX,EAASS,EAAAC,EAAA,GACRC,GADQ,CAEX,gBAAiBL,GAAA,KAAAA,EAAmB,MACxC,GACA,eAAQ,IAAI,0EAAqE,EAC1EN,CACX,CAKA,IAAMa,EAAc,MAAMC,GAAmBZ,CAAa,EAC1D,GAAIW,EAAa,CACb,IAAMb,EAASS,EAAAC,EAAA,GACRG,GADQ,CAEX,gBAAiBP,GAAA,KAAAA,EAAmB,MACxC,GACA,eAAQ,IAAI,uDAAkD,EACvDN,CACX,CAKA,eAAQ,KAAK,2DAAiD,EACvD,CACH,SAAU,IACV,OAAQ,CAAC,EACT,gBAAiBM,GAAA,KAAAA,EAAmB,MACxC,CACJ,EAKA,eAAsBS,GAAgBC,EAAqB,UAAWC,EAA8D,CAChI,GAAI,CAEA,GAAI,CAACC,GAAmB,EACpB,OAAO,KAGX,GAAID,EACA,OAAOA,EAIX,IAAME,EAAgB,CAClB,WAAW,OAAAH,EAAU,gBACrB,WAAW,OAAAA,EAAU,aACrB,WAAW,OAAAA,EAAU,QACzB,EAEA,QAAWI,KAAQD,EACf,GAAI,CACA,IAAME,EAAW,MAAM,MAAMD,CAAI,EACjC,GAAIC,EAAS,GAGT,OAFe,MAAMA,EAAS,KAAK,CAI3C,OAAQC,EAAA,CACJ,QACJ,CAIJ,eAAQ,KAAK,uDAA6C,OAAAN,EAAU,IAAG,EAChE,IACX,OAASjB,EAAO,CACZ,eAAQ,MAAM,0CAA2CA,CAAK,EACvD,IACX,CACJ,CAUA,eAAsBa,IAA8D,CAChF,GAAI,CAEA,GAAI,CAACM,GAAmB,EACpB,OAGJ,IAAM1B,EAAU+B,GAAgB,iBAAiB,EAC3C7B,EAAY6B,GAAgB,mBAAmB,EAC/C5B,EAAW4B,GAAgB,kBAAkB,EAC7CP,EAAaO,GAAgB,oBAAoB,EAEvD,GAAI,CAAC/B,GAAW,CAACE,EACb,OAGJ,IAAM8B,EAAiB,MAAMT,GAAgBC,CAAU,EAEvD,GAAI,CAACQ,EACD,OAGJ,IAAMrB,EAA6B,CAC/B,QAASX,EACT,UAAWE,EACX,SAAUC,GAAY,IACtB,OAAQ6B,CACZ,EAEA,eAAQ,IAAI,2FAAgF,CACxF,WAAY,CAAC,CAACrB,EAAU,QACxB,aAAc,CAAC,CAACA,EAAU,UAC1B,SAAUA,EAAU,SACpB,UAAW,CAAC,CAACA,EAAU,MAC3B,CAAC,EAEMA,CACX,OAASJ,EAAO,CACZ,QAAQ,MAAM,iDAAkDA,CAAK,EACrE,MACJ,CACJ,C7D5bA0B,KACAC,K+DPAC,KAgBA,IAAMC,GAAkB,IAAI,IACtBC,GAAgB,IAAI,IAcnB,SAASC,IAA6B,CAC3C,OAAI,OAAO,QAAW,YAAoB,KACxB,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAC3C,IAAI,UAAU,CACjC,CAqBA,eAAsBC,GACpBC,EACAC,EACAC,EACAC,EAAY,GACyB,CAErC,GAAIC,GAAc,IAAIJ,CAAQ,EAC5B,MAAIG,GACF,QAAQ,IAAI,iEAAiE,EAEzE,IAAI,MAAM,4BAA4B,EAI9C,IAAME,EAAqBC,GAAgB,IAAIN,CAAQ,EACvD,GAAIK,EACF,OAAIF,GACF,QAAQ,IAAI,4EAA4E,EAEnFE,EAGLF,GACF,QAAQ,IAAI,oCAAqCH,EAAS,UAAU,EAAG,EAAE,EAAI,KAAK,EAIpF,IAAMO,GAAqB,SAAY,CACrC,GAAI,CAEF,IAAMC,EAAW,MAAM,MAAM,GAAG,OAAAN,EAAU,oCAAoC,CAC5E,OAAQ,OACR,QAAS,CACP,eAAgB,kBAClB,EACA,KAAM,KAAK,UAAU,CACnB,KAAMF,EACN,QAAAC,CACF,CAAC,CACH,CAAC,EAED,GAAI,CAACO,EAAS,GAAI,CAChB,IAAMC,EAAY,MAAMD,EAAS,KAAK,EAAE,MAAM,KAAO,CAAE,QAAS,eAAgB,EAAE,EAClF,MAAM,IAAI,MAAMC,EAAU,SAAW,mCAAmC,OAAAD,EAAS,OAAQ,CAC3F,CAEA,IAAME,EAAmC,MAAMF,EAAS,KAAK,EAE7D,OAAIL,GACF,QAAQ,IAAI,8CAA0C,CACpD,WAAYO,EAAK,SAAS,GAC1B,KAAMA,EAAK,SAAS,KACpB,WAAY,OAAO,KAAKA,EAAK,OAAO,EAAE,OAAS,CACjD,CAAC,EAICP,GACF,QAAQ,IAAI,uDAAuD,EAErEQ,GAAeD,EAAK,KAAK,EAGzBE,GAAqBT,CAAS,EAG9BC,GAAc,IAAIJ,CAAQ,EAEnBU,CACT,OAASG,EAAO,CACd,cAAQ,MAAM,0CAAsCA,CAAK,EACnDA,CACR,QAAE,CAEAP,GAAgB,OAAON,CAAQ,CACjC,CACF,GAAG,EAGH,OAAAM,GAAgB,IAAIN,EAAUO,CAAiB,EAExCA,CACT,CAMO,SAASK,GAAqBT,EAAY,GAAa,CAC5D,GAAI,OAAO,QAAW,YAAa,OAEnC,IAAMW,EAAM,IAAI,IAAI,OAAO,SAAS,IAAI,EAEpCA,EAAI,aAAa,IAAI,UAAU,IACjCA,EAAI,aAAa,OAAO,UAAU,EAGlC,OAAO,QAAQ,aAAa,CAAC,EAAG,GAAIA,EAAI,SAAWA,EAAI,OAASA,EAAI,IAAI,EAEpEX,GACF,QAAQ,IAAI,yCAAyC,EAG3D,CAMO,SAASY,IAAiC,CAC/C,IAAMf,EAAWgB,GAAY,EAM7B,MALI,GAAChB,GAAY,CAACA,EAAS,WAAW,KAAK,GAKvCI,GAAc,IAAIJ,CAAQ,EAKhC,C/DhIO,IAAMiB,GAAN,KAAmB,CA8BxB,YAAYC,EAA6B,CAAC,EAAG,CAlB7C,KAAO,IAAM,IAAIC,GAEjB,KAAQ,gBAAkB,IAAIC,GAC9B,KAAQ,aAA8C,KACtD,KAAQ,cAAyD,KASjE,KAAQ,sBAAwB,GAChC,KAAQ,qBAAqC,KAC7C,KAAQ,sBAAwB,EAChC,KAAiB,yBAA2B,EA5F9C,IAAAC,EAAAC,EAAAC,EAAAC,EA+FI,KAAK,OAASN,EACd,KAAK,WAAa,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,EACxD,KAAK,yBAA2B,KAAK,oBAAoB,KAAK,IAAI,EAClE,KAAK,oBAAuBO,GAA+B,CACzD,GAAIA,EAAM,UAOR,GANI,KAAK,MAAM,WACb,QAAQ,IAAI,iBAAiB,YAAK,WAAU,wEAAuE,EAKjH,KAAK,QAAU,KAAK,MAAM,SAAW,KAAK,MAAM,MAAO,CACzD,KAAK,OAAO,oBAAoB,EAEhC,IAAMC,EAAY,KAAK,aAAa,EAE9BC,EADY,IAAI,gBAAgB,OAAO,QAAW,YAAc,OAAO,SAAS,OAAS,EAAE,EACtE,IAAI,UAAU,GAAK,OAE9C,KAAK,OAAO,eACV,CAAE,WAAY,KAAK,MAAM,QAAQ,WAAY,UAAW,KAAK,MAAM,QAAQ,SAAU,EACrF,CAAE,GAAI,KAAK,MAAM,MAAM,GAAI,UAAAD,CAAU,EACrCC,CACF,EAAE,MAAOC,GAAQ,CACf,QAAQ,MAAM,kDAAmDA,CAAG,CACtE,CAAC,CACH,MAEE,KAAK,sBAAwB,EAC7B,KAAK,WAAW,CAGtB,EAEA,QAAQ,IAAI,iBAAiB,YAAK,WAAU,oBAAmB,EAC/D,QAAQ,IAAI,iBAAiB,YAAK,WAAU,aAAa,CACvD,UAAWV,EAAO,UAClB,mBAAoB,CAAC,CAACA,EAAO,gBAC7B,gBAAiBA,EAAO,gBACxB,SAAUA,EAAO,QACnB,CAAC,EAIyBW,GAAkB,KAAK,OAAO,SAAS,GACxC,KAAK,OAAO,WACnC,QAAQ,IAAI,iBAAiB,YAAK,WAAU,wCAAuC,EAIrF,IAAMC,EAAM,KAAK,mBAAmB,EAChCC,EAAYC,GAAqBF,CAAG,EAGpCZ,EAAO,kBACTa,EAAYE,EAAAC,IAAA,GACPH,GACAb,EAAO,iBAFA,CAGV,UAAWgB,IAAA,GACNH,EAAU,WACVb,EAAO,gBAAgB,UAE9B,GACI,KAAK,OAAO,WACd,QAAQ,IAAI,iBAAiB,YAAK,WAAU,gCAAgCa,EAAU,UAAU,OAAO,GAI3G,KAAK,MAAQ,CACX,KAAM,CACJ,gBAAiB,GACjB,UAAW,GACX,SAAU,KACV,QAAS,IACX,EACA,QAAS,KACT,SAAU,KACV,OAAQ,CACN,OAAQ,QACR,SAAU,KACV,OAAQ,KACR,SAAU,CAAC,CACb,EACA,SAAU,CACR,KAAM,MACN,OAAQ,IACR,KAAM,WACR,EACA,MAAO,KACP,YAAaA,EACb,UAAW,GACX,cAAe,GACf,qBAAsB,GACtB,aAAc,CAAE,SAAU,IAAK,OAAQ,CAAC,CAAE,EAC1C,oBAAqB,GACrB,WAAWV,EAAAH,EAAO,YAAP,KAAAG,EAAoBS,IAAQ,aACvC,MAAO,IACT,EAEA,QAAQ,IAAI,iBAAiB,YAAK,WAAU,oBAAoB,CAC9D,oBAAqB,KAAK,MAAM,oBAChC,mBAAoB,CAAC,CAACZ,EAAO,eAC/B,CAAC,EAGD,KAAK,UAAY,IAAIiB,GAAU,CAC7B,QAASJ,EAAU,UAAU,OAC/B,CAAC,EAGD,IAAMK,GAAgBd,EAAAJ,EAAO,WAAP,YAAAI,EAAiB,OAGvC,GAFsBc,IAAkB,GAErB,CACjB,IAAMC,EAAe,OAAOD,GAAkB,SAAWA,EAAgB,CAAC,EAE1E,KAAK,OAAS,IAAIE,GAAa,CAC7B,UAAW,KAAK,UAChB,UAAW,KAAK,MAAM,UACtB,aAAc,KAAK,MAAM,aACzB,YAAa,KAAK,MAAM,YACxB,aAAcD,EAAa,aAE3B,UAAUd,EAAAL,EAAO,kBAAP,YAAAK,EAAwB,SAClC,QAAQC,EAAAN,EAAO,kBAAP,YAAAM,EAAwB,MAClC,CAAC,CACH,CAGA,KAAK,UAAU,iBAAiB,KAAK,aAAa,KAAK,IAAI,CAAC,EAGxD,OAAO,QAAW,cACpB,OAAO,iBAAiB,UAAW,KAAK,wBAAwB,EAChE,OAAO,iBAAiB,WAAY,KAAK,mBAAmB,GAI9D,KAAK,qBAAqB,EAG1B,KAAK,WAAW,CAClB,CAKA,SAAU,CACJ,OAAO,QAAW,cACpB,OAAO,oBAAoB,UAAW,KAAK,wBAAwB,EACnE,OAAO,oBAAoB,WAAY,KAAK,mBAAmB,GAE7D,KAAK,MAAM,WACb,QAAQ,IAAI,iBAAiB,YAAK,WAAU,cAAa,EAE3D,KAAK,gBAAgB,MAAM,EAC3B,KAAK,IAAI,MAAM,CACjB,CAKQ,qBAAsB,CAI5B,GAHoBe,GAAe,IAGf,KAAK,MAAM,MAAO,CAChC,KAAK,MAAM,WACb,QAAQ,IAAI,iBAAiB,YAAK,WAAU,qCAAoC,EAElF,MACF,CAGA,GAAI,KAAK,sBAAuB,CAC1B,KAAK,MAAM,WACb,QAAQ,IAAI,iBAAiB,YAAK,WAAU,gEAA+D,EAE7G,MACF,CAGA,GAAI,KAAK,uBAAyB,KAAK,0BAA4B,KAAK,qBAAsB,CACxF,KAAK,MAAM,WACb,QAAQ,MAAM,iBAAiB,YAAK,WAAU,iDAAiD,KAAK,oBAAoB,EAE1H,MACF,CAGI,KAAK,MAAM,WACb,QAAQ,IAAI,iBAAiB,YAAK,WAAU,8CAA6C,EAE3F,KAAK,gBAAgB,CACvB,CAKA,UAAUC,EAAoD,CAC5D,OAAO,KAAK,gBAAgB,UAAUA,CAAQ,CAChD,CAKA,UAAwB,CACtB,OAAO,KAAK,KACd,CAKQ,YAAYC,EAA+B,CACjD,KAAK,MAAQP,IAAA,GAAK,KAAK,OAAUO,GACjC,KAAK,gBAAgB,OAAO,KAAK,KAAK,CACxC,CAKQ,oBAAkC,CACxC,OAAI,KAAK,OAAO,YAAoB,KAAK,OAAO,YACzCC,GAAkB,CAC3B,CAKA,MAAc,YAAa,CACzB,GAAI,CAEF,MAAM,KAAK,uBAAuB,EAG9B,KAAK,MAAM,aAAa,QAC1B,MAAM,KAAK,gBAAgB,GAE3B,QAAQ,KAAK,mFAAmF,EAChG,KAAK,YAAY,CAAE,UAAW,GAAO,cAAe,EAAK,CAAC,EAE9D,OAASC,EAAO,CACd,QAAQ,MAAM,wCAAyCA,CAAK,EAC5D,KAAK,YAAY,CAAE,UAAW,GAAO,cAAe,EAAK,CAAC,CAC5D,CACF,CAKA,MAAc,wBAAyB,CAMrC,GALA,QAAQ,IAAI,iBAAiB,YAAK,WAAU,mCAAmC,CAC7E,oBAAqB,KAAK,MAAM,oBAChC,mBAAoB,CAAC,CAAC,KAAK,OAAO,eACpC,CAAC,EAEG,CAAC,KAAK,MAAM,oBAAqB,CACnC,QAAQ,IAAI,iBAAiB,YAAK,WAAU,yDAAwD,EACpG,MACF,CAEA,GAAI,CACF,IAAMC,EAAgB,KAAK,OAAO,aAAe,UACjD,QAAQ,IAAI,iBAAiB,YAAK,WAAU,0CAAyC,OAAAA,EAAe,EACpG,IAAM1B,EAAS,MAAM2B,GAAiBD,EAAe,KAAK,OAAO,eAAe,EAEhF,QAAQ,IAAI,iBAAiB,YAAK,WAAU,2BAA2B1B,CAAM,EAE7E,KAAK,YAAY,CACf,aAAcA,EACd,oBAAqB,EACvB,CAAC,EAGG,KAAK,QACP,KAAK,OAAO,UAAU,CACpB,aAAcA,EACd,YAAa,KAAK,MAAM,WAC1B,CAAC,CAEL,OAASyB,EAAO,CACd,QAAQ,MAAM,+CAAgDA,CAAK,EACnE,KAAK,YAAY,CACf,aAAc,CAAE,SAAU,IAAK,OAAQ,CAAC,CAAE,EAC1C,oBAAqB,EACvB,CAAC,CACH,CACF,CAKA,MAAc,iBAAkB,CAlYlC,IAAAtB,EAqYI,GAAIyB,GAAsB,EAAG,CAC3B,IAAMC,EAAU,KAAK,MAAM,aAAa,QACxC,GAAI,CAACA,EACH,eAAQ,MAAM,qEAAqE,EAC5E,KAAK,qBAAqB,EAGnC,QAAQ,IAAI,iBAAiB,YAAK,WAAU,uDAA+C,EAE3F,GAAI,CACF,IAAMC,EAAW,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,UAAU,EAC3E,GAAI,CAACA,EACH,OAAO,KAAK,qBAAqB,EAInC,IAAMC,EAAc,MAAMC,GACxBF,EACAD,EACA,KAAK,MAAM,YAAY,UAAU,QACjC,KAAK,MAAM,SACb,EAEA,QAAQ,IAAI,iBAAiB,YAAK,WAAU,mCAA8B,CACxE,WAAYE,EAAY,SAAS,GACjC,KAAMA,EAAY,SAAS,KAC3B,WAAY,OAAO,KAAKA,EAAY,OAAO,EAAE,OAAS,CACxD,CAAC,EAGD,KAAK,SAASA,EAAY,KAAK,EAG/B,IAAME,EAAiBC,GAAgBH,EAAY,KAAK,EACpDE,GACF,KAAK,YAAY,CAAE,QAASA,CAAe,CAAC,EAC5C,MAAM,KAAK,kBAAkBA,CAAc,GAGvC9B,EAAA4B,EAAY,UAAZ,MAAA5B,EAAqB,iBAAmB,KAAK,QAC3C,KAAK,MAAM,WACb,QAAQ,IAAI,iBAAiB,YAAK,WAAU,oDAAoD4B,EAAY,QAAQ,eAAe,IAKvI,QAAQ,MAAM,oDAAoD,EAClE,KAAK,YAAY,CAAE,cAAe,GAAM,UAAW,EAAM,CAAC,GAG5D,MACF,OAASN,EAAO,CACd,QAAQ,MAAM,iBAAiB,YAAK,WAAU,8DAAyDA,CAAK,CAE9G,CACF,CAGA,MAAM,KAAK,qBAAqB,CAClC,CAKA,MAAc,sBAAuB,CAInC,IAAMU,EADY,IAAI,gBAAgB,OAAO,QAAW,YAAc,OAAO,SAAS,OAAS,EAAE,EACpE,IAAI,OAAO,EAGpCA,IACE,KAAK,MAAM,WACb,QAAQ,IAAI,iBAAiB,YAAK,WAAU,gFAAwE,EAGtH,KAAK,UAAU,YAAYA,CAAU,EAErCC,GAAeD,CAAU,GAI3B,IAAME,EAAgBhB,GAAe,EAErC,QAAQ,IAAI,iBAAiB,YAAK,WAAU,yCAAyC,CACnF,iBAAkB,CAAC,CAACgB,EACpB,cAAe,CAAC,CAACF,EACjB,QAAS,KAAK,MAAM,aAAa,OACnC,CAAC,EAED,IAAIG,EAA4B,KAC5BC,EAAgB,GASpB,GAPIJ,GACFG,EAAaH,EACbI,EAAgB,IACPF,GAAiB,CAACG,GAAeH,CAAa,IACvDC,EAAaD,GAGXC,EAAY,CACd,KAAK,SAASA,CAAU,EAIpBC,IACE,KAAK,MAAM,WACb,QAAQ,IAAI,iBAAiB,YAAK,WAAU,yCAAwC,EAEtFH,GAAeE,CAAU,GAG3B,IAAML,EAAiBC,GAAgBI,CAAU,EAC7CL,GACF,KAAK,YAAY,CAAE,QAASA,CAAe,CAAC,EAC5C,MAAM,KAAK,kBAAkBA,CAAc,IAE3C,QAAQ,MAAM,uCAAuC,EACrD,KAAK,YAAY,CAAE,cAAe,GAAM,UAAW,EAAM,CAAC,EAE9D,KAAO,CAEL,IAAMJ,EAAU,KAAK,MAAM,aAAa,QACxC,QAAQ,IAAI,iBAAiB,YAAK,WAAU,oDAAoD,CAC9F,WAAY,CAAC,CAACA,EACd,QAAAA,CACF,CAAC,EACGA,EACF,MAAM,KAAK,qBAAqBA,CAAO,GAEvC,QAAQ,KAAK,iBAAiB,YAAK,WAAU,mEAAkE,EAC/G,KAAK,YAAY,CAAE,cAAe,GAAM,UAAW,EAAM,CAAC,EAE9D,CACF,CAKQ,SAASY,EAAsB,CACrC,KAAK,UAAU,YAAYA,CAAK,EAChC,KAAK,YAAY,CAAE,MAAAA,CAAM,CAAC,EAGtB,KAAK,gBACP,KAAK,cAAcA,CAAK,EACxB,KAAK,aAAe,KACpB,KAAK,cAAgB,KAOzB,CAKQ,cAAuC,CAC7C,OAAI,KAAK,UAAU,gBAAgB,EAC1B,QAAQ,QAAQ,KAAK,UAAU,gBAAgB,CAAC,GAGpD,KAAK,eACR,KAAK,aAAe,IAAI,QAAwBC,GAAY,CAC1D,KAAK,cAAgBA,CACvB,CAAC,GAGI,KAAK,aACd,CAKA,MAAM,qBAAqBb,EAAiB,CAG1C,GAAI,OAAO,QAAW,YAAa,CAEjC,IAAMc,EADY,IAAI,gBAAgB,OAAO,SAAS,MAAM,EACjC,IAAI,OAAO,EACtC,GAAIA,EAAU,CACR,KAAK,MAAM,WACb,QAAQ,IAAI,iBAAiB,YAAK,WAAU,+DAAuD,EAGrG,KAAK,SAASA,CAAQ,EACtBP,GAAeO,CAAQ,EACvB,IAAMV,EAAiBC,GAAgBS,CAAQ,EAC3CV,IACF,KAAK,YAAY,CAAE,QAASA,CAAe,CAAC,EAC5C,MAAM,KAAK,kBAAkBA,CAAc,GAE7C,MACF,CACF,CAGA,GAAI,KAAK,sBAAuB,CAC1B,KAAK,MAAM,WACb,QAAQ,IAAI,iBAAiB,YAAK,WAAU,0EAAyE,EAEvH,MACF,CAEA,GAAI,CAEF,IAAMW,EAAQC,GAAY,EAEtB,KAAK,MAAM,WACb,QAAQ,IAAI,qDAAsDhB,EAAS,CAAE,MAAAe,CAAM,CAAC,EAItF,IAAME,EAAW,MAAM,KAAK,UAAU,KACpC,gCACA,CACE,QAAAjB,EACA,KAAM,YACN,MAAAe,CACF,EACA,CAAE,SAAU,EAAK,CACnB,EAEA,KAAK,SAASE,EAAS,KAAK,EAC5BV,GAAeU,EAAS,KAAK,EAE7B,IAAMb,EAAiBC,GAAgBY,EAAS,KAAK,EACjDb,IACF,KAAK,YAAY,CAAE,QAASA,CAAe,CAAC,EAC5C,MAAM,KAAK,kBAAkBA,CAAc,GAG7C,KAAK,YAAY,CAAE,qBAAsB,EAAK,CAAC,CAEjD,OAASR,EAAO,CACd,QAAQ,MAAM,mDAAoDA,CAAK,EACvE,KAAK,YAAY,CAAE,cAAe,GAAM,UAAW,EAAM,CAAC,CAC5D,CACF,CAKA,MAAM,kBAAkBsB,EAAsB,CA1nBhD,IAAA5C,EAAAC,EAAAC,EAAAC,EAAA0C,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EA4nBI,GAAI,KAAK,sBAAuB,CAC1B,KAAK,MAAM,WACb,QAAQ,IAAI,iBAAiB,YAAK,WAAU,yDAAwD,EAEtG,MACF,CAEA,KAAK,sBAAwB,GAE7B,GAAI,CACE,KAAK,MAAM,WACb,QAAQ,IAAI,iBAAiB,YAAK,WAAU,6BAA6B,CAAE,UAAWP,EAAY,SAAU,CAAC,EAG/G,IAAMQ,EAAaC,GAAkB,EAC/BC,EAAYC,GAAa,EACzBC,EAAgBC,GAAiB,EAGjChB,EAAQC,GAAY,EAGpBgB,EAAa,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,OAAO,EACtEA,IAAe,MACjBC,GAAaD,IAAe,MAAM,EAGpC,IAAME,EAAkB,CACtB,QAAShB,EAAY,QACrB,UAAWA,EAAY,UACvB,WAAYA,EAAY,WACxB,KAAMA,EAAY,KAClB,cAAAY,EACA,YAAaF,EAAU,OACvB,cAAeA,EAAU,SACzB,UAAWA,EAAU,UACrB,UAAWA,EAAU,UACrB,YAAaA,EAAU,YACvB,QAASF,EAAW,UAAU,QAAQ,KACtC,eAAgBA,EAAW,UAAU,QAAQ,QAC7C,GAAIA,EAAW,UAAU,GAAG,KAC5B,UAAWA,EAAW,UAAU,GAAG,QACnC,YAAYpD,EAAAoD,EAAW,UAAU,SAArB,YAAApD,EAA6B,KACzC,aAAaC,EAAAmD,EAAW,UAAU,SAArB,YAAAnD,EAA6B,MAC1C,cAAcC,EAAAkD,EAAW,UAAU,SAArB,YAAAlD,EAA6B,OAC3C,UAAWkD,EAAW,UAAU,KAChC,WAAYA,EAAW,UAAU,OAAO,KACxC,cAAeA,EAAW,UAAU,OAAO,QAC3C,gBAAiBA,EAAW,UAAU,IAAI,aAC1C,OAAOP,GAAA1C,EAAAiD,EAAW,QAAX,YAAAjD,EAAkB,QAAlB,KAAA0C,EAA2B,GAClC,gBAAgBE,GAAAD,EAAAM,EAAW,QAAX,YAAAN,EAAkB,iBAAlB,KAAAC,EAAoC,GACpD,iBAAiBE,GAAAD,EAAAI,EAAW,QAAX,YAAAJ,EAAkB,kBAAlB,KAAAC,EAAqC,GACtD,gBAAgBE,GAAAD,EAAAE,EAAW,QAAX,YAAAF,EAAkB,iBAAlB,KAAAC,EAAoC,GACpD,YAAaC,EAAW,iBAAiB,MACzC,aAAcA,EAAW,iBAAiB,OAC1C,SAAUA,EAAW,SACrB,MAAAX,EACA,cAAe,EACjB,EAEME,EAAW,MAAM,KAAK,UAAU,KACpC,8BACAiB,CACF,EAGA,KAAK,qBAAuB,KAC5B,KAAK,sBAAwB,EAG7B,KAAK,mBAAmBjB,EAAUC,CAAW,EAE7C,KAAK,YAAY,CACf,cAAe,GACf,qBAAsB,GACtB,UAAW,EACb,CAAC,EAEG,KAAK,MAAM,WAAW,QAAQ,IAAI,iDAAiD,CAEzF,OAAStB,EAAO,CAEd,KAAK,qBAAuBA,EAC5B,KAAK,wBAEL,QAAQ,MAAM,sDAAsD,YAAK,sBAAqB,KAAI,YAAK,yBAAwB,MAAMA,CAAK,EAE1I,KAAK,YAAY,CACf,cAAe,GACf,UAAW,EACb,CAAC,CACH,QAAE,CAEA,KAAK,sBAAwB,EAC/B,CACF,CAEQ,mBAAmBqB,EAA+BC,EAAsB,CA7tBlF,IAAA5C,EAAAC,EAAAC,EAAAC,EAAA0C,EAAAC,EAAAC,EAAAC,EAAAC,EA+tBI,GAAIN,EAAS,MAAO,CAClB,IAAMkB,EAAYlB,EAAS,MACrBmB,EAAclD,EAAAC,EAAA,GACf8B,EAAS,OADM,CAGlB,UAAWkB,EAAU,aAAa7D,EAAA,KAAK,MAAM,eAAX,YAAAA,EAAyB,YAAa4C,EAAY,WAAa,GACjG,sBAAuBiB,EAAU,uBAAyB,CAAClB,EAAS,MAAM,UAAY,KAAK,EAC3F,iBAAkBkB,EAAU,kBAAoB,CAAClB,EAAS,MAAM,UAAY,KAAK,CACnF,GACA,KAAK,YAAY,CAAE,MAAOmB,CAAY,CAAC,CACzC,CAGA,GAAInB,EAAS,OAAQ,CACnB,IAAMoB,EAAe,CACnB,OAAQpB,EAAS,OACjB,SAAUA,EAAS,OAAO,MAAM,GAAG,EAAE,CAAC,EACtC,QAAQ1C,EAAA0C,EAAS,OAAO,MAAM,GAAG,EAAE,CAAC,IAA5B,KAAA1C,EAAiC,KACzC,UAAUC,EAAAyC,EAAS,WAAT,KAAAzC,EAAqB,CAAC,CAClC,EACA,KAAK,YAAY,CAAE,OAAQ6D,CAAa,CAAC,CAC3C,CAGA,GAAIpB,EAAS,MAAO,CAClB,IAAMqB,EAAiB,CACrB,KAAMrB,EAAS,MAAM,SACrB,OAAQ,KAAK,kBAAkBA,EAAS,MAAM,QAAQ,EACtD,KAAM,KAAK,gBAAgBA,EAAS,MAAM,QAAQ,CACpD,EACA,KAAK,YAAY,CAAE,SAAUqB,CAAe,CAAC,CAC/C,CAGA,IAAMC,EAAY,CAChB,iBAAiBpB,GAAA1C,EAAAwC,EAAS,WAAT,YAAAxC,EAAmB,kBAAnB,KAAA0C,EAAsC,GACvD,UAAW,GACX,UAAUC,EAAAH,EAAS,WAAT,KAAAG,EAAqB,KAC/B,QAASF,CACX,EAQA,GAPA,KAAK,YAAY,CACf,UAAUG,EAAAJ,EAAS,WAAT,KAAAI,EAAqB,KAC/B,KAAMkB,CACR,CAAC,EAIG,KAAK,QAAUrB,EAAY,cAAcI,EAAAL,EAAS,QAAT,MAAAK,EAAgB,IAAI,CAC/D,IAAM3C,EAAYsC,EAAS,MAAM,aAAaM,EAAA,KAAK,MAAM,eAAX,YAAAA,EAAyB,YAAaL,EAAY,WAAa,GAE7G,GAAIvC,EAAW,CAGb,IAAMC,EADY,IAAI,gBAAgB,OAAO,QAAW,YAAc,OAAO,SAAS,OAAS,EAAE,EACtE,IAAI,UAAU,GAAK,OAE1C,KAAK,MAAM,WACb,QAAQ,IAAI,6CAA8C,CACxD,WAAYsC,EAAY,WACxB,QAASD,EAAS,MAAM,GACxB,UAAAtC,EACA,SAAUC,GAAY,aACxB,CAAC,EAIH,KAAK,OAAO,eACV,CAAE,WAAYsC,EAAY,WAAY,UAAWA,EAAY,SAAU,EACvE,CAAE,GAAID,EAAS,MAAM,GAAI,UAAAtC,CAAU,EACnCC,CACF,EAAE,MAAOC,GAAQ,CACf,QAAQ,MAAM,oDAAqDA,CAAG,CACxE,CAAC,CACH,MACE,QAAQ,KAAK,oEAAoE,CAErF,CACF,CAGQ,kBAAkB2D,EAAsB,CAI9C,MAHwC,CACtC,IAAK,IAAK,IAAK,SAAK,IAAK,OAAK,IAAK,OAAK,IAAK,KAAM,IAAK,IAC1D,EACeA,CAAI,GAAKA,CAC1B,CAEQ,gBAAgBA,EAAsB,CAK5C,MAJsC,CACpC,IAAK,YAAa,IAAK,OAAQ,IAAK,gBACpC,IAAK,eAAgB,IAAK,kBAAmB,IAAK,mBACpD,EACaA,CAAI,GAAKA,CACxB,CAKA,cAAuB,CAh0BzB,IAAAlE,EAAAC,EAAAC,EAi0BI,QAAOF,EAAA,KAAK,MAAM,QAAX,YAAAA,EAAkB,cAAaC,EAAA,KAAK,MAAM,eAAX,YAAAA,EAAyB,cAAaC,EAAA,KAAK,MAAM,UAAX,YAAAA,EAAoB,YAAa,EAC/G,CAMA,mBAAmBiE,EAA4C,CACzD,KAAK,MAAM,WACb,QAAQ,IAAI,uCAAwCA,CAAS,EAI/D,IAAMC,EAAgBvD,IAAA,GACjB,KAAK,MAAM,aAAa,QACxBsD,GAIL,KAAK,YAAY,CACf,aAAcvD,EAAAC,EAAA,GACT,KAAK,MAAM,cADF,CAEZ,OAAQuD,CACV,EACF,CAAC,EAGD,KAAK,IAAI,KAAK,iBAAkBA,CAAa,EAEzC,KAAK,MAAM,WACb,QAAQ,IAAI,4CAA4C,CAE5D,CAMQ,sBAAuB,CAC7B,GAAI,OAAO,QAAW,YAAa,OAEnC,IAAMC,EAAiBjE,GAAwB,CA12BnD,IAAAJ,EAAAC,EA82BM,KAAID,EAAAI,EAAM,OAAN,YAAAJ,EAAY,QAAS,0BAA2B,CAClD,GAAM,CAAE,OAAAH,CAAO,EAAIO,EAAM,KAErB,KAAK,MAAM,WACb,QAAQ,IAAI,qDAAsDP,CAAM,EAG1E,KAAK,mBAAmBA,CAAM,CAChC,WAAWI,EAAAG,EAAM,OAAN,YAAAH,EAAY,QAAS,0BAA2B,CACzD,GAAM,CAAE,UAAAqE,EAAW,OAAAC,CAAO,EAAInE,EAAM,KAEhC,KAAK,MAAM,WACb,QAAQ,IAAI,qDAAsD,CAAE,UAAAkE,EAAW,OAAAC,CAAO,CAAC,EAGzF,KAAK,qBAAqBD,EAAWC,CAAM,CAC7C,CACF,EAEA,OAAO,iBAAiB,UAAWF,CAAa,EAE5C,KAAK,MAAM,WACb,QAAQ,IAAI,2EAA2E,CAE3F,CAMQ,qBAAqBC,EAAmBC,EAAiC,CAC/E,GAAI,OAAO,UAAa,YAAa,OAGrC,IAAMC,EAAoB,0BACpBC,EAAoB,SAAS,eAAeD,CAAiB,EAC/DC,GACFA,EAAkB,OAAO,EAG3B,IAAMC,EAAkBC,GAAyB,CAt5BrD,IAAA3E,EA65BM,IAAM4E,EALe,IAAI,IAAI,CAC3B,OAAQ,OAAQ,KAAM,MAAO,QAAS,KAAM,MAAO,QACnD,OAAQ,OAAQ,QAAS,SAAU,QAAS,KAC9C,CAAC,EAEkC,IAAID,EAAQ,QAAQ,YAAY,CAAC,EAGhEE,EAAgBF,EAEpB,GAAIC,EAAe,CAEjB,IAAME,EAASH,EAAQ,cAGvB,IAFwBG,GAAA,YAAAA,EAAQ,aAAa,oCAErB,QAAUA,aAAkB,YAElDD,EAAgBC,MACX,CAEL,IAAMC,EAAa,SAAS,cAAc,KAAK,EAC/CA,EAAW,aAAa,gCAAiC,MAAM,EAI/D,IAAMC,EAAgB,OAAO,iBAAiBL,CAAO,EAC/CM,GAAiBD,EAAc,QAcrC,GATIC,KAAmB,SACrBF,EAAW,MAAM,QAAU,eAE3BA,EAAW,MAAM,QAAUE,GAG7BF,EAAW,MAAM,SAAW,WAGxBE,KAAmB,UAAYA,GAAe,SAAS,QAAQ,EAAG,CACpE,IAAMC,GAAgBF,EAAc,cAChCE,IAAiBA,KAAkB,aACrCH,EAAW,MAAM,cAAgBG,GAErC,CAI0B,CAExB,QAAS,SAAU,WAAY,YAAa,WAAY,YAExD,OAAQ,WAAY,aAAc,YAElC,aAAc,UAAW,kBAAmB,gBAC5C,eAAgB,aAAc,WAE9B,YAAa,cAEb,YAEA,MAAO,SAAU,YAEjB,QAEA,aACF,EAEkB,QAAQC,IAAQ,CAChC,IAAMC,GAAYD,GAAK,QAAQ,WAAY,KAAK,EAAE,YAAY,EACxDE,EAAQL,EAAc,iBAAiBI,EAAS,EAKlDC,GAASA,EAAM,KAAK,IAAM,KAExBF,KAAS,QAAUE,IAAU,QAAUA,IAAU,WACnDN,EAAW,MAAM,KAAOM,EACfF,KAAS,YAClBJ,EAAW,MAAM,UAAYM,EAI7BN,EAAW,MAAM,YAAYK,GAAWC,CAAK,EAGnD,CAAC,EAIGV,EAAQ,OACiB,CACzB,QAAS,SAAU,YAAa,aAAc,YAAa,aAC3D,OAAQ,YAAa,cAAe,aACpC,cAAe,WAAY,oBAAqB,kBAChD,iBAAkB,eAAgB,YAClC,aAAc,eACd,aAAc,MAAO,UAAW,aAAc,QAAS,cACzD,EAEmB,QAAQQ,IAAQ,CACjC,IAAMG,EAAcX,EAAQ,MAAM,iBAAiBQ,EAAI,EACnDG,GACFP,EAAW,MAAM,YAAYI,GAAMG,CAAW,CAElD,CAAC,GAIHtF,EAAA2E,EAAQ,aAAR,MAAA3E,EAAoB,aAAa+E,EAAYJ,GAE7CI,EAAW,YAAYJ,CAAO,EAC9BE,EAAgBE,CAClB,CACF,CAGA,IAAMC,EAAgB,iBAAiBJ,EAAgBD,EAAUE,CAAa,GAC1EA,EAAc,MAAM,WAAa,UAAY,CAACA,EAAc,MAAM,YACpEA,EAAc,MAAM,SAAW,YAIjC,IAAMU,EAAe,SAAS,cAAc,KAAK,EACjDA,EAAa,GAAKf,EAClBe,EAAa,MAAM,SAAW,WAC9BA,EAAa,MAAM,MAAQ,IAC3BA,EAAa,MAAM,cAAgB,OACnCA,EAAa,MAAM,OAAS,OAC5BA,EAAa,MAAM,UAAY,aAC/BA,EAAa,MAAM,WAAa,OAChCA,EAAa,MAAM,OAAS,OAC5BA,EAAa,MAAM,QAAU,OAC7BA,EAAa,MAAM,OAAS,IAC5BA,EAAa,MAAM,QAAU,IAG7B,IAAMC,EAAeR,EAAc,aAC/BQ,IACFD,EAAa,MAAM,aAAeC,GAIpCX,EAAc,YAAYU,CAAY,EAGtC,IAAME,EAAgBlB,GAAU,CAAE,UAAW,0BAA2B,EAmBxE,GAjBA,OAAO,QAAQkB,CAAa,EAAE,QAAQ,CAAC,CAACC,EAAUL,CAAK,IAAM,CAE3D,IAAMM,EAAgBD,EAAS,SAAS,GAAG,EACvCA,EAAS,QAAQ,YAAa,CAACE,EAAGC,KAAWA,GAAO,YAAY,CAAC,EACjEH,EAGAA,EAAS,SAAS,GAAG,EACvBH,EAAa,MAAM,YAAYG,EAAUL,CAAK,EAE7CE,EAAa,MAAcI,CAAa,EAAIN,CAEjD,CAAC,EAGDV,EAAQ,eAAe,CAAE,SAAU,SAAU,MAAO,QAAS,CAAC,EAE1D,KAAK,MAAM,UAAW,CACxB,IAAMmB,EAAgB,OAAO,QAAQL,CAAa,EAAE,IAAI,CAAC,CAACM,EAAGC,CAAC,IAAM,GAAG,OAAAD,EAAC,MAAK,OAAAC,EAAG,EAAE,KAAK,IAAI,EAC3F,QAAQ,IAAI,8DAA8D,OAAA1B,EAAS,KAAKwB,CAAa,CACvG,CACF,EAIMG,EAAc,EACdC,EAAa,IACfC,EAAW,EAETC,EAAmBzB,GAAkC,CACzD,IAAM0B,EAAQ,OAAO,iBAAiB1B,CAAO,EAC7C,OACE0B,EAAM,UAAY,QAClBA,EAAM,aAAe,UACrBA,EAAM,UAAY,KAClB1B,EAAQ,QACRA,EAAQ,cAAgB,GACxBA,EAAQ,eAAiB,CAE7B,EAEM2B,EAAe,IAAM,CACzB,IAAMC,EAAW,SAAS,iBAAiB,gBAAgB,OAAAjC,EAAS,KAAI,EAExE,GAAIiC,EAAS,SAAW,EAAG,CAGzB,GAFAJ,GAAY,EAERA,GAAYF,EAAa,CACvB,KAAK,MAAM,WACb,QAAQ,KACN,qDAAqD,OAAA3B,EAAS,sBAAqB,OAAA2B,EAAW,YAChG,EAEF,MACF,CAEI,KAAK,MAAM,WACb,QAAQ,KACN,qDAAqD,OAAA3B,EAAS,yBAAwB,OAAA6B,EAAQ,KAAI,OAAAF,EAAW,mBAAkB,OAAAC,EAAa,IAAI,IAClJ,EAGF,WAAWI,EAAcJ,CAAU,EACnC,MACF,CAGA,IAAIvB,EAA8B,KAElC,GAAI4B,EAAS,SAAW,EACtB5B,EAAU4B,EAAS,CAAC,MACf,CAEL,QAASC,EAAI,EAAGA,EAAID,EAAS,OAAQC,IACnC,GAAI,CAACJ,EAAgBG,EAASC,CAAC,CAAC,EAAG,CACjC7B,EAAU4B,EAASC,CAAC,EACpB,KACF,CAGG7B,IACHA,EAAU4B,EAAS,CAAC,EAExB,CAEI5B,GACFD,EAAeC,CAAO,CAE1B,EAEA2B,EAAa,CACf,CACF,EgEhnCAG,KCbAC,KDIO,SAASC,GAAmBC,EAA6B,CAAC,EAAiB,CAC9E,OAAO,IAAIC,GAAaD,CAAM,CAClC,CjEeAE,KA0DA,SAASC,GAAYC,EAA6B,CAC9C,OAAI,OAAO,QAAW,YAAoB,KAC3B,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAC3C,IAAIA,CAAI,CAC1B,CAEA,SAASC,GAAIC,KAAmBC,EAAuB,CAC/CD,GACA,QAAQ,IAAI,kBAAmB,GAAGC,CAAI,CAE9C,CAMA,IAAMC,GAAN,KAA4B,CAA5B,cACI,KAAQ,OAAqC,KAC7C,KAAQ,OAA8B,KACtC,KAAQ,YAAc,GACtB,KAAQ,aAAe,GAKvB,MAAM,KAAKC,EAAqE,CArHpF,IAAAC,EAAAC,EAAAC,EAAAC,EAsHQ,GAAI,KAAK,aAAe,KAAK,aACzB,OAAAR,GAAII,EAAO,OAAS,GAAO,qCAAqC,EACzD,KAAK,WAAW,EAG3B,KAAK,aAAe,GACpB,KAAK,OAASK,EAAA,CACV,MAAO,IACJL,GAGPJ,GAAI,KAAK,OAAO,MAAQ,sDAAgDI,CAAM,EAE9E,GAAI,CAGA,IAAMM,EAAWZ,GAAY,OAAO,EAChCY,IACAC,GAAeD,CAAQ,EACvBV,GAAI,KAAK,OAAO,MAAQ,uCAAgC,GAI5D,KAAK,OAASY,GAAmB,CAC7B,UAAW,KAAK,OAAO,MACvB,SAAU,CAAE,OAAQ,EAAK,CAC7B,CAAC,EAGD,MAAM,KAAK,mBAAmB,EAK9B,IAAMC,EAAgB,MAAM,KAAK,iBAAiB,EAElDb,GAAI,KAAK,OAAO,MAAQ,iEAA6Da,CAAa,EAElG,KAAK,YAAc,GACnB,IAAMC,EAAU,KAAK,WAAW,EAChC,OAAIA,KACAR,GAAAD,EAAA,KAAK,QAAO,UAAZ,MAAAC,EAAA,KAAAD,EAAsBS,IAGnBA,CAEX,OAASC,EAAO,CACZ,IAAMC,EAAMD,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,CAAC,EACpE,MAAAf,GAAI,KAAK,OAAO,MAAQ,gCAA4BgB,CAAG,GACvDR,GAAAD,EAAA,KAAK,QAAO,UAAZ,MAAAC,EAAA,KAAAD,EAAsBS,GAChBA,CACV,QAAE,CACE,KAAK,aAAe,EACxB,CACJ,CAKA,YAA4C,CAjLhD,IAAAX,EAAAC,EAkLQ,GAAI,GAACA,GAAAD,EAAA,KAAK,SAAL,YAAAA,EAAa,SAAb,MAAAC,EAAqB,MAAM,SAAS,OAAO,KAEhD,IAAMW,EAAM,KAAK,OAAO,OAAO,MAAM,QACrC,MAAO,CACH,UAAWA,EAAI,UACf,WAAYA,EAAI,WAChB,QAASA,EAAI,QACb,SAAUA,EAAI,SACd,cAAeA,EAAI,cACnB,SAAU,KAAK,OAAO,MAAM,OAAS,MACzC,CACJ,CAKA,SAAmB,CAlMvB,IAAAZ,EAAAC,EAmMQ,OAAO,KAAK,aAAe,CAAC,GAACA,GAAAD,EAAA,KAAK,SAAL,YAAAA,EAAa,SAAb,MAAAC,EAAqB,MAAM,QAC5D,CAKA,MAAM,SAASY,EAA2D,CACtE,GAAI,CAAC,KAAK,QAAQ,EACd,MAAM,IAAI,MAAM,6CAA6C,EAGjElB,GAAI,KAAK,OAAQ,MAAQ,wBAAkBkB,CAAO,EAGlD,IAAMC,EAAqBD,EAAQ,eAAiB,GAEpD,GAAI,CACA,IAAME,EAAS,MAAM,KAAK,OAAQ,OAAQ,SACtC,CACA,KAAMF,EAAQ,UACd,KAAMA,EAAQ,WAAa,CAAC,CAC5B,EACA,CAAE,aAAc,EAAM,CAC1B,EAEA,OAAIE,GAAA,MAAAA,EAAQ,KACRpB,GAAI,KAAK,OAAQ,MAAQ,4BAAwBoB,EAAO,GAAG,EAGvDD,GAAsB,OAAO,QAAW,cACxC,OAAO,SAAS,KAAOD,EAAQ,WAAaE,EAAO,KAGhD,CAAE,IAAKA,EAAO,GAAI,GAGtB,IACX,OAASL,EAAO,CACZ,MAAAf,GAAI,KAAK,OAAQ,MAAQ,4BAAwBe,CAAK,EAChDA,CACV,CACJ,CAKA,eAA+B,CAjPnC,IAAAV,EAAAC,EAAAC,EAAAC,EAAAa,EAkPQ,QAAOf,GAAAD,EAAA,KAAK,SAAL,YAAAA,EAAa,MAAM,KAAK,WAAxB,YAAAC,EAAkC,OAAMe,GAAAb,GAAAD,EAAA,KAAK,SAAL,YAAAA,EAAa,SAAb,YAAAC,EAAqB,MAAM,UAA3B,YAAAa,EAAoC,aAAc,IACrG,CAKA,oBAAoC,CAxPxC,IAAAhB,EAAAC,EAAAC,EAyPQ,QAAOA,GAAAD,GAAAD,EAAA,KAAK,SAAL,YAAAA,EAAa,SAAb,YAAAC,EAAqB,MAAM,UAA3B,YAAAC,EAAoC,YAAa,IAC5D,CAMA,SAASe,EAAiBC,EAAmD,CACzE,IAAMT,EAAU,KAAK,WAAW,EAChC,GAAI,CAACA,EACD,OAAOQ,EAGX,IAAME,EAAM,IAAI,IAAIF,EAAS,OAAO,QAAW,YAAc,OAAO,SAAS,OAAS,MAAS,EAG/F,OAAAE,EAAI,aAAa,IAAI,kBAAmBV,EAAQ,SAAS,EACrDA,EAAQ,UACRU,EAAI,aAAa,IAAI,QAASV,EAAQ,QAAQ,EAE9CA,EAAQ,UACRU,EAAI,aAAa,IAAI,WAAYV,EAAQ,QAAQ,EAErDU,EAAI,aAAa,IAAI,UAAWV,EAAQ,OAAO,EAG3CS,GACA,OAAO,QAAQA,CAAgB,EAAE,QAAQ,CAAC,CAACE,EAAKC,CAAK,IAAM,CACvDF,EAAI,aAAa,IAAIC,EAAKC,CAAK,CACnC,CAAC,EAGEF,EAAI,SAAS,CACxB,CAKA,WAAiC,CAC7B,OAAO,KAAK,MAChB,CAMA,MAAc,oBAAoC,CAC9C,GAAK,KAAK,OAGV,OAAO,IAAI,QAASG,GAAY,CAC5B,IAAIC,EAAU,EACRC,EAAa,IAAM,CA7SrC,IAAAxB,EAAAC,GA+SoBD,EAAA,KAAK,SAAL,MAAAA,EAAa,MAAM,gBAAiBC,EAAA,KAAK,SAAL,MAAAA,EAAa,MAAM,OAEhDsB,EAAU,GADjBD,EAAQ,GAIRC,IACA,WAAWC,EAAY,EAAE,EAEjC,EACAA,EAAW,CACf,CAAC,CACL,CAEA,MAAc,kBAAwD,CA5T1E,IAAAxB,EAAAC,EAAAC,EA6TQ,GAAI,GAACF,EAAA,KAAK,SAAL,MAAAA,EAAa,QAAQ,OAAO,KAGjC,IAAMyB,EAAc,CAChB,aAAYxB,EAAA,KAAK,OAAO,MAAM,KAAK,WAAvB,YAAAA,EAAiC,KAAM,mBACnD,YAAWC,EAAA,KAAK,OAAO,MAAM,KAAK,UAAvB,YAAAA,EAAgC,YAAa,kBAC5D,EAEMwB,EAAQ,CACV,GAAI,KAAK,OAAQ,QACjB,UAAW,KAAK,OAAQ,WAAa,EACzC,EAIMC,EAAc,KAAK,OAAQ,OAEjC,GAAI,CAACA,EACD,MAAM,IAAI,MAAM,8FAA8F,EAGlH,OAAAhC,GAAI,KAAK,OAAQ,MAAQ,gDAA0CgC,CAAW,EAIvE,KAAK,OAAO,OAAO,WACtBF,EACAC,EACA,KAAK,OAAQ,UAAYjC,GAAY,UAAU,GAAK,OACpDkC,CACJ,CACJ,CACJ,EAMMC,GAAgB,IAAI9B,GAItB,OAAO,QAAW,cACjB,OAAe,cAAgB+B",
|
|
6
|
-
"names": ["getCookie", "name", "_a", "parts", "getEnvironmentConfig", "environment", "apiConfig", "ENVIRONMENT_CONFIGS", "customBaseUrl", "e", "__spreadProps", "__spreadValues", "detectEnvironment", "urlEnv", "storageEnv", "hostname", "href", "override", "isLocalEnvironment", "excludeCdn", "init_environment", "__esmMin", "FunnelResource", "init_funnel", "__esmMin", "apiClient", "request", "sessionId", "currentUrl", "includeDebugData", "params", "url", "EventDispatcher", "init_eventDispatcher", "__esmMin", "listener", "data", "error", "setClientToken", "token", "tokenChanged", "TOKEN_KEY", "error", "getClientToken", "clearClientToken", "init_tokenStorage", "__esmMin", "setFunnelSessionCookie", "sessionId", "FUNNEL_SESSION_COOKIE_NAME", "getFunnelSessionCookie", "cookie", "row", "clearFunnelSessionCookie", "init_sessionStorage", "__esmMin", "getFromStorage", "key", "setInStorage", "value", "e", "getFromCookie", "_a", "cookie", "c", "setInCookie", "maxAge", "clearFromCookie", "getSDKParams", "urlParams", "draft", "urlDraft", "storageDraft", "STORAGE_KEYS", "funnelTracking", "urlTracking", "storageTracking", "token", "getClientToken", "funnelSessionId", "funnelId", "funnelEnv", "urlFunnelEnv", "forceReset", "tagadaClientEnv", "urlEnv", "storageEnv", "tagadaClientBaseUrl", "urlBaseUrl", "storageBaseUrl", "currency", "urlCurrency", "storageCurrency", "locale", "urlLocale", "storageLocale", "isDraftMode", "setDraftMode", "handlePreviewMode", "debugMode", "urlToken", "params", "shouldReset", "persistSDKParamsFromURL", "clearClientToken", "clearFunnelSessionCookie", "tokenToSet", "setClientToken", "setFunnelTracking", "setClientEnvironment", "setClientBaseUrl", "enabled", "env", "clearClientEnvironment", "baseUrl", "clearClientBaseUrl", "isFunnelTrackingEnabled", "init_previewMode", "__esmMin", "init_tokenStorage", "init_sessionStorage", "clearSpecificCookie", "cookieName", "hostname", "parts", "domains", "i", "domain", "pathParts", "p", "paths", "currentPath", "part", "path", "baseDelete", "domainPart", "leavePreviewMode", "url", "param", "cookieDescriptor", "val", "normalizedVal", "e", "clearClientToken", "clearFunnelSessionCookie", "clearClientEnvironment", "clearClientBaseUrl", "cookie", "injectPreviewModeIndicator", "isInjected", "params", "getSDKParams", "draftMode", "isDraftMode", "trackingDisabled", "isFunnelTrackingEnabled", "hasCustomEnv", "container", "badge", "details", "bridge", "detailsHTML", "isHovering", "showDetails", "hideDetails", "leavePreviewBtn", "indicatorElement", "init_previewModeIndicator", "__esmMin", "init_previewMode", "init_tokenStorage", "init_sessionStorage", "funnelClient_exports", "__export", "FunnelClient", "TrackingProvider", "getAssignedPaymentFlowId", "getAssignedPixels", "getAssignedScripts", "getAssignedStaticResources", "getAssignedStepConfig", "getLocalFunnelConfig", "loadLocalFunnelConfig", "getAssignedFunnelId", "meta", "getAssignedFunnelVariant", "getAssignedFunnelStep", "parseStepConfig", "value", "trimmed", "strategies", "strategy", "result", "e", "isLocalDevelopment", "hostname", "localFunnelConfigCache", "localFunnelConfigLoading", "resolve", "response", "config", "error", "localConfigToStepConfig", "local", "localConfig", "windowValue", "parsed", "content", "_a", "stepConfig", "position", "scripts", "s", "rawPixels", "normalized", "key", "init_funnelClient", "__esmMin", "init_environment", "init_funnel", "init_eventDispatcher", "init_previewMode", "init_previewModeIndicator", "init_sessionStorage", "EventDispatcher", "FunnelResource", "__spreadValues", "listener", "urlSessionId", "getFunnelSessionCookie", "authSession", "store", "funnelId", "existingSessionId", "effectiveFunnelId", "injectedFunnelId", "funnelVariantId", "injectedStepId", "sdkParams", "getSDKParams", "finalFunnelId", "finalStepId", "urlParams", "funnelEnv", "enriched", "injectPreviewModeIndicator", "err", "entryStepId", "funnelStepId", "event", "options", "_b", "_c", "_d", "_e", "_f", "maxWaitTime", "startTime", "currentUrl", "fireAndForget", "shouldAutoRedirect", "stepId", "updates", "context", "setFunnelSessionCookie", "ctx", "detectEnvironment", "localResources", "existingStatic", "__spreadProps", "external_tracker_exports", "__export", "TagadaExternalTracker", "TagadaTracker", "init_environment", "init_funnelClient", "bind", "fn", "thisArg", "toString", "getPrototypeOf", "iterator", "toStringTag", "kindOf", "cache", "thing", "str", "kindOfTest", "type", "typeOfTest", "isArray", "isUndefined", "isBuffer", "val", "isFunction", "isArrayBuffer", "isArrayBufferView", "result", "isString", "isNumber", "isObject", "isBoolean", "isPlainObject", "prototype", "isEmptyObject", "isDate", "isFile", "isBlob", "isFileList", "isStream", "isFormData", "kind", "isURLSearchParams", "isReadableStream", "isRequest", "isResponse", "isHeaders", "trim", "forEach", "obj", "fn", "allOwnKeys", "l", "keys", "len", "key", "findKey", "_key", "_global", "isContextDefined", "context", "merge", "caseless", "skipUndefined", "assignValue", "targetKey", "i", "extend", "a", "b", "thisArg", "bind", "stripBOM", "content", "inherits", "constructor", "superConstructor", "props", "descriptors", "toFlatObject", "sourceObj", "destObj", "filter", "propFilter", "prop", "merged", "endsWith", "searchString", "position", "lastIndex", "toArray", "arr", "isTypedArray", "TypedArray", "forEachEntry", "_iterator", "pair", "matchAll", "regExp", "matches", "isHTMLForm", "toCamelCase", "m", "p1", "p2", "hasOwnProperty", "isRegExp", "reduceDescriptors", "reducer", "reducedDescriptors", "descriptor", "name", "ret", "freezeMethods", "value", "toObjectSet", "arrayOrString", "delimiter", "define", "noop", "toFiniteNumber", "defaultValue", "isSpecCompliantForm", "toJSONObject", "stack", "visit", "source", "target", "reducedValue", "isAsyncFn", "isThenable", "_setImmediate", "setImmediateSupported", "postMessageSupported", "token", "callbacks", "data", "cb", "asap", "isIterable", "utils_default", "AxiosError", "message", "code", "config", "request", "response", "utils_default", "prototype", "descriptors", "error", "customProps", "axiosError", "obj", "prop", "msg", "errCode", "AxiosError_default", "null_default", "isVisitable", "thing", "utils_default", "removeBrackets", "key", "renderKey", "path", "dots", "token", "i", "isFlatArray", "arr", "predicates", "prop", "toFormData", "obj", "formData", "options", "null_default", "option", "source", "metaTokens", "visitor", "defaultVisitor", "indexes", "useBlob", "convertValue", "value", "AxiosError_default", "el", "index", "stack", "exposedHelpers", "build", "toFormData_default", "encode", "str", "charMap", "match", "AxiosURLSearchParams", "params", "options", "toFormData_default", "prototype", "name", "value", "encoder", "_encode", "pair", "AxiosURLSearchParams_default", "encode", "val", "buildURL", "url", "params", "options", "_encode", "utils_default", "serializeFn", "serializedParams", "AxiosURLSearchParams_default", "hashmarkIndex", "InterceptorManager", "fulfilled", "rejected", "options", "id", "fn", "utils_default", "h", "InterceptorManager_default", "transitional_default", "URLSearchParams_default", "AxiosURLSearchParams_default", "FormData_default", "Blob_default", "browser_default", "URLSearchParams_default", "FormData_default", "Blob_default", "utils_exports", "__export", "hasBrowserEnv", "hasStandardBrowserEnv", "hasStandardBrowserWebWorkerEnv", "_navigator", "origin", "platform_default", "__spreadValues", "utils_exports", "browser_default", "toURLEncodedForm", "data", "options", "toFormData_default", "platform_default", "__spreadValues", "value", "key", "path", "helpers", "utils_default", "parsePropPath", "name", "utils_default", "match", "arrayToObject", "arr", "obj", "keys", "len", "key", "formDataToJSON", "formData", "buildPath", "path", "value", "target", "index", "isNumericKey", "isLast", "formDataToJSON_default", "stringifySafely", "rawValue", "parser", "encoder", "utils_default", "e", "defaults", "transitional_default", "data", "headers", "contentType", "hasJSONContentType", "isObjectPayload", "formDataToJSON_default", "isFileList", "toURLEncodedForm", "_FormData", "toFormData_default", "transitional", "forcedJSONParsing", "JSONRequested", "strictJSONParsing", "AxiosError_default", "platform_default", "status", "method", "defaults_default", "ignoreDuplicateOf", "utils_default", "parseHeaders_default", "rawHeaders", "parsed", "key", "val", "i", "line", "$internals", "normalizeHeader", "header", "normalizeValue", "value", "utils_default", "parseTokens", "str", "tokens", "tokensRE", "match", "isValidHeaderName", "matchHeaderValue", "context", "filter", "isHeaderNameFilter", "formatHeader", "w", "char", "buildAccessors", "obj", "accessorName", "methodName", "arg1", "arg2", "arg3", "AxiosHeaders", "headers", "valueOrRewrite", "rewrite", "self", "setHeader", "_value", "_header", "_rewrite", "lHeader", "key", "setHeaders", "parseHeaders_default", "dest", "entry", "parser", "matcher", "deleted", "deleteHeader", "keys", "format", "normalized", "targets", "asStrings", "thing", "first", "computed", "target", "accessors", "prototype", "defineAccessor", "mapped", "headerValue", "AxiosHeaders_default", "transformData", "fns", "response", "config", "defaults_default", "context", "headers", "AxiosHeaders_default", "data", "utils_default", "fn", "isCancel", "value", "CanceledError", "message", "config", "request", "AxiosError_default", "utils_default", "CanceledError_default", "settle", "resolve", "reject", "response", "validateStatus", "AxiosError_default", "parseProtocol", "url", "match", "speedometer", "samplesCount", "min", "bytes", "timestamps", "head", "tail", "firstSampleTS", "chunkLength", "now", "startedAt", "i", "bytesCount", "passed", "speedometer_default", "throttle", "fn", "freq", "timestamp", "threshold", "lastArgs", "timer", "invoke", "args", "now", "passed", "throttle_default", "progressEventReducer", "listener", "isDownloadStream", "freq", "bytesNotified", "_speedometer", "speedometer_default", "throttle_default", "e", "loaded", "total", "progressBytes", "rate", "inRange", "data", "progressEventDecorator", "throttled", "lengthComputable", "asyncDecorator", "fn", "args", "utils_default", "isURLSameOrigin_default", "platform_default", "origin", "isMSIE", "url", "cookies_default", "platform_default", "name", "value", "expires", "path", "domain", "secure", "sameSite", "cookie", "utils_default", "match", "isAbsoluteURL", "url", "combineURLs", "baseURL", "relativeURL", "buildFullPath", "baseURL", "requestedURL", "allowAbsoluteUrls", "isRelativeUrl", "isAbsoluteURL", "combineURLs", "headersToObject", "thing", "AxiosHeaders_default", "__spreadValues", "mergeConfig", "config1", "config2", "config", "getMergedValue", "target", "source", "prop", "caseless", "utils_default", "mergeDeepProperties", "a", "b", "valueFromConfig2", "defaultToConfig2", "mergeDirectKeys", "mergeMap", "merge", "configValue", "resolveConfig_default", "config", "newConfig", "mergeConfig", "data", "withXSRFToken", "xsrfHeaderName", "xsrfCookieName", "headers", "auth", "AxiosHeaders_default", "buildURL", "buildFullPath", "utils_default", "platform_default", "formHeaders", "allowedHeaders", "key", "val", "isURLSameOrigin_default", "xsrfValue", "cookies_default", "isXHRAdapterSupported", "xhr_default", "config", "resolve", "reject", "_config", "resolveConfig_default", "requestData", "requestHeaders", "AxiosHeaders_default", "responseType", "onUploadProgress", "onDownloadProgress", "onCanceled", "uploadThrottled", "downloadThrottled", "flushUpload", "flushDownload", "done", "request", "onloadend", "responseHeaders", "response", "settle", "value", "err", "AxiosError_default", "event", "msg", "timeoutErrorMessage", "transitional", "transitional_default", "utils_default", "val", "key", "progressEventReducer", "cancel", "CanceledError_default", "protocol", "parseProtocol", "platform_default", "composeSignals", "signals", "timeout", "length", "controller", "aborted", "onabort", "reason", "unsubscribe", "err", "AxiosError_default", "CanceledError_default", "timer", "signal", "utils_default", "composeSignals_default", "streamChunk", "chunk", "chunkSize", "len", "pos", "end", "readBytes", "iterable", "__asyncGenerator", "iter", "__forAwait", "readStream", "more", "temp", "error", "__await", "__yieldStar", "stream", "reader", "done", "value", "trackStream", "onProgress", "onFinish", "iterator", "bytes", "_onFinish", "e", "controller", "loadedBytes", "err", "reason", "DEFAULT_CHUNK_SIZE", "isFunction", "utils_default", "globalFetchAPI", "Request", "Response", "ReadableStream", "TextEncoder", "test", "fn", "args", "e", "factory", "env", "envFetch", "isFetchSupported", "isRequestSupported", "isResponseSupported", "isReadableStreamSupported", "encodeText", "encoder", "str", "supportsRequestStream", "duplexAccessed", "hasContentType", "platform_default", "supportsResponseStream", "resolvers", "res", "type", "config", "method", "AxiosError_default", "getBodyLength", "body", "resolveBodyLength", "headers", "length", "url", "data", "signal", "cancelToken", "timeout", "onDownloadProgress", "onUploadProgress", "responseType", "withCredentials", "fetchOptions", "resolveConfig_default", "_fetch", "composedSignal", "composeSignals_default", "request", "unsubscribe", "requestContentLength", "_request", "contentTypeHeader", "onProgress", "flush", "progressEventDecorator", "progressEventReducer", "asyncDecorator", "trackStream", "isCredentialsSupported", "resolvedOptions", "__spreadProps", "__spreadValues", "response", "isStreamResponse", "options", "prop", "responseContentLength", "responseData", "resolve", "reject", "settle", "AxiosHeaders_default", "err", "seedCache", "getFetch", "fetch", "seeds", "len", "i", "seed", "target", "map", "adapter", "knownAdapters", "null_default", "xhr_default", "getFetch", "utils_default", "fn", "value", "e", "renderReason", "reason", "isResolvedHandle", "adapter", "getAdapter", "adapters", "config", "length", "nameOrAdapter", "rejectedReasons", "i", "id", "AxiosError_default", "reasons", "state", "s", "adapters_default", "throwIfCancellationRequested", "config", "CanceledError_default", "dispatchRequest", "AxiosHeaders_default", "transformData", "adapters_default", "defaults_default", "response", "reason", "isCancel", "VERSION", "validators", "type", "i", "thing", "deprecatedWarnings", "validator", "version", "message", "formatMessage", "opt", "desc", "VERSION", "value", "opts", "AxiosError_default", "correctSpelling", "assertOptions", "options", "schema", "allowUnknown", "keys", "result", "validator_default", "validators", "validator_default", "Axios", "instanceConfig", "InterceptorManager_default", "configOrUrl", "config", "err", "dummy", "stack", "e", "mergeConfig", "transitional", "paramsSerializer", "headers", "utils_default", "contextHeaders", "method", "AxiosHeaders_default", "requestInterceptorChain", "synchronousRequestInterceptors", "interceptor", "responseInterceptorChain", "promise", "i", "len", "chain", "dispatchRequest", "newConfig", "onFulfilled", "onRejected", "error", "fullPath", "buildFullPath", "buildURL", "url", "generateHTTPMethod", "isForm", "data", "Axios_default", "CancelToken", "_CancelToken", "executor", "resolvePromise", "resolve", "token", "cancel", "i", "onfulfilled", "_resolve", "promise", "message", "config", "request", "CanceledError_default", "listener", "index", "controller", "abort", "err", "c", "CancelToken_default", "spread", "callback", "arr", "isAxiosError", "payload", "utils_default", "HttpStatusCode", "key", "value", "HttpStatusCode_default", "createInstance", "defaultConfig", "context", "Axios_default", "instance", "bind", "utils_default", "instanceConfig", "mergeConfig", "axios", "defaults_default", "CanceledError_default", "CancelToken_default", "isCancel", "VERSION", "toFormData_default", "AxiosError_default", "promises", "spread", "isAxiosError", "AxiosHeaders_default", "thing", "formDataToJSON_default", "adapters_default", "HttpStatusCode_default", "axios_default", "Axios", "AxiosError", "CanceledError", "isCancel", "CancelToken", "VERSION", "all", "Cancel", "isAxiosError", "spread", "toFormData", "AxiosHeaders", "HttpStatusCode", "formToJSON", "getAdapter", "mergeConfig", "axios_default", "ApiClient", "config", "axios_default", "__spreadValues", "_a", "_b", "error", "token", "response", "provider", "url", "data", "key", "value", "now", "history", "LIBVERSION", "UA_MAX_LENGTH", "USER_AGENT", "EMPTY", "UNKNOWN", "TYPEOF", "BROWSER", "CPU", "DEVICE", "ENGINE", "OS", "RESULT", "NAME", "TYPE", "VENDOR", "VERSION", "ARCHITECTURE", "MAJOR", "MODEL", "CONSOLE", "MOBILE", "TABLET", "SMARTTV", "WEARABLE", "XR", "EMBEDDED", "INAPP", "BRANDS", "FORMFACTORS", "FULLVERLIST", "PLATFORM", "PLATFORMVER", "BITNESS", "CH", "CH_FULL_VER_LIST", "CH_ARCH", "CH_BITNESS", "CH_FORM_FACTORS", "CH_MOBILE", "CH_MODEL", "CH_PLATFORM", "CH_PLATFORM_VER", "CH_ALL_VALUES", "AMAZON", "APPLE", "ASUS", "BLACKBERRY", "GOOGLE", "HUAWEI", "LENOVO", "HONOR", "LG", "MICROSOFT", "MOTOROLA", "NVIDIA", "ONEPLUS", "OPPO", "SAMSUNG", "SHARP", "SONY", "XIAOMI", "ZEBRA", "CHROME", "CHROMIUM", "CHROMECAST", "EDGE", "FIREFOX", "OPERA", "FACEBOOK", "SOGOU", "PREFIX_MOBILE", "SUFFIX_BROWSER", "WINDOWS", "isWindow", "NAVIGATOR", "NAVIGATOR_UADATA", "extend", "defaultRgx", "extensions", "mergedRgx", "extraRgx", "isExtensions", "i", "j", "k", "enumerize", "arr", "enums", "has", "str1", "str2", "lowerize", "isString", "obj", "deep", "prop", "val", "itemListToArray", "header", "tokens", "strip", "token", "trim", "str", "majorize", "version", "setProps", "propName", "pattern", "stripQuotes", "len", "rgxMapper", "ua", "arrays", "p", "q", "matches", "match", "regex", "props", "strMapper", "map", "windowsVersionMap", "formFactorsMap", "browserHintsMap", "defaultRegexes", "defaultProps", "createIData", "item", "itemType", "init_props", "is_ignoreProps", "is_ignoreRgx", "toString_props", "IData", "res", "UACHData", "strToCheck", "is", "cb", "that", "IDataResolve", "resolveData", "uach", "isHttpUACH", "UAItem", "rgxMap", "uaCH", "ch", "data", "detect", "realVersion", "brands", "prevName", "brandName", "brandVersion", "archName", "reParse", "ff", "idx", "osName", "osVersion", "parse", "UAParser", "headers", "kv", "v", "normalized", "userAgent", "httpUACH", "regexMap", "createItemFunc", "BrowserName", "BrowserType", "CPUArch", "DeviceType", "DeviceVendor", "EngineName", "OSName", "Extension", "MODEL", "NAME", "TYPE", "VENDOR", "VERSION", "MOBILE", "TABLET", "CRAWLER", "CLI", "EMAIL", "FETCHER", "INAPP", "MEDIAPLAYER", "LIBRARY", "CLIs", "Crawlers", "ExtraDevices", "Emails", "Fetchers", "os", "InApps", "MediaPlayers", "Libraries", "Vehicles", "Bots", "TIMEZONE", "EU_TIMEZONE", "EEA_EFTA_TIMEZONE", "EEA_TIMEZONE", "EFTA_TIMEZONE", "SCHENGEN_TIMEZONE", "isStandalonePWA", "_a", "Crawler", "Extension", "toResult", "value", "head", "ext", "UAParser", "isAppleSilicon", "resultOrUA", "res", "toResult", "OSName", "CPUArch", "canvas", "webgl", "debug", "e", "isBot", "resultOrUA", "BrowserType", "toResult", "Bots", "isChromeFamily", "EngineName", "getScreenResolution", "getTimeZone", "error", "getBrowserLocale", "collectDeviceInfo", "result", "UAParser", "flags", "isBot", "isChromeFamily", "isStandalonePWA", "isAppleSilicon", "getUrlParams", "params", "EventBus", "event", "callback", "data", "callbacks", "cb", "e", "init_eventDispatcher", "decodeJWTClient", "token", "parts", "payload", "paddedPayload", "decoded", "parsedPayload", "error", "isTokenExpired", "init_environment", "import_meta", "DEFAULT_PREFIXES", "resolveEnvValue", "key", "prefixes", "_a", "_b", "_c", "prefix", "envKey", "loadLocalDevConfig", "configVariant", "resolveEnvValue", "isLocalEnvironment", "localResponse", "localConfig", "config", "configLoaded", "deploymentResponse", "e", "defaultResponse", "result", "loadStaticResources", "funnelResponse", "funnelConfig", "loadLocalFunnelConfig", "transformed", "key", "value", "response", "staticResources", "error", "getMetaContent", "name", "metaTag", "loadProductionConfig", "storeId", "getMetaContent", "accountId", "basePath", "config", "encodedConfig", "decodedConfig", "error", "result", "loadPluginConfig", "configVariant", "rawConfig", "_a", "_b", "staticResources", "loadStaticResources", "productionConfig", "__spreadProps", "__spreadValues", "envConfig", "createRawPluginConfig", "localConfig", "loadLocalDevConfig", "loadLocalConfig", "configName", "defaultConfig", "isLocalEnvironment", "possiblePaths", "path", "response", "e", "resolveEnvValue", "resolvedConfig", "init_previewMode", "init_tokenStorage", "init_tokenStorage", "resolutionCache", "resolvedCodes", "getAuthCode", "resolveAuthHandoff", "authCode", "storeId", "apiBaseUrl", "debugMode", "resolvedCodes", "inFlightResolution", "resolutionCache", "resolutionPromise", "response", "errorData", "data", "setClientToken", "cleanAuthCodeFromUrl", "error", "url", "shouldResolveAuthCode", "getAuthCode", "TagadaClient", "config", "EventBus", "EventDispatcher", "_a", "_b", "_c", "_d", "event", "accountId", "funnelId", "err", "handlePreviewMode", "env", "envConfig", "getEnvironmentConfig", "__spreadProps", "__spreadValues", "ApiClient", "funnelFeature", "funnelConfig", "FunnelClient", "getClientToken", "listener", "updates", "detectEnvironment", "error", "configVariant", "loadPluginConfig", "shouldResolveAuthCode", "storeId", "authCode", "handoffData", "resolveAuthHandoff", "decodedSession", "decodeJWTClient", "queryToken", "setClientToken", "existingToken", "tokenToUse", "shouldPersist", "isTokenExpired", "token", "resolve", "urlToken", "draft", "isDraftMode", "response", "sessionData", "_e", "_f", "_g", "_h", "_i", "_j", "_k", "deviceInfo", "collectDeviceInfo", "urlParams", "getUrlParams", "browserLocale", "getBrowserLocale", "draftParam", "setDraftMode", "sessionInitData", "storeData", "storeConfig", "localeConfig", "currencyConfig", "authState", "code", "newConfig", "updatedConfig", "handleMessage", "elementId", "styles", "staticHighlightId", "existingHighlight", "applyToElement", "element", "isVoidElement", "targetElement", "parent", "newWrapper", "computedStyle", "elementDisplay", "verticalAlign", "prop", "camelProp", "value", "inlineValue", "highlightDiv", "borderRadius", "stylesToApply", "property", "camelProperty", "_", "letter", "appliedStyles", "k", "v", "maxAttempts", "intervalMs", "attempts", "isElementHidden", "style", "findAndApply", "elements", "i", "init_funnel", "init_sessionStorage", "createTagadaClient", "config", "TagadaClient", "init_tokenStorage", "getUrlParam", "name", "log", "debug", "args", "TagadaExternalTracker", "config", "_a", "_b", "_c", "_d", "__spreadValues", "urlToken", "setClientToken", "createTagadaClient", "funnelContext", "session", "error", "err", "ctx", "options", "shouldAutoRedirect", "result", "_e", "baseUrl", "additionalParams", "url", "key", "value", "resolve", "retries", "checkReady", "authSession", "store", "entryStepId", "TagadaTracker", "TagadaTracker"]
|
|
4
|
+
"sourcesContent": ["import { ApiConfig, Environment, EnvironmentConfig } from '../types';\r\n\r\n/**\r\n * Get cookie value by name\r\n */\r\nfunction getCookie(name: string): string | null {\r\n if (typeof document === 'undefined') return null;\r\n const value = `; ${document.cookie}`;\r\n const parts = value.split(`; ${name}=`);\r\n if (parts.length === 2) return parts.pop()?.split(';').shift() || null;\r\n return null;\r\n}\r\n\r\n/**\r\n * \u26A0\uFE0F IMPORTANT: Runtime Environment Detection\r\n * \r\n * This SDK uses RUNTIME hostname detection, NOT build-time environment variables.\r\n * This ensures the SDK always connects to the correct API based on where it's deployed.\r\n * \r\n * Environment detection priority (highest to lowest):\r\n * 1. **tagadaClientEnv** - Explicit override via URL param, localStorage, or cookie\r\n * Example: ?tagadaClientEnv=production\r\n * 2. **Production domains** \u2192 production API (app.tagadapay.com)\r\n * 3. **Dev/staging domains** \u2192 development API (app.tagadapay.dev, vercel.app, etc.)\r\n * 4. **Localhost/local IPs** \u2192 local API (localhost, 127.0.0.1, etc.)\r\n * - Can be overridden via window.__TAGADA_ENV__.TAGADA_ENVIRONMENT\r\n * 5. **Default fallback** \u2192 production API (safest for unknown domains)\r\n * \r\n * Build-time .env variables (VITE_*, REACT_APP_*, NEXT_PUBLIC_*) are IGNORED\r\n * to prevent incorrect API connections when plugins are deployed to different environments.\r\n */\r\n\r\n/**\r\n * Environment configurations for different deployment environments\r\n */\r\nexport const ENVIRONMENT_CONFIGS: Record<Environment, ApiConfig> = {\r\n production: {\r\n baseUrl: 'https://app.tagadapay.com',\r\n endpoints: {\r\n checkout: {\r\n sessionInit: '/api/v1/checkout/session/init',\r\n sessionInitAsync: '/api/v1/checkout/session/init-async',\r\n sessionStatus: '/api/v1/checkout/session/status',\r\n asyncStatus: '/api/public/v1/checkout/async-status',\r\n },\r\n customer: {\r\n profile: '/api/v1/customer/profile',\r\n session: '/api/v1/customer/session',\r\n },\r\n store: {\r\n config: '/api/v1/store/config',\r\n },\r\n },\r\n },\r\n development: {\r\n baseUrl: 'https://app.tagadapay.dev',\r\n endpoints: {\r\n checkout: {\r\n sessionInit: '/api/v1/checkout/session/init',\r\n sessionInitAsync: '/api/v1/checkout/session/init-async',\r\n sessionStatus: '/api/v1/checkout/session/status',\r\n asyncStatus: '/api/public/v1/checkout/async-status',\r\n },\r\n customer: {\r\n profile: '/api/v1/customer/profile',\r\n session: '/api/v1/customer/session',\r\n },\r\n store: {\r\n config: '/api/v1/store/config',\r\n },\r\n },\r\n },\r\n local: {\r\n baseUrl: 'http://app.localhost:3000',\r\n endpoints: {\r\n checkout: {\r\n sessionInit: '/api/v1/checkout/session/init',\r\n sessionInitAsync: '/api/v1/checkout/session/init-async',\r\n sessionStatus: '/api/v1/checkout/session/status',\r\n asyncStatus: '/api/public/v1/checkout/async-status',\r\n },\r\n customer: {\r\n profile: '/api/v1/customer/profile',\r\n session: '/api/v1/customer/session',\r\n },\r\n store: {\r\n config: '/api/v1/store/config',\r\n },\r\n },\r\n },\r\n};\r\n\r\n/**\r\n * Get the environment configuration based on the current environment\r\n * \r\n * Checks for custom base URL override via tagadaClientBaseUrl parameter\r\n */\r\nexport function getEnvironmentConfig(environment: Environment = 'local'): EnvironmentConfig {\r\n const apiConfig = ENVIRONMENT_CONFIGS[environment];\r\n\r\n if (!apiConfig) {\r\n console.warn(`Unknown environment: ${environment}. Falling back to local.`);\r\n return {\r\n environment: 'local',\r\n apiConfig: ENVIRONMENT_CONFIGS.local,\r\n };\r\n }\r\n\r\n // \uD83C\uDFAF Check for custom base URL override (URL > localStorage > cookie)\r\n let customBaseUrl: string | null = null;\r\n\r\n if (typeof window !== 'undefined') {\r\n const urlParams = new URLSearchParams(window.location.search);\r\n customBaseUrl = urlParams.get('tagadaClientBaseUrl');\r\n\r\n if (!customBaseUrl) {\r\n try {\r\n customBaseUrl = localStorage.getItem('tgd_client_base_url') || getCookie('tgd_client_base_url');\r\n } catch {\r\n // Storage not available\r\n }\r\n }\r\n }\r\n\r\n // If custom base URL is set, override the apiConfig.baseUrl\r\n if (customBaseUrl) {\r\n console.log(`[SDK] Using custom API base URL override: ${customBaseUrl}`);\r\n return {\r\n environment,\r\n apiConfig: {\r\n ...apiConfig,\r\n baseUrl: customBaseUrl,\r\n },\r\n };\r\n }\r\n\r\n return {\r\n environment,\r\n apiConfig,\r\n };\r\n}\r\n\r\n/**\r\n * Build a complete API URL from environment config and endpoint path\r\n */\r\nexport function buildApiUrl(config: EnvironmentConfig, endpointPath: string): string {\r\n return `${config.apiConfig.baseUrl}${endpointPath}`;\r\n}\r\n\r\n/**\r\n * Get a specific endpoint URL\r\n */\r\nexport function getEndpointUrl(\r\n config: EnvironmentConfig,\r\n category: keyof ApiConfig['endpoints'],\r\n endpoint: string,\r\n): string {\r\n const categoryEndpoints = config.apiConfig.endpoints[category] as Record<string, string>;\r\n const endpointPath = categoryEndpoints[endpoint];\r\n\r\n if (!endpointPath) {\r\n throw new Error(`Endpoint not found: ${category}.${endpoint}`);\r\n }\r\n\r\n return buildApiUrl(config, endpointPath);\r\n}\r\n\r\n/**\r\n * Auto-detect environment based on hostname and URL patterns at RUNTIME\r\n * \u26A0\uFE0F IMPORTANT: Ignores build-time .env variables to ensure correct detection in all environments\r\n * .env variables are ONLY used for local development via window.__TAGADA_ENV__\r\n * \r\n * Priority (highest to lowest):\r\n * 1. tagadaClientEnv - Explicit override via URL/localStorage/cookie\r\n * 2. __TAGADA_ENV__ - Local development override\r\n * 3. Hostname-based detection - Production/staging domains\r\n * 4. Default fallback - Production (safest)\r\n */\r\nexport function detectEnvironment(): Environment {\r\n console.log('[SDK] detectEnvironment() called');\r\n // Check if we're in browser\r\n if (typeof window === 'undefined') {\r\n return 'local'; // SSR fallback\r\n }\r\n\r\n // \uD83C\uDFAF PRIORITY 1: Check for explicit tagadaClientEnv override (URL > localStorage > cookie)\r\n // This allows forcing environment regardless of hostname\r\n const urlParams = new URLSearchParams(window.location.search);\r\n const urlEnv = urlParams.get('tagadaClientEnv');\r\n if (urlEnv && (urlEnv === 'production' || urlEnv === 'development' || urlEnv === 'local')) {\r\n console.log(`[SDK] Using explicit environment override: ${urlEnv}`);\r\n return urlEnv as Environment;\r\n }\r\n\r\n // Check localStorage/cookie for persisted override\r\n try {\r\n const storageEnv = localStorage.getItem('tgd_client_env') || getCookie('tgd_client_env');\r\n if (storageEnv && (storageEnv === 'production' || storageEnv === 'development' || storageEnv === 'local')) {\r\n console.log(`[SDK] Using persisted environment override: ${storageEnv}`);\r\n return storageEnv as Environment;\r\n }\r\n } catch {\r\n // Storage not available\r\n }\r\n\r\n const hostname = window.location.hostname;\r\n const href = window.location.href;\r\n\r\n console.log(`[SDK] detectEnvironment() - hostname: \"${hostname}\"`);\r\n\r\n // 1. Check for LOCAL environment first (highest priority for dev)\r\n // Local: localhost, local IPs, local domains, or ngrok tunnels (used for local dev)\r\n if (\r\n hostname === 'localhost' ||\r\n hostname.startsWith('127.') ||\r\n hostname.startsWith('192.168.') ||\r\n hostname.startsWith('10.') ||\r\n hostname.includes('.local') ||\r\n hostname === '' ||\r\n hostname === '0.0.0.0' ||\r\n hostname.includes('ngrok-free.dev') ||\r\n hostname.includes('ngrok-free.app') ||\r\n hostname.includes('ngrok.io') ||\r\n hostname.includes('ngrok.app')\r\n ) {\r\n console.log('[SDK] detectEnvironment() - returning LOCAL');\r\n // For local development, allow override via window.__TAGADA_ENV__ (injected by dev server)\r\n if (typeof window !== 'undefined' && (window as any)?.__TAGADA_ENV__?.TAGADA_ENVIRONMENT) {\r\n const override = (window as any).__TAGADA_ENV__.TAGADA_ENVIRONMENT.toLowerCase();\r\n if (override === 'production' || override === 'development' || override === 'local') {\r\n console.log(`[SDK] Local override detected: ${override}`);\r\n return override as Environment;\r\n }\r\n }\r\n return 'local';\r\n }\r\n\r\n // 2. Production: deployed to production domains\r\n if (\r\n hostname === 'app.tagadapay.com' ||\r\n hostname.includes('tagadapay.com') ||\r\n hostname.includes('yourproductiondomain.com')\r\n ) {\r\n return 'production';\r\n }\r\n\r\n // 3. Development: deployed to staging/dev domains or has dev indicators\r\n if (\r\n hostname === 'app.tagadapay.dev' ||\r\n hostname.includes('tagadapay.dev') ||\r\n hostname.includes('vercel.app') ||\r\n hostname.includes('netlify.app') ||\r\n hostname.includes('surge.sh') ||\r\n hostname.includes('github.io') ||\r\n hostname.includes('herokuapp.com') ||\r\n hostname.includes('railway.app') ||\r\n href.includes('?env=dev') ||\r\n href.includes('?dev=true') ||\r\n href.includes('#dev')\r\n ) {\r\n return 'development';\r\n }\r\n\r\n // 4. Default fallback for unknown domains (production is safest)\r\n console.warn(`[SDK] Unknown domain: ${hostname}, defaulting to production`);\r\n return 'production';\r\n}\r\n\r\n/**\r\n * Check if we're running in local development environment\r\n * Uses centralized detectEnvironment() for consistency\r\n * \r\n * @param excludeCdn - If true, excludes CDN subdomains (e.g., instance-id.cdn.localhost)\r\n * @returns true if in local environment (excluding CDN if specified)\r\n */\r\nexport function isLocalEnvironment(excludeCdn = false): boolean {\r\n const env = detectEnvironment();\r\n\r\n if (env !== 'local') {\r\n return false;\r\n }\r\n\r\n // If we need to exclude CDN subdomains\r\n if (excludeCdn && typeof window !== 'undefined') {\r\n return !window.location.hostname.includes('.cdn.');\r\n }\r\n\r\n return true;\r\n}\r\n\r\n", "/**\r\n * Funnel Resource - API client for funnel navigation and session management\r\n */\r\n\r\nimport { ApiClient } from './apiClient';\r\n\r\n/**\r\n * Funnel action types enum\r\n * \r\n * Special types:\r\n * - DIRECT_NAVIGATION: Bypasses step conditions, navigates directly to targetStepId\r\n * - BACK_NAVIGATION: Similar to direct_navigation, used for backward navigation\r\n * \r\n * Common types (for logging/tracking):\r\n * - These are commonly used action types that align with funnel orchestrator conditions\r\n * - Navigation logic is based on step conditions.from, action types are primarily for analytics\r\n */\r\nexport enum FunnelActionType {\r\n // Special navigation types (bypass step conditions)\r\n DIRECT_NAVIGATION = 'direct_navigation',\r\n BACK_NAVIGATION = 'back_navigation',\r\n\r\n // User interaction types\r\n CONTINUE_CLICKED = 'continue_clicked',\r\n BUTTON_CLICK = 'button_click',\r\n FORM_SUBMIT = 'form_submit',\r\n\r\n // Payment actions\r\n PAYMENT_SUCCESS = 'payment_success',\r\n PAYMENT_FAILED = 'payment_failed',\r\n\r\n // Offer actions\r\n OFFER_ACCEPTED = 'offer_accepted',\r\n OFFER_DECLINED = 'offer_declined',\r\n\r\n // Cart actions\r\n CART_UPDATED = 'cart_updated',\r\n CART_ITEM_ADDED = 'cart_item_added',\r\n\r\n // Generic/custom actions\r\n CUSTOM = 'custom'\r\n}\r\n\r\n/**\r\n * Data structures for specific action types\r\n */\r\n\r\nexport type NextAction<T> = T & { [key: string]: any };\r\n\r\n// ============================================================================\r\n// SCALABLE RESOURCE SYSTEM\r\n// ============================================================================\r\n\r\n/**\r\n * Base resource data type - all resources must have an id and optional metadata\r\n */\r\nexport interface FunnelResourceData {\r\n id: string;\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * Resource metadata for tracking, versioning, and relationships\r\n */\r\nexport interface ResourceMetadata {\r\n /** Plugin that created this resource */\r\n source?: string;\r\n /** Schema version for this resource */\r\n version?: string;\r\n /** Timestamp when resource was created */\r\n timestamp?: number;\r\n /** Scope: how long should this resource persist */\r\n scope?: 'global' | 'session' | 'step' | 'ephemeral';\r\n /** Tags for categorization and filtering */\r\n tags?: string[];\r\n /** Related resource IDs (for relationships) */\r\n relatedTo?: string[];\r\n /** Custom metadata */\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * Wrapped resource with metadata\r\n */\r\nexport interface ResourceWithMetadata<T extends FunnelResourceData = FunnelResourceData> {\r\n data: T;\r\n meta: ResourceMetadata;\r\n}\r\n\r\n/**\r\n * Standard resource types for e-commerce (provides IntelliSense)\r\n * These are SUGGESTIONS, not limitations - any key is allowed via index signature\r\n */\r\nexport interface StandardResourceKeys {\r\n // Core commerce entities (hot context)\r\n order?: FunnelResourceData;\r\n customer?: FunnelResourceData;\r\n payment?: FunnelResourceData;\r\n checkout?: FunnelResourceData;\r\n cart?: FunnelResourceData;\r\n subscription?: FunnelResourceData;\r\n product?: FunnelResourceData;\r\n variant?: FunnelResourceData;\r\n\r\n // Named resources (persistent reference)\r\n mainOrder?: FunnelResourceData;\r\n upsellOrder?: FunnelResourceData;\r\n downsellOrder?: FunnelResourceData;\r\n\r\n // Collections (array support for multiple instances)\r\n orders?: FunnelResourceData[];\r\n customers?: FunnelResourceData[];\r\n payments?: FunnelResourceData[];\r\n}\r\n\r\n/**\r\n * Flexible resource map supporting:\r\n * 1. Single resources (order)\r\n * 2. Collections (orders[])\r\n * 3. Wrapped resources with metadata\r\n * 4. Completely custom keys\r\n * \r\n * @example Simple usage (backward compatible)\r\n * ```typescript\r\n * resources: {\r\n * order: { id: '123', amount: 100 }\r\n * }\r\n * ```\r\n * \r\n * @example Multiple instances via collections\r\n * ```typescript\r\n * resources: {\r\n * order: { id: 'main' }, // Hot context\r\n * orders: [ // Full collection\r\n * { id: 'main', type: 'initial' },\r\n * { id: 'upsell1', type: 'addon' }\r\n * ]\r\n * }\r\n * ```\r\n * \r\n * @example With metadata (opt-in)\r\n * ```typescript\r\n * resources: {\r\n * order: {\r\n * data: { id: '123', amount: 100 },\r\n * meta: { source: 'checkout-plugin', version: '2.0' }\r\n * }\r\n * }\r\n * ```\r\n * \r\n * @example Typed resources (opt-in strict typing)\r\n * ```typescript\r\n * interface MyResources {\r\n * order: Order; // Your typed Order interface\r\n * customer: Customer;\r\n * }\r\n * \r\n * const result = await funnel.next<MyResources>({\r\n * type: 'payment_success',\r\n * data: {\r\n * resources: {\r\n * order: { id: '123', amount: 100 } // \u2705 Type-checked!\r\n * }\r\n * }\r\n * });\r\n * ```\r\n */\r\nexport type FunnelResourceMap<TCustom = {}> = StandardResourceKeys & {\r\n /**\r\n * Fully extensible - any key allowed\r\n * Value can be:\r\n * - Single resource: { id: '...' }\r\n * - Collection: [{ id: '...' }, ...]\r\n * - Wrapped: { data: {...}, meta: {...} }\r\n */\r\n [key: string]:\r\n | FunnelResourceData\r\n | FunnelResourceData[]\r\n | ResourceWithMetadata\r\n | ResourceWithMetadata[]\r\n | undefined;\r\n} & TCustom;\r\n\r\n/**\r\n * Typed resources structure for funnel actions\r\n * \r\n * \uD83D\uDCA1 RESOURCE PROTOCOL: Flexible & Scalable\r\n * \r\n * The system supports multiple patterns for maximum flexibility:\r\n * \r\n * 1. **Simple Pattern** (Default - Backward Compatible):\r\n * ```typescript\r\n * resources: { order: { id: '123' } }\r\n * ```\r\n * \r\n * 2. **Aliasing Pattern** (For Hot + Named Context):\r\n * ```typescript\r\n * resources: {\r\n * order: { id: '123' }, // Hot context (latest)\r\n * mainOrder: { id: '123' } // Named (persistent)\r\n * }\r\n * ```\r\n * \r\n * 3. **Collection Pattern** (For Multiple Instances):\r\n * ```typescript\r\n * resources: {\r\n * orders: [\r\n * { id: 'main', label: 'Initial Order' },\r\n * { id: 'upsell1', label: 'Upsell #1' }\r\n * ]\r\n * }\r\n * ```\r\n * \r\n * 4. **Metadata Pattern** (For Versioning/Tracking):\r\n * ```typescript\r\n * resources: {\r\n * order: {\r\n * data: { id: '123', amount: 100 },\r\n * meta: { version: '2.0', source: 'checkout' }\r\n * }\r\n * }\r\n * ```\r\n * \r\n * 5. **Namespaced Pattern** (For Collision Prevention):\r\n * ```typescript\r\n * resources: {\r\n * 'checkout:order': { id: '123' },\r\n * 'subscription:order': { id: '456' }\r\n * }\r\n * ```\r\n * \r\n * 6. **Typed Pattern** (For Strict Type Safety):\r\n * ```typescript\r\n * interface StrictResources {\r\n * order: Order; // Your interface\r\n * customer: Customer;\r\n * }\r\n * funnel.next<StrictResources>({ ... })\r\n * ```\r\n * \r\n * All patterns work together - choose what fits your use case!\r\n */\r\nexport interface FunnelActionResources<TCustom = {}> {\r\n /**\r\n * Resource map - infinitely extensible\r\n * - Standard keys provide IntelliSense\r\n * - Custom keys allowed via index signature\r\n * - Supports single resources, collections, and metadata\r\n * - Optional: pass generic for strict typing\r\n */\r\n resources?: FunnelResourceMap<TCustom>;\r\n /**\r\n * Legacy top-level data (backward compatible)\r\n * Will be automatically migrated to resources by orchestrator\r\n */\r\n [key: string]: any;\r\n}\r\n\r\nexport interface DirectNavigationActionData extends FunnelActionResources {\r\n targetStepId: string;\r\n}\r\n\r\nexport interface BackNavigationActionData extends FunnelActionResources {\r\n targetStepId: string;\r\n}\r\n\r\nexport interface PaymentSuccessActionData extends FunnelActionResources {\r\n payment: {\r\n id: string;\r\n status: string;\r\n transactionId?: string;\r\n timestamp?: string;\r\n [key: string]: any;\r\n };\r\n order: {\r\n id: string;\r\n amount: number;\r\n currency: string;\r\n [key: string]: any;\r\n };\r\n}\r\n\r\nexport interface PaymentFailedActionData extends FunnelActionResources {\r\n payment: {\r\n id: string;\r\n status: string;\r\n error?: string;\r\n [key: string]: any;\r\n };\r\n}\r\n\r\nexport interface OfferAcceptedActionData extends FunnelActionResources {\r\n offer: {\r\n accepted: boolean;\r\n offerId?: string;\r\n [key: string]: any;\r\n };\r\n}\r\n\r\nexport interface OfferDeclinedActionData extends FunnelActionResources {\r\n offer: {\r\n declined: boolean;\r\n offerId?: string;\r\n [key: string]: any;\r\n };\r\n}\r\n\r\nexport interface CartUpdatedActionData extends FunnelActionResources {\r\n cart: {\r\n hasSpecificItem?: boolean;\r\n itemIds?: string[];\r\n variantIds?: string[];\r\n total?: number;\r\n [key: string]: any;\r\n };\r\n}\r\n\r\nexport interface FormSubmitActionData extends FunnelActionResources {\r\n form?: {\r\n [key: string]: any;\r\n };\r\n}\r\n\r\n/**\r\n * Base properties shared by all FunnelAction types\r\n */\r\ninterface BaseFunnelAction {\r\n /**\r\n * Action timestamp (ISO string format)\r\n */\r\n timestamp?: string;\r\n /**\r\n * Current URL for session synchronization (browser back/forward handling)\r\n * If not provided, SDK will automatically use window.location.href\r\n * @example '/checkout', 'https://store.com/payment'\r\n */\r\n currentUrl?: string;\r\n}\r\n\r\n/**\r\n * Discriminated union for FunnelAction based on action type\r\n */\r\nexport type FunnelAction =\r\n BaseFunnelAction & (({\r\n type: FunnelActionType.DIRECT_NAVIGATION;\r\n data: NextAction<DirectNavigationActionData>;\r\n })\r\n | ({\r\n type: FunnelActionType.BACK_NAVIGATION;\r\n data: NextAction<BackNavigationActionData>;\r\n })\r\n | ({\r\n type: FunnelActionType.CONTINUE_CLICKED;\r\n data: NextAction<any>;\r\n })\r\n | ({\r\n type: FunnelActionType.BUTTON_CLICK;\r\n data: NextAction<any>;\r\n })\r\n | ({\r\n type: FunnelActionType.FORM_SUBMIT;\r\n data: NextAction<FormSubmitActionData>;\r\n })\r\n | ({\r\n type: FunnelActionType.PAYMENT_SUCCESS;\r\n data: NextAction<PaymentSuccessActionData>;\r\n })\r\n | ({\r\n type: FunnelActionType.PAYMENT_FAILED;\r\n data: NextAction<PaymentFailedActionData>;\r\n })\r\n | ({\r\n type: FunnelActionType.OFFER_ACCEPTED;\r\n data: NextAction<OfferAcceptedActionData>;\r\n })\r\n | ({\r\n type: FunnelActionType.OFFER_DECLINED;\r\n data: NextAction<OfferDeclinedActionData>;\r\n })\r\n | ({\r\n type: FunnelActionType.CART_UPDATED;\r\n data: NextAction<CartUpdatedActionData>;\r\n })\r\n | ({\r\n type: FunnelActionType.CART_ITEM_ADDED;\r\n data: NextAction<CartUpdatedActionData>;\r\n })\r\n | ({\r\n type: FunnelActionType.CUSTOM;\r\n data: NextAction<FunnelActionResources>;\r\n })\r\n | ({\r\n type: string;\r\n data?: NextAction<FunnelActionResources>;\r\n }));\r\n\r\nexport interface FunnelNavigationAction {\r\n type: 'redirect' | 'replace' | 'push' | 'external' | 'none';\r\n url?: string;\r\n data?: any;\r\n}\r\n\r\nexport interface FunnelNavigationResult {\r\n stepId?: string; // Optional for fire-and-forget mode\r\n url?: string; // URL to redirect to after navigation (if step has a URL configured)\r\n action?: FunnelNavigationAction; // Optional for fire-and-forget mode\r\n context?: SimpleFunnelContext; // Optional for fire-and-forget mode\r\n tracking?: {\r\n from: string;\r\n to: string;\r\n event: string;\r\n timestamp: string;\r\n };\r\n /**\r\n * Fire-and-forget response: indicates navigation was queued\r\n * When true, stepId, url, action, and context will be undefined\r\n */\r\n queued?: boolean;\r\n /**\r\n * Session ID (may be different if session was recovered)\r\n */\r\n sessionId?: string;\r\n}\r\n\r\n/**\r\n * Funnel context available to plugins\r\n * Contains current state, resources, and metadata about the funnel session\r\n * \r\n * @example Basic usage\r\n * ```typescript\r\n * const context = await funnel.getContext();\r\n * const orderId = context.resources?.order?.id;\r\n * ```\r\n * \r\n * @example Typed usage (opt-in strict typing)\r\n * ```typescript\r\n * interface MyResources {\r\n * order: Order;\r\n * customer: Customer;\r\n * }\r\n * const context = await funnel.getContext<MyResources>();\r\n * const total = context.resources?.order.amount; // \u2705 Type-safe!\r\n * ```\r\n * \r\n * @example Collection access\r\n * ```typescript\r\n * const allOrders = context.resources?.orders; // FunnelResourceData[]\r\n * const mainOrder = allOrders?.find(o => o.id === 'main');\r\n * ```\r\n */\r\nexport interface SimpleFunnelContext<TCustom = {}> {\r\n customerId: string;\r\n storeId: string;\r\n sessionId: string;\r\n funnelId: string;\r\n currentStepId: string;\r\n previousStepId?: string;\r\n /**\r\n * Furthest step reached in the funnel (for progress tracking in cyclic funnels)\r\n * Only moves forward, never backward - used for analytics\r\n */\r\n furthestStepId?: string;\r\n /**\r\n * \u2705 Environment context (staging or production)\r\n * - Determined at session initialization based on entry URL\r\n * - Ensures all navigation stays in the same environment\r\n * - 'staging': Uses funnel.config (alias domains like funnel--store.cdn.tagadapay.com)\r\n * - 'production': Uses funnel.productionConfig (custom domains)\r\n */\r\n environment?: 'staging' | 'production';\r\n startedAt: number;\r\n lastActivityAt: number;\r\n\r\n /**\r\n * Typed resources map - infinitely extensible\r\n * - Single resources, collections, or wrapped with metadata\r\n * - Pass generic for strict typing: SimpleFunnelContext<MyResources>\r\n * - Standard keys provide IntelliSense, custom keys always allowed\r\n */\r\n resources?: FunnelResourceMap<TCustom>;\r\n\r\n /**\r\n * Static resources from plugin manifest (type: \"static\")\r\n * - Configured in funnel editor's Static Resources tab\r\n * - Available at runtime as context.static\r\n * - Example: context.static.offer.id for statically configured offers\r\n */\r\n static?: Record<string, any>;\r\n\r\n /**\r\n * Legacy/Custom metadata\r\n * For backward compatibility and flexible unstructured data\r\n */\r\n metadata?: Record<string, any>;\r\n\r\n script?: string;\r\n}\r\n\r\nexport interface FunnelInitializeRequest {\r\n cmsSession: {\r\n customerId: string;\r\n storeId: string;\r\n sessionId: string;\r\n accountId: string;\r\n };\r\n funnelId?: string;\r\n entryStepId?: string;\r\n existingSessionId?: string;\r\n /**\r\n * Current URL for session synchronization (browser back/forward handling)\r\n * If not provided, SDK will automatically use window.location.href\r\n * @example '/checkout', 'https://store.com/payment'\r\n */\r\n currentUrl?: string;\r\n /**\r\n * A/B test variant ID extracted from injected HTML\r\n * Used to track which variant the user is seeing in an A/B test\r\n * @example 'step_1765015842897_variant_1'\r\n */\r\n funnelVariantId?: string;\r\n /**\r\n * Funnel step ID extracted from injected HTML\r\n * Used to track which step the user is on\r\n * @example 'step_1765015842897'\r\n */\r\n funnelStepId?: string;\r\n /**\r\n * \uD83C\uDFAF Draft/preview mode flag (explicit from SDK, more robust than URL parsing)\r\n * When true, uses draft/staging data instead of production data\r\n */\r\n draft?: boolean;\r\n /**\r\n * \uD83C\uDFAF Funnel tracking enable/disable flag (explicit from SDK, more robust than URL parsing)\r\n * When false, disables all funnel tracking events (useful for iframed previews in config editor)\r\n */\r\n funnelTracking?: boolean;\r\n /**\r\n * \uD83C\uDFAF Funnel environment override ('staging' | 'production')\r\n * Determines which funnel config to use\r\n */\r\n funnelEnv?: 'staging' | 'production';\r\n /**\r\n * \uD83C\uDFAF Tagada client environment override ('production' | 'development' | 'local')\r\n * Forces specific API environment\r\n */\r\n tagadaClientEnv?: 'production' | 'development' | 'local';\r\n /**\r\n * \uD83C\uDFAF Tagada client base URL override\r\n * Forces custom API base URL (e.g., for local development with ngrok)\r\n */\r\n tagadaClientBaseUrl?: string;\r\n /**\r\n * \uD83C\uDF0D Display currency override (e.g., 'USD', 'EUR')\r\n * Forces specific currency for display purposes\r\n */\r\n currency?: string;\r\n /**\r\n * \uD83C\uDF0D Display locale override (e.g., 'en', 'fr')\r\n * Forces specific locale for display purposes\r\n */\r\n locale?: string;\r\n}\r\n\r\nexport interface FunnelInitializeResponse {\r\n success: boolean;\r\n context?: SimpleFunnelContext;\r\n error?: string;\r\n}\r\n\r\nexport interface FunnelNavigateRequest {\r\n sessionId: string;\r\n event: FunnelAction;\r\n contextUpdates?: Partial<SimpleFunnelContext>;\r\n /**\r\n * Current URL for URL-to-Step mapping (browser back/forward sync)\r\n * Automatically extracted from event.currentUrl or window.location.href\r\n */\r\n currentUrl?: string;\r\n /**\r\n * Funnel ID for session recovery when session expires\r\n * If session is not found and funnelId is provided, a new session will be created\r\n */\r\n funnelId?: string;\r\n /**\r\n * Funnel step ID (from SDK injection/URL params)\r\n * Used to sync session state before navigation\r\n */\r\n funnelStepId?: string;\r\n /**\r\n * Funnel variant ID (from SDK injection/URL params for A/B testing)\r\n * Used to sync session state before navigation\r\n */\r\n funnelVariantId?: string;\r\n /**\r\n * Fire and forget mode - queues navigation to QStash and returns immediately\r\n * No response data needed, just acknowledgment that request was queued\r\n * When true, result will only contain queued status and sessionId (no URL or stepId)\r\n */\r\n fireAndForget?: boolean;\r\n /**\r\n * \u2705 Customer tags to set (merged with existing customer tags)\r\n * @example ['segment:vip', 'cart_value:high']\r\n */\r\n customerTags?: string[];\r\n /**\r\n * \u2705 Device ID for geo/device tag enrichment (optional)\r\n * @example 'dev_abc123xyz'\r\n */\r\n deviceId?: string;\r\n}\r\n\r\nexport interface FunnelNavigateResponse {\r\n success: boolean;\r\n result?: {\r\n stepId?: string;\r\n url?: string;\r\n /**\r\n * New session ID if session was recovered (expired/removed)\r\n * SDK should update its sessionId if this is present\r\n */\r\n sessionId?: string;\r\n tracking?: {\r\n from: string;\r\n to: string;\r\n event: string;\r\n timestamp: string;\r\n };\r\n /**\r\n * Fire-and-forget response: indicates navigation was queued\r\n * When present, stepId and url will be undefined\r\n */\r\n queued?: boolean;\r\n };\r\n error?: string;\r\n}\r\n\r\nexport interface FunnelContextUpdateRequest {\r\n contextUpdates: Partial<SimpleFunnelContext>;\r\n}\r\n\r\nexport interface FunnelContextUpdateResponse {\r\n success: boolean;\r\n error?: string;\r\n}\r\n\r\nexport class FunnelResource {\r\n constructor(private apiClient: ApiClient) { }\r\n\r\n /**\r\n * Initialize a funnel session\r\n */\r\n async initialize(request: FunnelInitializeRequest): Promise<FunnelInitializeResponse> {\r\n return this.apiClient.post('/api/v1/funnel/initialize', request);\r\n }\r\n\r\n /**\r\n * Navigate to next step in funnel\r\n */\r\n async navigate(request: FunnelNavigateRequest): Promise<FunnelNavigateResponse> {\r\n return this.apiClient.post('/api/v1/funnel/navigate', request);\r\n }\r\n\r\n /**\r\n * Update funnel context\r\n */\r\n async updateContext(sessionId: string, request: FunnelContextUpdateRequest): Promise<FunnelContextUpdateResponse> {\r\n return this.apiClient.patch(`/api/v1/funnel/context/${sessionId}`, request);\r\n }\r\n\r\n /**\r\n * End funnel session\r\n */\r\n async endSession(sessionId: string): Promise<{ success: boolean; error?: string }> {\r\n return this.apiClient.delete(`/api/v1/funnel/session/${sessionId}`);\r\n }\r\n\r\n /**\r\n * Get funnel session by ID\r\n * @param sessionId - The session ID to fetch\r\n * @param currentUrl - Optional current URL for session synchronization on page load\r\n */\r\n async getSession(sessionId: string, currentUrl?: string, includeDebugData?: boolean): Promise<{ success: boolean; context?: SimpleFunnelContext; debugData?: any; error?: string }> {\r\n const params = new URLSearchParams();\r\n if (currentUrl) {\r\n params.append('currentUrl', currentUrl);\r\n }\r\n if (includeDebugData) {\r\n params.append('includeDebugData', 'true');\r\n }\r\n const url = `/api/v1/funnel/session/${sessionId}${params.toString() ? `?${params}` : ''}`;\r\n return this.apiClient.get(url);\r\n }\r\n}\r\n\r\n", "/**\r\n * Simple event dispatcher for handling state changes in the SDK\r\n */\r\nexport type Listener<T> = (data: T) => void;\r\n\r\nexport class EventDispatcher<T> {\r\n private listeners: Set<Listener<T>> = new Set();\r\n\r\n subscribe(listener: Listener<T>): () => void {\r\n this.listeners.add(listener);\r\n return () => {\r\n this.listeners.delete(listener);\r\n };\r\n }\r\n\r\n notify(data: T): void {\r\n this.listeners.forEach((listener) => {\r\n try {\r\n listener(data);\r\n } catch (error) {\r\n console.error('Error in event listener:', error);\r\n }\r\n });\r\n }\r\n\r\n clear(): void {\r\n this.listeners.clear();\r\n }\r\n}\r\n\r\n", "/**\r\n * Client-side token storage utilities\r\n */\r\n\r\nconst TOKEN_KEY = 'cms_token';\r\n\r\n/**\r\n * Set the CMS token in localStorage\r\n * \r\n * IMPORTANT: Browser's native 'storage' event ONLY fires for changes in OTHER tabs/windows.\r\n * For same-tab updates to trigger storage listeners, we must manually dispatch the event.\r\n * We only dispatch if the token actually changed to minimize unnecessary events.\r\n */\r\nexport function setClientToken(token: string): void {\r\n if (typeof window !== 'undefined') {\r\n try {\r\n // Check if token actually changed to avoid unnecessary events and potential loops\r\n const currentToken = localStorage.getItem(TOKEN_KEY);\r\n const tokenChanged = currentToken !== token;\r\n\r\n localStorage.setItem(TOKEN_KEY, token);\r\n\r\n // Only dispatch if token actually changed\r\n // The storage event listeners have guards to prevent infinite loops:\r\n // - They check if token hasn't changed (client.ts line 261)\r\n // - They check if initialization is in progress (client.ts line 269)\r\n // - They check retry limits (client.ts line 277)\r\n if (tokenChanged) {\r\n window.dispatchEvent(new Event('storage'));\r\n }\r\n } catch (error) {\r\n console.error('Failed to save token to localStorage:', error);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Get the CMS token from localStorage\r\n */\r\nexport function getClientToken(): string | null {\r\n if (typeof window !== 'undefined') {\r\n try {\r\n return localStorage.getItem(TOKEN_KEY);\r\n } catch (error) {\r\n console.error('Failed to get token from localStorage:', error);\r\n return null;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Clear the CMS token from localStorage\r\n */\r\nexport function clearClientToken(): void {\r\n if (typeof window !== 'undefined') {\r\n try {\r\n localStorage.removeItem(TOKEN_KEY);\r\n } catch (error) {\r\n console.error('Failed to clear token from localStorage:', error);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Check if a token exists in localStorage\r\n */\r\nexport function hasClientToken(): boolean {\r\n return !!getClientToken();\r\n}\r\n\r\n", "/**\r\n * Session Storage Utilities - Core SDK (Framework-agnostic)\r\n * Handles session persistence using browser cookies\r\n */\r\n\r\nconst FUNNEL_SESSION_COOKIE_NAME = 'tgd-funnel-session-id';\r\nconst STICKY_SESSION_COOKIE_NAME = 'tgd-session-id';\r\nconst SESSION_MAX_AGE = 30 * 24 * 60 * 60; // 30 days\r\n\r\n/**\r\n * Save funnel session ID to browser cookie\r\n */\r\nexport function setFunnelSessionCookie(sessionId: string): void {\r\n if (typeof document === 'undefined') return;\r\n\r\n document.cookie = `${FUNNEL_SESSION_COOKIE_NAME}=${sessionId}; path=/; max-age=${SESSION_MAX_AGE}; SameSite=Lax`;\r\n}\r\n\r\n/**\r\n * Retrieve funnel session ID from browser cookie\r\n */\r\nexport function getFunnelSessionCookie(): string | undefined {\r\n if (typeof document === 'undefined') return undefined;\r\n\r\n const cookie = document.cookie\r\n .split('; ')\r\n .find((row) => row.startsWith(`${FUNNEL_SESSION_COOKIE_NAME}=`));\r\n\r\n return cookie ? cookie.split('=')[1] : undefined;\r\n}\r\n\r\n/**\r\n * Clear funnel session cookie\r\n */\r\nexport function clearFunnelSessionCookie(): void {\r\n if (typeof document === 'undefined') return;\r\n\r\n document.cookie = `${FUNNEL_SESSION_COOKIE_NAME}=; path=/; max-age=0`;\r\n}\r\n\r\n/**\r\n * Check if a funnel session cookie exists\r\n */\r\nexport function hasFunnelSessionCookie(): boolean {\r\n return !!getFunnelSessionCookie();\r\n}\r\n\r\n/**\r\n * Retrieve funnel variant ID from sticky session (for A/B tracking)\r\n * The variant ID is stored in the sticky session metadata by plugin-routing\r\n */\r\nexport function getFunnelVariantId(): string | undefined {\r\n if (typeof document === 'undefined') return undefined;\r\n\r\n try {\r\n const cookie = document.cookie\r\n .split('; ')\r\n .find((row) => row.startsWith(`${STICKY_SESSION_COOKIE_NAME}=`));\r\n\r\n if (!cookie) return undefined;\r\n\r\n const sessionData = JSON.parse(decodeURIComponent(cookie.split('=')[1]));\r\n return sessionData?.metadata?.funnelVariantId;\r\n } catch (error) {\r\n console.warn('Failed to parse sticky session for variant ID:', error);\r\n return undefined;\r\n }\r\n}\r\n\r\n\r\n", "/**\r\n * SDK Override Parameters\r\n * \r\n * Centralized parameter management for SDK behavior overrides.\r\n * Parameters can come from URL query params, localStorage, or cookies.\r\n * \r\n * Key concepts:\r\n * - forceReset: Clears all stored state (localStorage, cookies) - simulates hard refresh\r\n * - draft: Marks customers/sessions as draft (for staging/preview/testing)\r\n * - funnelTracking: Controls whether funnel events are tracked\r\n * - tagadaClientEnv: Forces specific environment (production/development/local) - overrides auto-detection\r\n * - tagadaClientBaseUrl: Forces custom API base URL - overrides environment-based URL\r\n * - token: Authentication token (URL > localStorage)\r\n * - funnelSessionId: Active funnel session (URL > cookie)\r\n * \r\n * \u26A0\uFE0F Note: authCode is NOT handled here - it has highest priority and is handled\r\n * separately in client.ts before all other initialization logic.\r\n * \r\n * Usage examples:\r\n * - Force production API: ?tagadaClientEnv=production\r\n * - Force development API: ?tagadaClientEnv=development\r\n * - Force local API: ?tagadaClientEnv=local\r\n * - Custom API URL: ?tagadaClientBaseUrl=https://tagada.loclx.io\r\n * - Combined: ?tagadaClientEnv=local&tagadaClientBaseUrl=https://tagada.loclx.io\r\n * - Hard reset + production: ?forceReset=true&tagadaClientEnv=production\r\n * - Cross-domain auth: ?authCode=ah_... (automatically handled, highest priority)\r\n */\r\n\r\nimport { clearClientToken, setClientToken, getClientToken } from './tokenStorage';\r\nimport { clearFunnelSessionCookie } from './sessionStorage';\r\n\r\n/**\r\n * SDK Override Parameters - centralized across all SDK functions\r\n * Can be set via URL params, localStorage, or cookies\r\n */\r\nexport interface SDKOverrideParams {\r\n /** Force clean state (clear localStorage and cookies) - simulates hard refresh */\r\n forceReset?: boolean;\r\n /** Token from URL (overrides localStorage) */\r\n token?: string | null;\r\n /** Funnel session ID from URL (overrides cookie) */\r\n funnelSessionId?: string | null;\r\n /** Funnel ID from URL */\r\n funnelId?: string | null;\r\n /** Draft mode - marks customers/sessions as draft */\r\n draft?: boolean;\r\n /** Enable/disable funnel tracking events (false in config editor iframe, true in funnel previews) */\r\n funnelTracking?: boolean;\r\n /** Funnel environment (staging/production) - determines which funnel config to use */\r\n funnelEnv?: 'staging' | 'production';\r\n /** Force specific environment (production/development/local) - overrides auto-detection */\r\n tagadaClientEnv?: 'production' | 'development' | 'local';\r\n /** Force custom API base URL - overrides environment-based URL */\r\n tagadaClientBaseUrl?: string;\r\n /** Display currency override (e.g., 'USD', 'EUR') */\r\n currency?: string;\r\n /** Display locale override (e.g., 'en', 'fr') */\r\n locale?: string;\r\n}\r\n\r\n// Storage keys for SDK override params\r\nconst STORAGE_KEYS = {\r\n DRAFT: 'tgd_draft',\r\n FUNNEL_TRACKING: 'tgd_funnel_tracking',\r\n FORCE_RESET: 'tgd_force_reset',\r\n CLIENT_ENV: 'tgd_client_env',\r\n CLIENT_BASE_URL: 'tgd_client_base_url',\r\n CURRENCY: 'tgd_currency',\r\n LOCALE: 'tgd_locale',\r\n} as const;\r\n\r\n/**\r\n * Check if force reset is active (simulates hard refresh)\r\n */\r\nexport function isForceReset(): boolean {\r\n if (typeof window === 'undefined') return false;\r\n\r\n const params = new URLSearchParams(window.location.search);\r\n return params.get('forceReset') === 'true';\r\n}\r\n\r\n/**\r\n * Get value from localStorage with fallback\r\n */\r\nfunction getFromStorage(key: string): string | null {\r\n if (typeof window === 'undefined') return null;\r\n try {\r\n return localStorage.getItem(key);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Set value in localStorage\r\n */\r\nfunction setInStorage(key: string, value: string): void {\r\n if (typeof window === 'undefined') return;\r\n try {\r\n localStorage.setItem(key, value);\r\n } catch {\r\n // Storage not available\r\n }\r\n}\r\n\r\n/**\r\n * Get value from cookie\r\n */\r\nfunction getFromCookie(key: string): string | null {\r\n if (typeof document === 'undefined') return null;\r\n const cookies = document.cookie.split(';');\r\n const cookie = cookies.find(c => c.trim().startsWith(`${key}=`));\r\n return cookie ? cookie.split('=')[1]?.trim() : null;\r\n}\r\n\r\n/**\r\n * Set value in cookie\r\n * \u26A0\uFE0F NEVER allows tgd_draft to be set as a cookie (localStorage-only)\r\n */\r\nfunction setInCookie(key: string, value: string, maxAge = 86400): void {\r\n if (typeof document === 'undefined') return;\r\n\r\n // \uD83D\uDEE1\uFE0F SAFETY: Block tgd_draft from EVER being written to cookies\r\n if (key === 'tgd_draft' || key === 'tgd-draft') {\r\n console.warn(`\uD83D\uDEE1\uFE0F [SDK] Blocked attempt to set ${key} as cookie - this should only be in localStorage`);\r\n return;\r\n }\r\n\r\n document.cookie = `${key}=${value}; path=/; max-age=${maxAge}`;\r\n}\r\n\r\n/**\r\n * Clear value from cookie\r\n */\r\nfunction clearFromCookie(key: string): void {\r\n if (typeof document === 'undefined') return;\r\n document.cookie = `${key}=; path=/; max-age=0`;\r\n}\r\n\r\n/**\r\n * Get SDK override parameters from all sources (URL, localStorage, cookies)\r\n * Priority: URL > localStorage > Cookie\r\n */\r\nexport function getSDKParams(): SDKOverrideParams {\r\n if (typeof window === 'undefined') {\r\n return {};\r\n }\r\n\r\n const urlParams = new URLSearchParams(window.location.search);\r\n\r\n // Get draft mode (URL > localStorage only - no cookie fallback to avoid resurrection)\r\n let draft: boolean | undefined;\r\n const urlDraft = urlParams.get('draft');\r\n if (urlDraft !== null) {\r\n draft = urlDraft === 'true';\r\n } else {\r\n const storageDraft = getFromStorage(STORAGE_KEYS.DRAFT);\r\n if (storageDraft !== null) {\r\n draft = storageDraft === 'true';\r\n }\r\n }\r\n\r\n // Get funnel tracking (URL > localStorage > cookie, default true)\r\n let funnelTracking: boolean | undefined;\r\n const urlTracking = urlParams.get('funnelTracking');\r\n if (urlTracking !== null) {\r\n funnelTracking = urlTracking !== 'false';\r\n } else {\r\n const storageTracking = getFromStorage(STORAGE_KEYS.FUNNEL_TRACKING) || getFromCookie(STORAGE_KEYS.FUNNEL_TRACKING);\r\n if (storageTracking !== null) {\r\n funnelTracking = storageTracking !== 'false';\r\n }\r\n }\r\n\r\n // Get token (URL > localStorage)\r\n const token = urlParams.get('token') || getClientToken() || null;\r\n\r\n // Get funnel session ID (URL only, cookie handled elsewhere)\r\n const funnelSessionId = urlParams.get('funnelSessionId') || null;\r\n\r\n // Get funnel ID (URL only)\r\n const funnelId = urlParams.get('funnelId') || null;\r\n\r\n // Get funnel environment (URL only - not persisted, set on entry)\r\n let funnelEnv: 'staging' | 'production' | undefined;\r\n const urlFunnelEnv = urlParams.get('funnelEnv');\r\n if (urlFunnelEnv && (urlFunnelEnv === 'staging' || urlFunnelEnv === 'production')) {\r\n funnelEnv = urlFunnelEnv;\r\n }\r\n\r\n // Force reset is URL-only (not persisted)\r\n const forceReset = urlParams.get('forceReset') === 'true';\r\n\r\n // Get client environment override (URL > localStorage > cookie)\r\n let tagadaClientEnv: 'production' | 'development' | 'local' | undefined;\r\n const urlEnv = urlParams.get('tagadaClientEnv');\r\n if (urlEnv && (urlEnv === 'production' || urlEnv === 'development' || urlEnv === 'local')) {\r\n tagadaClientEnv = urlEnv;\r\n } else {\r\n const storageEnv = getFromStorage(STORAGE_KEYS.CLIENT_ENV) || getFromCookie(STORAGE_KEYS.CLIENT_ENV);\r\n if (storageEnv && (storageEnv === 'production' || storageEnv === 'development' || storageEnv === 'local')) {\r\n tagadaClientEnv = storageEnv as 'production' | 'development' | 'local';\r\n }\r\n }\r\n\r\n // Get custom API base URL override (URL > localStorage > cookie)\r\n let tagadaClientBaseUrl: string | undefined;\r\n const urlBaseUrl = urlParams.get('tagadaClientBaseUrl');\r\n if (urlBaseUrl) {\r\n tagadaClientBaseUrl = urlBaseUrl;\r\n } else {\r\n const storageBaseUrl = getFromStorage(STORAGE_KEYS.CLIENT_BASE_URL) || getFromCookie(STORAGE_KEYS.CLIENT_BASE_URL);\r\n if (storageBaseUrl) {\r\n tagadaClientBaseUrl = storageBaseUrl;\r\n }\r\n }\r\n\r\n // Get display currency (URL > localStorage > cookie)\r\n let currency: string | undefined;\r\n const urlCurrency = urlParams.get('currency');\r\n if (urlCurrency) {\r\n currency = urlCurrency;\r\n } else {\r\n const storageCurrency = getFromStorage(STORAGE_KEYS.CURRENCY) || getFromCookie(STORAGE_KEYS.CURRENCY);\r\n if (storageCurrency) {\r\n currency = storageCurrency;\r\n }\r\n }\r\n\r\n // Get display locale (URL > localStorage > cookie)\r\n let locale: string | undefined;\r\n const urlLocale = urlParams.get('locale');\r\n if (urlLocale) {\r\n locale = urlLocale;\r\n } else {\r\n const storageLocale = getFromStorage(STORAGE_KEYS.LOCALE) || getFromCookie(STORAGE_KEYS.LOCALE);\r\n if (storageLocale) {\r\n locale = storageLocale;\r\n }\r\n }\r\n\r\n return {\r\n forceReset,\r\n token,\r\n funnelSessionId,\r\n funnelId,\r\n draft,\r\n funnelTracking,\r\n funnelEnv,\r\n tagadaClientEnv,\r\n tagadaClientBaseUrl,\r\n currency,\r\n locale,\r\n };\r\n}\r\n\r\n/**\r\n * Legacy alias for backward compatibility\r\n * @deprecated Use getSDKParams() instead\r\n */\r\nexport function getPreviewParams(): SDKOverrideParams {\r\n return getSDKParams();\r\n}\r\n\r\n/**\r\n * Check if draft mode is active\r\n * Uses centralized getSDKParams()\r\n */\r\nexport function isDraftMode(): boolean {\r\n const params = getSDKParams();\r\n return params.draft ?? false;\r\n}\r\n\r\n/**\r\n * Set draft mode in storage for persistence\r\n * \u26A0\uFE0F ONLY writes to localStorage (not cookies) to avoid resurrection issues\r\n */\r\nexport function setDraftMode(draft: boolean): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n if (draft) {\r\n setInStorage(STORAGE_KEYS.DRAFT, 'true');\r\n } else {\r\n try {\r\n localStorage.removeItem(STORAGE_KEYS.DRAFT);\r\n } catch {\r\n // Storage not available\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Initialize SDK with override parameters\r\n * \r\n * This function handles SDK initialization based on override params:\r\n * 1. If forceReset flag is set: Clear all stored state (simulates hard refresh)\r\n * 2. If token in URL: Use it (override localStorage)\r\n * 3. If draft in URL: Persist it to storage\r\n * 4. If funnelTracking in URL: Persist it to storage\r\n * \r\n * @returns True if force reset was activated and state was cleared\r\n */\r\nexport function handlePreviewMode(debugMode = false): boolean {\r\n // \uD83D\uDD12 CRITICAL: Read URL token DIRECTLY first before any getSDKParams()\r\n // This ensures we have the URL token before any clearing happens\r\n let urlToken: string | null = null;\r\n if (typeof window !== 'undefined') {\r\n const urlParams = new URLSearchParams(window.location.search);\r\n urlToken = urlParams.get('token');\r\n }\r\n\r\n const params = getSDKParams();\r\n const shouldReset = params.forceReset || false;\r\n\r\n if (!shouldReset && !params.token) {\r\n // Not forcing reset and no explicit token override\r\n // But still persist draft/tracking if in URL\r\n persistSDKParamsFromURL();\r\n return false;\r\n }\r\n\r\n if (debugMode) {\r\n console.log('[SDK] Detected params:', params);\r\n console.log('[SDK] URL token (direct read):', urlToken ? urlToken.substring(0, 20) + '...' : 'none');\r\n }\r\n\r\n // CASE 1: Force reset - clear all state (simulates hard refresh)\r\n if (shouldReset) {\r\n if (debugMode) {\r\n console.log('[SDK] Force reset: Clearing all stored state');\r\n }\r\n\r\n clearClientToken();\r\n clearFunnelSessionCookie();\r\n\r\n // Clear all tagadapay-related localStorage keys\r\n if (typeof window !== 'undefined' && window.localStorage) {\r\n const keys = Object.keys(localStorage);\r\n keys.forEach(key => {\r\n if (key.startsWith('tagadapay_') || key.startsWith('tgd_')) {\r\n if (debugMode) {\r\n console.log(`[SDK] Clearing localStorage: ${key}`);\r\n }\r\n localStorage.removeItem(key);\r\n }\r\n });\r\n }\r\n }\r\n\r\n // CASE 2: Token in URL - override stored token\r\n // \uD83D\uDD12 CRITICAL: Use the directly-read URL token to avoid any race conditions\r\n const tokenToSet = urlToken || params.token;\r\n if (tokenToSet !== null && tokenToSet !== undefined) {\r\n if (debugMode) {\r\n console.log('[SDK] Setting token from URL:', tokenToSet.substring(0, 20) + '...');\r\n }\r\n\r\n if (tokenToSet === '' || tokenToSet === 'null') {\r\n // Explicitly cleared token\r\n clearClientToken();\r\n } else {\r\n // Set token from URL IMMEDIATELY after clearing\r\n setClientToken(tokenToSet);\r\n if (debugMode) {\r\n console.log('[SDK] \u2705 Token set in localStorage immediately after clear');\r\n }\r\n }\r\n } else if (shouldReset) {\r\n // Force reset but no token = clear stored token\r\n if (debugMode) {\r\n console.log('[SDK] Force reset mode (no token in URL)');\r\n }\r\n clearClientToken();\r\n }\r\n\r\n // CASE 3: Persist URL params to storage\r\n persistSDKParamsFromURL();\r\n\r\n // CASE 4: Funnel session ID in URL - will be used by FunnelClient\r\n if (params.funnelSessionId && debugMode) {\r\n console.log('[SDK] Using funnelSessionId from URL:', params.funnelSessionId);\r\n }\r\n\r\n return shouldReset;\r\n}\r\n\r\n/**\r\n * Persist SDK parameters from URL to storage\r\n * This ensures params survive page navigation\r\n */\r\nfunction persistSDKParamsFromURL(): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n const urlParams = new URLSearchParams(window.location.search);\r\n\r\n // Persist draft mode if in URL\r\n const urlDraft = urlParams.get('draft');\r\n if (urlDraft !== null) {\r\n setDraftMode(urlDraft === 'true');\r\n }\r\n\r\n // Persist funnel tracking if in URL\r\n const urlTracking = urlParams.get('funnelTracking');\r\n if (urlTracking !== null) {\r\n setFunnelTracking(urlTracking !== 'false');\r\n }\r\n\r\n // Persist client environment if in URL\r\n const urlEnv = urlParams.get('tagadaClientEnv');\r\n if (urlEnv && (urlEnv === 'production' || urlEnv === 'development' || urlEnv === 'local')) {\r\n setClientEnvironment(urlEnv);\r\n }\r\n\r\n // Persist custom base URL if in URL\r\n const urlBaseUrl = urlParams.get('tagadaClientBaseUrl');\r\n if (urlBaseUrl) {\r\n setClientBaseUrl(urlBaseUrl);\r\n }\r\n}\r\n\r\n/**\r\n * Set funnel tracking mode in storage for persistence\r\n */\r\nexport function setFunnelTracking(enabled: boolean): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n const value = enabled ? 'true' : 'false';\r\n setInStorage(STORAGE_KEYS.FUNNEL_TRACKING, value);\r\n setInCookie(STORAGE_KEYS.FUNNEL_TRACKING, value, 86400);\r\n}\r\n\r\n/**\r\n * Set client environment override in storage for persistence\r\n */\r\nexport function setClientEnvironment(env: 'production' | 'development' | 'local'): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n setInStorage(STORAGE_KEYS.CLIENT_ENV, env);\r\n setInCookie(STORAGE_KEYS.CLIENT_ENV, env, 86400);\r\n}\r\n\r\n/**\r\n * Clear client environment override\r\n */\r\nexport function clearClientEnvironment(): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n try {\r\n localStorage.removeItem(STORAGE_KEYS.CLIENT_ENV);\r\n clearFromCookie(STORAGE_KEYS.CLIENT_ENV);\r\n } catch {\r\n // Storage not available\r\n }\r\n}\r\n\r\n/**\r\n * Set custom API base URL override in storage for persistence\r\n */\r\nexport function setClientBaseUrl(baseUrl: string): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n setInStorage(STORAGE_KEYS.CLIENT_BASE_URL, baseUrl);\r\n setInCookie(STORAGE_KEYS.CLIENT_BASE_URL, baseUrl, 86400);\r\n}\r\n\r\n/**\r\n * Clear custom API base URL override\r\n */\r\nexport function clearClientBaseUrl(): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n try {\r\n localStorage.removeItem(STORAGE_KEYS.CLIENT_BASE_URL);\r\n clearFromCookie(STORAGE_KEYS.CLIENT_BASE_URL);\r\n } catch {\r\n // Storage not available\r\n }\r\n}\r\n\r\n/**\r\n * Check if we should use URL params over stored values\r\n * \r\n * Returns true if:\r\n * - Force reset is active, OR\r\n * - Explicit token/sessionId in URL (indicating intentional override)\r\n */\r\nexport function shouldUseUrlParams(): boolean {\r\n const params = getSDKParams();\r\n return !!(\r\n params.forceReset ||\r\n params.token !== null ||\r\n params.funnelSessionId !== null\r\n );\r\n}\r\n\r\n/**\r\n * Check if funnel tracking is enabled\r\n * Uses centralized getSDKParams()\r\n * Default is true for normal operations\r\n */\r\nexport function isFunnelTrackingEnabled(): boolean {\r\n const params = getSDKParams();\r\n return params.funnelTracking ?? true; // Default true\r\n}\r\n\r\n", "/**\r\n * Preview Mode Indicator - Auto-injected DOM element\r\n * \r\n * Automatically injects a visual indicator when SDK is in preview/draft mode\r\n * Works with vanilla JS/DOM - no React required\r\n */\r\n\r\nimport { isDraftMode, isFunnelTrackingEnabled, getSDKParams, setDraftMode, setFunnelTracking, clearClientEnvironment, clearClientBaseUrl } from './previewMode';\r\nimport { clearClientToken } from './tokenStorage';\r\nimport { clearFunnelSessionCookie } from './sessionStorage';\r\n\r\nlet indicatorElement: HTMLElement | null = null;\r\nlet isInjected = false;\r\n\r\n/**\r\n * Helper to clear a specific cookie with all possible domain/path combinations\r\n */\r\nfunction clearSpecificCookie(cookieName: string): void {\r\n if (typeof window === 'undefined' || typeof document === 'undefined') return;\r\n\r\n const hostname = window.location.hostname;\r\n const parts = hostname.split('.');\r\n\r\n // All possible domains\r\n const domains = [\r\n '', // No domain (current)\r\n hostname, // Full hostname\r\n '.' + hostname, // Wildcard current\r\n ];\r\n\r\n // Add parent domains\r\n for (let i = 1; i < parts.length; i++) {\r\n const domain = parts.slice(i).join('.');\r\n domains.push(domain);\r\n domains.push('.' + domain);\r\n }\r\n\r\n // All possible paths\r\n const pathParts = window.location.pathname.split('/').filter(p => p);\r\n const paths = ['/'];\r\n let currentPath = '';\r\n pathParts.forEach(part => {\r\n currentPath += '/' + part;\r\n paths.push(currentPath);\r\n });\r\n\r\n // Try all combinations\r\n domains.forEach(domain => {\r\n paths.forEach(path => {\r\n const baseDelete = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=${path}`;\r\n const domainPart = domain ? `; domain=${domain}` : '';\r\n\r\n // Try all security flag variations\r\n document.cookie = baseDelete + domainPart;\r\n document.cookie = baseDelete + domainPart + '; secure';\r\n document.cookie = baseDelete + domainPart + '; SameSite=None; secure';\r\n document.cookie = baseDelete + domainPart + '; SameSite=Lax';\r\n document.cookie = baseDelete + domainPart + '; SameSite=Strict';\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Leave preview mode - Clear ALL storage (including Shopify cookies, all localStorage, etc.) and reload\r\n * \u26A0\uFE0F Nuclear option - clears everything to exit preview mode completely\r\n */\r\nfunction leavePreviewMode(): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n const confirmed = confirm(\r\n '\uD83D\uDEAA Leave Preview Mode?\\n\\nThis will clear ALL cookies and localStorage (including Shopify session, cart, and preview settings) and reload the page.\\n\\nAre you sure?'\r\n );\r\n\r\n if (!confirmed) return;\r\n\r\n // STEP 0: Remove ALL preview params from URL immediately\r\n const url = new URL(window.location.href);\r\n const previewParams = [\r\n 'draft', 'funnelEnv', 'funnelTracking', 'tagadaClientEnv',\r\n 'tagadaClientBaseUrl', 'forceReset', 'funnelId', 'funnelSessionId', 'token',\r\n ];\r\n\r\n previewParams.forEach(param => url.searchParams.delete(param));\r\n window.history.replaceState({}, '', url.href);\r\n\r\n // STEP 0.5: Install global cookie blocker for tgd_draft\r\n try {\r\n const cookieDescriptor = Object.getOwnPropertyDescriptor(Document.prototype, 'cookie') ||\r\n Object.getOwnPropertyDescriptor(HTMLDocument.prototype, 'cookie');\r\n\r\n if (cookieDescriptor && cookieDescriptor.set) {\r\n Object.defineProperty(document, 'cookie', {\r\n configurable: true,\r\n enumerable: true,\r\n get: function () { return cookieDescriptor.get ? cookieDescriptor.get.call(this) : ''; },\r\n set: function (val) {\r\n if (typeof val === 'string') {\r\n const normalizedVal = val.toLowerCase();\r\n if (normalizedVal.includes('tgd_draft') ||\r\n normalizedVal.includes('tgd-draft') ||\r\n normalizedVal.includes('tgd.draft') ||\r\n normalizedVal.includes('tgddraft')) {\r\n\r\n // Allow deletion attempts\r\n if (normalizedVal.includes('max-age=0') ||\r\n normalizedVal.includes('expires=thu, 01 jan 1970')) {\r\n if (cookieDescriptor.set) {\r\n cookieDescriptor.set.call(this, val);\r\n }\r\n return;\r\n }\r\n\r\n // Block all creation/update attempts\r\n console.warn('\uD83D\uDEE1\uFE0F [TagadaPay] BLOCKED: tgd_draft should never be a cookie');\r\n return;\r\n }\r\n }\r\n\r\n if (cookieDescriptor.set) {\r\n cookieDescriptor.set.call(this, val);\r\n }\r\n }\r\n });\r\n }\r\n } catch (e) {\r\n console.warn('[TagadaPay] Could not install cookie blocker:', e);\r\n }\r\n\r\n // STEP 1: Clear TagadaPay localStorage keys\r\n if (window.localStorage) {\r\n try {\r\n localStorage.removeItem('tgd_draft');\r\n localStorage.removeItem('tgd_funnel_tracking');\r\n localStorage.removeItem('tgd_client_env');\r\n localStorage.removeItem('tgd_client_base_url');\r\n localStorage.removeItem('cms_token');\r\n } catch (e) {\r\n console.warn('[TagadaPay] Failed to clear some localStorage keys:', e);\r\n }\r\n }\r\n\r\n // Clear SDK utilities\r\n clearClientToken();\r\n clearFunnelSessionCookie();\r\n clearClientEnvironment();\r\n clearClientBaseUrl();\r\n\r\n // STEP 2: Clear ALL storage\r\n if (window.localStorage) {\r\n localStorage.clear();\r\n }\r\n if (window.sessionStorage) {\r\n sessionStorage.clear();\r\n }\r\n\r\n // STEP 3: Clear known TagadaPay cookies\r\n const tagadaCookies = [\r\n 'tgd-funnel-session-id', 'tgd_draft', 'tgd_funnel_tracking',\r\n 'tgd_client_env', 'tgd_client_base_url', 'cms_token', 'tagadapay_session',\r\n ];\r\n\r\n tagadaCookies.forEach(cookieName => clearSpecificCookie(cookieName));\r\n\r\n // STEP 3.5: Clear alternative cookie name formats\r\n const alternativeNames = ['tgd-draft', 'tgd_draft', 'tgd.draft', 'tgddraft'];\r\n alternativeNames.forEach(cookieName => clearSpecificCookie(cookieName));\r\n\r\n // STEP 4: Clear ALL remaining cookies aggressively\r\n if (document.cookie) {\r\n const cookies = document.cookie.split(';');\r\n cookies.forEach(cookie => {\r\n const cookieName = cookie.split('=')[0].trim();\r\n if (!cookieName) return;\r\n\r\n const hostname = window.location.hostname;\r\n const parts = hostname.split('.');\r\n const domains = ['', hostname, '.' + hostname];\r\n\r\n for (let i = 1; i < parts.length; i++) {\r\n const domain = parts.slice(i).join('.');\r\n domains.push(domain);\r\n domains.push('.' + domain);\r\n }\r\n\r\n const pathParts = window.location.pathname.split('/').filter(p => p);\r\n const paths = ['/'];\r\n let currentPath = '';\r\n pathParts.forEach(part => {\r\n currentPath += '/' + part;\r\n paths.push(currentPath);\r\n });\r\n\r\n domains.forEach(domain => {\r\n paths.forEach(path => {\r\n const baseDelete = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=${path}`;\r\n const domainPart = domain ? `; domain=${domain}` : '';\r\n\r\n document.cookie = baseDelete + domainPart;\r\n document.cookie = baseDelete + domainPart + '; secure';\r\n document.cookie = baseDelete + domainPart + '; SameSite=None; secure';\r\n document.cookie = baseDelete + domainPart + '; SameSite=Lax';\r\n document.cookie = baseDelete + domainPart + '; SameSite=Strict';\r\n document.cookie = baseDelete + domainPart + '; secure; SameSite=None';\r\n document.cookie = baseDelete + domainPart + '; secure; SameSite=Lax';\r\n document.cookie = baseDelete + domainPart + '; secure; SameSite=Strict';\r\n });\r\n });\r\n });\r\n }\r\n\r\n // Final cleanup and reload\r\n setTimeout(() => {\r\n if (window.localStorage && localStorage.length > 0) {\r\n localStorage.clear();\r\n }\r\n\r\n clearSpecificCookie('tgd_draft');\r\n\r\n if (typeof window.stop === 'function') {\r\n window.stop();\r\n }\r\n\r\n window.location.replace(url.href);\r\n }, 10);\r\n}\r\n\r\n/**\r\n * Inject the preview mode indicator into the DOM\r\n * Called automatically during SDK initialization if preview mode is active\r\n */\r\nexport function injectPreviewModeIndicator(): void {\r\n // Skip if already injected or not in browser\r\n if (isInjected || typeof window === 'undefined' || typeof document === 'undefined') {\r\n return;\r\n }\r\n\r\n const params = getSDKParams();\r\n const draftMode = isDraftMode();\r\n const trackingDisabled = !isFunnelTrackingEnabled();\r\n const hasCustomEnv = !!(params.tagadaClientEnv || params.tagadaClientBaseUrl);\r\n\r\n // Only inject if in preview/dev mode\r\n if (!draftMode && !trackingDisabled && !hasCustomEnv) {\r\n return;\r\n }\r\n\r\n // Create container\r\n const container = document.createElement('div');\r\n container.id = 'tgd-preview-indicator';\r\n container.style.cssText = `\r\n position: fixed;\r\n bottom: 16px;\r\n right: 16px;\r\n z-index: 999999;\r\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\r\n `;\r\n\r\n // Create badge\r\n const badge = document.createElement('div');\r\n badge.style.cssText = `\r\n background: ${draftMode ? '#ff9500' : '#007aff'};\r\n color: white;\r\n padding: 8px 12px;\r\n border-radius: 8px;\r\n font-size: 13px;\r\n font-weight: 600;\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n `;\r\n badge.innerHTML = `\r\n <span style=\"font-size: 16px;\">\uD83D\uDD0D</span>\r\n <span>${draftMode ? 'Preview Mode' : 'Dev Mode'}</span>\r\n `;\r\n\r\n // Create details popup (with padding-top to bridge gap with badge)\r\n const details = document.createElement('div');\r\n details.style.cssText = `\r\n position: absolute;\r\n bottom: calc(100% + 8px);\r\n right: 0;\r\n background: white;\r\n border: 1px solid #e5e5e5;\r\n border-radius: 8px;\r\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\r\n padding: 12px;\r\n min-width: 250px;\r\n font-size: 12px;\r\n line-height: 1.5;\r\n display: none;\r\n `;\r\n details.style.paddingTop = '20px'; // Extra padding to bridge the gap\r\n\r\n // Add invisible bridge between badge and popup to prevent flickering\r\n const bridge = document.createElement('div');\r\n bridge.style.cssText = `\r\n position: absolute;\r\n bottom: 100%;\r\n left: 0;\r\n right: 0;\r\n height: 8px;\r\n display: none;\r\n `;\r\n\r\n // Build details content\r\n let detailsHTML = '<div style=\"margin-bottom: 8px; font-weight: 600; color: #1d1d1f;\">Current Environment</div>';\r\n detailsHTML += '<div style=\"display: flex; flex-direction: column; gap: 6px;\">';\r\n\r\n if (draftMode) {\r\n detailsHTML += `\r\n <div style=\"display: flex; justify-content: space-between; color: #86868b;\">\r\n <span>Draft Mode:</span>\r\n <span style=\"color: #ff9500; font-weight: 600;\">ON</span>\r\n </div>\r\n `;\r\n }\r\n\r\n if (trackingDisabled) {\r\n detailsHTML += `\r\n <div style=\"display: flex; justify-content: space-between; color: #86868b;\">\r\n <span>Tracking:</span>\r\n <span style=\"color: #ff3b30; font-weight: 600;\">DISABLED</span>\r\n </div>\r\n `;\r\n }\r\n\r\n if (params.funnelEnv) {\r\n detailsHTML += `\r\n <div style=\"display: flex; justify-content: space-between; color: #86868b;\">\r\n <span>Funnel Env:</span>\r\n <span style=\"color: #1d1d1f; font-weight: 600; font-family: monospace; font-size: 11px;\">\r\n ${params.funnelEnv}\r\n </span>\r\n </div>\r\n `;\r\n }\r\n\r\n if (params.tagadaClientEnv) {\r\n detailsHTML += `\r\n <div style=\"display: flex; justify-content: space-between; color: #86868b;\">\r\n <span>API Env:</span>\r\n <span style=\"color: #1d1d1f; font-weight: 600; font-family: monospace; font-size: 11px;\">\r\n ${params.tagadaClientEnv}\r\n </span>\r\n </div>\r\n `;\r\n }\r\n\r\n if (params.tagadaClientBaseUrl) {\r\n detailsHTML += `\r\n <div style=\"color: #86868b;\">\r\n <div style=\"margin-bottom: 4px;\">API URL:</div>\r\n <div style=\"color: #1d1d1f; font-weight: 600; font-family: monospace; font-size: 10px; word-break: break-all; background: #f5f5f7; padding: 4px 6px; border-radius: 4px;\">\r\n ${params.tagadaClientBaseUrl}\r\n </div>\r\n </div>\r\n `;\r\n }\r\n\r\n if (params.funnelId) {\r\n detailsHTML += `\r\n <div style=\"color: #86868b; margin-top: 4px; padding-top: 8px; border-top: 1px solid #e5e5e5;\">\r\n <div style=\"margin-bottom: 4px;\">Funnel ID:</div>\r\n <div style=\"color: #1d1d1f; font-family: monospace; font-size: 10px; word-break: break-all; background: #f5f5f7; padding: 4px 6px; border-radius: 4px;\">\r\n ${params.funnelId}\r\n </div>\r\n </div>\r\n `;\r\n }\r\n\r\n detailsHTML += '</div>';\r\n detailsHTML += `\r\n <div style=\"margin-top: 12px; padding-top: 8px; border-top: 1px solid #e5e5e5; font-size: 11px; color: #86868b; text-align: center;\">\r\n Add <code style=\"background: #f5f5f7; padding: 2px 4px; border-radius: 3px;\">?forceReset=true</code> to reset\r\n </div>\r\n `;\r\n\r\n // Add action button\r\n detailsHTML += `\r\n <div style=\"margin-top: 12px; padding-top: 8px; border-top: 1px solid #e5e5e5;\">\r\n <button id=\"tgd-leave-preview\" style=\"\r\n background: #ff3b30;\r\n color: white;\r\n border: none;\r\n border-radius: 6px;\r\n padding: 10px 12px;\r\n font-size: 13px;\r\n font-weight: 600;\r\n cursor: pointer;\r\n transition: opacity 0.2s;\r\n width: 100%;\r\n \">\r\n \uD83D\uDEAA Leave Preview Mode\r\n </button>\r\n </div>\r\n `;\r\n\r\n details.innerHTML = detailsHTML;\r\n\r\n // Hover behavior - keep popup visible when hovering over badge, bridge, or popup\r\n let isHovering = false;\r\n\r\n const showDetails = () => {\r\n isHovering = true;\r\n details.style.display = 'block';\r\n bridge.style.display = 'block';\r\n };\r\n\r\n const hideDetails = () => {\r\n isHovering = false;\r\n setTimeout(() => {\r\n if (!isHovering) {\r\n details.style.display = 'none';\r\n bridge.style.display = 'none';\r\n }\r\n }, 100); // Small delay to allow moving between elements\r\n };\r\n\r\n badge.addEventListener('mouseenter', showDetails);\r\n badge.addEventListener('mouseleave', hideDetails);\r\n bridge.addEventListener('mouseenter', showDetails);\r\n bridge.addEventListener('mouseleave', hideDetails);\r\n details.addEventListener('mouseenter', showDetails);\r\n details.addEventListener('mouseleave', hideDetails);\r\n\r\n // Button: Leave preview mode\r\n const leavePreviewBtn = details.querySelector('#tgd-leave-preview') as HTMLButtonElement;\r\n if (leavePreviewBtn) {\r\n leavePreviewBtn.addEventListener('mouseenter', () => {\r\n leavePreviewBtn.style.opacity = '0.8';\r\n });\r\n leavePreviewBtn.addEventListener('mouseleave', () => {\r\n leavePreviewBtn.style.opacity = '1';\r\n });\r\n leavePreviewBtn.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n leavePreviewMode();\r\n });\r\n }\r\n\r\n // Assemble\r\n container.appendChild(badge);\r\n container.appendChild(bridge); // Add invisible bridge\r\n container.appendChild(details);\r\n\r\n // Inject into DOM\r\n document.body.appendChild(container);\r\n indicatorElement = container;\r\n isInjected = true;\r\n}\r\n\r\n/**\r\n * Remove the preview mode indicator from the DOM\r\n */\r\nexport function removePreviewModeIndicator(): void {\r\n if (indicatorElement && indicatorElement.parentNode) {\r\n indicatorElement.parentNode.removeChild(indicatorElement);\r\n indicatorElement = null;\r\n isInjected = false;\r\n }\r\n}\r\n\r\n/**\r\n * Check if indicator is currently injected\r\n */\r\nexport function isIndicatorInjected(): boolean {\r\n return isInjected;\r\n}\r\n\r\n", "import { detectEnvironment } from './config/environment';\r\nimport { ApiClient } from './resources/apiClient';\r\nimport { FunnelAction, FunnelActionType, FunnelNavigationResult, FunnelResource, SimpleFunnelContext } from './resources/funnel';\r\nimport { EventDispatcher } from './utils/eventDispatcher';\r\nimport { PluginConfig } from './utils/pluginConfig';\r\nimport { getSDKParams } from './utils/previewMode';\r\nimport { injectPreviewModeIndicator } from './utils/previewModeIndicator';\r\nimport { getFunnelSessionCookie, setFunnelSessionCookie } from './utils/sessionStorage';\r\n\r\n/**\r\n * Tracking providers supported by the SDK.\r\n * Mirrors `TrackingType` in `apps/crm-app/.../types/tracking.ts`.\r\n */\r\nexport enum TrackingProvider {\r\n FACEBOOK = 'facebook',\r\n TIKTOK = 'tiktok',\r\n SNAPCHAT = 'snapchat',\r\n PINTEREST = 'pinterest',\r\n GTM = 'gtm',\r\n}\r\n\r\n/**\r\n * Base tracking config (all providers)\r\n */\r\nexport interface BaseTrackingConfig {\r\n enabled: boolean;\r\n}\r\n\r\n/**\r\n * Pixel-based providers (Facebook, TikTok)\r\n */\r\nexport interface PixelTrackingConfig extends BaseTrackingConfig {\r\n pixelId: string;\r\n events: {\r\n PageView: boolean;\r\n InitiateCheckout: boolean;\r\n Purchase: boolean;\r\n };\r\n}\r\n\r\n/**\r\n * Snapchat pixel config (extends base pixel events)\r\n */\r\nexport interface SnapchatTrackingConfig extends BaseTrackingConfig {\r\n pixelId: string;\r\n events: {\r\n PageView: boolean;\r\n InitiateCheckout: boolean;\r\n Purchase: boolean;\r\n AddToCart: boolean;\r\n ViewContent: boolean;\r\n Search: boolean;\r\n AddToWishlist: boolean;\r\n CompleteRegistration: boolean;\r\n };\r\n}\r\n\r\n/**\r\n * Meta Conversion API config\r\n */\r\nexport interface MetaConversionTrackingConfig extends BaseTrackingConfig {\r\n accessToken: string;\r\n pixelId: string;\r\n publishPurchaseIfNewCustomerOnly: boolean;\r\n}\r\n\r\n/**\r\n * Google Tag Manager config\r\n */\r\nexport interface GTMTrackingConfig extends BaseTrackingConfig {\r\n containerId: string;\r\n events: {\r\n PageView: boolean;\r\n InitiateCheckout: boolean;\r\n Purchase: boolean;\r\n AddToCart: boolean;\r\n ViewContent: boolean;\r\n };\r\n}\r\n\r\n/**\r\n * Union of all tracking configs.\r\n * This mirrors `TrackingFormValues` from the CRM.\r\n */\r\nexport type PixelConfig =\r\n | PixelTrackingConfig\r\n | SnapchatTrackingConfig\r\n | MetaConversionTrackingConfig\r\n | GTMTrackingConfig;\r\n\r\n/**\r\n * Pixels configuration keyed by provider.\r\n * Used in RuntimeStepConfig and getAssignedPixels().\r\n */\r\nexport type PixelsConfig = {\r\n [TrackingProvider.FACEBOOK]?: PixelTrackingConfig[];\r\n [TrackingProvider.TIKTOK]?: PixelTrackingConfig[];\r\n [TrackingProvider.SNAPCHAT]?: SnapchatTrackingConfig[];\r\n [TrackingProvider.PINTEREST]?: PixelTrackingConfig[];\r\n [TrackingProvider.GTM]?: GTMTrackingConfig[];\r\n};\r\n\r\n/**\r\n * Runtime step configuration injected from the CRM\r\n * Contains payment flows, static resources, scripts, and tracking configs\r\n */\r\nexport interface RuntimeStepConfig {\r\n payment?: {\r\n paymentFlowId?: string;\r\n };\r\n staticResources?: Record<string, string>;\r\n scripts?: Array<{\r\n name: string;\r\n enabled: boolean;\r\n content: string;\r\n position?: 'head-start' | 'head-end' | 'body-start' | 'body-end';\r\n }>;\r\n // Tracking configs keyed by provider\r\n pixels?: PixelsConfig;\r\n}\r\n\r\n/**\r\n * Get the funnel ID from the injected HTML\r\n * Returns undefined if not available\r\n */\r\nfunction getAssignedFunnelId(): string | undefined {\r\n if (typeof window === 'undefined') return undefined;\r\n\r\n // Method 1: Window variable (preferred - synchronous, fast)\r\n if ((window as any).__TGD_FUNNEL_ID__) {\r\n return (window as any).__TGD_FUNNEL_ID__;\r\n }\r\n\r\n // Method 2: Meta tag fallback\r\n if (typeof document !== 'undefined') {\r\n const meta = document.querySelector('meta[name=\"x-funnel-id\"]');\r\n return meta?.getAttribute('content') || undefined;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Get the assigned A/B test variant ID from the injected HTML\r\n * Returns undefined if not in an A/B test\r\n */\r\nfunction getAssignedFunnelVariant(): string | undefined {\r\n if (typeof window === 'undefined') return undefined;\r\n\r\n // Method 1: Window variable (preferred - synchronous, fast)\r\n if ((window as any).__TGD_FUNNEL_VARIANT_ID__) {\r\n return (window as any).__TGD_FUNNEL_VARIANT_ID__;\r\n }\r\n\r\n // Method 2: Meta tag fallback\r\n if (typeof document !== 'undefined') {\r\n const meta = document.querySelector('meta[name=\"x-funnel-variant-id\"]');\r\n return meta?.getAttribute('content') || undefined;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Get the funnel step ID from the injected HTML\r\n * Returns undefined if not available\r\n */\r\nfunction getAssignedFunnelStep(): string | undefined {\r\n if (typeof window === 'undefined') return undefined;\r\n\r\n // Method 1: Window variable (preferred - synchronous, fast)\r\n if ((window as any).__TGD_FUNNEL_STEP_ID__) {\r\n return (window as any).__TGD_FUNNEL_STEP_ID__;\r\n }\r\n\r\n // Method 2: Meta tag fallback\r\n if (typeof document !== 'undefined') {\r\n const meta = document.querySelector('meta[name=\"x-funnel-step-id\"]');\r\n return meta?.getAttribute('content') || undefined;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Parse step config from a string value (handles both JSON and URL-encoded formats)\r\n * Robust parsing with multiple fallback strategies\r\n */\r\nfunction parseStepConfig(value: string): RuntimeStepConfig | undefined {\r\n if (!value || typeof value !== 'string') return undefined;\r\n\r\n const trimmed = value.trim();\r\n if (!trimmed) return undefined;\r\n\r\n // Try parsing strategies in order of likelihood\r\n const strategies = [\r\n // Strategy 1: Direct JSON parse (for properly escaped window variable)\r\n () => JSON.parse(trimmed),\r\n // Strategy 2: URL decode then JSON parse (for meta tag)\r\n () => JSON.parse(decodeURIComponent(trimmed)),\r\n // Strategy 3: Double URL decode (edge case: double-encoded)\r\n () => JSON.parse(decodeURIComponent(decodeURIComponent(trimmed))),\r\n ];\r\n\r\n for (const strategy of strategies) {\r\n try {\r\n const result = strategy();\r\n if (result && typeof result === 'object') {\r\n return result as RuntimeStepConfig;\r\n }\r\n } catch {\r\n // Try next strategy\r\n }\r\n }\r\n\r\n // All strategies failed\r\n if (typeof console !== 'undefined') {\r\n console.warn('[SDK] Failed to parse stepConfig:', trimmed.substring(0, 100));\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Local funnel configuration for development\r\n * Loaded from /config/funnel.local.json\r\n */\r\nexport interface LocalFunnelConfig {\r\n /** Funnel ID to use in local dev */\r\n funnelId?: string;\r\n /** Step ID to simulate */\r\n stepId?: string;\r\n /** Static resources (offer ID, product ID, etc.) */\r\n staticResources?: Record<string, string>;\r\n /** Payment flow ID override */\r\n paymentFlowId?: string;\r\n /** Custom scripts for local testing */\r\n scripts?: RuntimeStepConfig['scripts'];\r\n /** Pixel tracking config */\r\n pixels?: RuntimeStepConfig['pixels'];\r\n}\r\n\r\n// Cache for local funnel config (loaded once)\r\nlet localFunnelConfigCache: LocalFunnelConfig | null | undefined = undefined;\r\nlet localFunnelConfigLoading = false;\r\n\r\n/**\r\n * Check if we're in true local development (not CDN deployment)\r\n */\r\nfunction isLocalDevelopment(): boolean {\r\n if (typeof window === 'undefined') return false;\r\n const hostname = window.location.hostname;\r\n // True local: localhost without CDN subdomain pattern\r\n return hostname === 'localhost' ||\r\n hostname === '127.0.0.1' ||\r\n (hostname.endsWith('.localhost') && !hostname.includes('.cdn.'));\r\n}\r\n\r\n/**\r\n * Load local funnel config from /config/funnel.local.json (for local dev only)\r\n * This replaces the old resources.static.json with a more complete structure\r\n * \r\n * Example funnel.local.json:\r\n * {\r\n * \"funnelId\": \"funnelv2_xxx\",\r\n * \"stepId\": \"step_checkout\",\r\n * \"staticResources\": {\r\n * \"offer\": \"offer_xxx\",\r\n * \"product\": \"product_xxx\"\r\n * },\r\n * \"paymentFlowId\": \"flow_xxx\"\r\n * }\r\n */\r\nexport async function loadLocalFunnelConfig(): Promise<LocalFunnelConfig | null> {\r\n // Only in true local development\r\n if (!isLocalDevelopment()) return null;\r\n\r\n // Return cached value if already loaded\r\n if (localFunnelConfigCache !== undefined) {\r\n return localFunnelConfigCache;\r\n }\r\n\r\n // Prevent concurrent loads\r\n if (localFunnelConfigLoading) {\r\n // Wait for existing load\r\n await new Promise(resolve => setTimeout(resolve, 100));\r\n return localFunnelConfigCache ?? null;\r\n }\r\n\r\n localFunnelConfigLoading = true;\r\n\r\n try {\r\n console.log('\uD83D\uDEE0\uFE0F [SDK] Loading local funnel config from /config/funnel.local.json...');\r\n const response = await fetch('/config/funnel.local.json');\r\n if (!response.ok) {\r\n console.log('\uD83D\uDEE0\uFE0F [SDK] funnel.local.json not found (this is fine in production)');\r\n localFunnelConfigCache = null;\r\n return null;\r\n }\r\n\r\n const config = await response.json() as LocalFunnelConfig;\r\n console.log('\uD83D\uDEE0\uFE0F [SDK] \u2705 Loaded local funnel config:', config);\r\n localFunnelConfigCache = config;\r\n return config;\r\n } catch (error) {\r\n console.log('\uD83D\uDEE0\uFE0F [SDK] funnel.local.json not available:', error);\r\n localFunnelConfigCache = null;\r\n return null;\r\n } finally {\r\n localFunnelConfigLoading = false;\r\n }\r\n}\r\n\r\n/**\r\n * Get the cached local funnel config (sync access after loadLocalFunnelConfig)\r\n */\r\nexport function getLocalFunnelConfig(): LocalFunnelConfig | null {\r\n return localFunnelConfigCache ?? null;\r\n}\r\n\r\n/**\r\n * Convert LocalFunnelConfig to RuntimeStepConfig\r\n */\r\nfunction localConfigToStepConfig(local: LocalFunnelConfig): RuntimeStepConfig {\r\n return {\r\n payment: local.paymentFlowId ? { paymentFlowId: local.paymentFlowId } : undefined,\r\n staticResources: local.staticResources,\r\n scripts: local.scripts,\r\n pixels: local.pixels,\r\n };\r\n}\r\n\r\n/**\r\n * Get the runtime step configuration\r\n * Contains payment flow, static resources, scripts, and pixel tracking\r\n * \r\n * Priority:\r\n * 1. Local funnel config (local dev only - /config/funnel.local.json) - HIGHEST in local dev\r\n * 2. Window variable (production - HTML injection)\r\n * 3. Meta tag (production - HTML injection fallback)\r\n * \r\n * This allows local developers to override injected config for testing.\r\n * \r\n * Returns undefined if not available\r\n */\r\nexport function getAssignedStepConfig(): RuntimeStepConfig | undefined {\r\n if (typeof window === 'undefined') return undefined;\r\n\r\n // Method 1: Local dev override (HIGHEST PRIORITY in local dev)\r\n // Allows developers to test different configurations without redeploying\r\n const localConfig = getLocalFunnelConfig();\r\n if (localConfig) {\r\n console.log('\uD83D\uDEE0\uFE0F [SDK] Using local funnel.local.json (overrides injected)');\r\n return localConfigToStepConfig(localConfig);\r\n }\r\n\r\n // Method 2: Window variable (production - HTML injection)\r\n const windowValue = (window as any).__TGD_STEP_CONFIG__;\r\n if (windowValue) {\r\n const parsed = parseStepConfig(windowValue);\r\n if (parsed) return parsed;\r\n }\r\n\r\n // Method 3: Meta tag fallback (URL-encoded)\r\n if (typeof document !== 'undefined') {\r\n const meta = document.querySelector('meta[name=\"x-step-config\"]');\r\n const content = meta?.getAttribute('content');\r\n if (content) {\r\n const parsed = parseStepConfig(content);\r\n if (parsed) return parsed;\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Get the assigned payment flow ID from step config or legacy injection\r\n * Returns undefined if not available\r\n */\r\nexport function getAssignedPaymentFlowId(): string | undefined {\r\n // Method 1: New stepConfig (preferred)\r\n const stepConfig = getAssignedStepConfig();\r\n if (stepConfig?.payment?.paymentFlowId) {\r\n return stepConfig.payment.paymentFlowId;\r\n }\r\n\r\n // Method 2: Legacy direct injection (backward compatibility)\r\n if (typeof window !== 'undefined') {\r\n // Legacy window variable\r\n if ((window as any).__TGD_PAYMENT_FLOW_ID__) {\r\n return (window as any).__TGD_PAYMENT_FLOW_ID__;\r\n }\r\n // Legacy meta tag\r\n if (typeof document !== 'undefined') {\r\n const meta = document.querySelector('meta[name=\"x-payment-flow-id\"]');\r\n return meta?.getAttribute('content') || undefined;\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Get the assigned static resources from step config\r\n * Returns undefined if not available\r\n */\r\nexport function getAssignedStaticResources(): Record<string, string> | undefined {\r\n const stepConfig = getAssignedStepConfig();\r\n return stepConfig?.staticResources;\r\n}\r\n\r\n/**\r\n * Get the assigned scripts from step config\r\n * Returns only enabled scripts, filtered by position if specified\r\n */\r\nexport function getAssignedScripts(position?: 'head-start' | 'head-end' | 'body-start' | 'body-end'): RuntimeStepConfig['scripts'] {\r\n const stepConfig = getAssignedStepConfig();\r\n if (!stepConfig?.scripts) return undefined;\r\n\r\n // Filter enabled scripts\r\n let scripts = stepConfig.scripts.filter(s => s.enabled);\r\n\r\n // Filter by position if specified\r\n if (position) {\r\n scripts = scripts.filter(s => s.position === position || (!s.position && position === 'head-end'));\r\n }\r\n\r\n return scripts.length > 0 ? scripts : undefined;\r\n}\r\n\r\n/**\r\n * Get assigned pixel tracking configuration (normalized to arrays)\r\n * Always returns arrays of PixelConfig for consistent consumption.\r\n */\r\nexport function getAssignedPixels(): PixelsConfig | undefined {\r\n const stepConfig = getAssignedStepConfig();\r\n const rawPixels = stepConfig?.pixels;\r\n if (!rawPixels || typeof rawPixels !== 'object') return undefined;\r\n\r\n const normalized: Record<string, PixelConfig[]> = {};\r\n\r\n for (const [key, value] of Object.entries(rawPixels)) {\r\n if (!value) continue;\r\n\r\n if (Array.isArray(value)) {\r\n // Already an array\r\n normalized[key] = value as PixelConfig[];\r\n } else if (typeof value === 'object') {\r\n // Single object - wrap in array\r\n normalized[key] = [value as PixelConfig];\r\n }\r\n // Skip invalid entries\r\n }\r\n\r\n return Object.keys(normalized).length > 0 ? normalized : undefined;\r\n}\r\n\r\nexport interface FunnelClientConfig {\r\n apiClient: ApiClient;\r\n debugMode?: boolean;\r\n pluginConfig?: PluginConfig;\r\n environment?: {\r\n environment: 'local' | 'development' | 'production' | 'staging';\r\n };\r\n /**\r\n * Automatically redirect to result.url after navigation (default: true)\r\n * Set to false if you want to handle navigation manually\r\n */\r\n autoRedirect?: boolean;\r\n /**\r\n * Override funnelId from rawPluginConfig\r\n */\r\n funnelId?: string;\r\n /**\r\n * Override stepId from rawPluginConfig\r\n */\r\n stepId?: string;\r\n}\r\n\r\nexport interface FunnelState {\r\n context: SimpleFunnelContext | null;\r\n isLoading: boolean;\r\n isInitialized: boolean;\r\n isNavigating: boolean;\r\n error: Error | null;\r\n sessionError: Error | null;\r\n}\r\n\r\nexport class FunnelClient {\r\n public state: FunnelState;\r\n private resource: FunnelResource;\r\n private eventDispatcher = new EventDispatcher<FunnelState>();\r\n private config: FunnelClientConfig;\r\n\r\n // Guards\r\n private isInitializing = false;\r\n private initializationAttempted = false;\r\n\r\n constructor(config: FunnelClientConfig) {\r\n this.config = config;\r\n this.resource = new FunnelResource(config.apiClient);\r\n\r\n this.state = {\r\n context: null,\r\n isLoading: false,\r\n isInitialized: false,\r\n isNavigating: false,\r\n error: null,\r\n sessionError: null,\r\n };\r\n }\r\n\r\n /**\r\n * Update configuration (e.g. when plugin config loads)\r\n */\r\n setConfig(config: Partial<FunnelClientConfig>) {\r\n this.config = { ...this.config, ...config };\r\n }\r\n\r\n /**\r\n * Subscribe to state changes\r\n */\r\n subscribe(listener: (state: FunnelState) => void): () => void {\r\n return this.eventDispatcher.subscribe(listener);\r\n }\r\n\r\n /**\r\n * Get current state\r\n */\r\n getState(): FunnelState {\r\n return this.state;\r\n }\r\n\r\n /**\r\n * Get the session ID that would be used for initialization (URL params or cookie)\r\n * This allows getting the session ID even before the client is fully initialized.\r\n */\r\n getDetectedSessionId(): string | null {\r\n // Priority 1: Already initialized session\r\n if (this.state.context?.sessionId) {\r\n return this.state.context.sessionId;\r\n }\r\n\r\n if (typeof window === 'undefined') return null;\r\n\r\n // Priority 2: URL params\r\n const params = new URLSearchParams(window.location.search);\r\n const urlSessionId = params.get('funnelSessionId');\r\n if (urlSessionId) return urlSessionId;\r\n\r\n // Priority 3: Cookie\r\n return getFunnelSessionCookie() || null;\r\n }\r\n\r\n /**\r\n * Reset initialization state (used for back-button restores)\r\n */\r\n resetInitialization() {\r\n this.initializationAttempted = false;\r\n this.isInitializing = false;\r\n // Clear context to force a fresh autoInitialize call to hit the backend\r\n this.updateState({\r\n context: null,\r\n isInitialized: false,\r\n });\r\n }\r\n\r\n /**\r\n * Initialize session with automatic detection (cookies, URL, etc.)\r\n */\r\n async autoInitialize(\r\n authSession: { customerId: string; sessionId: string },\r\n store: { id: string; accountId: string },\r\n funnelId?: string\r\n ): Promise<SimpleFunnelContext | null> {\r\n if (this.state.context) return this.state.context;\r\n if (this.isInitializing) return null;\r\n if (this.initializationAttempted) return null;\r\n\r\n this.initializationAttempted = true;\r\n this.isInitializing = true;\r\n this.updateState({ isLoading: true, error: null });\r\n\r\n try {\r\n // \uD83C\uDFAF Get detected session ID\r\n const existingSessionId = this.getDetectedSessionId();\r\n\r\n // URL params for funnelId\r\n const params = new URLSearchParams(typeof window !== 'undefined' ? window.location.search : '');\r\n const urlFunnelId = params.get('funnelId');\r\n const effectiveFunnelId = urlFunnelId || funnelId;\r\n\r\n // \uD83C\uDFAF Read funnel tracking data from injected HTML\r\n const injectedFunnelId = getAssignedFunnelId(); // Funnel ID from server\r\n const funnelVariantId = getAssignedFunnelVariant(); // A/B test variant ID\r\n const injectedStepId = getAssignedFunnelStep(); // Current step ID\r\n\r\n // \uD83C\uDFAF Get SDK override parameters (draft, funnelTracking, etc.)\r\n const sdkParams = getSDKParams();\r\n\r\n // Priority: config override > injected > URL/prop\r\n const finalFunnelId = this.config.funnelId || injectedFunnelId || effectiveFunnelId;\r\n const finalStepId = this.config.stepId || injectedStepId;\r\n\r\n // \uD83C\uDFAF Determine funnelEnv from URL params\r\n const urlParams = typeof window !== 'undefined' ? new URLSearchParams(window.location.search) : null;\r\n const funnelEnv = urlParams?.get('funnelEnv') as 'staging' | 'production' | null;\r\n\r\n if (this.config.debugMode) {\r\n console.log('\uD83D\uDE80 [FunnelClient] Auto-initializing...', {\r\n existingSessionId,\r\n effectiveFunnelId: finalFunnelId,\r\n funnelVariantId, // \uD83C\uDFAF Log variant ID for debugging\r\n funnelStepId: finalStepId, // \uD83C\uDFAF Log step ID for debugging\r\n draft: sdkParams.draft, // \uD83C\uDFAF Log draft mode\r\n funnelTracking: sdkParams.funnelTracking, // \uD83C\uDFAF Log tracking flag\r\n funnelEnv, // \uD83C\uDFAF Log funnel environment\r\n tagadaClientEnv: sdkParams.tagadaClientEnv, // \uD83C\uDFAF Log client environment\r\n tagadaClientBaseUrl: sdkParams.tagadaClientBaseUrl, // \uD83C\uDFAF Log custom API URL\r\n source: {\r\n funnelId: this.config.funnelId ? 'config' : injectedFunnelId ? 'injected' : effectiveFunnelId ? 'url/prop' : 'none',\r\n stepId: this.config.stepId ? 'config' : injectedStepId ? 'injected' : 'none',\r\n },\r\n });\r\n }\r\n\r\n // Note: We proceed even without funnelId/sessionId - the backend will create a new anonymous session if needed\r\n\r\n const response = await this.resource.initialize({\r\n cmsSession: {\r\n customerId: authSession.customerId,\r\n sessionId: authSession.sessionId,\r\n storeId: store.id,\r\n accountId: store.accountId,\r\n },\r\n funnelId: finalFunnelId,\r\n existingSessionId: existingSessionId || undefined,\r\n currentUrl: typeof window !== 'undefined' ? window.location.href : undefined,\r\n funnelVariantId, // \uD83C\uDFAF Pass A/B test variant ID to backend\r\n funnelStepId: finalStepId, // \uD83C\uDFAF Pass step ID to backend (with config override)\r\n draft: sdkParams.draft, // \uD83C\uDFAF Pass draft mode explicitly (more robust than URL parsing)\r\n funnelTracking: sdkParams.funnelTracking, // \uD83C\uDFAF Pass funnel tracking flag explicitly\r\n funnelEnv: funnelEnv || undefined, // \uD83C\uDFAF Pass funnel environment (staging/production)\r\n tagadaClientEnv: sdkParams.tagadaClientEnv, // \uD83C\uDFAF Pass client environment override\r\n tagadaClientBaseUrl: sdkParams.tagadaClientBaseUrl, // \uD83C\uDFAF Pass custom API base URL\r\n currency: sdkParams.currency, // \uD83C\uDF0D Pass display currency override\r\n locale: sdkParams.locale, // \uD83C\uDF0D Pass display locale override\r\n });\r\n\r\n if (response.success && response.context) {\r\n const enriched = this.enrichContext(response.context);\r\n this.handleSessionSuccess(enriched);\r\n\r\n // \uD83D\uDD0D Auto-inject preview mode indicator if in preview/dev mode\r\n injectPreviewModeIndicator();\r\n\r\n return enriched;\r\n } else {\r\n throw new Error(response.error || 'Failed to initialize funnel session');\r\n }\r\n\r\n } catch (error) {\r\n const err = error instanceof Error ? error : new Error(String(error));\r\n this.updateState({ error: err, isLoading: false });\r\n if (this.config.debugMode) {\r\n console.error('\u274C [FunnelClient] Init failed:', err);\r\n }\r\n throw err;\r\n } finally {\r\n this.isInitializing = false;\r\n }\r\n }\r\n\r\n /**\r\n * Manual initialization\r\n */\r\n async initialize(\r\n authSession: { customerId: string; sessionId: string },\r\n store: { id: string; accountId: string },\r\n funnelId?: string,\r\n entryStepId?: string\r\n ) {\r\n this.updateState({ isLoading: true, error: null });\r\n try {\r\n // \uD83C\uDFAF Read A/B test variant ID and step ID from injected HTML\r\n const funnelVariantId = getAssignedFunnelVariant();\r\n const funnelStepId = getAssignedFunnelStep();\r\n\r\n if (this.config.debugMode) {\r\n if (funnelVariantId) console.log('\uD83C\uDFAF [FunnelClient] Detected A/B test variant:', funnelVariantId);\r\n if (funnelStepId) console.log('\uD83C\uDFAF [FunnelClient] Detected step ID:', funnelStepId);\r\n }\r\n\r\n const response = await this.resource.initialize({\r\n cmsSession: {\r\n customerId: authSession.customerId,\r\n sessionId: authSession.sessionId,\r\n storeId: store.id,\r\n accountId: store.accountId,\r\n },\r\n funnelId: funnelId,\r\n entryStepId,\r\n currentUrl: typeof window !== 'undefined' ? window.location.href : undefined,\r\n funnelVariantId, // \uD83C\uDFAF Pass A/B test variant ID to backend\r\n funnelStepId, // \uD83C\uDFAF Pass step ID to backend\r\n });\r\n\r\n if (response.success && response.context) {\r\n const enriched = this.enrichContext(response.context);\r\n this.handleSessionSuccess(enriched);\r\n\r\n // \uD83D\uDD0D Auto-inject preview mode indicator if in preview/dev mode\r\n injectPreviewModeIndicator();\r\n\r\n return enriched;\r\n } else {\r\n throw new Error(response.error || 'Failed to initialize');\r\n }\r\n } catch (error) {\r\n const err = error instanceof Error ? error : new Error(String(error));\r\n this.updateState({ error: err, isLoading: false });\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Navigate\r\n * @param event - Navigation event/action\r\n * @param options - Navigation options\r\n * @param options.fireAndForget - If true, queues navigation to QStash and returns immediately without waiting for result\r\n * @param options.customerTags - Customer tags to set (merged with existing customer tags)\r\n * @param options.deviceId - Device ID for geo/device tag enrichment (optional, rarely needed)\r\n * @param options.autoRedirect - Override global autoRedirect setting for this specific call (default: use config)\r\n */\r\n async navigate(\r\n event: FunnelAction,\r\n options?: {\r\n fireAndForget?: boolean;\r\n customerTags?: string[];\r\n deviceId?: string;\r\n autoRedirect?: boolean;\r\n waitForSession?: boolean;\r\n }\r\n ): Promise<FunnelNavigationResult> {\r\n // Wait for session if requested\r\n if (options?.waitForSession && !this.state.context?.sessionId) {\r\n if (this.config.debugMode) {\r\n console.log('\u23F3 [FunnelClient] Waiting for session before navigation...');\r\n }\r\n\r\n const maxWaitTime = 5000;\r\n const startTime = Date.now();\r\n\r\n while (!this.state.context?.sessionId && (Date.now() - startTime < maxWaitTime)) {\r\n await new Promise(resolve => setTimeout(resolve, 100));\r\n }\r\n\r\n if (this.state.context?.sessionId && this.config.debugMode) {\r\n console.log('\u2705 [FunnelClient] Session ready, proceeding with navigation');\r\n }\r\n }\r\n\r\n if (!this.state.context?.sessionId) throw new Error('No active session');\r\n\r\n this.updateState({ isNavigating: true, isLoading: true });\r\n\r\n try {\r\n // Get current funnel state from injected HTML/meta tags\r\n let funnelVariantId = getAssignedFunnelVariant();\r\n let funnelStepId = getAssignedFunnelStep();\r\n const currentUrl = typeof window !== 'undefined' ? window.location.href : undefined;\r\n\r\n // \u2705 FALLBACK: Use config values if injection not available (e.g., on Shopify storefront)\r\n if (!funnelStepId && this.config.stepId) {\r\n funnelStepId = this.config.stepId;\r\n if (this.config.debugMode) {\r\n console.log('\uD83D\uDD0D [FunnelClient.navigate] Using stepId from config (no injection):', funnelStepId);\r\n }\r\n }\r\n\r\n if (!funnelVariantId && (this.config as any).variantId) {\r\n funnelVariantId = (this.config as any).variantId;\r\n if (this.config.debugMode) {\r\n console.log('\uD83D\uDD0D [FunnelClient.navigate] Using variantId from config (no injection):', funnelVariantId);\r\n }\r\n }\r\n\r\n // \u2705 DEBUG: Log what we're sending\r\n if (this.config.debugMode) {\r\n console.log('\uD83D\uDD0D [FunnelClient.navigate] Sending to backend:', {\r\n sessionId: this.state.context.sessionId,\r\n currentUrl,\r\n funnelStepId: funnelStepId || '(not found)',\r\n funnelVariantId: funnelVariantId || '(not found)',\r\n hasInjectedStepId: !!getAssignedFunnelStep(),\r\n hasInjectedVariantId: !!getAssignedFunnelVariant(),\r\n usedConfigFallback: !getAssignedFunnelStep() && !!this.config.stepId,\r\n customerTags: options?.customerTags || '(none)',\r\n deviceId: options?.deviceId || '(none)',\r\n });\r\n }\r\n\r\n const fireAndForget = options?.fireAndForget || false;\r\n\r\n const response = await this.resource.navigate({\r\n sessionId: this.state.context.sessionId,\r\n event,\r\n currentUrl,\r\n funnelStepId,\r\n funnelVariantId,\r\n fireAndForget,\r\n customerTags: options?.customerTags,\r\n deviceId: options?.deviceId,\r\n });\r\n\r\n if (!response.success || !response.result) {\r\n throw new Error(response.error || 'Navigation failed');\r\n }\r\n\r\n const result = response.result as FunnelNavigationResult;\r\n\r\n // \uD83D\uDD25 Fire-and-forget mode: Just return acknowledgment, skip everything else\r\n if (result.queued) {\r\n this.updateState({ isNavigating: false, isLoading: false });\r\n\r\n // Update session ID if it changed (session recovery)\r\n if (result.sessionId && result.sessionId !== this.state.context?.sessionId) {\r\n if (this.config.debugMode) {\r\n console.log(`\uD83D\uDD25 [FunnelClient] Session ID updated: ${this.state.context?.sessionId} \u2192 ${result.sessionId}`);\r\n }\r\n // Update context session ID\r\n if (this.state.context) {\r\n this.state.context.sessionId = result.sessionId;\r\n }\r\n }\r\n\r\n if (this.config.debugMode) {\r\n console.log('\uD83D\uDD25 [FunnelClient] Navigation queued (fire-and-forget mode)');\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Normal navigation: handle redirect\r\n // Per-call option takes precedence over global config\r\n const shouldAutoRedirect = options?.autoRedirect !== undefined\r\n ? options.autoRedirect\r\n : this.config.autoRedirect !== false; // Default to true\r\n\r\n // Skip refreshSession if auto-redirecting (next page will initialize with fresh state)\r\n // Only refresh if staying on same page (autoRedirect: false)\r\n if (!shouldAutoRedirect) {\r\n if (this.config.debugMode) {\r\n console.log('\uD83D\uDD04 [FunnelClient] Refreshing session (no auto-redirect)');\r\n }\r\n await this.refreshSession();\r\n }\r\n\r\n this.updateState({ isNavigating: false, isLoading: false });\r\n\r\n // Auto-redirect if enabled and result has a URL\r\n if (shouldAutoRedirect && result?.url && typeof window !== 'undefined') {\r\n if (this.config.debugMode) {\r\n console.log('\uD83D\uDE80 [FunnelClient] Auto-redirecting to:', result.url, '(skipped session refresh - next page will initialize)');\r\n }\r\n window.location.href = result.url;\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n const err = error instanceof Error ? error : new Error(String(error));\r\n this.updateState({ error: err, isNavigating: false, isLoading: false });\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Go to a specific step (direct navigation)\r\n * @param stepId - Target step ID\r\n * @param options - Navigation options (autoRedirect, etc.)\r\n */\r\n async goToStep(\r\n stepId: string,\r\n options?: { autoRedirect?: boolean }\r\n ): Promise<FunnelNavigationResult> {\r\n return this.navigate(\r\n {\r\n type: FunnelActionType.DIRECT_NAVIGATION,\r\n data: { targetStepId: stepId },\r\n } as FunnelAction,\r\n options\r\n );\r\n }\r\n\r\n /**\r\n * Refresh session data\r\n */\r\n async refreshSession() {\r\n if (!this.state.context?.sessionId) return;\r\n\r\n try {\r\n const response = await this.resource.getSession(this.state.context.sessionId);\r\n if (response.success && response.context) {\r\n const enriched = this.enrichContext(response.context);\r\n this.updateState({ context: enriched, sessionError: null });\r\n return enriched;\r\n }\r\n } catch (error) {\r\n this.updateState({ sessionError: error instanceof Error ? error : new Error(String(error)) });\r\n }\r\n }\r\n\r\n /**\r\n * Update context data\r\n */\r\n async updateContext(updates: Partial<SimpleFunnelContext>) {\r\n if (!this.state.context?.sessionId) throw new Error('No active session');\r\n this.updateState({ isLoading: true });\r\n\r\n try {\r\n const response = await this.resource.updateContext(this.state.context.sessionId, { contextUpdates: updates });\r\n if (response.success) {\r\n await this.refreshSession();\r\n } else {\r\n throw new Error(response.error || 'Failed to update context');\r\n }\r\n } finally {\r\n this.updateState({ isLoading: false });\r\n }\r\n }\r\n\r\n /**\r\n * End session\r\n */\r\n async endSession() {\r\n if (!this.state.context?.sessionId) return;\r\n\r\n try {\r\n await this.resource.endSession(this.state.context.sessionId);\r\n } finally {\r\n this.state.context = null;\r\n this.updateState({ context: null, isInitialized: false });\r\n if (typeof document !== 'undefined') {\r\n // Clear cookie via import or manually if needed, but we have utility for that\r\n // We should probably import clearFunnelSessionCookie\r\n }\r\n }\r\n }\r\n\r\n // Private helpers\r\n\r\n private updateState(updates: Partial<FunnelState>) {\r\n this.state = { ...this.state, ...updates };\r\n this.eventDispatcher.notify(this.state);\r\n }\r\n\r\n private handleSessionSuccess(context: SimpleFunnelContext) {\r\n setFunnelSessionCookie(context.sessionId);\r\n this.updateState({\r\n context,\r\n isLoading: false,\r\n isInitialized: true,\r\n error: null,\r\n sessionError: null\r\n });\r\n }\r\n\r\n private enrichContext(ctx: SimpleFunnelContext): SimpleFunnelContext {\r\n const env = this.config.environment?.environment || detectEnvironment();\r\n\r\n if (env !== 'local') return ctx;\r\n\r\n const localResources = this.config.pluginConfig?.staticResources || {};\r\n if (Object.keys(localResources).length === 0) return ctx;\r\n\r\n // \uD83C\uDFAF Check if context already has the same static resources\r\n // This prevents creating new objects unnecessarily, which would trigger React re-renders\r\n const existingStatic = ctx.static || {};\r\n const hasAllResources = Object.keys(localResources).every(\r\n key => existingStatic[key] === localResources[key]\r\n );\r\n\r\n // If context already has all static resources with same references, don't recreate\r\n if (hasAllResources && Object.keys(existingStatic).length === Object.keys(localResources).length) {\r\n return ctx;\r\n }\r\n\r\n return {\r\n ...ctx,\r\n static: {\r\n ...localResources,\r\n ...existingStatic\r\n }\r\n };\r\n }\r\n}\r\n\r\n", "/**\r\n * TagadaPay External Page Tracker\r\n * \r\n * A lightweight standalone script for tracking users on external pages\r\n * that are part of a Tagadapay funnel but not hosted on the Tagadapay platform.\r\n * \r\n * ARCHITECTURE:\r\n * - Reuses core SDK infrastructure (TagadaClient) for authentication and API handling\r\n * - All tracking handled automatically by funnelOrchestrator via autoInitialize() and navigate()\r\n * - No separate tracking endpoints needed - unified tracking through orchestrator\r\n * \r\n * Usage (via CDN):\r\n * <script src=\"https://cdn.jsdelivr.net/npm/@tagadapay/plugin-sdk/dist/external-tracker.min.js\"></script>\r\n * <script>\r\n * TagadaTracker.init({\r\n * storeId: 'store_xxx',\r\n * accountId: 'acc_xxx',\r\n * funnelId: 'funnel_xxx', // Optional: detected from URL\r\n * stepId: 'step_xxx',\r\n * stepName: 'External Offer Page',\r\n * stepType: 'external'\r\n * });\r\n * \r\n * // Navigate to next step (tracking automatic)\r\n * TagadaTracker.navigate({\r\n * eventType: 'form.submitted',\r\n * eventData: { email: 'user@example.com' }\r\n * });\r\n * </script>\r\n */\r\n\r\nimport { createTagadaClient } from './index';\r\nimport type { TagadaClient } from '../core/client';\r\nimport type { SimpleFunnelContext, FunnelActionType } from '../core/resources/funnel';\r\nimport { setClientToken } from '../core/utils/tokenStorage';\r\n\r\n// ============================================================================\r\n// TYPES\r\n// ============================================================================\r\n\r\nexport interface TagadaTrackerConfig {\r\n /** Store ID (required) */\r\n storeId: string;\r\n /** Account ID (required for session init) */\r\n accountId?: string;\r\n /** Funnel ID (optional - can be extracted from URL param) */\r\n funnelId?: string;\r\n /**\r\n * Step ID (REQUIRED for external pages)\r\n * \r\n * External URLs cannot be mapped to steps via URL matching (only works for Tagadapay-hosted pages).\r\n * You must explicitly specify which step this external page represents.\r\n */\r\n stepId: string;\r\n /** Step name (optional - for analytics/debugging) */\r\n stepName?: string;\r\n /** Step type (optional - e.g., 'landing', 'offer', 'external') */\r\n stepType?: string;\r\n /** API base URL (defaults to production) */\r\n apiBaseUrl?: string;\r\n /** Enable debug logging */\r\n debug?: boolean;\r\n /** Callback when session is ready */\r\n onReady?: (session: ExternalTrackerSession) => void;\r\n /** Callback on error */\r\n onError?: (error: Error) => void;\r\n}\r\n\r\nexport interface ExternalTrackerSession {\r\n sessionId: string;\r\n customerId: string;\r\n storeId: string;\r\n funnelId?: string;\r\n currentStepId?: string;\r\n cmsToken?: string;\r\n}\r\n\r\nexport interface NavigateOptions {\r\n /** Event type for navigation (e.g., 'offer.accepted', 'form.submitted') */\r\n eventType: string;\r\n /** Event data */\r\n eventData?: Record<string, unknown>;\r\n /** Override return URL */\r\n returnUrl?: string;\r\n /** Disable auto-redirect to control navigation manually (default: true) */\r\n autoRedirect?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// UTILITIES\r\n// ============================================================================\r\n\r\nfunction getUrlParam(name: string): string | null {\r\n if (typeof window === 'undefined') return null;\r\n const params = new URLSearchParams(window.location.search);\r\n return params.get(name);\r\n}\r\n\r\nfunction log(debug: boolean, ...args: unknown[]): void {\r\n if (debug) {\r\n console.log('[TagadaTracker]', ...args);\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// MAIN CLASS\r\n// ============================================================================\r\n\r\nclass TagadaExternalTracker {\r\n private config: TagadaTrackerConfig | null = null;\r\n private client: TagadaClient | null = null;\r\n private initialized = false;\r\n private initializing = false;\r\n\r\n /**\r\n * Initialize the tracker using SDK infrastructure\r\n */\r\n async init(config: TagadaTrackerConfig): Promise<ExternalTrackerSession | null> {\r\n if (this.initialized || this.initializing) {\r\n log(config.debug || false, 'Already initialized or initializing');\r\n return this.getSession();\r\n }\r\n\r\n this.initializing = true;\r\n this.config = {\r\n debug: false,\r\n ...config,\r\n };\r\n\r\n log(this.config.debug!, '\uD83D\uDE80 Initializing external tracker with SDK...', config);\r\n\r\n try {\r\n // 1. Check for token in URL and save to storage (bootstrap auth)\r\n // TagadaClient will automatically pick it up from storage\r\n const urlToken = getUrlParam('token');\r\n if (urlToken) {\r\n setClientToken(urlToken);\r\n log(this.config.debug!, '\uD83D\uDD11 Bootstrapped token from URL');\r\n }\r\n\r\n // 2. Create TagadaClient\r\n this.client = createTagadaClient({\r\n debugMode: this.config.debug,\r\n features: { funnel: true },\r\n });\r\n\r\n // 3. Wait for client to be ready (load token, init auth state)\r\n await this.waitForClientReady();\r\n\r\n // 4. Auto-initialize funnel session\r\n // FunnelClient handles cookies, existing session restoration, etc.\r\n // Orchestrator automatically tracks session start and step view\r\n const funnelContext = await this.initializeFunnel();\r\n\r\n log(this.config.debug!, '\u2705 Session initialized (tracking handled by orchestrator):', funnelContext);\r\n\r\n this.initialized = true;\r\n const session = this.getSession();\r\n if (session) {\r\n this.config.onReady?.(session);\r\n }\r\n\r\n return session;\r\n\r\n } catch (error) {\r\n const err = error instanceof Error ? error : new Error(String(error));\r\n log(this.config.debug!, '\u274C Initialization failed:', err);\r\n this.config.onError?.(err);\r\n throw err;\r\n } finally {\r\n this.initializing = false;\r\n }\r\n }\r\n\r\n /**\r\n * Get current session from SDK state\r\n */\r\n getSession(): ExternalTrackerSession | null {\r\n if (!this.client?.funnel?.state.context) return null;\r\n\r\n const ctx = this.client.funnel.state.context;\r\n return {\r\n sessionId: ctx.sessionId,\r\n customerId: ctx.customerId,\r\n storeId: ctx.storeId,\r\n funnelId: ctx.funnelId,\r\n currentStepId: ctx.currentStepId,\r\n cmsToken: this.client.state.token || undefined,\r\n };\r\n }\r\n\r\n /**\r\n * Check if tracker is ready\r\n */\r\n isReady(): boolean {\r\n return this.initialized && !!this.client?.funnel?.state.context;\r\n }\r\n\r\n /**\r\n * Navigate to next step in funnel using SDK's funnel client\r\n */\r\n async navigate(options: NavigateOptions): Promise<{ url: string } | null> {\r\n if (!this.isReady()) {\r\n throw new Error('Tracker not initialized. Call init() first.');\r\n }\r\n\r\n log(this.config!.debug!, '\uD83D\uDE80 Navigating:', options);\r\n\r\n // Determine if we should auto-redirect (default: true)\r\n const shouldAutoRedirect = options.autoRedirect !== false;\r\n\r\n try {\r\n const result = await this.client!.funnel!.navigate(\r\n {\r\n type: options.eventType as FunnelActionType,\r\n data: options.eventData || {},\r\n },\r\n { autoRedirect: false } // Always disable SDK auto-redirect, we handle it here\r\n );\r\n\r\n if (result?.url) {\r\n log(this.config!.debug!, '\u2705 Navigation result:', result.url);\r\n\r\n // Only redirect if autoRedirect is enabled\r\n if (shouldAutoRedirect && typeof window !== 'undefined') {\r\n window.location.href = options.returnUrl || result.url;\r\n }\r\n\r\n return { url: result.url };\r\n }\r\n\r\n return null;\r\n } catch (error) {\r\n log(this.config!.debug!, '\u274C Navigation failed:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Get customer ID (for identifying the user)\r\n */\r\n getCustomerId(): string | null {\r\n return this.client?.state.auth.customer?.id || this.client?.funnel?.state.context?.customerId || null;\r\n }\r\n\r\n /**\r\n * Get funnel session ID\r\n */\r\n getFunnelSessionId(): string | null {\r\n return this.client?.funnel?.state.context?.sessionId || null;\r\n }\r\n\r\n /**\r\n * Build a URL with funnel context parameters\r\n * Useful for linking to other external pages while preserving session\r\n */\r\n buildUrl(baseUrl: string, additionalParams?: Record<string, string>): string {\r\n const session = this.getSession();\r\n if (!session) {\r\n return baseUrl;\r\n }\r\n\r\n const url = new URL(baseUrl, typeof window !== 'undefined' ? window.location.origin : undefined);\r\n\r\n // Add funnel session context\r\n url.searchParams.set('funnelSessionId', session.sessionId);\r\n if (session.cmsToken) {\r\n url.searchParams.set('token', session.cmsToken);\r\n }\r\n if (session.funnelId) {\r\n url.searchParams.set('funnelId', session.funnelId);\r\n }\r\n url.searchParams.set('storeId', session.storeId);\r\n\r\n // Add any additional params\r\n if (additionalParams) {\r\n Object.entries(additionalParams).forEach(([key, value]) => {\r\n url.searchParams.set(key, value);\r\n });\r\n }\r\n\r\n return url.toString();\r\n }\r\n\r\n /**\r\n * Get the underlying SDK client (for advanced usage)\r\n */\r\n getClient(): TagadaClient | null {\r\n return this.client;\r\n }\r\n\r\n // ========================================================================\r\n // PRIVATE METHODS\r\n // ========================================================================\r\n\r\n private async waitForClientReady(): Promise<void> {\r\n if (!this.client) return;\r\n\r\n // Wait for token/auth to be resolved\r\n return new Promise((resolve) => {\r\n let retries = 0;\r\n const checkReady = () => {\r\n // Check if initialized OR if we have a token (sometimes isInitialized is lazy)\r\n if (this.client?.state.isInitialized || this.client?.state.token) {\r\n resolve();\r\n } else if (retries > 40) { // 2 seconds timeout\r\n resolve(); // Proceed anyway (might be anonymous)\r\n } else {\r\n retries++;\r\n setTimeout(checkReady, 50);\r\n }\r\n };\r\n checkReady();\r\n });\r\n }\r\n\r\n private async initializeFunnel(): Promise<SimpleFunnelContext | null> {\r\n if (!this.client?.funnel) return null;\r\n\r\n // Prepare auth session object\r\n const authSession = {\r\n customerId: this.client.state.auth.customer?.id || 'anon_placeholder',\r\n sessionId: this.client.state.auth.session?.sessionId || 'sess_placeholder',\r\n };\r\n\r\n const store = {\r\n id: this.config!.storeId,\r\n accountId: this.config!.accountId || '',\r\n };\r\n\r\n // IMPORTANT: For external pages, we must explicitly pass stepId as entryStepId\r\n // because URL-to-step mapping won't work for external URLs not hosted on Tagadapay\r\n const entryStepId = this.config!.stepId;\r\n\r\n if (!entryStepId) {\r\n throw new Error('stepId is required for external page tracking (URL mapping does not work for external pages)');\r\n }\r\n\r\n log(this.config!.debug!, '\uD83D\uDD0D Initializing external page at step:', entryStepId);\r\n\r\n // Use initialize() (not autoInitialize()) to explicitly specify the step\r\n // Orchestrator will automatically track session start and step view at this step\r\n return this.client.funnel.initialize(\r\n authSession,\r\n store,\r\n this.config!.funnelId || getUrlParam('funnelId') || undefined,\r\n entryStepId // \u2705 Explicitly tell orchestrator which step we're on\r\n );\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// GLOBAL INSTANCE\r\n// ============================================================================\r\n\r\nconst TagadaTracker = new TagadaExternalTracker();\r\n\r\nexport { TagadaTracker, TagadaExternalTracker };\r\n\r\nif (typeof window !== 'undefined') {\r\n (window as any).TagadaTracker = TagadaTracker;\r\n}\r\n", "import { detectEnvironment, getEnvironmentConfig } from './config/environment';\r\nimport { FunnelClient } from './funnelClient';\r\nimport { ApiClient } from './resources/apiClient';\r\nimport {\r\n AnonymousTokenResponse,\r\n AuthState,\r\n Currency,\r\n Customer,\r\n Environment,\r\n EnvironmentConfig,\r\n Locale,\r\n Session,\r\n SessionInitResponse,\r\n Store,\r\n} from './types';\r\nimport { collectDeviceInfo, getBrowserLocale, getUrlParams } from './utils/deviceInfo';\r\nimport { EventBus } from './utils/eventBus';\r\nimport { EventDispatcher } from './utils/eventDispatcher';\r\nimport { decodeJWTClient, isTokenExpired } from './utils/jwtDecoder';\r\nimport { loadPluginConfig, PluginConfig, RawPluginConfig } from './utils/pluginConfig';\r\nimport { handlePreviewMode, isDraftMode, setDraftMode } from './utils/previewMode';\r\nimport { getClientToken, setClientToken } from './utils/tokenStorage';\r\nimport { shouldResolveAuthCode, resolveAuthHandoff } from './utils/authHandoff';\r\n\r\nexport interface TagadaClientConfig {\r\n environment?: Environment;\r\n customApiConfig?: Partial<EnvironmentConfig>;\r\n debugMode?: boolean;\r\n localConfig?: string;\r\n rawPluginConfig?: RawPluginConfig;\r\n blockUntilSessionReady?: boolean;\r\n /**\r\n * Optional feature flags to enable/disable subsystems.\r\n * By default all features are enabled.\r\n */\r\n features?: {\r\n /**\r\n * Funnel session + navigation layer.\r\n * Set to false to completely disable funnel behaviour.\r\n * Pass object to configure behavior.\r\n */\r\n funnel?: boolean | {\r\n autoRedirect?: boolean;\r\n };\r\n };\r\n}\r\n\r\nexport interface TagadaState {\r\n auth: AuthState;\r\n session: Session | null;\r\n customer: Customer | null;\r\n locale: Locale;\r\n currency: Currency;\r\n store: Store | null;\r\n environment: EnvironmentConfig;\r\n isLoading: boolean;\r\n isInitialized: boolean;\r\n isSessionInitialized: boolean;\r\n pluginConfig: PluginConfig;\r\n pluginConfigLoading: boolean;\r\n debugMode: boolean;\r\n token: string | null;\r\n}\r\n\r\nexport class TagadaClient {\r\n public apiClient: ApiClient;\r\n public state: TagadaState;\r\n /**\r\n * Optional funnel client.\r\n * Exposed so higher-level SDKs (React, Standalone, Vue) can reuse the same\r\n * low-level logic without instantiating a second client.\r\n */\r\n public funnel?: FunnelClient;\r\n /**\r\n * Event bus for domain events and coordination\r\n */\r\n public bus = new EventBus();\r\n\r\n private eventDispatcher = new EventDispatcher<TagadaState>();\r\n private tokenPromise: Promise<string | null> | null = null;\r\n private tokenResolver: ((token: string | null) => void) | null = null;\r\n private boundHandleStorageChange: () => void;\r\n private boundHandlePageshow: (event: PageTransitionEvent) => void;\r\n\r\n // Config\r\n private readonly config: TagadaClientConfig;\r\n private instanceId: string;\r\n\r\n // Track initialization state to prevent infinite loops\r\n private isInitializingSession = false;\r\n private lastSessionInitError: Error | null = null;\r\n private sessionInitRetryCount = 0;\r\n private readonly MAX_SESSION_INIT_RETRIES = 3;\r\n\r\n constructor(config: TagadaClientConfig = {}) {\r\n this.config = config;\r\n this.instanceId = Math.random().toString(36).substr(2, 9);\r\n this.boundHandleStorageChange = this.handleStorageChange.bind(this);\r\n this.boundHandlePageshow = (event: PageTransitionEvent) => {\r\n if (event.persisted) {\r\n if (this.state.debugMode) {\r\n console.log(`[TagadaClient ${this.instanceId}] Page restored from BFcache (back button), re-initializing funnel...`);\r\n }\r\n\r\n // If we have an active session and store, we only need to re-initialize the funnel\r\n // This ensures tracking is correct and the session is fresh on the backend\r\n if (this.funnel && this.state.session && this.state.store) {\r\n this.funnel.resetInitialization();\r\n\r\n const accountId = this.getAccountId();\r\n const urlParams = new URLSearchParams(typeof window !== 'undefined' ? window.location.search : '');\r\n const funnelId = urlParams.get('funnelId') || undefined;\r\n\r\n this.funnel.autoInitialize(\r\n { customerId: this.state.session.customerId, sessionId: this.state.session.sessionId },\r\n { id: this.state.store.id, accountId },\r\n funnelId,\r\n ).catch((err) => {\r\n console.error('[TagadaClient] Funnel re-initialization failed:', err);\r\n });\r\n } else {\r\n // If state is missing, perform a full initialization\r\n this.sessionInitRetryCount = 0;\r\n this.initialize();\r\n }\r\n }\r\n };\r\n\r\n console.log(`[TagadaClient ${this.instanceId}] Initializing...`);\r\n console.log(`[TagadaClient ${this.instanceId}] Config:`, {\r\n debugMode: config.debugMode,\r\n hasRawPluginConfig: !!config.rawPluginConfig,\r\n rawPluginConfig: config.rawPluginConfig,\r\n features: config.features,\r\n });\r\n\r\n // Handle preview mode FIRST - clears state if needed\r\n // This ensures clean state when CRM previews pages\r\n const previewModeActive = handlePreviewMode(this.config.debugMode);\r\n if (previewModeActive && this.config.debugMode) {\r\n console.log(`[TagadaClient ${this.instanceId}] Preview mode active - state cleared`);\r\n }\r\n\r\n // Initialize default state\r\n const env = this.resolveEnvironment();\r\n let envConfig = getEnvironmentConfig(env);\r\n\r\n // Apply custom API config if provided\r\n if (config.customApiConfig) {\r\n envConfig = {\r\n ...envConfig,\r\n ...config.customApiConfig,\r\n apiConfig: {\r\n ...envConfig.apiConfig,\r\n ...config.customApiConfig.apiConfig,\r\n },\r\n };\r\n if (this.config.debugMode) {\r\n console.log(`[TagadaClient ${this.instanceId}] Applied custom API config:`, envConfig.apiConfig.baseUrl);\r\n }\r\n }\r\n\r\n this.state = {\r\n auth: {\r\n isAuthenticated: false,\r\n isLoading: false,\r\n customer: null,\r\n session: null,\r\n },\r\n session: null,\r\n customer: null,\r\n locale: {\r\n locale: 'en-US',\r\n language: 'en',\r\n region: 'US',\r\n messages: {},\r\n },\r\n currency: {\r\n code: 'USD',\r\n symbol: '$',\r\n name: 'US Dollar',\r\n },\r\n store: null,\r\n environment: envConfig,\r\n isLoading: true,\r\n isInitialized: false,\r\n isSessionInitialized: false,\r\n pluginConfig: { basePath: '/', config: {} },\r\n pluginConfigLoading: true, // Always true - loadPluginConfig will process rawPluginConfig\r\n debugMode: config.debugMode ?? env !== 'production',\r\n token: null,\r\n };\r\n\r\n console.log(`[TagadaClient ${this.instanceId}] Initial state:`, {\r\n pluginConfigLoading: this.state.pluginConfigLoading,\r\n hasRawPluginConfig: !!config.rawPluginConfig,\r\n });\r\n\r\n // Initialize API Client\r\n this.apiClient = new ApiClient({\r\n baseURL: envConfig.apiConfig.baseUrl,\r\n });\r\n\r\n // Initialize optional funnel client (feature-flagged)\r\n const funnelFeature = config.features?.funnel;\r\n const funnelEnabled = funnelFeature !== false;\r\n\r\n if (funnelEnabled) {\r\n const funnelConfig = typeof funnelFeature === 'object' ? funnelFeature : {};\r\n\r\n this.funnel = new FunnelClient({\r\n apiClient: this.apiClient,\r\n debugMode: this.state.debugMode,\r\n pluginConfig: this.state.pluginConfig,\r\n environment: this.state.environment,\r\n autoRedirect: funnelConfig.autoRedirect,\r\n // Pass funnelId and stepId from rawPluginConfig to enable config-based initialization\r\n funnelId: config.rawPluginConfig?.funnelId,\r\n stepId: config.rawPluginConfig?.stepId,\r\n });\r\n }\r\n\r\n // Setup token waiting mechanism\r\n this.apiClient.setTokenProvider(this.waitForToken.bind(this));\r\n\r\n // Listen for storage changes (cross-tab sync)\r\n if (typeof window !== 'undefined') {\r\n window.addEventListener('storage', this.boundHandleStorageChange);\r\n window.addEventListener('pageshow', this.boundHandlePageshow);\r\n }\r\n\r\n // Setup config hot-reload listener (for live config editing)\r\n this.setupConfigHotReload();\r\n\r\n // Start initialization\r\n this.initialize();\r\n }\r\n\r\n /**\r\n * Cleanup client resources\r\n */\r\n destroy() {\r\n if (typeof window !== 'undefined') {\r\n window.removeEventListener('storage', this.boundHandleStorageChange);\r\n window.removeEventListener('pageshow', this.boundHandlePageshow);\r\n }\r\n if (this.state.debugMode) {\r\n console.log(`[TagadaClient ${this.instanceId}] Destroyed`);\r\n }\r\n this.eventDispatcher.clear();\r\n this.bus.clear();\r\n }\r\n\r\n /**\r\n * Handle storage changes (e.g. token update in another tab)\r\n */\r\n private handleStorageChange() {\r\n const storedToken = getClientToken();\r\n\r\n // Avoid unnecessary re-initialization if token hasn't changed\r\n if (storedToken === this.state.token) {\r\n if (this.state.debugMode) {\r\n console.log(`[TagadaClient ${this.instanceId}] Token unchanged (ignoring event)`);\r\n }\r\n return;\r\n }\r\n\r\n // Prevent infinite loop: Don't re-initialize if we're currently initializing\r\n if (this.isInitializingSession) {\r\n if (this.state.debugMode) {\r\n console.log(`[TagadaClient ${this.instanceId}] Session initialization in progress, skipping storage change`);\r\n }\r\n return;\r\n }\r\n\r\n // Prevent infinite loop: Don't retry if we've hit max retries\r\n if (this.sessionInitRetryCount >= this.MAX_SESSION_INIT_RETRIES && this.lastSessionInitError) {\r\n if (this.state.debugMode) {\r\n console.error(`[TagadaClient ${this.instanceId}] Max session init retries reached, giving up`, this.lastSessionInitError);\r\n }\r\n return;\r\n }\r\n\r\n // Re-run initialization when token may have changed\r\n if (this.state.debugMode) {\r\n console.log(`[TagadaClient ${this.instanceId}] Storage changed, re-initializing token...`);\r\n }\r\n this.initializeToken();\r\n }\r\n\r\n /**\r\n * Subscribe to state changes\r\n */\r\n subscribe(listener: (state: TagadaState) => void): () => void {\r\n return this.eventDispatcher.subscribe(listener);\r\n }\r\n\r\n /**\r\n * Get current state\r\n */\r\n getState(): TagadaState {\r\n return this.state;\r\n }\r\n\r\n /**\r\n * Update state and notify listeners\r\n */\r\n private updateState(updates: Partial<TagadaState>) {\r\n this.state = { ...this.state, ...updates };\r\n this.eventDispatcher.notify(this.state);\r\n }\r\n\r\n /**\r\n * Resolve environment\r\n */\r\n private resolveEnvironment(): Environment {\r\n if (this.config.environment) return this.config.environment;\r\n return detectEnvironment();\r\n }\r\n\r\n /**\r\n * Main initialization flow\r\n */\r\n private async initialize() {\r\n try {\r\n // 1. Load Plugin Config\r\n await this.initializePluginConfig();\r\n\r\n // 2. Initialize Token (Background or Blocking based on config)\r\n if (this.state.pluginConfig.storeId) {\r\n await this.initializeToken();\r\n } else {\r\n console.warn('[TagadaClient] No store ID found in plugin config. Skipping token initialization.');\r\n this.updateState({ isLoading: false, isInitialized: true });\r\n }\r\n } catch (error) {\r\n console.error('[TagadaClient] Initialization failed:', error);\r\n this.updateState({ isLoading: false, isInitialized: true });\r\n }\r\n }\r\n\r\n /**\r\n * Load plugin configuration\r\n */\r\n private async initializePluginConfig() {\r\n console.log(`[TagadaClient ${this.instanceId}] initializePluginConfig called`, {\r\n pluginConfigLoading: this.state.pluginConfigLoading,\r\n hasRawPluginConfig: !!this.config.rawPluginConfig,\r\n });\r\n\r\n if (!this.state.pluginConfigLoading) {\r\n console.log(`[TagadaClient ${this.instanceId}] Plugin config already loading or loaded, skipping...`);\r\n return;\r\n }\r\n\r\n try {\r\n const configVariant = this.config.localConfig || 'default';\r\n console.log(`[TagadaClient ${this.instanceId}] Loading plugin config with variant: ${configVariant}`);\r\n const config = await loadPluginConfig(configVariant, this.config.rawPluginConfig);\r\n\r\n console.log(`[TagadaClient ${this.instanceId}] Plugin config loaded:`, config);\r\n\r\n this.updateState({\r\n pluginConfig: config,\r\n pluginConfigLoading: false,\r\n });\r\n\r\n // Keep funnel client in sync with latest plugin config / environment\r\n if (this.funnel) {\r\n this.funnel.setConfig({\r\n pluginConfig: config,\r\n environment: this.state.environment,\r\n });\r\n }\r\n } catch (error) {\r\n console.error('[TagadaClient] Failed to load plugin config:', error);\r\n this.updateState({\r\n pluginConfig: { basePath: '/', config: {} },\r\n pluginConfigLoading: false,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Initialize token and session\r\n */\r\n private async initializeToken() {\r\n // \uD83D\uDD10 PRIORITY 1: Check for authCode (cross-domain handoff)\r\n // This ALWAYS takes precedence over existing tokens\r\n if (shouldResolveAuthCode()) {\r\n const storeId = this.state.pluginConfig.storeId;\r\n if (!storeId) {\r\n console.error('[TagadaClient] Cannot resolve authCode: storeId not found in config');\r\n return this.fallbackToNormalFlow();\r\n }\r\n\r\n console.log(`[TagadaClient ${this.instanceId}] \uD83D\uDD10 Cross-domain auth detected, resolving...`);\r\n\r\n try {\r\n const authCode = new URLSearchParams(window.location.search).get('authCode');\r\n if (!authCode) {\r\n return this.fallbackToNormalFlow();\r\n }\r\n\r\n // Resolve the handoff\r\n const handoffData = await resolveAuthHandoff(\r\n authCode,\r\n storeId,\r\n this.state.environment.apiConfig.baseUrl,\r\n this.state.debugMode\r\n );\r\n\r\n console.log(`[TagadaClient ${this.instanceId}] \u2705 Auth handoff resolved:`, {\r\n customerId: handoffData.customer.id,\r\n role: handoffData.customer.role,\r\n hasContext: Object.keys(handoffData.context).length > 0,\r\n });\r\n\r\n // Set the new token (already stored by resolveAuthHandoff)\r\n this.setToken(handoffData.token);\r\n\r\n // Decode session from token\r\n const decodedSession = decodeJWTClient(handoffData.token);\r\n if (decodedSession) {\r\n this.updateState({ session: decodedSession });\r\n await this.initializeSession(decodedSession);\r\n\r\n // If context has funnelSessionId, restore it\r\n if (handoffData.context?.funnelSessionId && this.funnel) {\r\n if (this.state.debugMode) {\r\n console.log(`[TagadaClient ${this.instanceId}] Restoring funnel session from handoff context:`, handoffData.context.funnelSessionId);\r\n }\r\n // The funnel client will pick this up during auto-initialization\r\n }\r\n } else {\r\n console.error('[TagadaClient] Failed to decode token from handoff');\r\n this.updateState({ isInitialized: true, isLoading: false });\r\n }\r\n\r\n return; // \u2705 Auth handoff resolved successfully, exit early\r\n } catch (error) {\r\n console.error(`[TagadaClient ${this.instanceId}] \u274C Auth handoff failed, falling back to normal flow:`, error);\r\n // Fall through to normal initialization\r\n }\r\n }\r\n\r\n // Continue with normal flow if no authCode or resolution failed\r\n await this.fallbackToNormalFlow();\r\n }\r\n\r\n /**\r\n * Normal token initialization flow (no cross-domain handoff)\r\n */\r\n private async fallbackToNormalFlow() {\r\n // \uD83D\uDD12 CRITICAL: Read URL token FIRST before any async operations\r\n // This prevents race conditions where anonymous token creation overwrites URL token\r\n const urlParams = new URLSearchParams(typeof window !== 'undefined' ? window.location.search : '');\r\n const queryToken = urlParams.get('token');\r\n\r\n // If URL has token, set it IMMEDIATELY to prevent any race condition\r\n if (queryToken) {\r\n if (this.state.debugMode) {\r\n console.log(`[TagadaClient ${this.instanceId}] \uD83D\uDD12 URL token detected, setting immediately to prevent race condition`);\r\n }\r\n // Set token on API client immediately\r\n this.apiClient.updateToken(queryToken);\r\n // Also persist to localStorage\r\n setClientToken(queryToken);\r\n }\r\n\r\n // Now check storage (which should have the URL token if we just set it)\r\n const existingToken = getClientToken();\r\n\r\n console.log(`[TagadaClient ${this.instanceId}] Initializing token (normal flow)...`, {\r\n hasExistingToken: !!existingToken,\r\n hasQueryToken: !!queryToken,\r\n storeId: this.state.pluginConfig.storeId,\r\n });\r\n\r\n let tokenToUse: string | null = null;\r\n let shouldPersist = false;\r\n\r\n if (queryToken) {\r\n tokenToUse = queryToken;\r\n shouldPersist = true;\r\n } else if (existingToken && !isTokenExpired(existingToken)) {\r\n tokenToUse = existingToken;\r\n }\r\n\r\n if (tokenToUse) {\r\n this.setToken(tokenToUse);\r\n\r\n // Persist token if it came from query (updates localStorage and fires event)\r\n // We do this AFTER setToken so state is updated and handleStorageChange sees match\r\n if (shouldPersist) {\r\n if (this.state.debugMode) {\r\n console.log(`[TagadaClient ${this.instanceId}] Persisting query token to storage...`);\r\n }\r\n setClientToken(tokenToUse);\r\n }\r\n\r\n const decodedSession = decodeJWTClient(tokenToUse);\r\n if (decodedSession) {\r\n this.updateState({ session: decodedSession });\r\n await this.initializeSession(decodedSession);\r\n } else {\r\n console.error('[TagadaClient] Failed to decode token');\r\n this.updateState({ isInitialized: true, isLoading: false });\r\n }\r\n } else {\r\n // Create anonymous token\r\n const storeId = this.state.pluginConfig.storeId;\r\n console.log(`[TagadaClient ${this.instanceId}] No existing token, creating anonymous token...`, {\r\n hasStoreId: !!storeId,\r\n storeId,\r\n });\r\n if (storeId) {\r\n await this.createAnonymousToken(storeId);\r\n } else {\r\n console.warn(`[TagadaClient ${this.instanceId}] No storeId in plugin config, skipping anonymous token creation`);\r\n this.updateState({ isInitialized: true, isLoading: false });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Set token and resolve waiting requests\r\n */\r\n private setToken(token: string | null) {\r\n this.apiClient.updateToken(token);\r\n this.updateState({ token });\r\n\r\n // Notify waiting requests\r\n if (this.tokenResolver) {\r\n this.tokenResolver(token);\r\n this.tokenPromise = null;\r\n this.tokenResolver = null;\r\n } else {\r\n // If we set a token but no one was waiting, ensure future requests don't wait unnecessarily\r\n // Actually, if we have a token, the provider won't be called by ApiClient logic if we handle it right.\r\n // But to be safe, if we set a token, we can pre-resolve the promise if it exists.\r\n // Wait, if tokenPromise exists, tokenResolver must exist.\r\n }\r\n }\r\n\r\n /**\r\n * Wait for token to be available\r\n */\r\n private waitForToken(): Promise<string | null> {\r\n if (this.apiClient.getCurrentToken()) {\r\n return Promise.resolve(this.apiClient.getCurrentToken());\r\n }\r\n\r\n if (!this.tokenPromise) {\r\n this.tokenPromise = new Promise<string | null>((resolve) => {\r\n this.tokenResolver = resolve;\r\n });\r\n }\r\n\r\n return this.tokenPromise;\r\n }\r\n\r\n /**\r\n * Create anonymous token\r\n */\r\n async createAnonymousToken(storeId: string) {\r\n // \uD83D\uDD12 CRITICAL: Never create anonymous token if URL has a token\r\n // This prevents race conditions during forceReset\r\n if (typeof window !== 'undefined') {\r\n const urlParams = new URLSearchParams(window.location.search);\r\n const urlToken = urlParams.get('token');\r\n if (urlToken) {\r\n if (this.state.debugMode) {\r\n console.log(`[TagadaClient ${this.instanceId}] \uD83D\uDD12 URL has token, skipping anonymous token creation`);\r\n }\r\n // Use the URL token instead\r\n this.setToken(urlToken);\r\n setClientToken(urlToken);\r\n const decodedSession = decodeJWTClient(urlToken);\r\n if (decodedSession) {\r\n this.updateState({ session: decodedSession });\r\n await this.initializeSession(decodedSession);\r\n }\r\n return;\r\n }\r\n }\r\n\r\n // Prevent concurrent anonymous token creation\r\n if (this.isInitializingSession) {\r\n if (this.state.debugMode) {\r\n console.log(`[TagadaClient ${this.instanceId}] Session initialization in progress, skipping anonymous token creation`);\r\n }\r\n return;\r\n }\r\n\r\n try {\r\n // \uD83C\uDFAF Check draft mode from URL, localStorage, or cookie\r\n const draft = isDraftMode();\r\n\r\n if (this.state.debugMode) {\r\n console.log('[TagadaClient] Creating anonymous token for store:', storeId, { draft });\r\n }\r\n\r\n // We use fetch directly or ApiClient with skipAuth to avoid waiting for itself\r\n const response = await this.apiClient.post<AnonymousTokenResponse>(\r\n '/api/v1/cms/session/anonymous',\r\n {\r\n storeId,\r\n role: 'anonymous',\r\n draft, // \uD83C\uDFAF Pass draft mode to anonymous login\r\n },\r\n { skipAuth: true }\r\n );\r\n\r\n this.setToken(response.token);\r\n setClientToken(response.token);\r\n\r\n const decodedSession = decodeJWTClient(response.token);\r\n if (decodedSession) {\r\n this.updateState({ session: decodedSession });\r\n await this.initializeSession(decodedSession);\r\n }\r\n\r\n this.updateState({ isSessionInitialized: true });\r\n\r\n } catch (error) {\r\n console.error('[TagadaClient] Failed to create anonymous token:', error);\r\n this.updateState({ isInitialized: true, isLoading: false });\r\n }\r\n }\r\n\r\n /**\r\n * Initialize session\r\n */\r\n async initializeSession(sessionData: Session) {\r\n // Prevent concurrent initialization attempts\r\n if (this.isInitializingSession) {\r\n if (this.state.debugMode) {\r\n console.log(`[TagadaClient ${this.instanceId}] Session initialization already in progress, skipping`);\r\n }\r\n return;\r\n }\r\n\r\n this.isInitializingSession = true;\r\n\r\n try {\r\n if (this.state.debugMode) {\r\n console.log(`[TagadaClient ${this.instanceId}] Initializing session...`, { sessionId: sessionData.sessionId });\r\n }\r\n\r\n const deviceInfo = collectDeviceInfo();\r\n const urlParams = getUrlParams();\r\n const browserLocale = getBrowserLocale();\r\n\r\n // \uD83C\uDFAF Check draft mode from URL, localStorage, or cookie\r\n const draft = isDraftMode();\r\n\r\n // Store draft mode if detected from URL (urlParams may have draft from query string)\r\n const draftParam = new URLSearchParams(window.location.search).get('draft');\r\n if (draftParam !== null) {\r\n setDraftMode(draftParam === 'true');\r\n }\r\n\r\n const sessionInitData = {\r\n storeId: sessionData.storeId,\r\n accountId: sessionData.accountId,\r\n customerId: sessionData.customerId,\r\n role: sessionData.role,\r\n browserLocale,\r\n queryLocale: urlParams.locale,\r\n queryCurrency: urlParams.currency,\r\n utmSource: urlParams.utmSource,\r\n utmMedium: urlParams.utmMedium,\r\n utmCampaign: urlParams.utmCampaign,\r\n browser: deviceInfo.userAgent.browser.name,\r\n browserVersion: deviceInfo.userAgent.browser.version,\r\n os: deviceInfo.userAgent.os.name,\r\n osVersion: deviceInfo.userAgent.os.version,\r\n deviceType: deviceInfo.userAgent.device?.type,\r\n deviceModel: deviceInfo.userAgent.device?.model,\r\n deviceVendor: deviceInfo.userAgent.device?.vendor,\r\n userAgent: deviceInfo.userAgent.name,\r\n engineName: deviceInfo.userAgent.engine.name,\r\n engineVersion: deviceInfo.userAgent.engine.version,\r\n cpuArchitecture: deviceInfo.userAgent.cpu.architecture,\r\n isBot: deviceInfo.flags?.isBot ?? false,\r\n isChromeFamily: deviceInfo.flags?.isChromeFamily ?? false,\r\n isStandalonePWA: deviceInfo.flags?.isStandalonePWA ?? false,\r\n isAppleSilicon: deviceInfo.flags?.isAppleSilicon ?? false,\r\n screenWidth: deviceInfo.screenResolution.width,\r\n screenHeight: deviceInfo.screenResolution.height,\r\n timeZone: deviceInfo.timeZone,\r\n draft, // \uD83C\uDFAF Pass draft mode to session init\r\n fetchMessages: false,\r\n };\r\n\r\n const response = await this.apiClient.post<SessionInitResponse>(\r\n '/api/v1/cms/session/v2/init',\r\n sessionInitData\r\n );\r\n\r\n // Success - reset error tracking\r\n this.lastSessionInitError = null;\r\n this.sessionInitRetryCount = 0;\r\n\r\n // Update state with session data\r\n this.updateSessionState(response, sessionData);\r\n\r\n this.updateState({\r\n isInitialized: true,\r\n isSessionInitialized: true,\r\n isLoading: false,\r\n });\r\n\r\n if (this.state.debugMode) console.log('[TagadaClient] Session initialized successfully');\r\n\r\n } catch (error) {\r\n // Track error and increment retry count\r\n this.lastSessionInitError = error as Error;\r\n this.sessionInitRetryCount++;\r\n\r\n console.error(`[TagadaClient] Error initializing session (attempt ${this.sessionInitRetryCount}/${this.MAX_SESSION_INIT_RETRIES}):`, error);\r\n\r\n this.updateState({\r\n isInitialized: true,\r\n isLoading: false,\r\n });\r\n } finally {\r\n // Always release the lock\r\n this.isInitializingSession = false;\r\n }\r\n }\r\n\r\n private updateSessionState(response: SessionInitResponse, sessionData: Session) {\r\n // Update Store\r\n if (response.store) {\r\n const storeData = response.store as any;\r\n const storeConfig = {\r\n ...response.store,\r\n // Ensure accountId is included - fallback to plugin config or session accountId\r\n accountId: storeData.accountId || this.state.pluginConfig?.accountId || sessionData.accountId || '',\r\n presentmentCurrencies: storeData.presentmentCurrencies || [response.store.currency || 'USD'],\r\n chargeCurrencies: storeData.chargeCurrencies || [response.store.currency || 'USD'],\r\n };\r\n this.updateState({ store: storeConfig });\r\n }\r\n\r\n // Update Locale (only if provided - V2 endpoint doesn't return locale)\r\n if (response.locale) {\r\n const localeConfig = {\r\n locale: response.locale,\r\n language: response.locale.split('-')[0],\r\n region: response.locale.split('-')[1] ?? 'US',\r\n messages: response.messages ?? {},\r\n };\r\n this.updateState({ locale: localeConfig });\r\n }\r\n\r\n // Update Currency\r\n if (response.store) {\r\n const currencyConfig = {\r\n code: response.store.currency,\r\n symbol: this.getCurrencySymbol(response.store.currency),\r\n name: this.getCurrencyName(response.store.currency),\r\n };\r\n this.updateState({ currency: currencyConfig });\r\n }\r\n\r\n // Update Customer & Auth\r\n const authState = {\r\n isAuthenticated: response.customer?.isAuthenticated ?? false,\r\n isLoading: false,\r\n customer: response.customer ?? null,\r\n session: sessionData,\r\n };\r\n this.updateState({\r\n customer: response.customer ?? null,\r\n auth: authState\r\n });\r\n\r\n // Auto-initialize funnel if enabled\r\n // This runs after we have all required data: auth.session, store, accountId\r\n if (this.funnel && sessionData.customerId && response.store?.id) {\r\n const accountId = response.store.accountId || this.state.pluginConfig?.accountId || sessionData.accountId || '';\r\n\r\n if (accountId) {\r\n // Get funnelId from URL or config\r\n const urlParams = new URLSearchParams(typeof window !== 'undefined' ? window.location.search : '');\r\n const funnelId = urlParams.get('funnelId') || undefined;\r\n\r\n if (this.state.debugMode) {\r\n console.log('[TagadaClient] Auto-initializing funnel...', {\r\n customerId: sessionData.customerId,\r\n storeId: response.store.id,\r\n accountId,\r\n funnelId: funnelId || 'auto-detect',\r\n });\r\n }\r\n\r\n // Auto-initialize funnel in background (don't block session init)\r\n this.funnel.autoInitialize(\r\n { customerId: sessionData.customerId, sessionId: sessionData.sessionId },\r\n { id: response.store.id, accountId },\r\n funnelId,\r\n ).catch((err) => {\r\n console.error('[TagadaClient] Funnel auto-initialization failed:', err);\r\n });\r\n } else {\r\n console.warn('[TagadaClient] Cannot auto-initialize funnel: accountId is missing');\r\n }\r\n }\r\n }\r\n\r\n // Helper methods\r\n private getCurrencySymbol(code: string): string {\r\n const symbols: Record<string, string> = {\r\n USD: '$', EUR: '\u20AC', GBP: '\u00A3', JPY: '\u00A5', CAD: 'C$', AUD: 'A$',\r\n };\r\n return symbols[code] || code;\r\n }\r\n\r\n private getCurrencyName(code: string): string {\r\n const names: Record<string, string> = {\r\n USD: 'US Dollar', EUR: 'Euro', GBP: 'British Pound',\r\n JPY: 'Japanese Yen', CAD: 'Canadian Dollar', AUD: 'Australian Dollar',\r\n };\r\n return names[code] || code;\r\n }\r\n\r\n /**\r\n * Helper to get accountId with fallbacks\r\n */\r\n getAccountId(): string {\r\n return this.state.store?.accountId || this.state.pluginConfig?.accountId || this.state.session?.accountId || '';\r\n }\r\n\r\n /**\r\n * Update plugin config dynamically (hot-reload)\r\n * Used for live config editing without page reload\r\n */\r\n updatePluginConfig(newConfig: Partial<PluginConfig['config']>) {\r\n if (this.state.debugMode) {\r\n console.log('[TagadaClient] Hot-reloading config:', newConfig);\r\n }\r\n\r\n // Merge new config with existing\r\n const updatedConfig = {\r\n ...this.state.pluginConfig.config,\r\n ...newConfig,\r\n };\r\n\r\n // Update state\r\n this.updateState({\r\n pluginConfig: {\r\n ...this.state.pluginConfig,\r\n config: updatedConfig,\r\n },\r\n });\r\n\r\n // Emit config update event\r\n this.bus.emit('CONFIG_UPDATED', updatedConfig);\r\n\r\n if (this.state.debugMode) {\r\n console.log('[TagadaClient] Config updated successfully');\r\n }\r\n }\r\n\r\n /**\r\n * Setup listener for config updates from parent window (config editor)\r\n * Enables live config editing via postMessage\r\n */\r\n private setupConfigHotReload() {\r\n if (typeof window === 'undefined') return;\r\n\r\n const handleMessage = (event: MessageEvent) => {\r\n // Security: Only accept messages from same origin or trusted origins\r\n // In production, you might want to check event.origin more strictly\r\n\r\n if (event.data?.type === 'TAGADAPAY_CONFIG_UPDATE') {\r\n const { config } = event.data;\r\n\r\n if (this.state.debugMode) {\r\n console.log('[TagadaClient] Received config update from parent:', config);\r\n }\r\n\r\n this.updatePluginConfig(config);\r\n } else if (event.data?.type === 'APPLY_STYLES_TO_ELEMENT') {\r\n const { elementId, styles } = event.data;\r\n\r\n if (this.state.debugMode) {\r\n console.log('[TagadaClient] Received style application request:', { elementId, styles });\r\n }\r\n\r\n this.applyStylesToElement(elementId, styles);\r\n }\r\n };\r\n\r\n window.addEventListener('message', handleMessage);\r\n\r\n if (this.state.debugMode) {\r\n console.log('[TagadaClient] Config hot-reload and style manipulation listeners enabled');\r\n }\r\n }\r\n\r\n /**\r\n * Apply CSS properties to a real div child element for highlighting\r\n * Used by config editor to highlight elements in preview without altering the element's style\r\n */\r\n private applyStylesToElement(elementId: string, styles?: Record<string, string>) {\r\n if (typeof document === 'undefined') return;\r\n\r\n // Always remove any existing highlight, even if the target element is not found\r\n const staticHighlightId = 'tagada-editor-highlight';\r\n const existingHighlight = document.getElementById(staticHighlightId) as HTMLElement | null;\r\n if (existingHighlight) {\r\n existingHighlight.remove();\r\n }\r\n\r\n const applyToElement = (element: HTMLElement) => {\r\n // List of void/self-closing elements that don't accept children\r\n const voidElements = new Set([\r\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\r\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\r\n ]);\r\n\r\n const isVoidElement = voidElements.has(element.tagName.toLowerCase());\r\n\r\n // For void elements, wrap them in a container div\r\n let targetElement = element;\r\n\r\n if (isVoidElement) {\r\n // Check if element is already wrapped (from a previous highlight)\r\n const parent = element.parentElement;\r\n const existingWrapper = parent?.getAttribute('data-tagada-highlight-wrapper');\r\n\r\n if (existingWrapper === 'true' && parent instanceof HTMLElement) {\r\n // Reuse existing wrapper\r\n targetElement = parent;\r\n } else {\r\n // Create a new wrapper\r\n const newWrapper = document.createElement('div');\r\n newWrapper.setAttribute('data-tagada-highlight-wrapper', 'true');\r\n\r\n // Preserve the element's layout behavior by matching its display style\r\n // This minimizes the visual impact of the wrapper\r\n const computedStyle = window.getComputedStyle(element);\r\n const elementDisplay = computedStyle.display;\r\n\r\n // Match the display type to preserve layout\r\n // For inline elements, use inline-block (to support position: relative)\r\n // For all others, use the same display value\r\n if (elementDisplay === 'inline') {\r\n newWrapper.style.display = 'inline-block';\r\n } else {\r\n newWrapper.style.display = elementDisplay;\r\n }\r\n\r\n newWrapper.style.position = 'relative';\r\n\r\n // Preserve vertical alignment for inline elements\r\n if (elementDisplay === 'inline' || elementDisplay.includes('inline')) {\r\n const verticalAlign = computedStyle.verticalAlign;\r\n if (verticalAlign && verticalAlign !== 'baseline') {\r\n newWrapper.style.verticalAlign = verticalAlign;\r\n }\r\n }\r\n\r\n // Preserve spacing and layout properties from the original element\r\n // List of CSS properties that affect spacing and layout\r\n const spacingProperties = [\r\n // Width and height\r\n 'width', 'height', 'minWidth', 'minHeight', 'maxWidth', 'maxHeight',\r\n // Flex properties\r\n 'flex', 'flexGrow', 'flexShrink', 'flexBasis',\r\n // Grid properties\r\n 'gridColumn', 'gridRow', 'gridColumnStart', 'gridColumnEnd',\r\n 'gridRowStart', 'gridRowEnd', 'gridArea',\r\n // Alignment properties\r\n 'alignSelf', 'justifySelf',\r\n // Box sizing\r\n 'boxSizing',\r\n // Gap (for grid/flex)\r\n 'gap', 'rowGap', 'columnGap',\r\n // Order (for flex/grid)\r\n 'order',\r\n // Aspect ratio\r\n 'aspectRatio',\r\n ];\r\n\r\n spacingProperties.forEach(prop => {\r\n const camelProp = prop.replace(/([A-Z])/g, '-$1').toLowerCase();\r\n const value = computedStyle.getPropertyValue(camelProp);\r\n\r\n // Only copy if the value is not empty\r\n // For most properties, we want to preserve the value even if it's 'auto' or '0px'\r\n // as these might be intentional layout choices\r\n if (value && value.trim() !== '') {\r\n // Handle special cases\r\n if (prop === 'flex' && value !== 'none' && value !== '0 1 auto') {\r\n newWrapper.style.flex = value;\r\n } else if (prop === 'boxSizing') {\r\n newWrapper.style.boxSizing = value;\r\n } else {\r\n // Use setProperty for kebab-case properties\r\n // Preserve all values including percentages, auto, etc.\r\n newWrapper.style.setProperty(camelProp, value);\r\n }\r\n }\r\n });\r\n\r\n // Also check inline styles for spacing properties\r\n // This handles cases where styles are set directly on the element\r\n if (element.style) {\r\n const inlineSpacingProps = [\r\n 'width', 'height', 'min-width', 'min-height', 'max-width', 'max-height',\r\n 'flex', 'flex-grow', 'flex-shrink', 'flex-basis',\r\n 'grid-column', 'grid-row', 'grid-column-start', 'grid-column-end',\r\n 'grid-row-start', 'grid-row-end', 'grid-area',\r\n 'align-self', 'justify-self',\r\n 'box-sizing', 'gap', 'row-gap', 'column-gap', 'order', 'aspect-ratio'\r\n ];\r\n\r\n inlineSpacingProps.forEach(prop => {\r\n const inlineValue = element.style.getPropertyValue(prop);\r\n if (inlineValue) {\r\n newWrapper.style.setProperty(prop, inlineValue);\r\n }\r\n });\r\n }\r\n\r\n // Insert wrapper before element\r\n element.parentNode?.insertBefore(newWrapper, element);\r\n // Move element into wrapper\r\n newWrapper.appendChild(element);\r\n targetElement = newWrapper;\r\n }\r\n }\r\n\r\n // Ensure element has position relative for absolute child positioning\r\n const computedStyle = getComputedStyle(isVoidElement ? element : targetElement);\r\n if (targetElement.style.position === 'static' || !targetElement.style.position) {\r\n targetElement.style.position = 'relative';\r\n }\r\n\r\n // Create new highlight div with static ID\r\n const highlightDiv = document.createElement('div');\r\n highlightDiv.id = staticHighlightId;\r\n highlightDiv.style.position = 'absolute';\r\n highlightDiv.style.inset = '0';\r\n highlightDiv.style.pointerEvents = 'none';\r\n highlightDiv.style.zIndex = '9999';\r\n highlightDiv.style.boxSizing = 'border-box';\r\n highlightDiv.style.background = 'none';\r\n highlightDiv.style.border = 'none';\r\n highlightDiv.style.outline = 'none';\r\n highlightDiv.style.margin = '0';\r\n highlightDiv.style.padding = '0';\r\n\r\n // Inherit border radius from parent\r\n const borderRadius = computedStyle.borderRadius;\r\n if (borderRadius) {\r\n highlightDiv.style.borderRadius = borderRadius;\r\n }\r\n\r\n // Append the new highlight div to the target element\r\n targetElement.appendChild(highlightDiv);\r\n\r\n // Apply CSS properties to the highlight div\r\n const stylesToApply = styles || { boxShadow: '0 0 0 2px rgb(239 68 68)' }; // Default red ring\r\n\r\n Object.entries(stylesToApply).forEach(([property, value]) => {\r\n // Convert kebab-case to camelCase for style object\r\n const camelProperty = property.includes('-')\r\n ? property.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())\r\n : property;\r\n\r\n // Use setProperty for kebab-case or direct assignment for camelCase\r\n if (property.includes('-')) {\r\n highlightDiv.style.setProperty(property, value);\r\n } else {\r\n (highlightDiv.style as any)[camelProperty] = value;\r\n }\r\n });\r\n\r\n // Scroll element into view\r\n element.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n\r\n if (this.state.debugMode) {\r\n const appliedStyles = Object.entries(stylesToApply).map(([k, v]) => `${k}: ${v}`).join('; ');\r\n console.log(`[TagadaClient] Applied styles to highlight div of element #${elementId}:`, appliedStyles);\r\n }\r\n };\r\n\r\n // Support multiple IDs in editor-id attribute (space-separated)\r\n // Use ~= selector to match elementId as a space-separated value\r\n const maxAttempts = 5;\r\n const intervalMs = 1000;\r\n let attempts = 0;\r\n\r\n const isElementHidden = (element: HTMLElement): boolean => {\r\n const style = window.getComputedStyle(element);\r\n return (\r\n style.display === 'none' ||\r\n style.visibility === 'hidden' ||\r\n style.opacity === '0' ||\r\n element.hidden ||\r\n element.offsetWidth === 0 ||\r\n element.offsetHeight === 0\r\n );\r\n };\r\n\r\n const findAndApply = () => {\r\n const elements = document.querySelectorAll(`[editor-id~=\"${elementId}\"]`) as NodeListOf<HTMLElement>;\r\n\r\n if (elements.length === 0) {\r\n attempts += 1;\r\n\r\n if (attempts >= maxAttempts) {\r\n if (this.state.debugMode) {\r\n console.warn(\r\n `[TagadaClient] Element with editor-id containing \"${elementId}\" not found after ${maxAttempts} attempts`\r\n );\r\n }\r\n return;\r\n }\r\n\r\n if (this.state.debugMode) {\r\n console.warn(\r\n `[TagadaClient] Element with editor-id containing \"${elementId}\" not found (attempt ${attempts}/${maxAttempts}), retrying in ${intervalMs / 1000}s`\r\n );\r\n }\r\n\r\n setTimeout(findAndApply, intervalMs);\r\n return;\r\n }\r\n\r\n // If multiple elements found, prioritize the one that is not hidden\r\n let element: HTMLElement | null = null;\r\n\r\n if (elements.length === 1) {\r\n element = elements[0];\r\n } else {\r\n // Find the first non-hidden element\r\n for (let i = 0; i < elements.length; i++) {\r\n if (!isElementHidden(elements[i])) {\r\n element = elements[i];\r\n break;\r\n }\r\n }\r\n // If all are hidden, use the first one\r\n if (!element) {\r\n element = elements[0];\r\n }\r\n }\r\n\r\n if (element) {\r\n applyToElement(element);\r\n }\r\n };\r\n\r\n findAndApply();\r\n }\r\n}\r\n\r\n", "'use strict';\n\n/**\n * Create a bound version of a function with a specified `this` context\n *\n * @param {Function} fn - The function to bind\n * @param {*} thisArg - The value to be passed as the `this` parameter\n * @returns {Function} A new function that will call the original function with the specified `this` context\n */\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n", "'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\nconst {iterator, toStringTag} = Symbol;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(toStringTag in val) && !(iterator in val);\n}\n\n/**\n * Determine if a value is an empty object (safely handles Buffers)\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an empty object, otherwise false\n */\nconst isEmptyObject = (val) => {\n // Early return for non-objects or Buffers to prevent RangeError\n if (!isObject(val) || isBuffer(val)) {\n return false;\n }\n\n try {\n return Object.keys(val).length === 0 && Object.getPrototypeOf(val) === Object.prototype;\n } catch (e) {\n // Fallback for any other objects that might cause RangeError with Object.keys()\n return false;\n }\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\nconst [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Buffer check\n if (isBuffer(obj)) {\n return;\n }\n\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n if (isBuffer(obj)){\n return null;\n }\n\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless, skipUndefined} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else if (!skipUndefined || !isUndefined(val)) {\n result[targetKey] = val;\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[iterator];\n\n const _iterator = generator.call(obj);\n\n let result;\n\n while ((result = _iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n return value != null && Number.isFinite(value = +value) ? value : defaultValue;\n}\n\n\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[toStringTag] === 'FormData' && thing[iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n //Buffer check\n if (isBuffer(source)) {\n return source;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n }\n\n return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\n// original code\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\n\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\n if (setImmediateSupported) {\n return setImmediate;\n }\n\n return postMessageSupported ? ((token, callbacks) => {\n _global.addEventListener(\"message\", ({source, data}) => {\n if (source === _global && data === token) {\n callbacks.length && callbacks.shift()();\n }\n }, false);\n\n return (cb) => {\n callbacks.push(cb);\n _global.postMessage(token, \"*\");\n }\n })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);\n})(\n typeof setImmediate === 'function',\n isFunction(_global.postMessage)\n);\n\nconst asap = typeof queueMicrotask !== 'undefined' ?\n queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);\n\n// *********************\n\n\nconst isIterable = (thing) => thing != null && isFunction(thing[iterator]);\n\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isEmptyObject,\n isReadableStream,\n isRequest,\n isResponse,\n isHeaders,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable,\n setImmediate: _setImmediate,\n asap,\n isIterable\n};\n", "'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n if (response) {\n this.response = response;\n this.status = response.status ? response.status : null;\n }\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.status\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n const msg = error && error.message ? error.message : 'Error';\n\n // Prefer explicit code; otherwise copy the low-level error's code (e.g. ECONNREFUSED)\n const errCode = code == null && error ? error.code : code;\n AxiosError.call(axiosError, msg, errCode, config, request, response);\n\n // Chain the original error on the standard field; non-enumerable to avoid JSON noise\n if (error && axiosError.cause == null) {\n Object.defineProperty(axiosError, 'cause', { value: error, configurable: true });\n }\n\n axiosError.name = (error && error.name) || 'Error';\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n", "// eslint-disable-next-line strict\nexport default null;\n", "'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (PlatformFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (utils.isBoolean(value)) {\n return value.toString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array<String|Number>} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n", "'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n", "'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?(object|Function)} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n if (utils.isFunction(options)) {\n options = {\n serialize: options\n };\n } \n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n", "'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {void}\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n", "'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n", "'use strict';\n\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n", "'use strict';\n\nexport default typeof FormData !== 'undefined' ? FormData : null;\n", "'use strict'\n\nexport default typeof Blob !== 'undefined' ? Blob : null\n", "import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\nimport Blob from './classes/Blob.js'\n\nexport default {\n isBrowser: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob\n },\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n", "const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nconst _navigator = typeof navigator === 'object' && navigator || undefined;\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = hasBrowserEnv &&\n (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\nconst origin = hasBrowserEnv && window.location.href || 'http://localhost';\n\nexport {\n hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv,\n _navigator as navigator,\n origin\n}\n", "import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n ...utils,\n ...platform\n}\n", "'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), {\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n },\n ...options\n });\n}\n", "'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n\n if (name === '__proto__') return true;\n\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n", "'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http', 'fetch'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data) ||\n utils.isReadableStream(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (utils.isResponse(data) || utils.isReadableStream(data)) {\n return data;\n }\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data, this.parseReviver);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nexport default defaults;\n", "'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n", "'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite)\n } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else if (utils.isObject(header) && utils.isIterable(header)) {\n let obj = {}, dest, key;\n for (const entry of header) {\n if (!utils.isArray(entry)) {\n throw TypeError('Object iterator must return a key-value pair');\n }\n\n obj[key = entry[0]] = (dest = obj[key]) ?\n (utils.isArray(dest) ? [...dest, entry[1]] : [dest, entry[1]]) : entry[1];\n }\n\n setHeaders(obj, valueOrRewrite)\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n getSetCookie() {\n return this.get(\"set-cookie\") || [];\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n }\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n", "'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n", "'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n", "'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n", "'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n", "'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n", "'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n", "/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */\nfunction throttle(fn, freq) {\n let timestamp = 0;\n let threshold = 1000 / freq;\n let lastArgs;\n let timer;\n\n const invoke = (args, now = Date.now()) => {\n timestamp = now;\n lastArgs = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n fn(...args);\n }\n\n const throttled = (...args) => {\n const now = Date.now();\n const passed = now - timestamp;\n if ( passed >= threshold) {\n invoke(args, now);\n } else {\n lastArgs = args;\n if (!timer) {\n timer = setTimeout(() => {\n timer = null;\n invoke(lastArgs)\n }, threshold - passed);\n }\n }\n }\n\n const flush = () => lastArgs && invoke(lastArgs);\n\n return [throttled, flush];\n}\n\nexport default throttle;\n", "import speedometer from \"./speedometer.js\";\nimport throttle from \"./throttle.js\";\nimport utils from \"../utils.js\";\n\nexport const progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return throttle(e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e,\n lengthComputable: total != null,\n [isDownloadStream ? 'download' : 'upload']: true\n };\n\n listener(data);\n }, freq);\n}\n\nexport const progressEventDecorator = (total, throttled) => {\n const lengthComputable = total != null;\n\n return [(loaded) => throttled[0]({\n lengthComputable,\n total,\n loaded\n }), throttled[1]];\n}\n\nexport const asyncDecorator = (fn) => (...args) => utils.asap(() => fn(...args));\n", "import platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => {\n url = new URL(url, platform.origin);\n\n return (\n origin.protocol === url.protocol &&\n origin.host === url.host &&\n (isMSIE || origin.port === url.port)\n );\n})(\n new URL(platform.origin),\n platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)\n) : () => true;\n", "import utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure, sameSite) {\n if (typeof document === 'undefined') return;\n\n const cookie = [`${name}=${encodeURIComponent(value)}`];\n\n if (utils.isNumber(expires)) {\n cookie.push(`expires=${new Date(expires).toUTCString()}`);\n }\n if (utils.isString(path)) {\n cookie.push(`path=${path}`);\n }\n if (utils.isString(domain)) {\n cookie.push(`domain=${domain}`);\n }\n if (secure === true) {\n cookie.push('secure');\n }\n if (utils.isString(sameSite)) {\n cookie.push(`SameSite=${sameSite}`);\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read(name) {\n if (typeof document === 'undefined') return null;\n const match = document.cookie.match(new RegExp('(?:^|; )' + name + '=([^;]*)'));\n return match ? decodeURIComponent(match[1]) : null;\n },\n\n remove(name) {\n this.write(name, '', Date.now() - 86400000, '/');\n }\n }\n\n :\n\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {},\n read() {\n return null;\n },\n remove() {}\n };\n\n", "'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n", "'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n", "'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {\n let isRelativeUrl = !isAbsoluteURL(requestedURL);\n if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n", "'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? { ...thing } : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, prop, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({caseless}, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, prop, caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, prop, caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, prop, caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b, prop) => mergeDeepProperties(headersToObject(a), headersToObject(b), prop, true)\n };\n\n utils.forEach(Object.keys({...config1, ...config2}), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n", "import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport isURLSameOrigin from \"./isURLSameOrigin.js\";\nimport cookies from \"./cookies.js\";\nimport buildFullPath from \"../core/buildFullPath.js\";\nimport mergeConfig from \"../core/mergeConfig.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport buildURL from \"./buildURL.js\";\n\nexport default (config) => {\n const newConfig = mergeConfig({}, config);\n\n let { data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth } = newConfig;\n\n newConfig.headers = headers = AxiosHeaders.from(headers);\n\n newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer);\n\n // HTTP basic authentication\n if (auth) {\n headers.set('Authorization', 'Basic ' +\n btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))\n );\n }\n\n if (utils.isFormData(data)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n headers.setContentType(undefined); // browser handles it\n } else if (utils.isFunction(data.getHeaders)) {\n // Node.js FormData (like form-data package)\n const formHeaders = data.getHeaders();\n // Only set safe headers to avoid overwriting security headers\n const allowedHeaders = ['content-type', 'content-length'];\n Object.entries(formHeaders).forEach(([key, val]) => {\n if (allowedHeaders.includes(key.toLowerCase())) {\n headers.set(key, val);\n }\n });\n }\n } \n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n\n if (platform.hasStandardBrowserEnv) {\n withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\n\n if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {\n // Add xsrf header\n const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\n\n if (xsrfValue) {\n headers.set(xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n return newConfig;\n}\n\n", "import utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport {progressEventReducer} from '../helpers/progressEventReducer.js';\nimport resolveConfig from \"../helpers/resolveConfig.js\";\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n const _config = resolveConfig(config);\n let requestData = _config.data;\n const requestHeaders = AxiosHeaders.from(_config.headers).normalize();\n let {responseType, onUploadProgress, onDownloadProgress} = _config;\n let onCanceled;\n let uploadThrottled, downloadThrottled;\n let flushUpload, flushDownload;\n\n function done() {\n flushUpload && flushUpload(); // flush events\n flushDownload && flushDownload(); // flush events\n\n _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\n\n _config.signal && _config.signal.removeEventListener('abort', onCanceled);\n }\n\n let request = new XMLHttpRequest();\n\n request.open(_config.method.toUpperCase(), _config.url, true);\n\n // Set the request timeout in MS\n request.timeout = _config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError(event) {\n // Browsers deliver a ProgressEvent in XHR onerror\n // (message may be empty; when present, surface it)\n // See https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/error_event\n const msg = event && event.message ? event.message : 'Network Error';\n const err = new AxiosError(msg, AxiosError.ERR_NETWORK, config, request);\n // attach the underlying event for consumers who want details\n err.event = event || null;\n reject(err);\n request = null;\n };\n \n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = _config.transitional || transitionalDefaults;\n if (_config.timeoutErrorMessage) {\n timeoutErrorMessage = _config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(_config.withCredentials)) {\n request.withCredentials = !!_config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = _config.responseType;\n }\n\n // Handle progress if needed\n if (onDownloadProgress) {\n ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));\n request.addEventListener('progress', downloadThrottled);\n }\n\n // Not all browsers support upload events\n if (onUploadProgress && request.upload) {\n ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));\n\n request.upload.addEventListener('progress', uploadThrottled);\n\n request.upload.addEventListener('loadend', flushUpload);\n }\n\n if (_config.cancelToken || _config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\n if (_config.signal) {\n _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(_config.url);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n", "import CanceledError from \"../cancel/CanceledError.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport utils from '../utils.js';\n\nconst composeSignals = (signals, timeout) => {\n const {length} = (signals = signals ? signals.filter(Boolean) : []);\n\n if (timeout || length) {\n let controller = new AbortController();\n\n let aborted;\n\n const onabort = function (reason) {\n if (!aborted) {\n aborted = true;\n unsubscribe();\n const err = reason instanceof Error ? reason : this.reason;\n controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));\n }\n }\n\n let timer = timeout && setTimeout(() => {\n timer = null;\n onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT))\n }, timeout)\n\n const unsubscribe = () => {\n if (signals) {\n timer && clearTimeout(timer);\n timer = null;\n signals.forEach(signal => {\n signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);\n });\n signals = null;\n }\n }\n\n signals.forEach((signal) => signal.addEventListener('abort', onabort));\n\n const {signal} = controller;\n\n signal.unsubscribe = () => utils.asap(unsubscribe);\n\n return signal;\n }\n}\n\nexport default composeSignals;\n", "\nexport const streamChunk = function* (chunk, chunkSize) {\n let len = chunk.byteLength;\n\n if (!chunkSize || len < chunkSize) {\n yield chunk;\n return;\n }\n\n let pos = 0;\n let end;\n\n while (pos < len) {\n end = pos + chunkSize;\n yield chunk.slice(pos, end);\n pos = end;\n }\n}\n\nexport const readBytes = async function* (iterable, chunkSize) {\n for await (const chunk of readStream(iterable)) {\n yield* streamChunk(chunk, chunkSize);\n }\n}\n\nconst readStream = async function* (stream) {\n if (stream[Symbol.asyncIterator]) {\n yield* stream;\n return;\n }\n\n const reader = stream.getReader();\n try {\n for (;;) {\n const {done, value} = await reader.read();\n if (done) {\n break;\n }\n yield value;\n }\n } finally {\n await reader.cancel();\n }\n}\n\nexport const trackStream = (stream, chunkSize, onProgress, onFinish) => {\n const iterator = readBytes(stream, chunkSize);\n\n let bytes = 0;\n let done;\n let _onFinish = (e) => {\n if (!done) {\n done = true;\n onFinish && onFinish(e);\n }\n }\n\n return new ReadableStream({\n async pull(controller) {\n try {\n const {done, value} = await iterator.next();\n\n if (done) {\n _onFinish();\n controller.close();\n return;\n }\n\n let len = value.byteLength;\n if (onProgress) {\n let loadedBytes = bytes += len;\n onProgress(loadedBytes);\n }\n controller.enqueue(new Uint8Array(value));\n } catch (err) {\n _onFinish(err);\n throw err;\n }\n },\n cancel(reason) {\n _onFinish(reason);\n return iterator.return();\n }\n }, {\n highWaterMark: 2\n })\n}\n", "import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport composeSignals from \"../helpers/composeSignals.js\";\nimport {trackStream} from \"../helpers/trackStream.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport {progressEventReducer, progressEventDecorator, asyncDecorator} from \"../helpers/progressEventReducer.js\";\nimport resolveConfig from \"../helpers/resolveConfig.js\";\nimport settle from \"../core/settle.js\";\n\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\n\nconst {isFunction} = utils;\n\nconst globalFetchAPI = (({Request, Response}) => ({\n Request, Response\n}))(utils.global);\n\nconst {\n ReadableStream, TextEncoder\n} = utils.global;\n\n\nconst test = (fn, ...args) => {\n try {\n return !!fn(...args);\n } catch (e) {\n return false\n }\n}\n\nconst factory = (env) => {\n env = utils.merge.call({\n skipUndefined: true\n }, globalFetchAPI, env);\n\n const {fetch: envFetch, Request, Response} = env;\n const isFetchSupported = envFetch ? isFunction(envFetch) : typeof fetch === 'function';\n const isRequestSupported = isFunction(Request);\n const isResponseSupported = isFunction(Response);\n\n if (!isFetchSupported) {\n return false;\n }\n\n const isReadableStreamSupported = isFetchSupported && isFunction(ReadableStream);\n\n const encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?\n ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :\n async (str) => new Uint8Array(await new Request(str).arrayBuffer())\n );\n\n const supportsRequestStream = isRequestSupported && isReadableStreamSupported && test(() => {\n let duplexAccessed = false;\n\n const hasContentType = new Request(platform.origin, {\n body: new ReadableStream(),\n method: 'POST',\n get duplex() {\n duplexAccessed = true;\n return 'half';\n },\n }).headers.has('Content-Type');\n\n return duplexAccessed && !hasContentType;\n });\n\n const supportsResponseStream = isResponseSupported && isReadableStreamSupported &&\n test(() => utils.isReadableStream(new Response('').body));\n\n const resolvers = {\n stream: supportsResponseStream && ((res) => res.body)\n };\n\n isFetchSupported && ((() => {\n ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {\n !resolvers[type] && (resolvers[type] = (res, config) => {\n let method = res && res[type];\n\n if (method) {\n return method.call(res);\n }\n\n throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);\n })\n });\n })());\n\n const getBodyLength = async (body) => {\n if (body == null) {\n return 0;\n }\n\n if (utils.isBlob(body)) {\n return body.size;\n }\n\n if (utils.isSpecCompliantForm(body)) {\n const _request = new Request(platform.origin, {\n method: 'POST',\n body,\n });\n return (await _request.arrayBuffer()).byteLength;\n }\n\n if (utils.isArrayBufferView(body) || utils.isArrayBuffer(body)) {\n return body.byteLength;\n }\n\n if (utils.isURLSearchParams(body)) {\n body = body + '';\n }\n\n if (utils.isString(body)) {\n return (await encodeText(body)).byteLength;\n }\n }\n\n const resolveBodyLength = async (headers, body) => {\n const length = utils.toFiniteNumber(headers.getContentLength());\n\n return length == null ? getBodyLength(body) : length;\n }\n\n return async (config) => {\n let {\n url,\n method,\n data,\n signal,\n cancelToken,\n timeout,\n onDownloadProgress,\n onUploadProgress,\n responseType,\n headers,\n withCredentials = 'same-origin',\n fetchOptions\n } = resolveConfig(config);\n\n let _fetch = envFetch || fetch;\n\n responseType = responseType ? (responseType + '').toLowerCase() : 'text';\n\n let composedSignal = composeSignals([signal, cancelToken && cancelToken.toAbortSignal()], timeout);\n\n let request = null;\n\n const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {\n composedSignal.unsubscribe();\n });\n\n let requestContentLength;\n\n try {\n if (\n onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&\n (requestContentLength = await resolveBodyLength(headers, data)) !== 0\n ) {\n let _request = new Request(url, {\n method: 'POST',\n body: data,\n duplex: \"half\"\n });\n\n let contentTypeHeader;\n\n if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {\n headers.setContentType(contentTypeHeader)\n }\n\n if (_request.body) {\n const [onProgress, flush] = progressEventDecorator(\n requestContentLength,\n progressEventReducer(asyncDecorator(onUploadProgress))\n );\n\n data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);\n }\n }\n\n if (!utils.isString(withCredentials)) {\n withCredentials = withCredentials ? 'include' : 'omit';\n }\n\n // Cloudflare Workers throws when credentials are defined\n // see https://github.com/cloudflare/workerd/issues/902\n const isCredentialsSupported = isRequestSupported && \"credentials\" in Request.prototype;\n\n const resolvedOptions = {\n ...fetchOptions,\n signal: composedSignal,\n method: method.toUpperCase(),\n headers: headers.normalize().toJSON(),\n body: data,\n duplex: \"half\",\n credentials: isCredentialsSupported ? withCredentials : undefined\n };\n\n request = isRequestSupported && new Request(url, resolvedOptions);\n\n let response = await (isRequestSupported ? _fetch(request, fetchOptions) : _fetch(url, resolvedOptions));\n\n const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');\n\n if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {\n const options = {};\n\n ['status', 'statusText', 'headers'].forEach(prop => {\n options[prop] = response[prop];\n });\n\n const responseContentLength = utils.toFiniteNumber(response.headers.get('content-length'));\n\n const [onProgress, flush] = onDownloadProgress && progressEventDecorator(\n responseContentLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true)\n ) || [];\n\n response = new Response(\n trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\n flush && flush();\n unsubscribe && unsubscribe();\n }),\n options\n );\n }\n\n responseType = responseType || 'text';\n\n let responseData = await resolvers[utils.findKey(resolvers, responseType) || 'text'](response, config);\n\n !isStreamResponse && unsubscribe && unsubscribe();\n\n return await new Promise((resolve, reject) => {\n settle(resolve, reject, {\n data: responseData,\n headers: AxiosHeaders.from(response.headers),\n status: response.status,\n statusText: response.statusText,\n config,\n request\n })\n })\n } catch (err) {\n unsubscribe && unsubscribe();\n\n if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {\n throw Object.assign(\n new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),\n {\n cause: err.cause || err\n }\n )\n }\n\n throw AxiosError.from(err, err && err.code, config, request);\n }\n }\n}\n\nconst seedCache = new Map();\n\nexport const getFetch = (config) => {\n let env = (config && config.env) || {};\n const {fetch, Request, Response} = env;\n const seeds = [\n Request, Response, fetch\n ];\n\n let len = seeds.length, i = len,\n seed, target, map = seedCache;\n\n while (i--) {\n seed = seeds[i];\n target = map.get(seed);\n\n target === undefined && map.set(seed, target = (i ? new Map() : factory(env)))\n\n map = target;\n }\n\n return target;\n};\n\nconst adapter = getFetch();\n\nexport default adapter;\n", "import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport * as fetchAdapter from './fetch.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\n/**\n * Known adapters mapping.\n * Provides environment-specific adapters for Axios:\n * - `http` for Node.js\n * - `xhr` for browsers\n * - `fetch` for fetch API-based requests\n * \n * @type {Object<string, Function|Object>}\n */\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter,\n fetch: {\n get: fetchAdapter.getFetch,\n }\n};\n\n// Assign adapter names for easier debugging and identification\nutils.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', { value });\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', { value });\n }\n});\n\n/**\n * Render a rejection reason string for unknown or unsupported adapters\n * \n * @param {string} reason\n * @returns {string}\n */\nconst renderReason = (reason) => `- ${reason}`;\n\n/**\n * Check if the adapter is resolved (function, null, or false)\n * \n * @param {Function|null|false} adapter\n * @returns {boolean}\n */\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\n\n/**\n * Get the first suitable adapter from the provided list.\n * Tries each adapter in order until a supported one is found.\n * Throws an AxiosError if no adapter is suitable.\n * \n * @param {Array<string|Function>|string|Function} adapters - Adapter(s) by name or function.\n * @param {Object} config - Axios request configuration\n * @throws {AxiosError} If no suitable adapter is available\n * @returns {Function} The resolved adapter function\n */\nfunction getAdapter(adapters, config) {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n const { length } = adapters;\n let nameOrAdapter;\n let adapter;\n\n const rejectedReasons = {};\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n\n adapter = nameOrAdapter;\n\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n\n if (adapter && (utils.isFunction(adapter) || (adapter = adapter.get(config)))) {\n break;\n }\n\n rejectedReasons[id || '#' + i] = adapter;\n }\n\n if (!adapter) {\n const reasons = Object.entries(rejectedReasons)\n .map(([id, state]) => `adapter ${id} ` +\n (state === false ? 'is not supported by the environment' : 'is not available in the build')\n );\n\n let s = length ?\n (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n 'as no adapter specified';\n\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n return adapter;\n}\n\n/**\n * Exports Axios adapters and utility to resolve an adapter\n */\nexport default {\n /**\n * Resolve an adapter from a list of adapter names or functions.\n * @type {Function}\n */\n getAdapter,\n\n /**\n * Exposes all known adapters\n * @type {Object<string, Function|Object>}\n */\n adapters: knownAdapters\n};\n", "'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults.adapter, config);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n", "export const VERSION = \"1.13.2\";", "'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\nvalidators.spelling = function spelling(correctSpelling) {\n return (value, opt) => {\n // eslint-disable-next-line no-console\n console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);\n return true;\n }\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n", "'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig || {};\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(configOrUrl, config) {\n try {\n return await this._request(configOrUrl, config);\n } catch (err) {\n if (err instanceof Error) {\n let dummy = {};\n\n Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());\n\n // slice off the Error: ... line\n const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, '') : '';\n try {\n if (!err.stack) {\n err.stack = stack;\n // match without the 2 top stack lines\n } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, ''))) {\n err.stack += '\\n' + stack\n }\n } catch (e) {\n // ignore the case where \"stack\" is an un-writable property\n }\n }\n\n throw err;\n }\n }\n\n _request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n }\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.allowAbsoluteUrls\n if (config.allowAbsoluteUrls !== undefined) {\n // do nothing\n } else if (this.defaults.allowAbsoluteUrls !== undefined) {\n config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;\n } else {\n config.allowAbsoluteUrls = true;\n }\n\n validator.assertOptions(config, {\n baseUrl: validators.spelling('baseURL'),\n withXsrfToken: validators.spelling('withXSRFToken')\n }, true);\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift(...requestInterceptorChain);\n chain.push(...responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n", "'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n toAbortSignal() {\n const controller = new AbortController();\n\n const abort = (err) => {\n controller.abort(err);\n };\n\n this.subscribe(abort);\n\n controller.signal.unsubscribe = () => this.unsubscribe(abort);\n\n return controller.signal;\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n", "'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n", "'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n", "const HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n WebServerIsDown: 521,\n ConnectionTimedOut: 522,\n OriginIsUnreachable: 523,\n TimeoutOccurred: 524,\n SslHandshakeFailed: 525,\n InvalidSslCertificate: 526,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n", "'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n", "import axios from './lib/axios.js';\n\n// This module is intended to unwrap Axios default export as named.\n// Keep top-level export same with static properties\n// so that it can keep same with es module or cjs\nconst {\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n} = axios;\n\nexport {\n axios as default,\n Axios,\n AxiosError,\n CanceledError,\n isCancel,\n CancelToken,\n VERSION,\n all,\n Cancel,\n isAxiosError,\n spread,\n toFormData,\n AxiosHeaders,\n HttpStatusCode,\n formToJSON,\n getAdapter,\n mergeConfig\n}\n", "/**\r\n * Base API Client using Axios\r\n * Shared between all resource clients\r\n */\r\n\r\nimport axios, { AxiosInstance, AxiosRequestConfig, InternalAxiosRequestConfig } from 'axios';\r\n\r\n// Extend AxiosRequestConfig to include skipAuth\r\ndeclare module 'axios' {\r\n export interface AxiosRequestConfig {\r\n skipAuth?: boolean;\r\n }\r\n}\r\n\r\nexport interface ApiClientConfig {\r\n baseURL: string;\r\n headers?: Record<string, string>;\r\n timeout?: number;\r\n}\r\n\r\nexport type TokenProvider = () => Promise<string | null>;\r\n\r\nexport class ApiClient {\r\n public axios: AxiosInstance;\r\n private currentToken: string | null = null;\r\n private tokenProvider: TokenProvider | null = null;\r\n\r\n // Circuit breaker state\r\n private requestHistory: Map<string, { count: number; firstRequestTime: number }> = new Map();\r\n private readonly WINDOW_MS = 5000; // 5 seconds window\r\n private readonly MAX_REQUESTS = 30; // Max 30 requests per endpoint in window\r\n\r\n constructor(config: ApiClientConfig) {\r\n this.axios = axios.create({\r\n baseURL: config.baseURL,\r\n timeout: config.timeout || 60000, // 60 seconds for payment operations\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...config.headers,\r\n },\r\n });\r\n\r\n // Cleanup interval for circuit breaker history\r\n if (typeof setInterval !== 'undefined') {\r\n setInterval(() => this.cleanupHistory(), 10000);\r\n }\r\n\r\n // Request interceptor for logging and auth\r\n this.axios.interceptors.request.use(\r\n async (config: InternalAxiosRequestConfig) => {\r\n // Circuit Breaker Check\r\n if (config.url) {\r\n try {\r\n this.checkRequestLimit(`${config.method?.toUpperCase()}:${config.url}`);\r\n } catch (error) {\r\n console.error('[SDK] \uD83D\uDED1 Request blocked by Circuit Breaker:', error);\r\n return Promise.reject(error);\r\n }\r\n }\r\n\r\n // Check if we need to wait for token\r\n if (!config.skipAuth && !this.currentToken && this.tokenProvider) {\r\n try {\r\n console.log('[SDK] Waiting for token...');\r\n const token = await this.tokenProvider();\r\n if (token) {\r\n this.updateToken(token);\r\n // Ensure header is set on this specific request config\r\n config.headers['x-cms-token'] = token;\r\n }\r\n } catch (error) {\r\n console.error('[SDK] Failed to get token from provider:', error);\r\n }\r\n }\r\n\r\n // Ensure token is in headers if we have it (and not skipped)\r\n if (!config.skipAuth && this.currentToken) {\r\n config.headers['x-cms-token'] = this.currentToken;\r\n }\r\n\r\n console.log(`[SDK] Making ${config.method?.toUpperCase()} request to: ${config.baseURL || ''}${config.url}`);\r\n // console.log('[SDK] Request headers:', config.headers);\r\n\r\n return config;\r\n },\r\n (error) => {\r\n console.error('[SDK] Request error:', error);\r\n return Promise.reject(error instanceof Error ? error : new Error(String(error)));\r\n }\r\n );\r\n\r\n // Response interceptor for logging\r\n this.axios.interceptors.response.use(\r\n (response) => {\r\n // console.log('[SDK] Response status:', response.status);\r\n return response;\r\n },\r\n (error) => {\r\n console.error('[SDK] Response error:', error.message);\r\n return Promise.reject(error instanceof Error ? error : new Error(String(error)));\r\n }\r\n );\r\n }\r\n\r\n // Set a provider that returns a promise resolving to the token\r\n // This allows requests to wait until the token is ready\r\n setTokenProvider(provider: TokenProvider) {\r\n this.tokenProvider = provider;\r\n }\r\n\r\n // Convenience methods\r\n async get<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T> {\r\n const response = await this.axios.get<T>(url, config);\r\n return response.data;\r\n }\r\n\r\n async post<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> {\r\n const response = await this.axios.post<T>(url, data, config);\r\n return response.data;\r\n }\r\n\r\n async put<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> {\r\n const response = await this.axios.put<T>(url, data, config);\r\n return response.data;\r\n }\r\n\r\n async patch<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> {\r\n const response = await this.axios.patch<T>(url, data, config);\r\n return response.data;\r\n }\r\n\r\n async delete<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T> {\r\n const response = await this.axios.delete<T>(url, config);\r\n return response.data;\r\n }\r\n\r\n // Update headers (useful for auth tokens)\r\n setHeader(key: string, value: string) {\r\n this.axios.defaults.headers.common[key] = value;\r\n }\r\n\r\n removeHeader(key: string) {\r\n delete this.axios.defaults.headers.common[key];\r\n }\r\n\r\n // Token management methods (matching old ApiService pattern)\r\n updateToken(token: string | null) {\r\n this.currentToken = token;\r\n if (token) {\r\n this.setHeader('x-cms-token', token);\r\n // console.log('[SDK] Token updated in ApiClient:', token.substring(0, 8) + '...');\r\n } else {\r\n this.removeHeader('x-cms-token');\r\n console.log('[SDK] Token removed from ApiClient');\r\n }\r\n }\r\n\r\n getCurrentToken(): string | null {\r\n return this.currentToken;\r\n }\r\n\r\n // Update configuration (useful for environment changes)\r\n updateConfig(config: Partial<ApiClientConfig>) {\r\n if (config.baseURL) {\r\n this.axios.defaults.baseURL = config.baseURL;\r\n }\r\n if (config.timeout) {\r\n this.axios.defaults.timeout = config.timeout;\r\n }\r\n if (config.headers) {\r\n Object.assign(this.axios.defaults.headers.common, config.headers);\r\n }\r\n console.log('[SDK] ApiClient configuration updated');\r\n }\r\n\r\n // Circuit Breaker Implementation\r\n private checkRequestLimit(key: string) {\r\n const now = Date.now();\r\n const history = this.requestHistory.get(key);\r\n\r\n if (!history) {\r\n this.requestHistory.set(key, { count: 1, firstRequestTime: now });\r\n return;\r\n }\r\n\r\n if (now - history.firstRequestTime > this.WINDOW_MS) {\r\n // Window expired, reset\r\n this.requestHistory.set(key, { count: 1, firstRequestTime: now });\r\n return;\r\n }\r\n\r\n history.count++;\r\n if (history.count > this.MAX_REQUESTS) {\r\n const error = new Error(`Circuit Breaker: Too many requests to ${key} (${history.count} in ${this.WINDOW_MS}ms)`);\r\n // Add a property to identify this as a circuit breaker error\r\n (error as any).isCircuitBreaker = true;\r\n throw error;\r\n }\r\n }\r\n\r\n private cleanupHistory() {\r\n const now = Date.now();\r\n for (const [key, history] of this.requestHistory.entries()) {\r\n if (now - history.firstRequestTime > this.WINDOW_MS) {\r\n this.requestHistory.delete(key);\r\n }\r\n }\r\n }\r\n}\r\n", "// Generated ESM version of ua-parser-js\n// DO NOT EDIT THIS FILE!\n// Source: /src/main/ua-parser.js\n\n/////////////////////////////////////////////////////////////////////////////////\n/* UAParser.js v2.0.6\n Copyright \u00A9 2012-2025 Faisal Salman <f@faisalman.com>\n UAParser.js PRO Enterprise License *//*\n Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.\n Supports browser & node.js environment. \n Demo : https://uaparser.dev\n Source : https://github.com/faisalman/ua-parser-js */\n/////////////////////////////////////////////////////////////////////////////////\n\n/* jshint esversion: 6 */ \n/* globals window */\n\n\n \n //////////////\n // Constants\n /////////////\n\n var LIBVERSION = '2.0.6',\n UA_MAX_LENGTH = 500,\n USER_AGENT = 'user-agent',\n EMPTY = '',\n UNKNOWN = '?',\n TYPEOF = {\n FUNCTION : 'function',\n OBJECT : 'object',\n STRING : 'string',\n UNDEFINED : 'undefined'\n },\n\n // properties\n BROWSER = 'browser',\n CPU = 'cpu',\n DEVICE = 'device',\n ENGINE = 'engine',\n OS = 'os',\n RESULT = 'result',\n\n NAME = 'name',\n TYPE = 'type',\n VENDOR = 'vendor',\n VERSION = 'version',\n ARCHITECTURE= 'architecture',\n MAJOR = 'major',\n MODEL = 'model',\n\n // device types\n CONSOLE = 'console',\n MOBILE = 'mobile',\n TABLET = 'tablet',\n SMARTTV = 'smarttv',\n WEARABLE = 'wearable',\n XR = 'xr',\n EMBEDDED = 'embedded',\n\n // browser types\n INAPP = 'inapp',\n\n // client hints\n BRANDS = 'brands',\n FORMFACTORS = 'formFactors',\n FULLVERLIST = 'fullVersionList',\n PLATFORM = 'platform',\n PLATFORMVER = 'platformVersion',\n BITNESS = 'bitness',\n CH = 'sec-ch-ua',\n CH_FULL_VER_LIST= CH + '-full-version-list',\n CH_ARCH = CH + '-arch',\n CH_BITNESS = CH + '-' + BITNESS,\n CH_FORM_FACTORS = CH + '-form-factors',\n CH_MOBILE = CH + '-' + MOBILE,\n CH_MODEL = CH + '-' + MODEL,\n CH_PLATFORM = CH + '-' + PLATFORM,\n CH_PLATFORM_VER = CH_PLATFORM + '-version',\n CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS],\n\n // device vendors\n AMAZON = 'Amazon',\n APPLE = 'Apple',\n ASUS = 'ASUS',\n BLACKBERRY = 'BlackBerry',\n GOOGLE = 'Google',\n HUAWEI = 'Huawei',\n LENOVO = 'Lenovo',\n HONOR = 'Honor',\n LG = 'LG',\n MICROSOFT = 'Microsoft',\n MOTOROLA = 'Motorola',\n NVIDIA = 'Nvidia',\n ONEPLUS = 'OnePlus',\n OPPO = 'OPPO',\n SAMSUNG = 'Samsung',\n SHARP = 'Sharp',\n SONY = 'Sony',\n XIAOMI = 'Xiaomi',\n ZEBRA = 'Zebra',\n\n // browsers\n CHROME = 'Chrome',\n CHROMIUM = 'Chromium',\n CHROMECAST = 'Chromecast',\n EDGE = 'Edge',\n FIREFOX = 'Firefox',\n OPERA = 'Opera',\n FACEBOOK = 'Facebook',\n SOGOU = 'Sogou',\n\n PREFIX_MOBILE = 'Mobile ',\n SUFFIX_BROWSER = ' Browser',\n\n // os\n WINDOWS = 'Windows';\n \n var isWindow = typeof window !== TYPEOF.UNDEFINED,\n NAVIGATOR = (isWindow && window.navigator) ? \n window.navigator : \n undefined,\n NAVIGATOR_UADATA = (NAVIGATOR && NAVIGATOR.userAgentData) ? \n NAVIGATOR.userAgentData : \n undefined;\n\n ///////////\n // Helper\n //////////\n\n var extend = function (defaultRgx, extensions) {\n var mergedRgx = {};\n var extraRgx = extensions;\n if (!isExtensions(extensions)) {\n extraRgx = {};\n for (var i in extensions) {\n for (var j in extensions[i]) {\n extraRgx[j] = extensions[i][j].concat(extraRgx[j] ? extraRgx[j] : []);\n }\n }\n }\n for (var k in defaultRgx) {\n mergedRgx[k] = extraRgx[k] && extraRgx[k].length % 2 === 0 ? extraRgx[k].concat(defaultRgx[k]) : defaultRgx[k];\n }\n return mergedRgx;\n },\n enumerize = function (arr) {\n var enums = {};\n for (var i=0; i<arr.length; i++) {\n enums[arr[i].toUpperCase()] = arr[i];\n }\n return enums;\n },\n has = function (str1, str2) {\n if (typeof str1 === TYPEOF.OBJECT && str1.length > 0) {\n for (var i in str1) {\n if (lowerize(str2) == lowerize(str1[i])) return true;\n }\n return false;\n }\n return isString(str1) ? lowerize(str2) == lowerize(str1) : false;\n },\n isExtensions = function (obj, deep) {\n for (var prop in obj) {\n return /^(browser|cpu|device|engine|os)$/.test(prop) || (deep ? isExtensions(obj[prop]) : false);\n }\n },\n isString = function (val) {\n return typeof val === TYPEOF.STRING;\n },\n itemListToArray = function (header) {\n if (!header) return undefined;\n var arr = [];\n var tokens = strip(/\\\\?\\\"/g, header).split(',');\n for (var i = 0; i < tokens.length; i++) {\n if (tokens[i].indexOf(';') > -1) {\n var token = trim(tokens[i]).split(';v=');\n arr[i] = { brand : token[0], version : token[1] };\n } else {\n arr[i] = trim(tokens[i]);\n }\n }\n return arr;\n },\n lowerize = function (str) {\n return isString(str) ? str.toLowerCase() : str;\n },\n majorize = function (version) {\n return isString(version) ? strip(/[^\\d\\.]/g, version).split('.')[0] : undefined;\n },\n setProps = function (arr) {\n for (var i in arr) {\n if (!arr.hasOwnProperty(i)) continue;\n\n var propName = arr[i];\n if (typeof propName == TYPEOF.OBJECT && propName.length == 2) {\n this[propName[0]] = propName[1];\n } else {\n this[propName] = undefined;\n }\n }\n return this;\n },\n strip = function (pattern, str) {\n return isString(str) ? str.replace(pattern, EMPTY) : str;\n },\n stripQuotes = function (str) {\n return strip(/\\\\?\\\"/g, str); \n },\n trim = function (str, len) {\n str = strip(/^\\s\\s*/, String(str));\n return typeof len === TYPEOF.UNDEFINED ? str : str.substring(0, len);\n };\n\n ///////////////\n // Map helper\n //////////////\n\n var rgxMapper = function (ua, arrays) {\n\n if(!ua || !arrays) return;\n\n var i = 0, j, k, p, q, matches, match;\n\n // loop through all regexes maps\n while (i < arrays.length && !matches) {\n\n var regex = arrays[i], // even sequence (0,2,4,..)\n props = arrays[i + 1]; // odd sequence (1,3,5,..)\n j = k = 0;\n\n // try matching uastring with regexes\n while (j < regex.length && !matches) {\n\n if (!regex[j]) { break; }\n matches = regex[j++].exec(ua);\n\n if (!!matches) {\n for (p = 0; p < props.length; p++) {\n match = matches[++k];\n q = props[p];\n // check if given property is actually array\n if (typeof q === TYPEOF.OBJECT && q.length > 0) {\n if (q.length === 2) {\n if (typeof q[1] == TYPEOF.FUNCTION) {\n // assign modified match\n this[q[0]] = q[1].call(this, match);\n } else {\n // assign given value, ignore regex match\n this[q[0]] = q[1];\n }\n } else if (q.length >= 3) {\n // Check whether q[1] FUNCTION or REGEX\n if (typeof q[1] === TYPEOF.FUNCTION && !(q[1].exec && q[1].test)) {\n if (q.length > 3) {\n this[q[0]] = match ? q[1].apply(this, q.slice(2)) : undefined;\n } else {\n // call function (usually string mapper)\n this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;\n }\n } else {\n if (q.length == 3) {\n // sanitize match using given regex\n this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;\n } else if (q.length == 4) {\n this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;\n } else if (q.length > 4) {\n this[q[0]] = match ? q[3].apply(this, [match.replace(q[1], q[2])].concat(q.slice(4))) : undefined;\n }\n }\n }\n } else {\n this[q] = match ? match : undefined;\n }\n }\n }\n }\n i += 2;\n }\n },\n\n strMapper = function (str, map) {\n\n for (var i in map) {\n // check if current value is array\n if (typeof map[i] === TYPEOF.OBJECT && map[i].length > 0) {\n for (var j = 0; j < map[i].length; j++) {\n if (has(map[i][j], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n } else if (has(map[i], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n return map.hasOwnProperty('*') ? map['*'] : str;\n };\n\n ///////////////\n // String map\n //////////////\n\n var windowsVersionMap = {\n 'ME' : '4.90',\n 'NT 3.51': '3.51',\n 'NT 4.0': '4.0',\n '2000' : ['5.0', '5.01'],\n 'XP' : ['5.1', '5.2'],\n 'Vista' : '6.0',\n '7' : '6.1',\n '8' : '6.2',\n '8.1' : '6.3',\n '10' : ['6.4', '10.0'],\n 'NT' : ''\n },\n \n formFactorsMap = {\n 'embedded' : 'Automotive',\n 'mobile' : 'Mobile',\n 'tablet' : ['Tablet', 'EInk'],\n 'smarttv' : 'TV',\n 'wearable' : 'Watch',\n 'xr' : ['VR', 'XR'],\n '?' : ['Desktop', 'Unknown'],\n '*' : undefined\n },\n\n browserHintsMap = {\n 'Chrome' : 'Google Chrome',\n 'Edge' : 'Microsoft Edge',\n 'Edge WebView2' : 'Microsoft Edge WebView2',\n 'Chrome WebView': 'Android WebView',\n 'Chrome Headless':'HeadlessChrome',\n 'Huawei Browser': 'HuaweiBrowser',\n 'MIUI Browser' : 'Miui Browser',\n 'Opera Mobi' : 'OperaMobile',\n 'Yandex' : 'YaBrowser'\n };\n\n //////////////\n // Regex map\n /////////////\n\n var defaultRegexes = {\n\n browser : [[\n\n // Most common regardless engine\n /\\b(?:crmo|crios)\\/([\\w\\.]+)/i // Chrome for Android/iOS\n ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [\n /webview.+edge\\/([\\w\\.]+)/i // Microsoft Edge\n ], [VERSION, [NAME, EDGE+' WebView']], [\n /edg(?:e|ios|a)?\\/([\\w\\.]+)/i \n ], [VERSION, [NAME, 'Edge']], [\n\n // Presto based\n /(opera mini)\\/([-\\w\\.]+)/i, // Opera Mini\n /(opera [mobiletab]{3,6})\\b.+version\\/([-\\w\\.]+)/i, // Opera Mobi/Tablet\n /(opera)(?:.+version\\/|[\\/ ]+)([\\w\\.]+)/i // Opera\n ], [NAME, VERSION], [\n /opios[\\/ ]+([\\w\\.]+)/i // Opera mini on iphone >= 8.0\n ], [VERSION, [NAME, OPERA+' Mini']], [\n /\\bop(?:rg)?x\\/([\\w\\.]+)/i // Opera GX\n ], [VERSION, [NAME, OPERA+' GX']], [\n /\\bopr\\/([\\w\\.]+)/i // Opera Webkit\n ], [VERSION, [NAME, OPERA]], [\n\n // Mixed\n /\\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\\/ ]?([\\w\\.]+)/i // Baidu\n ], [VERSION, [NAME, 'Baidu']], [\n /\\b(?:mxbrowser|mxios|myie2)\\/?([-\\w\\.]*)\\b/i // Maxthon\n ], [VERSION, [NAME, 'Maxthon']], [\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\\/ ]?([\\w\\.]*)/i, \n // Lunascape/Maxthon/Netfront/Jasmine/Blazer/Sleipnir\n // Trident based\n /(avant|iemobile|slim(?:browser|boat|jet))[\\/ ]?([\\d\\.]*)/i, // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet\n /(?:ms|\\()(ie) ([\\w\\.]+)/i, // Internet Explorer\n\n // Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble/Palemoon\n /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:lg |qute)browser|palemoon)\\/([-\\w\\.]+)/i,\n // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon\n /(heytap|ovi|115|surf|qwant)browser\\/([\\d\\.]+)/i, // HeyTap/Ovi/115/Surf\n /(qwant)(?:ios|mobile)\\/([\\d\\.]+)/i, // Qwant\n /(ecosia|weibo)(?:__| \\w+@)([\\d\\.]+)/i // Ecosia/Weibo\n ], [NAME, VERSION], [\n /quark(?:pc)?\\/([-\\w\\.]+)/i // Quark\n ], [VERSION, [NAME, 'Quark']], [\n /\\bddg\\/([\\w\\.]+)/i // DuckDuckGo\n ], [VERSION, [NAME, 'DuckDuckGo']], [\n /(?:\\buc? ?browser|(?:juc.+)ucweb)[\\/ ]?([\\w\\.]+)/i // UCBrowser\n ], [VERSION, [NAME, 'UCBrowser']], [\n /microm.+\\bqbcore\\/([\\w\\.]+)/i, // WeChat Desktop for Windows Built-in Browser\n /\\bqbcore\\/([\\w\\.]+).+microm/i,\n /micromessenger\\/([\\w\\.]+)/i // WeChat\n ], [VERSION, [NAME, 'WeChat']], [\n /konqueror\\/([\\w\\.]+)/i // Konqueror\n ], [VERSION, [NAME, 'Konqueror']], [\n /trident.+rv[: ]([\\w\\.]{1,9})\\b.+like gecko/i // IE11\n ], [VERSION, [NAME, 'IE']], [\n /ya(?:search)?browser\\/([\\w\\.]+)/i // Yandex\n ], [VERSION, [NAME, 'Yandex']], [\n /slbrowser\\/([\\w\\.]+)/i // Smart Lenovo Browser\n ], [VERSION, [NAME, 'Smart ' + LENOVO + SUFFIX_BROWSER]], [\n /(avast|avg)\\/([\\w\\.]+)/i // Avast/AVG Secure Browser\n ], [[NAME, /(.+)/, '$1 Secure' + SUFFIX_BROWSER], VERSION], [\n /\\bfocus\\/([\\w\\.]+)/i // Firefox Focus\n ], [VERSION, [NAME, FIREFOX+' Focus']], [\n /\\bopt\\/([\\w\\.]+)/i // Opera Touch\n ], [VERSION, [NAME, OPERA+' Touch']], [\n /coc_coc\\w+\\/([\\w\\.]+)/i // Coc Coc Browser\n ], [VERSION, [NAME, 'Coc Coc']], [\n /dolfin\\/([\\w\\.]+)/i // Dolphin\n ], [VERSION, [NAME, 'Dolphin']], [\n /coast\\/([\\w\\.]+)/i // Opera Coast\n ], [VERSION, [NAME, OPERA+' Coast']], [\n /miuibrowser\\/([\\w\\.]+)/i // MIUI Browser\n ], [VERSION, [NAME, 'MIUI' + SUFFIX_BROWSER]], [\n /fxios\\/([\\w\\.-]+)/i // Firefox for iOS\n ], [VERSION, [NAME, PREFIX_MOBILE + FIREFOX]], [\n /\\bqihoobrowser\\/?([\\w\\.]*)/i // 360\n ], [VERSION, [NAME, '360']], [\n /\\b(qq)\\/([\\w\\.]+)/i // QQ\n ], [[NAME, /(.+)/, '$1Browser'], VERSION], [\n /(oculus|sailfish|huawei|vivo|pico)browser\\/([\\w\\.]+)/i\n ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser\n /samsungbrowser\\/([\\w\\.]+)/i // Samsung Internet\n ], [VERSION, [NAME, SAMSUNG + ' Internet']], [\n /metasr[\\/ ]?([\\d\\.]+)/i // Sogou Explorer\n ], [VERSION, [NAME, SOGOU + ' Explorer']], [\n /(sogou)mo\\w+\\/([\\d\\.]+)/i // Sogou Mobile\n ], [[NAME, SOGOU + ' Mobile'], VERSION], [\n /(electron)\\/([\\w\\.]+) safari/i, // Electron-based App\n /(tesla)(?: qtcarbrowser|\\/(20\\d\\d\\.[-\\w\\.]+))/i, // Tesla\n /m?(qqbrowser|2345(?=browser|chrome|explorer))\\w*[\\/ ]?v?([\\w\\.]+)/i // QQ/2345\n ], [NAME, VERSION], [\n /(lbbrowser|rekonq)/i // LieBao Browser/Rekonq\n ], [NAME], [\n /ome\\/([\\w\\.]+) \\w* ?(iron) saf/i, // Iron\n /ome\\/([\\w\\.]+).+qihu (360)[es]e/i // 360\n ], [VERSION, NAME], [\n\n // WebView\n /((?:fban\\/fbios|fb_iab\\/fb4a)(?!.+fbav)|;fbav\\/([\\w\\.]+);)/i // Facebook App for iOS & Android\n ], [[NAME, FACEBOOK], VERSION, [TYPE, INAPP]], [\n /(kakao(?:talk|story))[\\/ ]([\\w\\.]+)/i, // Kakao App\n /(naver)\\(.*?(\\d+\\.[\\w\\.]+).*\\)/i, // Naver InApp\n /(daum)apps[\\/ ]([\\w\\.]+)/i, // Daum App\n /safari (line)\\/([\\w\\.]+)/i, // Line App for iOS\n /\\b(line)\\/([\\w\\.]+)\\/iab/i, // Line App for Android\n /(alipay)client\\/([\\w\\.]+)/i, // Alipay\n /(twitter)(?:and| f.+e\\/([\\w\\.]+))/i, // Twitter\n /(bing)(?:web|sapphire)\\/([\\w\\.]+)/i, // Bing\n /(instagram|snapchat|klarna)[\\/ ]([-\\w\\.]+)/i // Instagram/Snapchat/Klarna\n ], [NAME, VERSION, [TYPE, INAPP]], [\n /\\bgsa\\/([\\w\\.]+) .*safari\\//i // Google Search Appliance on iOS\n ], [VERSION, [NAME, 'GSA'], [TYPE, INAPP]], [\n /musical_ly(?:.+app_?version\\/|_)([\\w\\.]+)/i // TikTok\n ], [VERSION, [NAME, 'TikTok'], [TYPE, INAPP]], [\n /\\[(linkedin)app\\]/i // LinkedIn App for iOS & Android\n ], [NAME, [TYPE, INAPP]], [\n /(zalo(?:app)?)[\\/\\sa-z]*([\\w\\.-]+)/i // Zalo \n ], [[NAME, /(.+)/, 'Zalo'], VERSION, [TYPE, INAPP]], [\n\n /(chromium)[\\/ ]([-\\w\\.]+)/i // Chromium\n ], [NAME, VERSION], [\n\n /headlesschrome(?:\\/([\\w\\.]+)| )/i // Chrome Headless\n ], [VERSION, [NAME, CHROME+' Headless']], [\n\n /wv\\).+chrome\\/([\\w\\.]+).+edgw\\//i // Edge WebView2\n ], [VERSION, [NAME, EDGE+' WebView2']], [\n\n / wv\\).+(chrome)\\/([\\w\\.]+)/i // Chrome WebView\n ], [[NAME, CHROME+' WebView'], VERSION], [\n\n /droid.+ version\\/([\\w\\.]+)\\b.+(?:mobile safari|safari)/i // Android Browser\n ], [VERSION, [NAME, 'Android' + SUFFIX_BROWSER]], [\n\n /chrome\\/([\\w\\.]+) mobile/i // Chrome Mobile\n ], [VERSION, [NAME, PREFIX_MOBILE + 'Chrome']], [\n\n /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\\/v?([\\w\\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia\n ], [NAME, VERSION], [\n\n /version\\/([\\w\\.\\,]+) .*mobile(?:\\/\\w+ | ?)safari/i // Safari Mobile\n ], [VERSION, [NAME, PREFIX_MOBILE + 'Safari']], [\n /iphone .*mobile(?:\\/\\w+ | ?)safari/i\n ], [[NAME, PREFIX_MOBILE + 'Safari']], [\n /version\\/([\\w\\.\\,]+) .*(safari)/i // Safari\n ], [VERSION, NAME], [\n /webkit.+?(mobile ?safari|safari)(\\/[\\w\\.]+)/i // Safari < 3.0\n ], [NAME, [VERSION, '1']], [\n\n /(webkit|khtml)\\/([\\w\\.]+)/i\n ], [NAME, VERSION], [\n\n // Gecko based\n /(?:mobile|tablet);.*(firefox)\\/([\\w\\.-]+)/i // Firefox Mobile\n ], [[NAME, PREFIX_MOBILE + FIREFOX], VERSION], [\n /(navigator|netscape\\d?)\\/([-\\w\\.]+)/i // Netscape\n ], [[NAME, 'Netscape'], VERSION], [\n /(wolvic|librewolf)\\/([\\w\\.]+)/i // Wolvic/LibreWolf\n ], [NAME, VERSION], [\n /mobile vr; rv:([\\w\\.]+)\\).+firefox/i // Firefox Reality\n ], [VERSION, [NAME, FIREFOX+' Reality']], [\n /ekiohf.+(flow)\\/([\\w\\.]+)/i, // Flow\n /(swiftfox)/i, // Swiftfox\n /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\\/ ]?([\\w\\.\\+]+)/i,\n // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror\n /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\\/([-\\w\\.]+)$/i,\n // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix\n /(firefox)\\/([\\w\\.]+)/i, // Other Firefox-based\n /(mozilla)\\/([\\w\\.]+(?= .+rv\\:.+gecko\\/\\d+)|[0-4][\\w\\.]+(?!.+compatible))/i, // Mozilla\n\n // Other\n /(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\\. ]?browser)[-\\/ ]?v?([\\w\\.]+)/i,\n // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser/Ladybird\n /\\b(links) \\(([\\w\\.]+)/i // Links\n ], [NAME, [VERSION, /_/g, '.']], [\n \n /(cobalt)\\/([\\w\\.]+)/i // Cobalt\n ], [NAME, [VERSION, /[^\\d\\.]+./, EMPTY]]\n ],\n\n cpu : [[\n\n /\\b((amd|x|x86[-_]?|wow|win)64)\\b/i // AMD64 (x64)\n ], [[ARCHITECTURE, 'amd64']], [\n\n /(ia32(?=;))/i, // IA32 (quicktime)\n /\\b((i[346]|x)86)(pc)?\\b/i // IA32 (x86)\n ], [[ARCHITECTURE, 'ia32']], [\n\n /\\b(aarch64|arm(v?[89]e?l?|_?64))\\b/i // ARM64\n ], [[ARCHITECTURE, 'arm64']], [\n\n /\\b(arm(v[67])?ht?n?[fl]p?)\\b/i // ARMHF\n ], [[ARCHITECTURE, 'armhf']], [\n\n // PocketPC mistakenly identified as PowerPC\n /( (ce|mobile); ppc;|\\/[\\w\\.]+arm\\b)/i\n ], [[ARCHITECTURE, 'arm']], [\n\n / sun4\\w[;\\)]/i // SPARC\n ], [[ARCHITECTURE, 'sparc']], [\n // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC\n /\\b(avr32|ia64(?=;)|68k(?=\\))|\\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\\b|pa-risc)/i,\n /((ppc|powerpc)(64)?)( mac|;|\\))/i, // PowerPC\n /(?:osf1|[freopnt]{3,4}bsd) (alpha)/i // Alpha\n ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [\n /mc680.0/i\n ], [[ARCHITECTURE, '68k']], [\n /winnt.+\\[axp/i\n ], [[ARCHITECTURE, 'alpha']]\n ],\n\n device : [[\n\n //////////////////////////\n // MOBILES & TABLETS\n /////////////////////////\n\n // Samsung\n /\\b(sch-i[89]0\\d|shw-m380s|sm-[ptx]\\w{2,4}|gt-[pn]\\d{2,4}|sgh-t8[56]9|nexus 10)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [\n /\\b((?:s[cgp]h|gt|sm)-(?![lr])\\w+|sc[g-]?[\\d]+a?|galaxy nexus)/i,\n /samsung[- ]((?!sm-[lr]|browser)[-\\w]+)/i,\n /sec-(sgh\\w+)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [\n\n // Apple\n /(?:\\/|\\()(ip(?:hone|od)[\\w, ]*)[\\/\\);]/i // iPod/iPhone\n ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [\n /\\b(?:ios|apple\\w+)\\/.+[\\(\\/](ipad)/i, // iPad\n /\\b(ipad)[\\d,]*[;\\] ].+(mac |i(pad)?)os/i\n ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [\n /(macintosh);/i\n ], [MODEL, [VENDOR, APPLE]], [\n\n // Sharp\n /\\b(sh-?[altvz]?\\d\\d[a-ekm]?)/i\n ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [\n\n // Honor\n /\\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\\)|;)/i\n ], [MODEL, [VENDOR, HONOR], [TYPE, TABLET]], [\n /honor([-\\w ]+)[;\\)]/i\n ], [MODEL, [VENDOR, HONOR], [TYPE, MOBILE]], [\n\n // Huawei\n /\\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\\w\\. ]*(?= bui|\\)))\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [\n /(?:huawei) ?([-\\w ]+)[;\\)]/i,\n /\\b(nexus 6p|\\w{2,4}e?-[atu]?[ln][\\dx][\\dc][adnt]?)\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [\n\n // Xiaomi\n /oid[^\\)]+; (2[\\dbc]{4}(182|283|rp\\w{2})[cgl]|m2105k81a?c)(?: bui|\\))/i,\n /\\b(?:xiao)?((?:red)?mi[-_ ]?pad[\\w- ]*)(?: bui|\\))/i // Mi Pad tablets\n ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [\n\n /\\b(poco[\\w ]+|m2\\d{3}j\\d\\d[a-z]{2})(?: bui|\\))/i, // Xiaomi POCO\n /\\b; (\\w+) build\\/hm\\1/i, // Xiaomi Hongmi 'numeric' models\n /\\b(hm[-_ ]?note?[_ ]?(?:\\d\\w)?) bui/i, // Xiaomi Hongmi\n /\\b(redmi[\\-_ ]?(?:note|k)?[\\w_ ]+)(?: bui|\\))/i, // Xiaomi Redmi\n /oid[^\\)]+; (m?[12][0-389][01]\\w{3,6}[c-y])( bui|; wv|\\))/i, // Xiaomi Redmi 'numeric' models\n /\\b(mi[-_ ]?(?:a\\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\\d{0,2}\\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\\))/i, // Xiaomi Mi\n / ([\\w ]+) miui\\/v?\\d/i\n ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [\n\n // OnePlus\n /droid.+; (cph2[3-6]\\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\\d|p[g-k]\\w[1m]10)\\b/i,\n /(?:one)?(?:plus)? (a\\d0\\d\\d)(?: b|\\))/i\n ], [MODEL, [VENDOR, ONEPLUS], [TYPE, MOBILE]], [\n\n // OPPO\n /; (\\w+) bui.+ oppo/i,\n /\\b(cph[12]\\d{3}|p(?:af|c[al]|d\\w|e[ar])[mt]\\d0|x9007|a101op)\\b/i\n ], [MODEL, [VENDOR, OPPO], [TYPE, MOBILE]], [\n /\\b(opd2(\\d{3}a?))(?: bui|\\))/i\n ], [MODEL, [VENDOR, strMapper, { 'OnePlus' : ['203', '304', '403', '404', '413', '415'], '*' : OPPO }], [TYPE, TABLET]], [\n\n // BLU\n /(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\\w\\+ ]*)(?: bui|\\))/i // Vivo series\n ], [MODEL, [VENDOR, 'BLU'], [TYPE, MOBILE]], [ \n\n // Vivo\n /; vivo (\\w+)(?: bui|\\))/i,\n /\\b(v[12]\\d{3}\\w?[at])(?: bui|;)/i\n ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [\n\n // Realme\n /\\b(rmx[1-3]\\d{3})(?: bui|;|\\))/i\n ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [\n\n // Lenovo\n /(ideatab[-\\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\\d{3,4}(?:f[cu]|xu|[av])|yt\\d?-[jx]?\\d+[lfmx])( bui|;|\\)|\\/)/i,\n /lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\\w- ]+?)|tb[\\w-]{6,7})( bui|;|\\)|\\/)/i\n ], [MODEL, [VENDOR, LENOVO], [TYPE, TABLET]], [ \n /lenovo[-_ ]?([-\\w ]+?)(?: bui|\\)|\\/)/i\n ], [MODEL, [VENDOR, LENOVO], [TYPE, MOBILE]], [\n\n // Motorola\n /\\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\\b[\\w ]+build\\//i,\n /\\bmot(?:orola)?[- ]([\\w\\s]+)(\\)| bui)/i,\n /((?:moto(?! 360)[-\\w\\(\\) ]+|xt\\d{3,4}[cgkosw\\+]?[-\\d]*|nexus 6)(?= bui|\\)))/i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [\n /\\b(mz60\\d|xoom[2 ]{0,2}) build\\//i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [\n\n // LG\n /((?=lg)?[vl]k\\-?\\d{3}) bui| 3\\.[-\\w; ]{10}lg?-([06cv9]{3,4})/i\n ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [\n /(lm(?:-?f100[nv]?|-[\\w\\.]+)(?= bui|\\))|nexus [45])/i,\n /\\blg[-e;\\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\\w+)/i,\n /\\blg-?([\\d\\w]+) bui/i\n ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [\n\n // Nokia\n /(nokia) (t[12][01])/i\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n /(?:maemo|nokia).*(n900|lumia \\d+|rm-\\d+)/i,\n /nokia[-_ ]?(([-\\w\\. ]*?))( bui|\\)|;|\\/)/i\n ], [[MODEL, /_/g, ' '], [TYPE, MOBILE], [VENDOR, 'Nokia']], [\n\n // Google\n /(pixel (c|tablet))\\b/i // Google Pixel C/Tablet\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [\n // Google Pixel\n /droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\\d ]*a?( pro)?( xl)?( fold)?( \\(5g\\))?)( bui|\\))/i\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [\n /(google) (pixelbook( go)?)/i\n ], [VENDOR, MODEL], [\n\n // Sony\n /droid.+; (a?\\d[0-2]{2}so|[c-g]\\d{4}|so[-gl]\\w+|xq-\\w\\w\\d\\d)(?= bui|\\).+chrome\\/(?![1-6]{0,1}\\d\\.))/i\n ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [\n /sony tablet [ps]/i,\n /\\b(?:sony)?sgp\\w+(?: bui|\\))/i\n ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [\n\n // Amazon\n /(alexa)webm/i,\n /(kf[a-z]{2}wi|aeo(?!bc)\\w\\w)( bui|\\))/i, // Kindle Fire without Silk / Echo Show\n /(kf[a-z]+)( bui|\\)).+silk\\//i // Kindle Fire HD\n ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [\n /((?:sd|kf)[0349hijorstuw]+)( bui|\\)).+silk\\//i // Fire Phone\n ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [\n\n // BlackBerry\n /(playbook);[-\\w\\),; ]+(rim)/i // BlackBerry PlayBook\n ], [MODEL, VENDOR, [TYPE, TABLET]], [\n /\\b((?:bb[a-f]|st[hv])100-\\d)/i,\n /(?:blackberry|\\(bb10;) (\\w+)/i\n ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [\n\n // Asus\n /(?:\\b|asus_)(transfo[prime ]{4,10} \\w+|eeepc|slider \\w+|nexus 7|padfone|p00[cj])/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [\n / (z[bes]6[027][012][km][ls]|zenfone \\d\\w?)\\b/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [\n\n // HTC\n /(nexus 9)/i // HTC Nexus 9\n ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [\n /(htc)[-;_ ]{1,2}([\\w ]+(?=\\)| bui)|\\w+)/i, // HTC\n\n // ZTE\n /(zte)[- ]([\\w ]+?)(?: bui|\\/|\\))/i,\n /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\\.))|sony(?!-bra))[-_ ]?([-\\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony\n ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [\n\n // TCL\n /tcl (xess p17aa)/i,\n /droid [\\w\\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\\w(\\w|\\w\\w))?(\\)| bui)/i\n ], [MODEL, [VENDOR, 'TCL'], [TYPE, TABLET]], [\n /droid [\\w\\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\\w(\\w|\\w\\w))?(\\)| bui)/i\n ], [MODEL, [VENDOR, 'TCL'], [TYPE, MOBILE]], [\n\n // itel\n /(itel) ((\\w+))/i\n ], [[VENDOR, lowerize], MODEL, [TYPE, strMapper, { 'tablet' : ['p10001l', 'w7001'], '*' : 'mobile' }]], [\n\n // Acer\n /droid.+; ([ab][1-7]-?[0178a]\\d\\d?)/i\n ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [\n\n // Meizu\n /droid.+; (m[1-5] note) bui/i,\n /\\bmz-([-\\w]{2,})/i\n ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [\n \n // Ulefone\n /; ((?:power )?armor(?:[\\w ]{0,8}))(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [\n\n // Energizer\n /; (energy ?\\w+)(?: bui|\\))/i,\n /; energizer ([\\w ]+)(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Energizer'], [TYPE, MOBILE]], [\n\n // Cat\n /; cat (b35);/i,\n /; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Cat'], [TYPE, MOBILE]], [\n\n // Smartfren\n /((?:new )?andromax[\\w- ]+)(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Smartfren'], [TYPE, MOBILE]], [\n\n // Nothing\n /droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i\n ], [MODEL, [VENDOR, 'Nothing'], [TYPE, MOBILE]], [\n\n // Archos\n /; (x67 5g|tikeasy \\w+|ac[1789]\\d\\w+)( b|\\))/i,\n /archos ?(5|gamepad2?|([\\w ]*[t1789]|hello) ?\\d+[\\w ]*)( b|\\))/i\n ], [MODEL, [VENDOR, 'Archos'], [TYPE, TABLET]], [\n /archos ([\\w ]+)( b|\\))/i,\n /; (ac[3-6]\\d\\w{2,8})( b|\\))/i \n ], [MODEL, [VENDOR, 'Archos'], [TYPE, MOBILE]], [\n\n // HMD\n /; (n159v)/i\n ], [MODEL, [VENDOR, 'HMD'], [TYPE, MOBILE]], [\n\n // MIXED\n /(imo) (tab \\w+)/i, // IMO\n /(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i // Infinix XPad / Tecno\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(blackberry|benq|palm(?=\\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\\w]*)/i,\n // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Tecno/Micromax/Advan\n // BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko\n /; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\\w\\+ ]+?)(?: bui|\\)|; r)/i,\n /(hp) ([\\w ]+\\w)/i, // HP iPAQ\n /(microsoft); (lumia[\\w ]+)/i, // Microsoft Lumia\n /(oppo) ?([\\w ]+) bui/i, // OPPO\n /(hisense) ([ehv][\\w ]+)\\)/i, // Hisense\n /droid[^;]+; (philips)[_ ]([sv-x][\\d]{3,4}[xz]?)/i // Philips\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n\n /(kobo)\\s(ereader|touch)/i, // Kobo\n /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad\n /(kindle)\\/([\\w\\.]+)/i // Kindle\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(surface duo)/i // Surface Duo\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [\n /droid [\\d\\.]+; (fp\\du?)(?: b|\\))/i // Fairphone\n ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [\n /((?:tegranote|shield t(?!.+d tv))[\\w- ]*?)(?: b|\\))/i // Nvidia Tablets\n ], [MODEL, [VENDOR, NVIDIA], [TYPE, TABLET]], [\n /(sprint) (\\w+)/i // Sprint Phones\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n /(kin\\.[onetw]{3})/i // Microsoft Kin\n ], [[MODEL, /\\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [\n /droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\\)/i // Zebra\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [\n /droid.+; (ec30|ps20|tc[2-8]\\d[kx])\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [\n\n ///////////////////\n // SMARTTVS\n ///////////////////\n\n /(philips)[\\w ]+tv/i, // Philips\n /smart-tv.+(samsung)/i // Samsung\n ], [VENDOR, [TYPE, SMARTTV]], [\n /hbbtv.+maple;(\\d+)/i\n ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [\n /(vizio)(?: |.+model\\/)(\\w+-\\w+)/i, // Vizio\n /tcast.+(lg)e?. ([-\\w]+)/i // LG SmartTV\n ], [VENDOR, MODEL, [TYPE, SMARTTV]], [\n /(nux; netcast.+smarttv|lg (netcast\\.tv-201\\d|android tv))/i\n ], [[VENDOR, LG], [TYPE, SMARTTV]], [\n /(apple) ?tv/i // Apple TV\n ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [\n /crkey.*devicetype\\/chromecast/i // Google Chromecast Third Generation\n ], [[MODEL, CHROMECAST+' Third Generation'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /crkey.*devicetype\\/([^/]*)/i // Google Chromecast with specific device type\n ], [[MODEL, /^/, 'Chromecast '], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /fuchsia.*crkey/i // Google Chromecast Nest Hub\n ], [[MODEL, CHROMECAST+' Nest Hub'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /crkey/i // Google Chromecast, Linux-based or unknown\n ], [[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /(portaltv)/i // Facebook Portal TV\n ], [MODEL, [VENDOR, FACEBOOK], [TYPE, SMARTTV]], [\n /droid.+aft(\\w+)( bui|\\))/i // Fire TV\n ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [\n /(shield \\w+ tv)/i // Nvidia Shield TV\n ], [MODEL, [VENDOR, NVIDIA], [TYPE, SMARTTV]], [\n /\\(dtv[\\);].+(aquos)/i,\n /(aquos-tv[\\w ]+)\\)/i // Sharp\n ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[\n /(bravia[\\w ]+)( bui|\\))/i // Sony\n ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [\n /(mi(tv|box)-?\\w+) bui/i // Xiaomi\n ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [\n /Hbbtv.*(technisat) (.*);/i // TechniSAT\n ], [VENDOR, MODEL, [TYPE, SMARTTV]], [\n /\\b(roku)[\\dx]*[\\)\\/]((?:dvp-)?[\\d\\.]*)/i, // Roku\n /hbbtv\\/\\d+\\.\\d+\\.\\d+ +\\([\\w\\+ ]*; *([\\w\\d][^;]*);([^;]*)/i // HbbTV devices\n ], [[VENDOR, /.+\\/(\\w+)/, '$1', strMapper, {'LG':'lge'}], [MODEL, trim], [TYPE, SMARTTV]], [\n\n ///////////////////\n // CONSOLES\n ///////////////////\n\n /(playstation \\w+)/i // Playstation\n ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [\n /\\b(xbox(?: one)?(?!; xbox))[\\); ]/i // Microsoft Xbox\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [\n /(ouya)/i, // Ouya\n /(nintendo) (\\w+)/i, // Nintendo\n /(retroid) (pocket ([^\\)]+))/i // Retroid Pocket\n ], [VENDOR, MODEL, [TYPE, CONSOLE]], [\n /droid.+; (shield)( bui|\\))/i // Nvidia Portable\n ], [MODEL, [VENDOR, NVIDIA], [TYPE, CONSOLE]], [\n\n ///////////////////\n // WEARABLES\n ///////////////////\n\n /\\b(sm-[lr]\\d\\d[0156][fnuw]?s?|gear live)\\b/i // Samsung Galaxy Watch\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]], [\n /((pebble))app/i, // Pebble\n /(asus|google|lg|oppo) ((pixel |zen)?watch[\\w ]*)( bui|\\))/i // Asus ZenWatch / LG Watch / Pixel Watch\n ], [VENDOR, MODEL, [TYPE, WEARABLE]], [\n /(ow(?:19|20)?we?[1-3]{1,3})/i // Oppo Watch\n ], [MODEL, [VENDOR, OPPO], [TYPE, WEARABLE]], [\n /(watch)(?: ?os[,\\/]|\\d,\\d\\/)[\\d\\.]+/i // Apple Watch\n ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [\n /(opwwe\\d{3})/i // OnePlus Watch\n ], [MODEL, [VENDOR, ONEPLUS], [TYPE, WEARABLE]], [\n /(moto 360)/i // Motorola 360\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, WEARABLE]], [\n /(smartwatch 3)/i // Sony SmartWatch\n ], [MODEL, [VENDOR, SONY], [TYPE, WEARABLE]], [\n /(g watch r)/i // LG G Watch R\n ], [MODEL, [VENDOR, LG], [TYPE, WEARABLE]], [\n /droid.+; (wt63?0{2,3})\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [\n\n ///////////////////\n // XR\n ///////////////////\n\n /droid.+; (glass) \\d/i // Google Glass\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, XR]], [\n /(pico) ([\\w ]+) os\\d/i // Pico\n ], [VENDOR, MODEL, [TYPE, XR]], [\n /(quest( \\d| pro)?s?).+vr/i // Meta Quest\n ], [MODEL, [VENDOR, FACEBOOK], [TYPE, XR]], [\n /mobile vr; rv.+firefox/i // Unidentifiable VR device using Firefox Reality / Wolvic\n ], [[TYPE, XR]], [\n\n ///////////////////\n // EMBEDDED\n ///////////////////\n\n /(tesla)(?: qtcarbrowser|\\/[-\\w\\.]+)/i // Tesla\n ], [VENDOR, [TYPE, EMBEDDED]], [\n /(aeobc)\\b/i // Echo Dot\n ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [\n /(homepod).+mac os/i // Apple HomePod\n ], [MODEL, [VENDOR, APPLE], [TYPE, EMBEDDED]], [\n /windows iot/i // Unidentifiable embedded device using Windows IoT\n ], [[TYPE, EMBEDDED]], [\n\n ////////////////////\n // MIXED (GENERIC)\n ///////////////////\n\n /droid.+; ([\\w- ]+) (4k|android|smart|google)[- ]?tv/i // Unidentifiable SmartTV\n ], [MODEL, [TYPE, SMARTTV]], [\n /\\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\\w ]+safari)\\b/i\n ], [[TYPE, SMARTTV]], [\n /droid .+?; ([^;]+?)(?: bui|; wv\\)|\\) applew|; hmsc).+?(mobile|vr|\\d) safari/i\n ], [MODEL, [TYPE, strMapper, { 'mobile' : 'Mobile', 'xr' : 'VR', '*' : TABLET }]], [\n /\\b((tablet|tab)[;\\/]|focus\\/\\d(?!.+mobile))/i // Unidentifiable Tablet\n ], [[TYPE, TABLET]], [\n /(phone|mobile(?:[;\\/]| [ \\w\\/\\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile\n ], [[TYPE, MOBILE]], [\n /droid .+?; ([\\w\\. -]+)( bui|\\))/i // Generic Android Device\n ], [MODEL, [VENDOR, 'Generic']]\n ],\n\n engine : [[\n\n /windows.+ edge\\/([\\w\\.]+)/i // EdgeHTML\n ], [VERSION, [NAME, EDGE+'HTML']], [\n\n /(arkweb)\\/([\\w\\.]+)/i // ArkWeb\n ], [NAME, VERSION], [\n\n /webkit\\/537\\.36.+chrome\\/(?!27)([\\w\\.]+)/i // Blink\n ], [VERSION, [NAME, 'Blink']], [\n\n /(presto)\\/([\\w\\.]+)/i, // Presto\n /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\\/([\\w\\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna/Servo\n /ekioh(flow)\\/([\\w\\.]+)/i, // Flow\n /(khtml|tasman|links)[\\/ ]\\(?([\\w\\.]+)/i, // KHTML/Tasman/Links\n /(icab)[\\/ ]([23]\\.[\\d\\.]+)/i, // iCab\n\n /\\b(libweb)/i // LibWeb\n ], [NAME, VERSION], [\n /ladybird\\//i\n ], [[NAME, 'LibWeb']], [\n\n /rv\\:([\\w\\.]{1,9})\\b.+(gecko)/i // Gecko\n ], [VERSION, NAME]\n ],\n\n os : [[\n\n // Windows\n /(windows nt) (6\\.[23]); arm/i // Windows RT\n ], [[NAME, /N/, 'R'], [VERSION, strMapper, windowsVersionMap]], [\n /(windows (?:phone|mobile|iot))(?: os)?[\\/ ]?([\\d\\.]*( se)?)/i, // Windows IoT/Mobile/Phone\n // Windows NT/3.1/95/98/ME/2000/XP/Vista/7/8/8.1/10/11\n /(windows)[\\/ ](1[01]|2000|3\\.1|7|8(\\.1)?|9[58]|me|server 20\\d\\d( r2)?|vista|xp)/i\n ], [NAME, VERSION], [\n /windows nt ?([\\d\\.\\)]*)(?!.+xbox)/i,\n /\\bwin(?=3| ?9|n)(?:nt| 9x )?([\\d\\.;]*)/i\n ], [[VERSION, /(;|\\))/g, '', strMapper, windowsVersionMap], [NAME, WINDOWS]], [\n /(windows ce)\\/?([\\d\\.]*)/i // Windows CE\n ], [NAME, VERSION], [\n\n // iOS/macOS\n /[adehimnop]{4,7}\\b(?:.*os ([\\w]+) like mac|; opera)/i, // iOS\n /(?:ios;fbsv|ios(?=.+ip(?:ad|hone))|ip(?:ad|hone)(?: |.+i(?:pad)?)os)[\\/ ]([\\w\\.]+)/i,\n /cfnetwork\\/.+darwin/i\n ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [\n /(mac os x) ?([\\w\\. ]*)/i,\n /(macintosh|mac_powerpc\\b)(?!.+(haiku|morphos))/i // Mac OS\n ], [[NAME, 'macOS'], [VERSION, /_/g, '.']], [\n\n // Google Chromecast\n /android ([\\d\\.]+).*crkey/i // Google Chromecast, Android-based\n ], [VERSION, [NAME, CHROMECAST + ' Android']], [\n /fuchsia.*crkey\\/([\\d\\.]+)/i // Google Chromecast, Fuchsia-based\n ], [VERSION, [NAME, CHROMECAST + ' Fuchsia']], [\n /crkey\\/([\\d\\.]+).*devicetype\\/smartspeaker/i // Google Chromecast, Linux-based Smart Speaker\n ], [VERSION, [NAME, CHROMECAST + ' SmartSpeaker']], [\n /linux.*crkey\\/([\\d\\.]+)/i // Google Chromecast, Legacy Linux-based\n ], [VERSION, [NAME, CHROMECAST + ' Linux']], [\n /crkey\\/([\\d\\.]+)/i // Google Chromecast, unknown\n ], [VERSION, [NAME, CHROMECAST]], [\n\n // Mobile OSes\n /droid ([\\w\\.]+)\\b.+(android[- ]x86)/i // Android-x86\n ], [VERSION, NAME], [ \n /(ubuntu) ([\\w\\.]+) like android/i // Ubuntu Touch\n ], [[NAME, /(.+)/, '$1 Touch'], VERSION], [\n /(harmonyos)[\\/ ]?([\\d\\.]*)/i, // HarmonyOS\n // Android/Blackberry/WebOS/QNX/Bada/RIM/KaiOS/Maemo/MeeGo/S40/Sailfish OS/OpenHarmony/Tizen\n /(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\\w*[-\\/\\.; ]?([\\d\\.]*)/i\n ], [NAME, VERSION], [\n /\\(bb(10);/i // BlackBerry 10\n ], [VERSION, [NAME, BLACKBERRY]], [\n /(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\\/ ]?([\\w\\.]*)/i // Symbian\n ], [VERSION, [NAME, 'Symbian']], [\n /mozilla\\/[\\d\\.]+ \\((?:mobile|tablet|tv|mobile; [\\w ]+); rv:.+ gecko\\/([\\w\\.]+)/i // Firefox OS\n ], [VERSION, [NAME, FIREFOX+' OS']], [\n /\\b(?:hp)?wos(?:browser)?\\/([\\w\\.]+)/i, // WebOS\n /webos(?:[ \\/]?|\\.tv-20(?=2[2-9]))(\\d[\\d\\.]*)/i\n ], [VERSION, [NAME, 'webOS']], [\n /web0s;.+?(?:chr[o0]me|safari)\\/(\\d+)/i\n // https://webostv.developer.lge.com/develop/specifications/web-api-and-web-engine\n ], [[VERSION, strMapper, {'25':'120','24':'108','23':'94','22':'87','6':'79','5':'68','4':'53','3':'38','2':'538','1':'537','*':'TV'}], [NAME, 'webOS']], [ \n /watch(?: ?os[,\\/]|\\d,\\d\\/)([\\d\\.]+)/i // watchOS\n ], [VERSION, [NAME, 'watchOS']], [\n\n // Google ChromeOS\n /(cros) [\\w]+(?:\\)| ([\\w\\.]+)\\b)/i // Chromium OS\n ], [[NAME, \"Chrome OS\"], VERSION],[\n\n // Smart TVs\n /panasonic;(viera)/i, // Panasonic Viera\n /(netrange)mmh/i, // Netrange\n /(nettv)\\/(\\d+\\.[\\w\\.]+)/i, // NetTV\n\n // Console\n /(nintendo|playstation) (\\w+)/i, // Nintendo/Playstation\n /(xbox); +xbox ([^\\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)\n /(pico) .+os([\\w\\.]+)/i, // Pico\n\n // Other\n /\\b(joli|palm)\\b ?(?:os)?\\/?([\\w\\.]*)/i, // Joli/Palm\n /linux.+(mint)[\\/\\(\\) ]?([\\w\\.]*)/i, // Mint\n /(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\\d\\.]*)/i, // Mageia/VectorLinux/Fuchsia/ArcaOS/Arch\n /([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\\/ ]?(?!chrom|package)([-\\w\\.]*)/i,\n // Ubuntu/Debian/SUSE/Gentoo/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire/Knoppix\n /((?:open)?solaris)[-\\/ ]?([\\w\\.]*)/i, // Solaris\n /\\b(aix)[; ]([1-9\\.]{0,4})/i, // AIX\n /(hurd|linux|morphos)(?: (?:arm|x86|ppc)\\w*| ?)([\\w\\.]*)/i, // Hurd/Linux/MorphOS\n /(gnu) ?([\\w\\.]*)/i, // GNU\n /\\b([-frentopcghs]{0,5}bsd|dragonfly)[\\/ ]?(?!amd|[ix346]{1,2}86)([\\w\\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly\n /(haiku) ?(r\\d)?/i // Haiku\n ], [NAME, VERSION], [\n /(sunos) ?([\\d\\.]*)/i // Solaris\n ], [[NAME, 'Solaris'], VERSION], [\n /\\b(beos|os\\/2|amigaos|openvms|hp-ux|serenityos)/i, // BeOS/OS2/AmigaOS/OpenVMS/HP-UX/SerenityOS\n /(unix) ?([\\w\\.]*)/i // UNIX\n ], [NAME, VERSION]\n ]\n };\n\n /////////////////\n // Factories\n ////////////////\n\n var defaultProps = (function () {\n var props = { init : {}, isIgnore : {}, isIgnoreRgx : {}, toString : {}};\n setProps.call(props.init, [\n [BROWSER, [NAME, VERSION, MAJOR, TYPE]],\n [CPU, [ARCHITECTURE]],\n [DEVICE, [TYPE, MODEL, VENDOR]],\n [ENGINE, [NAME, VERSION]],\n [OS, [NAME, VERSION]]\n ]);\n setProps.call(props.isIgnore, [\n [BROWSER, [VERSION, MAJOR]],\n [ENGINE, [VERSION]],\n [OS, [VERSION]]\n ]);\n setProps.call(props.isIgnoreRgx, [\n [BROWSER, / ?browser$/i],\n [OS, / ?os$/i]\n ]);\n setProps.call(props.toString, [\n [BROWSER, [NAME, VERSION]],\n [CPU, [ARCHITECTURE]],\n [DEVICE, [VENDOR, MODEL]],\n [ENGINE, [NAME, VERSION]],\n [OS, [NAME, VERSION]]\n ]);\n return props;\n })();\n\n var createIData = function (item, itemType) {\n\n var init_props = defaultProps.init[itemType],\n is_ignoreProps = defaultProps.isIgnore[itemType] || 0,\n is_ignoreRgx = defaultProps.isIgnoreRgx[itemType] || 0,\n toString_props = defaultProps.toString[itemType] || 0;\n\n function IData () {\n setProps.call(this, init_props);\n }\n\n IData.prototype.getItem = function () {\n return item;\n };\n\n IData.prototype.withClientHints = function () {\n\n // nodejs / non-client-hints browsers\n if (!NAVIGATOR_UADATA) {\n return item\n .parseCH()\n .get();\n }\n\n // browsers based on chromium 85+\n return NAVIGATOR_UADATA\n .getHighEntropyValues(CH_ALL_VALUES)\n .then(function (res) {\n return item\n .setCH(new UACHData(res, false))\n .parseCH()\n .get();\n });\n };\n\n IData.prototype.withFeatureCheck = function () {\n return item.detectFeature().get();\n };\n\n if (itemType != RESULT) {\n IData.prototype.is = function (strToCheck) {\n var is = false;\n for (var i in this) {\n if (this.hasOwnProperty(i) && !has(is_ignoreProps, i) && lowerize(is_ignoreRgx ? strip(is_ignoreRgx, this[i]) : this[i]) == lowerize(is_ignoreRgx ? strip(is_ignoreRgx, strToCheck) : strToCheck)) {\n is = true;\n if (strToCheck != TYPEOF.UNDEFINED) break;\n } else if (strToCheck == TYPEOF.UNDEFINED && is) {\n is = !is;\n break;\n }\n }\n return is;\n };\n IData.prototype.toString = function () {\n var str = EMPTY;\n for (var i in toString_props) {\n if (typeof(this[toString_props[i]]) !== TYPEOF.UNDEFINED) {\n str += (str ? ' ' : EMPTY) + this[toString_props[i]];\n }\n }\n return str || TYPEOF.UNDEFINED;\n };\n }\n\n if (!NAVIGATOR_UADATA) {\n IData.prototype.then = function (cb) { \n var that = this;\n var IDataResolve = function () {\n for (var prop in that) {\n if (that.hasOwnProperty(prop)) {\n this[prop] = that[prop];\n }\n }\n };\n IDataResolve.prototype = {\n is : IData.prototype.is,\n toString : IData.prototype.toString\n };\n var resolveData = new IDataResolve();\n cb(resolveData);\n return resolveData;\n };\n }\n\n return new IData();\n };\n\n /////////////////\n // Constructor\n ////////////////\n\n function UACHData (uach, isHttpUACH) {\n uach = uach || {};\n setProps.call(this, CH_ALL_VALUES);\n if (isHttpUACH) {\n setProps.call(this, [\n [BRANDS, itemListToArray(uach[CH])],\n [FULLVERLIST, itemListToArray(uach[CH_FULL_VER_LIST])],\n [MOBILE, /\\?1/.test(uach[CH_MOBILE])],\n [MODEL, stripQuotes(uach[CH_MODEL])],\n [PLATFORM, stripQuotes(uach[CH_PLATFORM])],\n [PLATFORMVER, stripQuotes(uach[CH_PLATFORM_VER])],\n [ARCHITECTURE, stripQuotes(uach[CH_ARCH])],\n [FORMFACTORS, itemListToArray(uach[CH_FORM_FACTORS])],\n [BITNESS, stripQuotes(uach[CH_BITNESS])]\n ]);\n } else {\n for (var prop in uach) {\n if(this.hasOwnProperty(prop) && typeof uach[prop] !== TYPEOF.UNDEFINED) this[prop] = uach[prop];\n }\n }\n }\n\n function UAItem (itemType, ua, rgxMap, uaCH) {\n\n this.get = function (prop) {\n if (!prop) return this.data;\n return this.data.hasOwnProperty(prop) ? this.data[prop] : undefined;\n };\n\n this.set = function (prop, val) {\n this.data[prop] = val;\n return this;\n };\n\n this.setCH = function (ch) {\n this.uaCH = ch;\n return this;\n };\n\n this.detectFeature = function () {\n if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) {\n switch (this.itemType) {\n case BROWSER:\n // Brave-specific detection\n if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == TYPEOF.FUNCTION) {\n this.set(NAME, 'Brave');\n }\n break;\n case DEVICE:\n // Chrome-specific detection: check for 'mobile' value of navigator.userAgentData\n if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) {\n this.set(TYPE, MOBILE);\n }\n // iPadOS-specific detection: identified as Mac, but has some iOS-only properties\n if (this.get(MODEL) == 'Macintosh' && NAVIGATOR && typeof NAVIGATOR.standalone !== TYPEOF.UNDEFINED && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) {\n this.set(MODEL, 'iPad')\n .set(TYPE, TABLET);\n }\n break;\n case OS:\n // Chrome-specific detection: check for 'platform' value of navigator.userAgentData\n if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) {\n this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);\n }\n break;\n case RESULT:\n var data = this.data;\n var detect = function (itemType) {\n return data[itemType]\n .getItem()\n .detectFeature()\n .get();\n };\n this.set(BROWSER, detect(BROWSER))\n .set(CPU, detect(CPU))\n .set(DEVICE, detect(DEVICE))\n .set(ENGINE, detect(ENGINE))\n .set(OS, detect(OS));\n }\n }\n return this;\n };\n\n this.parseUA = function () {\n if (this.itemType != RESULT) {\n rgxMapper.call(this.data, this.ua, this.rgxMap);\n }\n switch (this.itemType) {\n case BROWSER:\n this.set(MAJOR, majorize(this.get(VERSION)));\n break;\n case OS:\n if (this.get(NAME) == 'iOS' && this.get(VERSION) == '18.6') {\n // Based on the assumption that iOS version is tightly coupled with Safari version\n var realVersion = /\\) Version\\/([\\d\\.]+)/.exec(this.ua); // Get Safari version\n if (realVersion && parseInt(realVersion[1].substring(0,2), 10) >= 26) {\n this.set(VERSION, realVersion[1]); // Set as iOS version\n }\n }\n break;\n }\n return this;\n };\n\n this.parseCH = function () {\n var uaCH = this.uaCH,\n rgxMap = this.rgxMap;\n \n switch (this.itemType) {\n case BROWSER:\n case ENGINE:\n var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName;\n if (brands) {\n for (var i=0; i<brands.length; i++) {\n var brandName = brands[i].brand || brands[i],\n brandVersion = brands[i].version;\n if (this.itemType == BROWSER && \n !/not.a.brand/i.test(brandName) && \n (!prevName || \n (/Chrom/.test(prevName) && brandName != CHROMIUM) || \n (prevName == EDGE && /WebView2/.test(brandName))\n )) {\n brandName = strMapper(brandName, browserHintsMap);\n prevName = this.get(NAME);\n if (!(prevName && !/Chrom/.test(prevName) && /Chrom/.test(brandName))) {\n this.set(NAME, brandName)\n .set(VERSION, brandVersion)\n .set(MAJOR, majorize(brandVersion));\n }\n prevName = brandName;\n }\n if (this.itemType == ENGINE && brandName == CHROMIUM) {\n this.set(VERSION, brandVersion);\n }\n }\n }\n break;\n case CPU:\n var archName = uaCH[ARCHITECTURE];\n if (archName) {\n if (archName && uaCH[BITNESS] == '64') archName += '64';\n rgxMapper.call(this.data, archName + ';', rgxMap);\n }\n break;\n case DEVICE:\n if (uaCH[MOBILE]) {\n this.set(TYPE, MOBILE);\n }\n if (uaCH[MODEL]) {\n this.set(MODEL, uaCH[MODEL]);\n if (!this.get(TYPE) || !this.get(VENDOR)) {\n var reParse = {};\n rgxMapper.call(reParse, 'droid 9; ' + uaCH[MODEL] + ')', rgxMap);\n if (!this.get(TYPE) && !!reParse.type) {\n this.set(TYPE, reParse.type);\n }\n if (!this.get(VENDOR) && !!reParse.vendor) {\n this.set(VENDOR, reParse.vendor);\n }\n }\n }\n if (uaCH[FORMFACTORS]) {\n var ff;\n if (typeof uaCH[FORMFACTORS] !== 'string') {\n var idx = 0;\n while (!ff && idx < uaCH[FORMFACTORS].length) {\n ff = strMapper(uaCH[FORMFACTORS][idx++], formFactorsMap);\n }\n } else {\n ff = strMapper(uaCH[FORMFACTORS], formFactorsMap);\n }\n this.set(TYPE, ff);\n }\n break;\n case OS:\n var osName = uaCH[PLATFORM];\n if(osName) {\n var osVersion = uaCH[PLATFORMVER];\n if (osName == WINDOWS) osVersion = (parseInt(majorize(osVersion), 10) >= 13 ? '11' : '10');\n this.set(NAME, osName)\n .set(VERSION, osVersion);\n }\n // Xbox-Specific Detection\n if (this.get(NAME) == WINDOWS && uaCH[MODEL] == 'Xbox') {\n this.set(NAME, 'Xbox')\n .set(VERSION, undefined);\n } \n break;\n case RESULT:\n var data = this.data;\n var parse = function (itemType) {\n return data[itemType]\n .getItem()\n .setCH(uaCH)\n .parseCH()\n .get();\n };\n this.set(BROWSER, parse(BROWSER))\n .set(CPU, parse(CPU))\n .set(DEVICE, parse(DEVICE))\n .set(ENGINE, parse(ENGINE))\n .set(OS, parse(OS));\n }\n return this;\n };\n\n setProps.call(this, [\n ['itemType', itemType],\n ['ua', ua],\n ['uaCH', uaCH],\n ['rgxMap', rgxMap],\n ['data', createIData(this, itemType)]\n ]);\n\n return this;\n }\n\n function UAParser (ua, extensions, headers) {\n\n if (typeof ua === TYPEOF.OBJECT) {\n if (isExtensions(ua, true)) {\n if (typeof extensions === TYPEOF.OBJECT) {\n headers = extensions; // case UAParser(extensions, headers) \n }\n extensions = ua; // case UAParser(extensions)\n } else {\n headers = ua; // case UAParser(headers)\n extensions = undefined;\n }\n ua = undefined;\n } else if (typeof ua === TYPEOF.STRING && !isExtensions(extensions, true)) {\n headers = extensions; // case UAParser(ua, headers)\n extensions = undefined;\n }\n\n if (headers) {\n if (typeof headers.append === TYPEOF.FUNCTION) {\n // Convert Headers object into a plain object\n var kv = {};\n headers.forEach(function (v, k) { kv[String(k).toLowerCase()] = v; });\n headers = kv;\n } else {\n // Normalize headers field name into lowercase\n var normalized = {};\n for (var header in headers) {\n if (headers.hasOwnProperty(header)) {\n normalized[String(header).toLowerCase()] = headers[header];\n }\n }\n headers = normalized;\n }\n }\n \n if (!(this instanceof UAParser)) {\n return new UAParser(ua, extensions, headers).getResult();\n }\n\n var userAgent = typeof ua === TYPEOF.STRING ? ua : // Passed user-agent string\n (headers && headers[USER_AGENT] ? headers[USER_AGENT] : // User-Agent from passed headers\n ((NAVIGATOR && NAVIGATOR.userAgent) ? NAVIGATOR.userAgent : // navigator.userAgent\n EMPTY)), // empty string\n\n httpUACH = new UACHData(headers, true),\n regexMap = extensions ? \n extend(defaultRegexes, extensions) : \n defaultRegexes,\n\n createItemFunc = function (itemType) {\n if (itemType == RESULT) {\n return function () {\n return new UAItem(itemType, userAgent, regexMap, httpUACH)\n .set('ua', userAgent)\n .set(BROWSER, this.getBrowser())\n .set(CPU, this.getCPU())\n .set(DEVICE, this.getDevice())\n .set(ENGINE, this.getEngine())\n .set(OS, this.getOS())\n .get();\n };\n } else {\n return function () {\n return new UAItem(itemType, userAgent, regexMap[itemType], httpUACH)\n .parseUA()\n .get();\n };\n }\n };\n \n // public methods\n setProps.call(this, [\n ['getBrowser', createItemFunc(BROWSER)],\n ['getCPU', createItemFunc(CPU)],\n ['getDevice', createItemFunc(DEVICE)],\n ['getEngine', createItemFunc(ENGINE)],\n ['getOS', createItemFunc(OS)],\n ['getResult', createItemFunc(RESULT)],\n ['getUA', function () { return userAgent; }],\n ['setUA', function (ua) {\n if (isString(ua)) userAgent = trim(ua, UA_MAX_LENGTH);\n return this;\n }]\n ])\n .setUA(userAgent);\n\n return this;\n }\n\n UAParser.VERSION = LIBVERSION;\n UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR, TYPE]);\n UAParser.CPU = enumerize([ARCHITECTURE]);\n UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);\n UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);\n\n export {UAParser};", "// Generated ESM version of ua-parser-js/enums\n// DO NOT EDIT THIS FILE!\n// Source: /src/enums/ua-parser-enums.js\n\n///////////////////////////////////////////////\n/* Enums for UAParser.js v2.0.6\n https://github.com/faisalman/ua-parser-js\n Author: Faisal Salman <f@faisalman.com>\n UAParser.js PRO Enterprise License */\n//////////////////////////////////////////////\n\n/*jshint esversion: 6 */ \n\nconst BrowserName = Object.freeze({\n '115': '115',\n '2345': '2345',\n '360': '360',\n ALIPAY: 'Alipay',\n AMAYA: 'Amaya',\n ANDROID: 'Android Browser',\n ARORA: 'Arora',\n AVANT: 'Avant',\n AVAST: 'Avast Secure Browser',\n AVG: 'AVG Secure Browser',\n BAIDU: 'Baidu Browser',\n BASILISK: 'Basilisk',\n BING: 'Bing',\n BLAZER: 'Blazer',\n BOLT: 'Bolt',\n BOWSER: 'Bowser',\n BRAVE: 'Brave',\n CAMINO: 'Camino',\n CHIMERA: 'Chimera',\n CHROME: 'Chrome',\n CHROME_HEADLESS: 'Chrome Headless',\n CHROME_MOBILE: 'Mobile Chrome',\n CHROME_WEBVIEW: 'Chrome WebView',\n CHROMIUM: 'Chromium',\n COBALT: 'Cobalt',\n COC_COC: 'Coc Coc',\n CONKEROR: 'Conkeror',\n DAUM: 'Daum',\n DILLO: 'Dillo',\n DOLPHIN: 'Dolphin',\n DOOBLE: 'Dooble',\n DORIS: 'Doris',\n DRAGON: 'Dragon',\n DUCKDUCKGO: 'DuckDuckGo',\n ECOSIA: 'Ecosia',\n EDGE: 'Edge',\n EDGE_WEBVIEW: 'Edge WebView',\n EDGE_WEBVIEW2: 'Edge WebView2',\n EPIPHANY: 'Epiphany',\n FACEBOOK: 'Facebook',\n FALKON: 'Falkon',\n FIREBIRD: 'Firebird',\n FIREFOX: 'Firefox',\n FIREFOX_FOCUS: 'Firefox Focus',\n FIREFOX_MOBILE: 'Mobile Firefox',\n FIREFOX_REALITY: 'Firefox Reality',\n FENNEC: 'Fennec',\n FLOCK: 'Flock',\n FLOW: 'Flow',\n GO: 'GoBrowser',\n GOOGLE_SEARCH: 'GSA',\n HELIO: 'Helio',\n HEYTAP: 'HeyTap',\n HONOR: 'Honor',\n HUAWEI: 'Huawei Browser',\n ICAB: 'iCab',\n ICE: 'ICE Browser',\n ICEAPE: 'IceApe',\n ICECAT: 'IceCat',\n ICEDRAGON: 'IceDragon',\n ICEWEASEL: 'IceWeasel',\n IE: 'IE',\n INSTAGRAM: 'Instagram',\n IRIDIUM: 'Iridium',\n IRON: 'Iron',\n JASMINE: 'Jasmine',\n KONQUEROR: 'Konqueror',\n KAKAO: 'KakaoTalk',\n KHTML: 'KHTML',\n K_MELEON: 'K-Meleon',\n KLAR: 'Klar',\n KLARNA: 'Klarna',\n KINDLE: 'Kindle',\n LENOVO: 'Smart Lenovo Browser',\n LADYBIRD: 'Ladybird',\n LG: 'LG Browser',\n LIBREWOLF: 'LibreWolf',\n LIEBAO: 'LBBROWSER',\n LINE: 'Line',\n LINKEDIN: 'LinkedIn',\n LINKS: 'Links',\n LUNASCAPE: 'Lunascape',\n LYNX: 'Lynx',\n MAEMO: 'Maemo Browser',\n MAXTHON: 'Maxthon',\n MIDORI: 'Midori',\n MINIMO: 'Minimo',\n MIUI: 'MIUI Browser',\n MOZILLA: 'Mozilla',\n MOSAIC: 'Mosaic',\n NAVER: 'Naver',\n NETFRONT: 'NetFront',\n NETSCAPE: 'Netscape',\n NETSURF: 'Netsurf',\n NOKIA: 'Nokia Browser',\n OBIGO: 'Obigo',\n OCULUS: 'Oculus Browser',\n OMNIWEB: 'OmniWeb',\n OPERA: 'Opera',\n OPERA_COAST: 'Opera Coast',\n OPERA_GX: 'Opera GX',\n OPERA_MINI: 'Opera Mini',\n OPERA_MOBI: 'Opera Mobi',\n OPERA_TABLET: 'Opera Tablet',\n OPERA_TOUCH: 'Opera Touch',\n OTTER: 'Otter',\n OVI: 'OviBrowser',\n PALEMOON: 'PaleMoon',\n PHANTOMJS: 'PhantomJS',\n PHOENIX: 'Phoenix',\n PICOBROWSER: 'Pico Browser',\n POLARIS: 'Polaris',\n PUFFIN: 'Puffin',\n QQ: 'QQBrowser',\n QQ_LITE: 'QQBrowserLite',\n QUARK: 'Quark',\n QUPZILLA: 'QupZilla',\n QUTEBROWSER: 'qutebrowser',\n QWANT: 'Qwant',\n REKONQ: 'rekonq',\n ROCKMELT: 'Rockmelt',\n SAFARI: 'Safari',\n SAFARI_MOBILE: 'Mobile Safari',\n SAILFISH: 'Sailfish Browser',\n SAMSUNG: 'Samsung Internet',\n SEAMONKEY: 'SeaMonkey',\n SILK: 'Silk',\n SKYFIRE: 'Skyfire',\n SLEIPNIR: 'Sleipnir',\n SLIMBOAT: 'SlimBoat',\n SLIMBROWSER: 'SlimBrowser',\n SLIMJET: 'Slimjet',\n SNAPCHAT: 'Snapchat',\n SOGOU_EXPLORER: 'Sogou Explorer',\n SOGOU_MOBILE: 'Sogou Mobile',\n SURF: 'Surf',\n SWIFTFOX: 'Swiftfox',\n TESLA: 'Tesla',\n TIKTOK: 'TikTok',\n TIZEN: 'Tizen Browser',\n TWITTER: 'Twitter',\n UC: 'UCBrowser',\n UP: 'UP.Browser',\n VIVALDI: 'Vivaldi',\n VIVO: 'Vivo Browser',\n W3M: 'w3m',\n WATERFOX: 'Waterfox',\n WEBKIT: 'WebKit',\n WECHAT: 'WeChat',\n WEIBO: 'Weibo',\n WHALE: 'Whale',\n WOLVIC: 'Wolvic',\n YANDEX: 'Yandex',\n ZALO: 'Zalo'\n\n // TODO : test!\n});\n/**\n * @deprecated Use `BrowserName` instead\n */\nconst Browser = BrowserName;\n\nconst BrowserType = Object.freeze({\n CRAWLER: 'crawler',\n CLI: 'cli',\n EMAIL: 'email',\n FETCHER: 'fetcher',\n INAPP: 'inapp',\n MEDIAPLAYER: 'mediaplayer',\n LIBRARY: 'library'\n});\n\nconst CPUArch = Object.freeze({\n '68K': '68k',\n ALPHA: 'alpha',\n ARM : 'arm',\n ARM_64: 'arm64',\n ARM_HF: 'armhf',\n AVR: 'avr',\n AVR_32: 'avr32',\n IA64: 'ia64',\n IRIX: 'irix',\n IRIX_64: 'irix64',\n MIPS: 'mips',\n MIPS_64: 'mips64',\n PA_RISC: 'pa-risc',\n PPC: 'ppc',\n SPARC: 'sparc',\n SPARC_64: 'sparc64',\n X86: 'ia32',\n X86_64: 'amd64'\n});\n/**\n * @deprecated Use `CPUArch` instead\n */\nconst CPU = CPUArch;\n\nconst DeviceType = Object.freeze({\n CONSOLE: 'console',\n DESKTOP: 'desktop',\n EMBEDDED: 'embedded',\n MOBILE: 'mobile',\n SMARTTV: 'smarttv',\n TABLET: 'tablet',\n WEARABLE: 'wearable',\n XR: 'xr'\n});\n/**\n * @deprecated Use `DeviceType` instead\n */\nconst Device = DeviceType;\n\nconst DeviceVendor = Object.freeze({\n ACER: 'Acer',\n ADVAN: 'Advan',\n ALCATEL: 'Alcatel',\n APPLE: 'Apple',\n AMAZON: 'Amazon',\n ARCHOS: 'Archos',\n ASUS: 'ASUS',\n ATT: 'AT&T',\n BENQ: 'BenQ',\n BLACKBERRY: 'BlackBerry',\n BLU: 'BLU',\n CAT: 'Cat',\n DELL: 'Dell',\n ENERGIZER: 'Energizer',\n ESSENTIAL: 'Essential',\n FACEBOOK: 'Facebook',\n FAIRPHONE: 'Fairphone',\n GEEKSPHONE: 'GeeksPhone',\n GENERIC: 'Generic',\n GOOGLE: 'Google',\n HISENSE: 'Hisense',\n HMD: 'HMD',\n HP: 'HP',\n HTC: 'HTC',\n HUAWEI: 'Huawei',\n IMO: 'IMO',\n INFINIX: 'Infinix',\n ITEL: 'itel',\n JOLLA: 'Jolla',\n KOBO: 'Kobo',\n LAVA: 'Lava',\n LENOVO: 'Lenovo',\n LG: 'LG',\n MEIZU: 'Meizu',\n MICROMAX: 'Micromax',\n MICROSOFT: 'Microsoft',\n MOTOROLA: 'Motorola',\n NEXIAN: 'Nexian',\n NINTENDO: 'Nintendo',\n NOKIA: 'Nokia',\n NOTHING: 'Nothing',\n NVIDIA: 'Nvidia',\n ONEPLUS: 'OnePlus',\n OPPO: 'OPPO',\n OUYA: 'Ouya',\n PALM: 'Palm',\n PANASONIC: 'Panasonic',\n PEBBLE: 'Pebble',\n PHILIPS: 'Philips',\n PICO: 'Pico',\n POLYTRON: 'Polytron',\n REALME: 'Realme',\n RETROID: 'Retroid',\n RIM: 'RIM',\n ROKU: 'Roku',\n SAMSUNG: 'Samsung',\n SHARP: 'Sharp',\n SIEMENS: 'Siemens',\n SMARTFREN: 'Smartfren',\n SONY: 'Sony',\n SPRINT: 'Sprint',\n TCL: 'TCL',\n TECHNISAT: 'TechniSAT',\n TECNO: 'TECNO',\n TESLA: 'Tesla',\n ULEFONE: 'Ulefone',\n VIVO: 'Vivo',\n VIZIO: 'Vizio',\n VODAFONE: 'Vodafone',\n WIKO: 'Wiko',\n XBOX: 'Xbox',\n XIAOMI: 'Xiaomi',\n ZEBRA: 'Zebra',\n ZTE: 'ZTE',\n\n // TODO : test!\n});\n/**\n * @deprecated Use `DeviceVendor` instead\n */\nconst Vendor = DeviceVendor;\n\nconst EngineName = Object.freeze({\n AMAYA: 'Amaya',\n ARKWEB: 'ArkWeb',\n BLINK: 'Blink',\n EDGEHTML: 'EdgeHTML',\n FLOW: 'Flow',\n GECKO: 'Gecko',\n GOANNA: 'Goanna',\n ICAB: 'iCab',\n KHTML: 'KHTML',\n LIBWEB: 'LibWeb',\n LINKS: 'Links',\n LYNX: 'Lynx',\n NETFRONT: 'NetFront',\n NETSURF: 'NetSurf',\n PRESTO: 'Presto',\n SERVO: 'Servo',\n TASMAN: 'Tasman',\n TRIDENT: 'Trident',\n W3M: 'w3m',\n WEBKIT: 'WebKit'\n});\n/**\n * @deprecated Use `EngineName` instead\n */\nconst Engine = EngineName;\n\nconst OSName = Object.freeze({\n AIX: 'AIX',\n AMIGA_OS: 'Amiga OS',\n ANDROID: 'Android',\n ANDROID_X86: 'Android-x86',\n ARCAOS: 'ArcaOS',\n ARCH: 'Arch',\n BADA: 'Bada',\n BEOS: 'BeOS',\n BLACKBERRY: 'BlackBerry',\n CENTOS: 'CentOS',\n CHROME_OS: 'Chrome OS',\n CHROMECAST: 'Chromecast',\n CHROMECAST_ANDROID: 'Chromecast Android',\n CHROMECAST_FUCHSIA: 'Chromecast Fuchsia',\n CHROMECAST_LINUX: 'Chromecast Linux',\n CHROMECAST_SMARTSPEAKER: 'Chromecast SmartSpeaker',\n CONTIKI: 'Contiki',\n DEBIAN: 'Debian',\n DEEPIN: 'Deepin',\n DRAGONFLY: 'DragonFly',\n ELEMENTARY_OS: 'elementary OS',\n FEDORA: 'Fedora',\n FIREFOX_OS: 'Firefox OS',\n FREEBSD: 'FreeBSD',\n FUCHSIA: 'Fuchsia',\n GENTOO: 'Gentoo',\n GHOSTBSD: 'GhostBSD',\n GNU: 'GNU',\n HAIKU: 'Haiku',\n HARMONYOS: 'HarmonyOS',\n HP_UX: 'HP-UX',\n HURD: 'Hurd',\n IOS: 'iOS',\n JOLI: 'Joli',\n KAIOS: 'KaiOS',\n KNOPPIX: 'Knoppix',\n KUBUNTU: 'Kubuntu',\n LINPUS: 'Linpus',\n LINSPIRE: 'Linspire',\n LINUX: 'Linux',\n MACOS: 'macOS',\n MAEMO: 'Maemo',\n MAGEIA: 'Mageia',\n MANDRIVA: 'Mandriva',\n MANJARO: 'Manjaro',\n MEEGO: 'MeeGo',\n MINIX: 'Minix',\n MINT: 'Mint',\n MORPH_OS: 'Morph OS',\n NETBSD: 'NetBSD',\n NETRANGE: 'NetRange',\n NETTV: 'NetTV',\n NINTENDO: 'Nintendo',\n OPENHARMONY: 'OpenHarmony',\n OPENBSD: 'OpenBSD',\n OPENVMS: 'OpenVMS',\n OS2: 'OS/2',\n PALM: 'Palm',\n PC_BSD: 'PC-BSD',\n PCLINUXOS: 'PCLinuxOS',\n PICO: 'Pico',\n PLAN9: 'Plan9',\n PLAYSTATION: 'PlayStation',\n QNX: 'QNX',\n RASPBIAN: 'Raspbian',\n REDHAT: 'RedHat',\n RIM_TABLET_OS: 'RIM Tablet OS',\n RISC_OS: 'RISC OS',\n SABAYON: 'Sabayon',\n SAILFISH: 'Sailfish',\n SERENITYOS: 'SerenityOS',\n SERIES40: 'Series40',\n SLACKWARE: 'Slackware',\n SOLARIS: 'Solaris',\n SUSE: 'SUSE',\n SYMBIAN: 'Symbian',\n TIZEN: 'Tizen',\n UBUNTU: 'Ubuntu',\n UBUNTU_TOUCH: 'Ubuntu Touch',\n UNIX: 'Unix',\n VECTORLINUX: 'VectorLinux',\n WATCHOS: 'watchOS',\n WEBOS: 'WebOS',\n WINDOWS: 'Windows',\n WINDOWS_CE: 'Windows CE',\n WINDOWS_IOT: 'Windows IoT',\n WINDOWS_MOBILE: 'Windows Mobile',\n WINDOWS_PHONE: 'Windows Phone',\n WINDOWS_RT: 'Windows RT',\n XBOX: 'Xbox',\n XUBUNTU: 'Xubuntu',\n ZENWALK: 'Zenwalk'\n\n // TODO : test!\n});\n/**\n * @deprecated Use `OSName` instead\n */\nconst OS = OSName;\n\n/*////////////////////////////////\n * Enums for Extensions submodule\n *///////////////////////////////\n\nconst Extension = Object.freeze({\n BrowserName: {\n CLI: {\n CURL: 'curl',\n ELINKS: 'ELinks',\n HTTPIE: 'HTTPie',\n LYNX: 'Lynx',\n WGET: 'Wget'\n },\n Crawler: {\n AHREFS_BOT: 'AhrefsBot',\n AI2_BOT: 'AI2Bot',\n AIHIT_BOT: 'aiHitBot',\n ALGOLIA_CRAWLER: 'Algolia Crawler',\n APPLE_BOT: 'Applebot',\n APPLE_BOT_EXTENDED: 'Applebot-Extended',\n ASK_TEOMA: 'Teoma',\n AMAZON_BOT: 'Amazonbot',\n AMAZON_CONTXBOT: 'contxbot',\n ANTHROPIC_AI: 'anthropic-ai',\n ANTHROPIC_CLAUDE_BOT: 'ClaudeBot',\n ANTHROPIC_CLAUDE_SEARCHBOT: 'Claude-SearchBot',\n ANTHROPIC_CLAUDE_WEB: 'Claude-Web',\n ARCHIVEORG_BOT: 'archive.org_bot',\n BAIDU_ADS: 'Baidu-ADS',\n BAIDU_SPIDER: 'Baiduspider',\n BAIDU_SPIDER_ADS: 'Baiduspider-ads',\n BAIDU_SPIDER_CPRO: 'Baiduspider-cpro',\n BAIDU_SPIDER_FAVO: 'Baiduspider-favo',\n BAIDU_SPIDER_IMAGE: 'Baiduspider-image',\n BAIDU_SPIDER_NEWS: 'Baiduspider-news',\n BAIDU_SPIDER_RENDER: 'Baiduspider-render',\n BAIDU_SPIDER_VIDEO: 'Baiduspider-video',\n BLEX_BOT: 'BLEXBot',\n BOTIFY: 'botify',\n BRAVE_BOT: 'Bravebot',\n BYTEDANCE_BYTESPIDER: 'Bytespider',\n BYTEDANCE_TIKTOKSPIDER: 'TikTokSpider',\n COMMON_CRAWL_CCBOT: 'CCBot',\n COCCOC_BOT_WEB: 'coccocbot-web',\n COCCOC_BOT_IMAGE: 'coccocbot-image',\n COHERE_TRAINING_DATA_CRAWLER: 'cohere-training-data-crawler',\n COTOYOGI: 'Cotoyogi',\n COVEO_BOT: 'Coveobot',\n CRITEO_BOT: 'CriteoBot',\n DATAFORSEO_BOT: 'DataForSeoBot',\n DAUM: 'Daum',\n DAUM_DAUMOA: 'Daumoa',\n DAUM_DAUMOA_IMAGE: 'Daumoa-image',\n DEEPSEEK_BOT: 'DeepSeekBot',\n DIFFBOT: 'Diffbot',\n DUCKDUCKGO_BOT: 'DuckDuckBot',\n DUCKDUCKGO_FAVICONS_BOT: 'DuckDuckGo-Favicons-Bot',\n ELASTIC: 'Elastic',\n ELASTIC_SWIFTYPE_BOT: 'Swiftbot',\n EXALEAD_EXABOT: 'Exabot',\n FIRECRAWL_AGENT: 'FirecrawlAgent',\n FREESPOKE: 'Freespoke',\n GOOGLE_ADSBOT: 'AdsBot-Google',\n GOOGLE_ADSBOT_MOBILE: 'Adsbot-Google-Mobile',\n GOOGLE_ADSENSE: 'AdSense',\n GOOGLE_APIS: 'APIs-Google',\n GOOGLE_BOT: 'Googlebot',\n GOOGLE_BOT_IMAGE: 'Googlebot-Image',\n GOOGLE_BOT_NEWS: 'Googlebot-News',\n GOOGLE_BOT_VIDEO: 'Googlebot-Video',\n GOOGLE_CLOUDVERTEXBOT: 'Google-CloudVertexBot',\n GOOGLE_EXTENDED: 'Google-Extended',\n GOOGLE_INSPECTIONTOOL: 'Google-InspectionTool',\n GOOGLE_OTHER: 'GoogleOther',\n GOOGLE_OTHER_IMAGE: 'GoogleOther-Image',\n GOOGLE_OTHER_VIDEO: 'GoogleOther-Video',\n GOOGLE_SAFETY: 'Google-Safety',\n GOOGLE_STOREBOT: 'Storebot-Google',\n HIVE_IMAGESIFTBOT: 'ImagesiftBot',\n HUAWEI_PANGUBOT: 'PanguBot',\n HUAWEI_PETALBOT: 'PetalBot',\n HUGGINGFACE_BOT: 'HuggingFace-Bot',\n HUNTER_VELENPUBLICWEBCRAWLER: 'VelenPublicWebCrawler',\n IA_ARCHIVER: 'ia_archiver',\n IASK_BOT: 'iAskBot',\n KAGI_BOT: 'Kagibot',\n KANGAROO_BOT: 'Kangaroo Bot',\n LINE_SPIDER: 'Linespider',\n LINKEDIN_BOT: 'LinkedInBot',\n MAGPIE_CRAWLER: 'magpie-crawler',\n MARGINALIA: 'marginalia',\n META_EXTERNALAGENT: 'meta-externalagent',\n META_FACEBOOKBOT: 'FacebookBot',\n META_FACEBOOKCATALOG: 'facebookcatalog',\n META_FACEBOOKEXTERNALHIT: 'facebookexternalhit',\n MAJESTIC_MJ12BOT: 'MJ12bot',\n MICROSOFT_BINGBOT: 'Bingbot',\n MICROSOFT_MSNBOT: 'msnbot',\n MICROSOFT_ADIDXBOT: 'adidxbot',\n MOJEEK_BOT: 'MojeekBot',\n MOZ_DOTBOT: 'DotBot',\n ONCRAWL: 'OnCrawl',\n ONESPOT_SCRAPERBOT: 'Onespot-ScraperBot',\n OPENAI_GPTBOT: 'GPTBot',\n OPENAI_SEARCH_BOT: 'OAI-SearchBot',\n PERPLEXITY_BOT: 'PerplexityBot',\n QIHOO_360_SPIDER: '360Spider',\n QWANT_BOT: 'Qwantbot',\n QWANT_BOT_NEWS: 'Qwantbot-news',\n REPLICATE_BOT: 'Replicate-Bot',\n RUNPOD_BOT: 'RunPod-Bot',\n SB_INTUITIONS_BOT: 'SBIntuitionsBot',\n SEEKPORT_BOT: 'SeekportBot',\n SEMRUSH_BOT: 'SemrushBot',\n SEMRUSH_BOT_BACKLINK: 'SemrushBot-BA',\n SEMRUSH_BOT_CONTENTSHAKE: 'SemrushBot-OCOB',\n SEMRUSH_BOT_SEO_CHECKER: 'SemrushBot-SI',\n SEZNAM_BOT: 'SeznamBot',\n SITEIMPROVE: 'Siteimprove',\n SOGOU_PIC_SPIDER: 'Sogou Pic Spider',\n SOGOU_WEB_SPIDER: 'Sogou web spider',\n STARTPAGE: 'Startpage',\n SURLY_BOT: 'SurdotlyBot',\n TIMPI_BOT: 'Timpibot',\n TOGETHER_BOT: 'Together-Bot',\n TURNITIN_BOT: 'TurnitinBot',\n TWIN_AGENT: 'TwinAgent',\n VERCEL_V0BOT: 'v0bot',\n WEBZIO: 'webzio',\n WEBZIO_EXTENDED: 'Webzio-Extended',\n WEBZIO_OMGILI: 'omgili',\n WEBZIO_OMGILI_BOT: 'omgilibot',\n XAI_BOT: 'xAI-Bot',\n YAHOO_JAPAN: 'Y!J-BRW',\n YAHOO_SLURP: 'Yahoo! Slurp',\n YANDEX_ACCESSIBILITY_BOT: 'YandexAccessibilityBot',\n YANDEX_ADDITIONAL_BOT: 'YandexAdditionalBot',\n YANDEX_ADNET: 'YandexAdNet',\n YANDEX_BLOGS: 'YandexBlogs',\n YANDEX_BOT: 'YandexBot',\n YANDEX_BOT_MIRRORDETECTOR: 'YandexBot MirrorDetector',\n YANDEX_COMBOT: 'YandexComBot',\n YANDEX_FAVICONS: 'YandexFavicons',\n YANDEX_IMAGE_RESIZER: 'YandexImageResizer',\n YANDEX_IMAGES: 'YandexImages',\n YANDEX_MARKET: 'YandexMarket',\n YANDEX_MEDIA: 'YandexMedia',\n YANDEX_METRIKA: 'YandexMetrika',\n YANDEX_MOBILE_BOT: 'YandexMobileBot',\n YANDEX_MOBILE_SCREENSHOT_BOT: 'YandexMobileScreenShotBot',\n YANDEX_NEWS: 'YandexNews',\n YANDEX_ONTODB: 'YandexOntoDB',\n YANDEX_ONTODB_API: 'YandexOntoDBAPI',\n YANDEX_PARTNER: 'YandexPartner',\n YANDEX_RCA: 'YandexRCA',\n YANDEX_RENDERRESOURCES_BOT: 'YandexRenderResourcesBot',\n YANDEX_SCREENSHOT_BOT: 'YandexScreenshotBot',\n YANDEX_SPRAV_BOT: 'YandexSpravBot',\n YANDEX_TRACKER: 'YandexTracker',\n YANDEX_VERTICALS: 'YandexVerticals',\n YANDEX_VERTIS: 'YandexVertis',\n YANDEX_VIDEO: 'YandexVideo',\n YANDEX_VIDEO_PARSER: 'YandexVideoParser',\n YANDEX_WEBMASTER: 'YandexWebmaster',\n YEP_BOT: 'YepBot',\n YETI: 'Yeti',\n YISOU_SPIDER: 'YisouSpider',\n YOU_BOT: 'YouBot',\n ZHIPU_CHATGLM_SPIDER: 'ChatGLM-Spider',\n ZUM_BOT: 'ZumBot'\n },\n Email: {\n AIRMAIL: 'Airmail',\n APPLE_MAIL: 'Mail',\n BLUEMAIL: 'BlueMail',\n DAUM_MAIL: 'DaumMail',\n EVOLUTION: 'Evolution',\n EM_CLIENT: 'eM Client',\n FOXMAIL: 'Foxmail',\n KMAIL: 'KMail',\n KMAIL2: 'kmail2',\n KONTACT: 'Kontact',\n MICROSOFT_OUTLOOK: 'Microsoft Outlook',\n MICROSOFT_OUTLOOK_MAC: 'MacOutlook',\n NAVER_MAILAPP: 'NaverMailApp',\n POLYMAIL: 'Polymail',\n PROTON_MAIL: 'ProtonMail',\n SPARK_MAIL: 'SparkDesktop',\n SPARROW: 'Sparrow',\n THUNDERBIRD: 'Thunderbird',\n YAHOO_MAIL: 'Yahoo',\n ZIMBRA: 'Zimbra',\n ZOHO_MAIL: 'ZohoMail-Desktop'\n },\n Fetcher: {\n AHREFS_SITEAUDIT: 'AhrefsSiteAudit',\n ANTHROPIC_CLAUDE_USER: 'Claude-User',\n ASANA: 'Asana',\n BETTER_UPTIME_BOT: 'Better Uptime Bot',\n BITLY_BOT: 'bitlybot',\n BLUESKY: 'Bluesky',\n BUFFER_LINKPREVIEWBOT: 'BufferLinkPreviewBot',\n COHERE_AI: 'Cohere-AI',\n DISCORD_BOT: 'Discordbot',\n DUCKDUCKGO_ASSISTBOT: 'DuckAssistBot',\n GOOGLE_CHROME_LIGHTHOUSE: 'Chrome-Lighthouse',\n GOOGLE_FEEDFETCHER: 'FeedFetcher-Google',\n GOOGLE_GEMINI_DEEP_RESEARCH: 'Gemini-Deep-Research',\n GOOGLE_IMAGEPROXY: 'GoogleImageProxy',\n GOOGLE_PAGERENDERER: 'Google-PageRenderer',\n GOOGLE_READ_ALOUD: 'Google-Read-Aloud',\n GOOGLE_PRODUCER: 'GoogleProducer',\n GOOGLE_SITE_VERIFICATION: 'Google-Site-Verification',\n HUBSPOT_PAGE_FETCHER: 'HubSpot Page Fetcher',\n IFRAMELY: 'Iframely',\n KAKAOTALK_SCRAP: 'kakaotalk-scrap',\n KEYBASE_BOT: 'KeybaseBot',\n META_EXTERNALFETCHER: 'meta-externalfetcher',\n META_WHATSAPP: 'WhatsApp',\n MICROSOFT_BINGPREVIEW: 'BingPreview',\n MICROSOFT_PREVIEW: 'MicrosoftPreview',\n MISTRALAI_USER: 'MistralAI-User',\n NAVER_BLUENO: 'Blueno',\n ONCRAWL_ROGERBOT: 'rogerbot',\n OPENAI_CHATGPT_USER: 'ChatGPT-User',\n PERPLEXITY_USER: 'Perplexity-User',\n PINTEREST_BOT: 'Pinterestbot',\n SEMRUSH_SITEAUDITBOT: 'SiteAuditBot',\n SLACK_BOT: 'Slackbot',\n SLACK_BOT_LINKEXPANDING: 'Slackbot-LinkExpanding',\n SLACK_IMGPROXY: 'Slack-ImgProxy',\n SNAP_URL_PREVIEW: 'Snap URL Preview',\n SKYPE_URIPREVIEW: 'SkypeUriPreview',\n TELEGRAM_BOT: 'TelegramBot',\n UPTIMEROBOT: 'UptimeRobot',\n VERCEL_FAVICON_BOT: 'vercel-favicon-bot',\n VERCEL_SCREENSHOT_BOT: 'vercel-screenshot-bot',\n VERCEL_BOT: 'Vercelbot',\n VERCEL_FLAGS: 'vercelflags',\n VERCEL_TRACING: 'verceltracing',\n X_TWITTERBOT: 'Twitterbot',\n YANDEX_CALENDAR: 'YandexCalendar',\n YANDEX_DIRECT: 'YandexDirect',\n YANDEX_DIRECTDYN: 'YandexDirectDyn',\n YANDEX_DIRECTFETCHER: 'YaDirectFetcher',\n YANDEX_FORDOMAIN: 'YandexForDomain',\n YANDEX_PAGECHECKER: 'YandexPagechecker',\n YANDEX_SEARCHSHOP: 'YandexSearchShop',\n YANDEX_SITELINKS: 'YandexSitelinks',\n YANDEX_USERPROXY: 'YandexUserproxy',\n ZOOMINFO_BOT: 'Zoombot'\n },\n InApp: {\n DISCORD: 'Discord',\n EVERNOTE: 'Evernote',\n FIGMA: 'Figma',\n FLIPBOARD: 'Flipboard',\n MATTERMOST: 'Mattermost',\n TEAMS: 'Teams',\n NOTION: 'Notion',\n POSTMAN: 'Postman',\n RAMBOX: 'Rambox',\n ROCKETCHAT: 'Rocket.Chat',\n SLACK: 'Slack',\n TIKTOK_LITE: 'TikTok Lite',\n VSCODE: 'VS Code',\n YAHOO_JAPAN: 'Yahoo! Japan'\n },\n Library: {\n ADOBE_AIR: 'AdobeAIR',\n AIOHTTP: 'aiohttp',\n APACHE_HTTPCLIENT: 'Apache-HttpClient',\n AXIOS: 'axios',\n GO_HTTP_CLIENT: 'go-http-client',\n GOT: 'got',\n GUZZLEHTTP: 'GuzzleHttp',\n JAVA: 'Java',\n JAVA_HTTPCLIENT: 'Java-http-client',\n JSDOM: 'jsdom',\n LIBWWW_PERL: 'libwww-perl',\n LUA_RESTY_HTTP: 'lua-resty-http',\n NEEDLE: 'Needle',\n NUTCH: 'Nutch',\n OKHTTP: 'OkHttp',\n NODE_FETCH: 'node-fetch',\n NODE_SUPERAGENT: 'node-superagent',\n PHP_SOAP: 'PHP-SOAP',\n POSTMAN_RUNTIME: 'PostmanRuntime',\n PYTHON_HTTPX: 'python-httpx',\n PYTHON_URLLIB: 'python-urllib',\n PYTHON_URLLIB3: 'python-urllib3',\n PYTHON_REQUESTS: 'python-requests',\n SCRAPY: 'Scrapy'\n }\n },\n DeviceVendor: {\n Vehicle: {\n BMW: 'BMW',\n BYD: 'BYD',\n JEEP: 'Jeep',\n RIVIAN: 'Rivian',\n TESLA: 'Tesla',\n VOLVO: 'Volvo'\n }\n }\n});\n\nexport { \n Browser,// deprecated\n CPU, // deprecated\n Device, // deprecated\n Vendor, // deprecated\n Engine, // deprecated\n OS, // deprecated\n BrowserName,\n BrowserType, \n CPUArch,\n DeviceType, \n DeviceVendor,\n EngineName,\n OSName,\n Extension\n};", "// Generated ESM version of ua-parser-js/extensions\n// DO NOT EDIT THIS FILE!\n// Source: /src/extensions/ua-parser-extensions.js\n\n///////////////////////////////////////////////\n/* Extensions for UAParser.js v2.0.6\n https://github.com/faisalman/ua-parser-js\n Author: Faisal Salman <f@faisalman.com>\n UAParser.js PRO Enterprise License */\n//////////////////////////////////////////////\n\n/*jshint esversion: 6 */ \n\nconst MODEL = 'model';\nconst NAME = 'name';\nconst TYPE = 'type';\nconst VENDOR = 'vendor';\nconst VERSION = 'version';\nconst MOBILE = 'mobile';\nconst TABLET = 'tablet';\nconst CRAWLER = 'crawler';\nconst CLI = 'cli';\nconst EMAIL = 'email';\nconst FETCHER = 'fetcher';\nconst INAPP = 'inapp';\nconst MEDIAPLAYER = 'mediaplayer';\nconst LIBRARY = 'library';\n\n//////////////////////\n// COMMAND LINE APPS\n/////////////////////\n\nconst CLIs = Object.freeze({\n browser : [\n // wget / curl / Lynx / ELinks / HTTPie\n [/(wget|curl|lynx|elinks|httpie)[\\/ ]\\(?([\\w\\.-]+)/i], [NAME, VERSION, [TYPE, CLI]]\n ]\n});\n\n////////////////////////\n// CRAWLERS / SPIDERS\n///////////////////////\n\nconst Crawlers = Object.freeze({\n browser : [\n [\n // AhrefsBot - https://ahrefs.com/robot\n // Amazonbot - https://developer.amazon.com/amazonbot\n // Bingbot / AdIdxBot - https://www.bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0\n // Bravebot - https://search.brave.com/help/brave-search-crawler\n // CCBot - https://commoncrawl.org/faq\n // contxbot - https://affiliate-program.amazon.com/help/node/topic/GT98G5PPRERNVZ2C\n // Coveobot - https://connect.coveo.com/s/article/19648\n // CriteoBot - https://www.criteo.com/criteo-crawler/\n // Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot\n // DuckDuckBot - http://duckduckgo.com/duckduckbot.html\n // FacebookBot - https://developers.facebook.com/docs/sharing/bot/\n // GPTBot - https://platform.openai.com/docs/gptbot\n // iAskBot - https://iask.ai\n // Kagibot - https://kagi.com/bot\n // Kangaroo Bot - https://kangaroollm.com.au/kangaroo-bot/\n // LinkedInBot - http://www.linkedin.com\n // MJ12bot - https://mj12bot.com/\n // MojeekBot - https://www.mojeek.com/bot.html\n // Onespot - https://www.onespot.com/identifying-traffic.html\n // OpenAI's SearchGPT - https://platform.openai.com/docs/bots\n // PerplexityBot - https://perplexity.ai/perplexitybot\n // SBIntuitionsBot - https://www.sbintuitions.co.jp/bot/\n // SeznamBot - http://napoveda.seznam.cz/seznambot-intro\n // SurdotlyBot - http://sur.ly/bot.html\n // Swiftbot - https://swiftype.com/swiftbot\n // YepBot - https://yep.com/yepbot/\n /((?:adidx|ahrefs|amazon|bing|brave|cc|contx|coveo|criteo|dot|duckduck(?:go-favicons-)?|exa|facebook|gpt|iask|kagi|kangaroo |linkedin|mj12|mojeek|oai-search|onespot-scraper|perplexity|sbintuitions|semrush|seznam|surdotly|swift|yep)bot)\\/([\\w\\.-]+)/i,\n\n // Algolia Crawler\n /(algolia crawler(?: renderscript)?)\\/?([\\w\\.]*)/i,\n\n // Applebot - http://apple.com/go/applebot\n /(applebot(?:-extended)?)\\/?([\\w\\.]*)/i,\n\n // Baiduspider https://help.baidu.com/question?prod_id=99&class=0&id=3001\n /(baiduspider[-imagevdonwsfcpr]{0,7})\\/?([\\w\\.]*)/i,\n\n // ClaudeBot (Anthropic)\n /(claude(?:bot|-searchbot|-web)|anthropic-ai)\\/?([\\w\\.]*)/i, \n\n // Coc Coc Bot - https://help.coccoc.com/en/search-engine\n /(coccocbot-(?:image|web))\\/([\\w\\.]+)/i, \n\n // Daum\n /(daum(?:oa)?(?:-image)?)[ \\/]([\\w\\.]+)/i,\n\n // Facebook / Meta \n // https://developers.facebook.com/docs/sharing/webmasters/web-crawlers\n /(facebook(?:externalhit|catalog)|meta-externalagent)\\/([\\w\\.]+)/i,\n\n // Googlebot - http://www.google.com/bot.html\n /(google(?:bot|other|-inspectiontool)(?:-image|-video|-news)?|storebot-google)\\/?([\\w\\.]*)/i, \n\n // Internet Archive (archive.org)\n /(ia_archiver|archive\\.org_bot)\\/?([\\w\\.]*)/i,\n\n // OnCrawl\n /(oncrawl) mobile\\/([\\w\\.]+)/i,\n\n // Qwantbot - https://help.qwant.com/bot\n /(qwantbot(?:-news)?)[-\\w]*\\/?([\\w\\.]*)/i,\n\n // SemrushBot - http://www.semrush.com/bot.html\n /((?:semrush|splitsignal)bot[-abcfimostw]*)\\/?([\\w\\.-]*)/i,\n\n // Sogou Spider\n /(sogou (?:pic|head|web|orion|news) spider)\\/([\\w\\.]+)/i, \n\n // Yahoo! Japan - https://support.yahoo-net.jp/PccSearch/s/article/H000007955\n /(y!?j-(?:asr|br[uw]|dscv|mmp|vsidx|wsc))\\/([\\w\\.]+)/i, \n\n // Yandex Bots - https://yandex.com/bots\n /(yandex(?:(?:mobile)?(?:accessibility|additional|com|renderresources|screenshot|sprav)?bot(?!.+mirror)|image(?:s|resizer)|adnet|blogs|favicons|market|media|metrika|news|ontodb(?:api)?|partner|rca|tracker|turbo|verti(?:cal)?s|webmaster|video(?:parser)?))\\/([\\w\\.]+)/i,\n\n // Yeti (Naver)\n /(yeti)\\/([\\w\\.]+)/i,\n\n // aiHitBot / Algolia Crawler / BLEXBot / Diffbot / FirecrawlAgent / HuggingFace-Bot / Linespider / MSNBot / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / PanguBot / Replicate-Bot / RunPod-Bot / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / Together-Bot / VelenPublicWebCrawler / xAI-Bot / YisouSpider / YouBot / ZumBot\n // Cotoyogi - https://ds.rois.ac.jp/en_center8/en_crawler/\n // Freespoke - https://docs.freespoke.com/search/bot/\n /((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cotoyogi|firecrawlagent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|twinagent|webzio-extended)\\/?([\\w\\.]*)/i\n ],\n [NAME, VERSION, [TYPE, CRAWLER]],\n\n [\n // YandexBot MirrorDetector\n /(yandexbot\\/([\\w\\.]+); mirrordetector)/i\n ],\n [[NAME, /\\/.+;/ig, ''], VERSION, [TYPE, CRAWLER]],\n\n [\n // Google Bots\n /((?:adsbot|apis|mediapartners)-google(?:-mobile)?|google-?(?:other|cloudvertexbot|extended|safety))/i,\n\n // AI2Bot - https://allenai.org/crawler\n // DataForSeoBot - https://dataforseo.com/dataforseo-bot\n // Huawei AspiegelBot / PetalBot https://aspiegel.com/petalbot\n // ImagesiftBot - https://imagesift.com/about\n // Siteimprove - https://help.siteimprove.com/support/solutions/articles/80000448553\n // TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html\n // v0bot - https://vercel.com/docs/bot-management\n // Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp\n // Botify / Bytespider / DeepSeekBot / Qihoo 360Spider / SeekportBot / TikTokSpider\n /\\b((ai2|aspiegel|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\\/s)|marginalia|siteimprove(?=bot|\\.com)|teoma|webzio|yahoo! slurp)/i\n ], \n [NAME, [TYPE, CRAWLER]]\n ]\n});\n\n//////////////////\n// EXTRA DEVICES\n/////////////////\n\nconst ExtraDevices = Object.freeze({\n device : [[ \n /(nook)[\\w ]+build\\/(\\w+)/i, // Nook\n /(dell) (strea[kpr\\d ]*[\\dko])/i, // Dell Streak\n /(le[- ]+pan)[- ]+(\\w{1,9}) bui/i, // Le Pan Tablets\n /(trinity)[- ]*(t\\d{3}) bui/i, // Trinity Tablets\n /(gigaset)[- ]+(q\\w{1,9}) bui/i, // Gigaset Tablets\n /(vodafone) ([\\w ]+)(?:\\)| bui)/i // Vodafone\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(u304aa)/i // AT&T\n ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [\n\n /\\bsie-(\\w*)/i // Siemens\n ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [\n\n /\\b(rct\\w+) b/i // RCA Tablets\n ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [\n\n /\\b(venue[\\d ]{2,7}) b/i // Dell Venue Tablets\n ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [\n\n /\\b(q(?:mv|ta)\\w+) b/i // Verizon Tablet\n ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [\n\n /\\b(?:barnes[& ]+noble |bn[rt])([\\w\\+ ]*) b/i // Barnes & Noble Tablet\n ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [\n\n /\\b(tm\\d{3}\\w+) b/i\n ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [\n\n /\\b(k88) b/i // ZTE K Series Tablet\n ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [\n\n /\\b(nx\\d{3}j) b/i // ZTE Nubia\n ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [\n\n /\\b(gen\\d{3}) b.+49h/i // Swiss GEN Mobile\n ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [\n\n /\\b(zur\\d{3}) b/i // Swiss ZUR Tablet\n ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [\n\n /^((zeki)?tb.*\\b) b/i // Zeki Tablets\n ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [\n\n /\\b([yr]\\d{2}) b/i,\n /\\b(?:dragon[- ]+touch |dt)(\\w{5}) b/i // Dragon Touch Tablet\n ], [MODEL, [VENDOR, 'Dragon Touch'], [TYPE, TABLET]], [\n\n /\\b(ns-?\\w{0,9}) b/i // Insignia Tablets\n ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [\n\n /\\b((nxa|next)-?\\w{0,9}) b/i // NextBook Tablets\n ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [\n\n /\\b(xtreme\\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i // Voice Xtreme Phones\n ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [\n\n /\\b(lvtel\\-)?(v1[12]) b/i // LvTel Phones\n ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [\n\n /\\b(ph-1) /i // Essential PH-1\n ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [\n\n /\\b(v(100md|700na|7011|917g).*\\b) b/i // Envizen Tablets\n ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [\n\n /\\b(trio[-\\w\\. ]+) b/i // MachSpeed Tablets\n ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [\n\n /\\btu_(1491) b/i // Rotor Tablets\n ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]]\n ]\n});\n\n///////////////\n// EMAIL APPS\n//////////////\n\nconst Emails = Object.freeze({\n browser : [\n [\n // Evolution / Kontact/KMail[2] / [Microsoft/Mac] Outlook / Thunderbird\n // Airmail / BlueMail / DaumMail / eMClient / Foxmail / NaverMailApp / Polymail\n // ProtonMail / SparkDesktop / Sparrow / Yahoo! Mail / Zimbra / ZohoMail-Desktop\n /((?:air|blue|daum|fox|poly|proton)mail|emclient|evolution|kmail2?|kontact|(?:microsoft |mac)?outlook(?:-express)?|navermailapp|(?!chrom.+)sparrow|sparkdesktop|thunderbird|yahoo|zohomail-desktop)(?:m.+ail; |[\\/ ])([\\w\\.]+)/i,\n\n // Apple's Mail\n /(mail)\\/([\\w\\.]+) cf/i\n ], [NAME, VERSION, [TYPE, EMAIL]], [\n \n // Zimbra\n /zdesktop\\/([\\w\\.]+)/i\n ], [VERSION, [NAME, 'Zimbra'], [TYPE, EMAIL]]\n ]\n});\n\n///////////////////////\n// ON-DEMAND SCRAPERS\n//////////////////////\n\nconst Fetchers = Object.freeze({\n browser : [\n [\n // Asana / Bitlybot / Better Uptime / BingPreview / Blueno / Cohere-AI / HubSpot Page Fetcher / kakaotalk-scrap / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot\n // AhrefsSiteAudit - https://ahrefs.com/robot/site-audit\n // Buffer Link Preview Bot - https://scraper.buffer.com/about/bots/link-preview-bot\n // ChatGPT-User - https://platform.openai.com/docs/plugins/bot\n // DuckAssistBot - https://duckduckgo.com/duckassistbot/\n // Google Site Verifier / Meta / Yahoo! Japan\n // Iframely - https://iframely.com/docs/about\n // Perplexity-User - https://docs.perplexity.ai/guides/bots\n // MistralAI-User - https://docs.mistral.ai/robots/\n // Yandex Bots - https://yandex.com/bots\n /(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:chatgpt|claude|mistralai|perplexity)-user|cohere-ai|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher)\\/([\\w\\.]+)/i,\n\n // Bluesky\n /(bluesky) cardyb\\/([\\w\\.]+)/i,\n\n // Skype\n /(skypeuripreview) preview\\/([\\w\\.]+)/i,\n\n // Slackbot - https://api.slack.com/robots\n /(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\\w\\.]+)/i,\n \n // WhatsApp\n /(whatsapp)\\/([\\w\\.]+)/i\n ], \n [NAME, VERSION, [TYPE, FETCHER]],\n\n [\n // Google Bots / Chrome-Lighthouse / Gemini-Deep-Research / KeybaseBot / Snapchat / Vercelbot / Yandex Bots\n /((?:better uptime |keybase|telegram|vercel)bot|chrome-lighthouse|feedfetcher-google|gemini-deep-research|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|yandex(?:sitelinks|userproxy))/i\n ], \n [NAME, [TYPE, FETCHER]],\n ],\n\n os : [\n [/whatsapp\\/[\\d\\.]+ (a|i)/i],\n [[NAME, os => os == 'A' ? 'Android' : 'iOS' ]]\n ]\n});\n\n////////////////////\n// IN-APP BROWSERS\n///////////////////\n\nconst InApps = Object.freeze({\n browser : [[\n // Discord/Figma/Flipboard/Mattermost/Notion/Postman/Rambox/Rocket.Chat/Slack/Teams\n /\\b(discord|figma|mattermost|notion|postman|rambox|rocket.chat|slack|teams)\\/([\\w\\.]+).+(electron\\/|; ios)/i,\n /(flipboard)\\/([\\w\\.]+)/i\n ], [NAME, VERSION, [TYPE, INAPP]], [\n\n // Evernote/Teams on mobile\n /(evernote) win/i,\n /(teams)mobile-(ios|and)/i\n ], [NAME, [TYPE, INAPP]], [\n\n // Slack\n /chatlyio\\/([\\d\\.]+)/i], \n [VERSION, [NAME, 'Slack'], [TYPE, INAPP]], [\n\n // TikTok Lite\n /ultralite app_version\\/([\\w\\.]+)/i], \n [VERSION, [NAME, 'TikTok Lite'], [TYPE, INAPP]], [\n\n // VS Code\n /\\) code\\/([\\d\\.]+).+electron\\//i], \n [VERSION, [NAME, 'VS Code'], [TYPE, INAPP]], [\n\n // Yahoo! Japan\n /jp\\.co\\.yahoo\\.(?:android\\.yjtop|ipn\\.appli)\\/([\\d\\.]+)/i], \n [VERSION, [NAME, 'Yahoo! Japan'], [TYPE, INAPP]]\n ]\n});\n\n//////////////////////\n// MEDIA PLAYER APPS\n/////////////////////\n\nconst MediaPlayers = Object.freeze({\n browser : [[\n /(apple(?:coremedia|tv))\\/([\\w\\._]+)/i, // Generic Apple CoreMedia\n /(coremedia) v([\\w\\._]+)/i, \n // Ares/Nexplayer/OSSProxy\n /(ares|clementine|music player daemon|nexplayer|ossproxy) ([\\w\\.-]+)/i, \n // Aqualung/Lyssna/BSPlayer/Clementine/MPD\n // Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/GnomeMplayer/MoC\n // NSPlayer/PSP-InternetRadioPlayer/Videos\n // Nero Home/Nero Scout/Nokia\n // QuickTime/RealMedia/RadioApp/RadioClientApplication/\n // SoundTap/Totem/Stagefright/Streamium\n // XBMC/gvfs/Xine/XMMS/irapp\n /^(aqualung|audacious|audimusicstream|amarok|bass|bsplayer|core|gnomemplayer|gvfs|irapp|lyssna|music on console|nero (?:home|scout)|nokia\\d+|nsplayer|psp-internetradioplayer|quicktime|rma|radioapp|radioclientapplication|soundtap|stagefright|streamium|totem|videos|xbmc|xine|xmms)\\/([\\w\\.-]+)/i,\n /(lg player|nexplayer) ([\\d\\.]+)/i,\n /player\\/(nexplayer|lg player) ([\\w\\.-]+)/i, // NexPlayer/LG Player\n /(gstreamer) souphttpsrc.+libsoup\\/([\\w\\.-]+)/i, // Gstreamer\n /(htc streaming player) [\\w_]+ \\/ ([\\d\\.]+)/i, // HTC Streaming Player\n /(lavf)([\\d\\.]+)/i, // Lavf (FFMPEG)\n // MPlayer SVN\n /(mplayer)(?: |\\/)(?:(?:sherpya-){0,1}svn)(?:-| )(r\\d+(?:-\\d+[\\w\\.-]+))/i,\n / (songbird)\\/([\\w\\.-]+)/i, // Songbird/Philips-Songbird\n /(winamp)(?:3 version|mpeg| ) ([\\w\\.-]+)/i, // Winamp\n /(vlc)(?:\\/| media player - version )([\\w\\.-]+)/i, // VLC Videolan\n /^(foobar2000|itunes|smp)\\/([\\d\\.]+)/i, // Foobar2000/iTunes/SMP\n /com\\.(riseupradioalarm)\\/([\\d\\.]*)/i, // RiseUP Radio Alarm\n /(mplayer)(?:\\s|\\/| unknown-)([\\w\\.\\-]+)/i, // MPlayer\n // Windows Media Server\n /(windows)\\/([\\w\\.-]+) upnp\\/[\\d\\.]+ dlnadoc\\/[\\d\\.]+ home media server/i\n ], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [\n\n /(flrp)\\/([\\w\\.-]+)/i // Flip Player\n ], [[NAME, 'Flip Player'], VERSION, [TYPE, MEDIAPLAYER]], [\n // FStream/NativeHost/QuerySeekSpider\n // MPlayer (no other info)/Media Player Classic/Nero ShowTime\n // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)\n // inlight radio / YourMuze\n /(fstream|media player classic|inlight radio|mplayer|nativehost|nero showtime|ocms-bot|queryseekspider|tapinradio|tunein radio|winamp|yourmuze)/i \n ], [NAME, [TYPE, MEDIAPLAYER]], [\n\n /(htc_one_s|windows-media-player|wmplayer)\\/([\\w\\.-]+)/i, // HTC One S / Windows Media Player\n ], [[NAME, /[_-]/g, ' '], VERSION, [TYPE, MEDIAPLAYER]], [\n\n /(rad.io|radio.(?:de|at|fr)) ([\\d\\.]+)/i // Rad.io\n ], [[NAME, 'rad.io'], VERSION, [TYPE, MEDIAPLAYER]]\n ]\n});\n\n/////////////\n// LIBRARIES\n//////////////\n\nconst Libraries = Object.freeze({\n browser : [\n // Apache-HttpClient/Axios/go-http-client/got/GuzzleHttp/Java[-HttpClient]/jsdom/libwww-perl/lua-resty-http/Needle/node-fetch/OkHttp/PHP-SOAP/PostmanRuntime/python-urllib/python-requests/Scrapy/superagent\n [\n /^(apache-httpclient|axios|(?:go|java)-http-client|got|guzzlehttp|java|libwww-perl|lua-resty-http|needle|node-(?:fetch|superagent)|okhttp|php-soap|postmanruntime|python-(?:httpx|urllib[23]?|requests)|scrapy)\\/([\\w\\.]+)/i,\n /(adobeair|aiohttp|jsdom)\\/([\\w\\.]+)/i,\n /(nutch)-([\\w\\.-]+)(\\(|$)/i,\n /\\((java)\\/([\\w\\.]+)/i\n ], [NAME, VERSION, [TYPE, LIBRARY]]\n ]\n});\n\n/////////////\n// VEHICLES\n////////////\n\nconst Vehicles = Object.freeze({\n device : [\n [/aftlbt962e2/i], // BMW\n [[VENDOR, 'BMW']],\n\n [/dilink.+(byd) auto/i], // BYD\n [VENDOR],\n\n [/aftlft962x3/i], // Jeep\n [[VENDOR, 'Jeep'], [MODEL, 'Wagooner']],\n \n [/(rivian) (r1t)/i], // Rivian\n [VENDOR, MODEL],\n\n [/vcc.+netfront/i], // Volvo\n [[VENDOR, 'Volvo']]\n ]\n});\n\n//////////\n// BOTS\n/////////\n\nconst Bots = Object.freeze({\n browser : [\n ...CLIs.browser,\n ...Fetchers.browser,\n ...Crawlers.browser,\n ...Libraries.browser\n ],\n os : [\n ...Fetchers.os\n ]\n});\n\nexport { \n Bots,\n CLIs,\n Crawlers,\n ExtraDevices,\n Emails,\n Fetchers,\n InApps,\n Libraries,\n MediaPlayers,\n Vehicles\n};", "/*! detectEurope.js v0.1.2\n Determine whether a user is from the European Union (EU) area\n https://github.com/faisalman/detect-europe-js\n Author: Faisal Salman <f@faisalman.com>\n MIT License */\nconst TIMEZONE = {\n ANDORRA: {\n ANDORRA: 'Europe/Andorra'\n },\n AUSTRIA: {\n VIENNA: 'Europe/Vienna'\n },\n BELGIUM: {\n BRUSSELS: 'Europe/Brussels'\n },\n BULGARIA: {\n SOFIA: 'Europe/Sofia'\n },\n CROATIA: {\n ZAGREB: 'Europe/Zagreb'\n },\n CYPRUS: {\n NICOSIA_EUROPE: 'Europe/Nicosia',\n NICOSIA_ASIA: 'Asia/Nicosia',\n FAMAGUSTA: 'Asia/Famagusta'\n },\n CZECHIA: {\n PRAGUE: 'Europe/Prague'\n },\n DENMARK: {\n COPENHAGEN: 'Europe/Copenhagen',\n FAROE: 'Atlantic/Faroe'\n },\n ESTONIA: {\n TALLINN: 'Europe/Tallinn'\n },\n FINLAND: {\n HELSINKI: 'Europe/Helsinki',\n MARIEHAMN: 'Europe/Mariehamn'\n },\n FRANCE: {\n PARIS: 'Europe/Paris',\n CAYENNE: 'America/Cayenne',\n GUADELOUPE: 'America/Guadeloupe',\n MARIGOT: 'America/Marigot',\n MARTINIQUE: 'America/Martinique',\n MAYOTTE: 'Indian/Mayotte',\n REUNION: 'Indian/Reunion'\n },\n GERMANY: {\n BERLIN: 'Europe/Berlin',\n BUSINGEN: 'Europe/Busingen'\n },\n GREECE: {\n ATHENS: 'Europe/Athens'\n },\n HUNGARY: {\n BUDAPEST: 'Europe/Budapest'\n },\n ICELAND: {\n REYKJAVIK: 'Atlantic/Reykjavik'\n },\n IRELAND: {\n DUBLIN: 'Europe/Dublin'\n },\n ITALY: {\n ROME: 'Europe/Rome'\n },\n LATVIA: {\n RIGA: 'Europe/Riga'\n },\n LIECHTENSTEIN: {\n VADUZ: 'Europe/Vaduz'\n },\n LITHUANIA: {\n VILNIUS: 'Europe/Vilnius'\n },\n LUXEMBOURG: {\n LUXEMBOURG: 'Europe/Luxembourg'\n },\n MALTA: {\n MALTA: 'Europe/Malta'\n },\n MONACO: {\n MONACO: 'Europe/Monaco'\n },\n NETHERLANDS: {\n AMSTERDAM: 'Europe/Amsterdam',\n ARUBA: 'America/Aruba',\n CURACAO: 'America/Curacao',\n KRALENDIJK: 'America/Kralendijk',\n LOWER_PRINCES: 'America/Lower_Princes'\n },\n NORWAY: {\n OSLO: 'Europe/Oslo',\n JAN_MAYEN: 'Atlantic/Jan_Mayen',\n LONGYEARBYEN: 'Arctic/Longyearbyen'\n },\n POLAND: {\n WARSAW: 'Europe/Warsaw'\n },\n PORTUGAL: {\n LISBON: 'Europe/Lisbon',\n AZORES: 'Atlantic/Azores',\n MADEIRA: 'Atlantic/Madeira'\n },\n ROMANIA: {\n BUCHAREST: 'Europe/Bucharest'\n },\n SAN_MARINO: {\n SAN_MARINO: 'Europe/San_Marino'\n },\n SLOVAKIA: {\n BRATISLAVA: 'Europe/Bratislava'\n },\n SLOVENIA: {\n LJUBLJANA: 'Europe/Ljubljana'\n },\n SPAIN: {\n MADRID: 'Europe/Madrid',\n CANARY: 'Atlantic/Canary',\n CEUTA: 'Africa/Ceuta'\n },\n SWEDEN: {\n STOCKHOLM: 'Europe/Stockholm'\n },\n SWITZERLAND: {\n ZURICH: 'Europe/Zurich'\n },\n VATICAN: {\n VATICAN: 'Europe/Vatican'\n }\n};\nconst EU_TIMEZONE = [\n TIMEZONE.AUSTRIA.VIENNA,\n TIMEZONE.BELGIUM.BRUSSELS,\n TIMEZONE.BULGARIA.SOFIA,\n TIMEZONE.CROATIA.ZAGREB,\n TIMEZONE.CYPRUS.NICOSIA_EUROPE,\n TIMEZONE.CYPRUS.NICOSIA_ASIA,\n TIMEZONE.CYPRUS.FAMAGUSTA,\n TIMEZONE.CZECHIA.PRAGUE,\n TIMEZONE.DENMARK.COPENHAGEN,\n TIMEZONE.ESTONIA.TALLINN,\n TIMEZONE.FINLAND.HELSINKI,\n TIMEZONE.FINLAND.MARIEHAMN,\n TIMEZONE.FRANCE.PARIS,\n TIMEZONE.GERMANY.BERLIN,\n TIMEZONE.GREECE.ATHENS,\n TIMEZONE.HUNGARY.BUDAPEST,\n TIMEZONE.IRELAND.DUBLIN,\n TIMEZONE.ITALY.ROME,\n TIMEZONE.LATVIA.RIGA,\n TIMEZONE.LITHUANIA.VILNIUS,\n TIMEZONE.LUXEMBOURG.LUXEMBOURG,\n TIMEZONE.MALTA.MALTA,\n TIMEZONE.NETHERLANDS.AMSTERDAM,\n TIMEZONE.POLAND.WARSAW,\n TIMEZONE.PORTUGAL.LISBON,\n TIMEZONE.ROMANIA.BUCHAREST,\n TIMEZONE.SLOVAKIA.BRATISLAVA,\n TIMEZONE.SLOVENIA.LJUBLJANA,\n TIMEZONE.SPAIN.MADRID,\n TIMEZONE.SWEDEN.STOCKHOLM,\n TIMEZONE.FRANCE.CAYENNE,\n TIMEZONE.FRANCE.GUADELOUPE,\n TIMEZONE.FRANCE.MARIGOT,\n TIMEZONE.FRANCE.MARTINIQUE,\n TIMEZONE.FRANCE.MAYOTTE,\n TIMEZONE.FRANCE.REUNION,\n TIMEZONE.PORTUGAL.AZORES,\n TIMEZONE.PORTUGAL.MADEIRA,\n TIMEZONE.SPAIN.CANARY\n];\nconst EEA_EFTA_TIMEZONE = [\n TIMEZONE.ICELAND.REYKJAVIK,\n TIMEZONE.LIECHTENSTEIN.VADUZ,\n TIMEZONE.NORWAY.OSLO,\n TIMEZONE.NORWAY.JAN_MAYEN\n];\nconst EEA_TIMEZONE = [\n ...EU_TIMEZONE,\n ...EEA_EFTA_TIMEZONE\n];\nconst EFTA_TIMEZONE = [\n TIMEZONE.SWITZERLAND.ZURICH,\n ...EEA_EFTA_TIMEZONE\n];\nconst SCHENGEN_TIMEZONE = [\n TIMEZONE.AUSTRIA.VIENNA,\n TIMEZONE.BELGIUM.BRUSSELS,\n TIMEZONE.BULGARIA.SOFIA,\n TIMEZONE.CROATIA.ZAGREB,\n TIMEZONE.CZECHIA.PRAGUE,\n TIMEZONE.DENMARK.COPENHAGEN,\n TIMEZONE.ESTONIA.TALLINN,\n TIMEZONE.FINLAND.HELSINKI,\n TIMEZONE.FINLAND.MARIEHAMN,\n TIMEZONE.FRANCE.PARIS,\n TIMEZONE.GERMANY.BERLIN,\n TIMEZONE.GREECE.ATHENS,\n TIMEZONE.HUNGARY.BUDAPEST,\n TIMEZONE.ITALY.ROME,\n TIMEZONE.LATVIA.RIGA,\n TIMEZONE.LITHUANIA.VILNIUS,\n TIMEZONE.LUXEMBOURG.LUXEMBOURG,\n TIMEZONE.MALTA.MALTA,\n TIMEZONE.NETHERLANDS.AMSTERDAM,\n TIMEZONE.POLAND.WARSAW,\n TIMEZONE.PORTUGAL.LISBON,\n TIMEZONE.PORTUGAL.AZORES,\n TIMEZONE.PORTUGAL.MADEIRA,\n TIMEZONE.ROMANIA.BUCHAREST,\n TIMEZONE.SLOVAKIA.BRATISLAVA,\n TIMEZONE.SLOVENIA.LJUBLJANA,\n TIMEZONE.SPAIN.MADRID,\n TIMEZONE.SPAIN.CANARY,\n TIMEZONE.SWEDEN.STOCKHOLM,\n TIMEZONE.ANDORRA.ANDORRA,\n TIMEZONE.GERMANY.BUSINGEN,\n TIMEZONE.ICELAND.REYKJAVIK,\n TIMEZONE.LIECHTENSTEIN.VADUZ,\n TIMEZONE.MONACO.MONACO,\n TIMEZONE.NORWAY.OSLO,\n TIMEZONE.SAN_MARINO.SAN_MARINO,\n TIMEZONE.SPAIN.CEUTA,\n TIMEZONE.SWITZERLAND.ZURICH,\n TIMEZONE.VATICAN.VATICAN\n];\nconst isTimezoneIn = (tz) => { var _a; return typeof window !== 'undefined' && ((_a = window === null || window === void 0 ? void 0 : window.Intl) === null || _a === void 0 ? void 0 : _a.DateTimeFormat) && tz.includes(Intl.DateTimeFormat().resolvedOptions().timeZone); };\nconst isFromEU = () => isTimezoneIn(EU_TIMEZONE);\nconst isFromEEA = () => isTimezoneIn(EEA_TIMEZONE);\nconst isFromEFTA = () => isTimezoneIn(EFTA_TIMEZONE);\nconst isFromSchengen = () => isTimezoneIn(SCHENGEN_TIMEZONE);\nexport { isFromEU, isFromEEA, isFromEFTA, isFromSchengen };\n", "/*! isStandalonePWA 0.1.1\n Detect if PWA is running in standalone mode\n https://github.com/faisalman/is-standalone-pwa\n Author: Faisal Salman <f@faisalman.com>\n MIT License */\nexport function isStandalonePWA() {\n var _a;\n return typeof window !== 'undefined' &&\n ((window === null || window === void 0 ? void 0 : window.matchMedia('(display-mode: standalone)').matches) ||\n ((_a = window.navigator) === null || _a === void 0 ? void 0 : _a.standalone) ||\n document.referrer.startsWith('android-app://') ||\n (window === null || window === void 0 ? void 0 : window.Windows) ||\n /trident.+(msapphost|webview)\\//i.test(navigator.userAgent) ||\n document.referrer.startsWith('app-info://platform/microsoft-store'));\n}\n;\n", "// Generated ESM version of ua-parser-js/helpers\n// DO NOT EDIT THIS FILE!\n// Source: /src/helpers/ua-parser-helpers.js\n\n///////////////////////////////////////////////\n/* Helpers for UAParser.js v2.0.6\n https://github.com/faisalman/ua-parser-js\n Author: Faisal Salman <f@faisalman.com>\n UAParser.js PRO Enterprise License */\n//////////////////////////////////////////////\n\n/*jshint esversion: 6 */ \n\nimport { UAParser } from '../main/ua-parser.mjs';\nimport { CPUArch, OSName, EngineName, Extension, BrowserType } from '../enums/ua-parser-enums.mjs';\nimport { Bots, Crawlers } from '../extensions/ua-parser-extensions.mjs';\nimport { isFromEU } from 'detect-europe-js';\nimport { isFrozenUA } from 'ua-is-frozen';\nimport { isStandalonePWA } from 'is-standalone-pwa';\nconst { Crawler } = Extension.BrowserName;\n\nconst toResult = (value, head, ext) => typeof value === 'string' ? UAParser(value, head, ext) : value;\n\nconst getDeviceVendor = (model) => UAParser(`Mozilla/5.0 (Linux; Android 10; ${model}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36`).device.vendor;\n\nconst isAppleSilicon = (resultOrUA) => {\n const res = toResult(resultOrUA);\n if (res.os.is(OSName.MACOS)) {\n if (res.cpu.is(CPUArch.ARM)) {\n return true;\n }\n if (typeof resultOrUA !== 'string' && typeof window !== 'undefined') {\n try {\n const canvas = document.createElement('canvas');\n const webgl = canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n const debug = webgl.getExtension('WEBGL_debug_renderer_info');\n const renderer = webgl.getParameter(debug.UNMASKED_RENDERER_WEBGL);\n if (renderer.match(/apple m\\d/i)) {\n return true;\n }\n } catch {\n return false;\n }\n }\n }\n return false;\n}\n\nconst isAIBot = (resultOrUA) => [\n\n // AI2\n Crawler.AI2_BOT,\n\n // Amazon\n Crawler.AMAZON_BOT,\n\n // Anthropic\n Crawler.ANTHROPIC_AI,\n Crawler.ANTHROPIC_CLAUDE_BOT,\n Crawler.ANTHROPIC_CLAUDE_SEARCHBOT,\n Crawler.ANTHROPIC_CLAUDE_WEB,\n\n // Apple\n Crawler.APPLE_BOT,\n Crawler.APPLE_BOT_EXTENDED,\n\n // Brave\n Crawler.BRAVE_BOT,\n\n // ByteDance\n Crawler.BYTEDANCE_BYTESPIDER,\n Crawler.BYTEDANCE_TIKTOKSPIDER,\n\n // Cohere\n Crawler.COHERE_TRAINING_DATA_CRAWLER,\n\n // Common Crawl\n Crawler.COMMON_CRAWL_CCBOT,\n \n // Coveo\n Crawler.COVEO_BOT,\n\n // DataForSeo\n Crawler.DATAFORSEO_BOT,\n\n // DeepSeek\n Crawler.DEEPSEEK_BOT,\n\n // Diffbot\n Crawler.DIFFBOT,\n\n // Google\n Crawler.GOOGLE_EXTENDED,\n Crawler.GOOGLE_OTHER,\n Crawler.GOOGLE_OTHER_IMAGE,\n Crawler.GOOGLE_OTHER_VIDEO,\n Crawler.GOOGLE_CLOUDVERTEXBOT,\n\n // Hive AI\n Crawler.HIVE_IMAGESIFTBOT,\n\n // Huawei\n Crawler.HUAWEI_PETALBOT,\n Crawler.HUAWEI_PANGUBOT,\n\n // Hugging Face\n Crawler.HUGGINGFACE_BOT,\n\n // Kangaroo\n Crawler.KANGAROO_BOT,\n\n // Mendable.ai\n Crawler.FIRECRAWL_AGENT,\n\n // Meta\n Crawler.META_FACEBOOKBOT,\n Crawler.META_EXTERNALAGENT,\n\n // OpenAI\n Crawler.OPENAI_GPTBOT,\n Crawler.OPENAI_SEARCH_BOT,\n\n // Perplexity\n Crawler.PERPLEXITY_BOT,\n\n // Replicate\n Crawler.REPLICATE_BOT,\n\n // Runpod\n Crawler.RUNPOD_BOT,\n\n // SB Intuitions\n Crawler.SB_INTUITIONS_BOT,\n\n // Semrush\n Crawler.SEMRUSH_BOT_CONTENTSHAKE,\n\n // Timpi\n Crawler.TIMPI_BOT,\n\n // Together AI\n Crawler.TOGETHER_BOT,\n\n // Velen.io\n Crawler.HUNTER_VELENPUBLICWEBCRAWLER,\n\n // Vercel\n Crawler.VERCEL_V0BOT,\n\n // Webz.io\n Crawler.WEBZIO_OMGILI,\n Crawler.WEBZIO_OMGILI_BOT,\n Crawler.WEBZIO_EXTENDED,\n\n // X\n Crawler.XAI_BOT,\n\n // You.com\n Crawler.YOU_BOT,\n\n // Zhipu AI\n Crawler.ZHIPU_CHATGLM_SPIDER\n ]\n .map((s) => s.toLowerCase())\n .includes(String(toResult(resultOrUA, Crawlers).browser.name).toLowerCase());\n\nconst isBot = (resultOrUA) => [\n BrowserType.CLI, \n BrowserType.CRAWLER, \n BrowserType.FETCHER, \n BrowserType.LIBRARY\n ].includes(toResult(resultOrUA, Bots).browser.type);\n\nconst isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(EngineName.BLINK);\n\nconst isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js\n / electron\\//i.test(navigator?.userAgent)); // browser\n\nexport { \n getDeviceVendor,\n isAppleSilicon,\n isAIBot,\n isBot,\n isChromeFamily,\n isElectron,\n isFromEU,\n isFrozenUA,\n isStandalonePWA\n}", "import { UAParser } from '@ua-parser-js/pro-enterprise';\r\nimport {\r\n isBot,\r\n isChromeFamily,\r\n isStandalonePWA,\r\n isAppleSilicon,\r\n} from '@ua-parser-js/pro-enterprise/helpers';\r\n\r\nexport interface DeviceInfo {\r\n userAgent: {\r\n name: string;\r\n browser: {\r\n major: string;\r\n name: string;\r\n version: string;\r\n type?: string;\r\n };\r\n os: {\r\n name: string;\r\n version: string;\r\n };\r\n device?: {\r\n model?: string;\r\n type?: string;\r\n vendor?: string;\r\n };\r\n engine: {\r\n name: string;\r\n version: string;\r\n };\r\n cpu: {\r\n architecture: string;\r\n };\r\n };\r\n screenResolution: {\r\n width: number;\r\n height: number;\r\n };\r\n timeZone: string;\r\n // Enhanced detection helpers\r\n flags?: {\r\n isBot: boolean; // Bot/crawler detection\r\n isChromeFamily: boolean; // Chrome/Edge/Brave/Opera\r\n isStandalonePWA: boolean; // Installed as PWA\r\n isAppleSilicon: boolean; // M1/M2/M3 Mac\r\n };\r\n}\r\n\r\n/**\r\n * Get screen resolution\r\n */\r\nfunction getScreenResolution(): { width: number; height: number } {\r\n return {\r\n width: window.screen.width,\r\n height: window.screen.height,\r\n };\r\n}\r\n\r\n/**\r\n * Get timezone\r\n */\r\nfunction getTimeZone(): string {\r\n try {\r\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\r\n } catch (error) {\r\n console.error('Failed to get timezone:', error);\r\n return 'UTC';\r\n }\r\n}\r\n\r\n/**\r\n * Get browser locale\r\n */\r\nexport function getBrowserLocale(): string {\r\n try {\r\n return navigator.language || 'en-US';\r\n } catch (error) {\r\n console.error('Failed to get browser locale:', error);\r\n return 'en-US';\r\n }\r\n}\r\n\r\n/**\r\n * Collect all device information using UAParser\r\n */\r\nexport function collectDeviceInfo(): DeviceInfo {\r\n if (typeof window === 'undefined') {\r\n // Server-side fallback\r\n return {\r\n userAgent: {\r\n name: '',\r\n browser: { major: '', name: '', version: '' },\r\n os: { name: '', version: '' },\r\n device: undefined,\r\n engine: { name: '', version: '' },\r\n cpu: { architecture: '' },\r\n },\r\n screenResolution: { width: 0, height: 0 },\r\n timeZone: 'UTC',\r\n flags: {\r\n isBot: false,\r\n isChromeFamily: false,\r\n isStandalonePWA: false,\r\n isAppleSilicon: false,\r\n },\r\n };\r\n }\r\n\r\n const parser = new UAParser();\r\n const result = parser.getResult();\r\n\r\n // Enhanced detection using UAParser official helpers\r\n let flags: DeviceInfo['flags'];\r\n try {\r\n flags = {\r\n isBot: isBot(result),\r\n isChromeFamily: isChromeFamily(result),\r\n isStandalonePWA: isStandalonePWA(),\r\n isAppleSilicon: isAppleSilicon(result),\r\n };\r\n } catch (error) {\r\n console.error('Failed to compute device flags:', error);\r\n flags = {\r\n isBot: false,\r\n isChromeFamily: false,\r\n isStandalonePWA: false,\r\n isAppleSilicon: false,\r\n };\r\n }\r\n\r\n return {\r\n userAgent: {\r\n name: result.ua,\r\n browser: {\r\n major: result.browser.major || '',\r\n name: result.browser.name || '',\r\n version: result.browser.version || '',\r\n type: result.browser.type,\r\n },\r\n os: {\r\n name: result.os.name || '',\r\n version: result.os.version || '',\r\n },\r\n device: result.device.model || result.device.type || result.device.vendor\r\n ? {\r\n model: result.device.model,\r\n type: result.device.type,\r\n vendor: result.device.vendor,\r\n }\r\n : undefined,\r\n engine: {\r\n name: result.engine.name || '',\r\n version: result.engine.version || '',\r\n },\r\n cpu: {\r\n architecture: result.cpu.architecture || '',\r\n },\r\n },\r\n screenResolution: getScreenResolution(),\r\n timeZone: getTimeZone(),\r\n flags,\r\n };\r\n}\r\n\r\n/**\r\n * Get URL parameters for session initialization\r\n */\r\nexport function getUrlParams(): {\r\n locale?: string;\r\n currency?: string;\r\n utmSource?: string;\r\n utmMedium?: string;\r\n utmCampaign?: string;\r\n} {\r\n if (typeof window === 'undefined') {\r\n return {};\r\n }\r\n\r\n const params = new URLSearchParams(window.location.search);\r\n\r\n return {\r\n locale: params.get('locale') || undefined,\r\n currency: params.get('currency') || undefined,\r\n utmSource: params.get('utm_source') || undefined,\r\n utmMedium: params.get('utm_medium') || undefined,\r\n utmCampaign: params.get('utm_campaign') || undefined,\r\n };\r\n}\r\n\r\n", "/**\r\n * Event Bus for handling domain events and coordination\r\n */\r\nexport type EventCallback<T = any> = (data: T) => void | Promise<void>;\r\n\r\nexport class EventBus {\r\n private listeners: Map<string, Set<EventCallback>> = new Map();\r\n\r\n on<T = any>(event: string, callback: EventCallback<T>): () => void {\r\n if (!this.listeners.has(event)) {\r\n this.listeners.set(event, new Set());\r\n }\r\n this.listeners.get(event)!.add(callback);\r\n return () => this.off(event, callback);\r\n }\r\n\r\n off<T = any>(event: string, callback: EventCallback<T>): void {\r\n if (this.listeners.has(event)) {\r\n this.listeners.get(event)!.delete(callback);\r\n }\r\n }\r\n\r\n async emit<T = any>(event: string, data?: T): Promise<void> {\r\n if (this.listeners.has(event)) {\r\n const callbacks = Array.from(this.listeners.get(event)!);\r\n await Promise.all(callbacks.map(cb => {\r\n try {\r\n return Promise.resolve(cb(data));\r\n } catch (e) {\r\n console.error(`[EventBus] Error in listener for event \"${event}\":`, e);\r\n return Promise.resolve();\r\n }\r\n }));\r\n }\r\n }\r\n\r\n clear(): void {\r\n this.listeners.clear();\r\n }\r\n}\r\n\r\n\r\n", "import { Session } from '../types';\r\n\r\n/**\r\n * JWT payload structure from the CMS token\r\n */\r\ninterface JWTPayload {\r\n sessionId: string;\r\n storeId: string;\r\n accountId: string;\r\n customerId: string;\r\n role: 'authenticated' | 'anonymous';\r\n iat?: number;\r\n exp?: number;\r\n}\r\n\r\n/**\r\n * Decode a JWT token to extract session information\r\n * This is a simple client-side decoder - do not use for security validation\r\n */\r\nexport function decodeJWTClient(token: string): Session | null {\r\n try {\r\n // Split the token into parts\r\n const parts = token.split('.');\r\n if (parts.length !== 3) {\r\n console.error('Invalid JWT token format');\r\n return null;\r\n }\r\n\r\n // Decode the payload (second part)\r\n const payload = parts[1];\r\n\r\n // Add padding if needed\r\n const paddedPayload = payload + '='.repeat((4 - (payload.length % 4)) % 4);\r\n\r\n // Decode base64\r\n const decoded = atob(paddedPayload);\r\n\r\n // Parse JSON\r\n const parsedPayload: JWTPayload = JSON.parse(decoded);\r\n\r\n // Check if token is expired\r\n if (parsedPayload.exp && Date.now() >= parsedPayload.exp * 1000) {\r\n console.warn('JWT token is expired');\r\n return null;\r\n }\r\n\r\n // Return session data\r\n return {\r\n sessionId: parsedPayload.sessionId,\r\n storeId: parsedPayload.storeId,\r\n accountId: parsedPayload.accountId,\r\n customerId: parsedPayload.customerId,\r\n role: parsedPayload.role,\r\n isValid: true,\r\n isLoading: false,\r\n };\r\n } catch (error) {\r\n console.error('Failed to decode JWT token:', error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Check if a JWT token is expired\r\n */\r\nexport function isTokenExpired(token: string): boolean {\r\n try {\r\n const parts = token.split('.');\r\n if (parts.length !== 3) return true;\r\n\r\n const payload = parts[1];\r\n const paddedPayload = payload + '='.repeat((4 - (payload.length % 4)) % 4);\r\n const decoded = atob(paddedPayload);\r\n const parsedPayload: JWTPayload = JSON.parse(decoded);\r\n\r\n if (parsedPayload.exp) {\r\n return Date.now() >= parsedPayload.exp * 1000;\r\n }\r\n\r\n return false;\r\n } catch (error) {\r\n console.error('Failed to check token expiration:', error);\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Get token expiration time\r\n */\r\nexport function getTokenExpiration(token: string): Date | null {\r\n try {\r\n const parts = token.split('.');\r\n if (parts.length !== 3) return null;\r\n\r\n const payload = parts[1];\r\n const paddedPayload = payload + '='.repeat((4 - (payload.length % 4)) % 4);\r\n const decoded = atob(paddedPayload);\r\n const parsedPayload: JWTPayload = JSON.parse(decoded);\r\n\r\n if (parsedPayload.exp) {\r\n return new Date(parsedPayload.exp * 1000);\r\n }\r\n\r\n return null;\r\n } catch (error) {\r\n console.error('Failed to get token expiration:', error);\r\n return null;\r\n }\r\n}\r\n\r\n", "/**\r\n * Plugin Configuration Utility Functions\r\n * Pure functions for plugin configuration management\r\n */\r\n\r\nimport { isLocalEnvironment } from '../config/environment';\r\nimport { resolveEnvValue } from './env';\r\n\r\nexport type PluginConfig<TConfig = Record<string, any>> = {\r\n storeId?: string;\r\n accountId?: string;\r\n basePath?: string;\r\n config?: any;\r\n staticResources?: Record<string, any>; // NEW: Static resources for local dev\r\n // Common config properties that plugins expect\r\n productId?: string;\r\n variants?: Record<string, string>;\r\n prices?: Record<string, any>;\r\n defaultCurrency?: string;\r\n hidePriceId?: string;\r\n upsellId?: string;\r\n googleApiKey?: string;\r\n} & TConfig;\r\n\r\nexport type RawPluginConfig<TConfig = Record<string, any>> = {\r\n storeId?: string;\r\n accountId?: string;\r\n basePath?: string;\r\n config?: any;\r\n} & TConfig;\r\n\r\n/**\r\n * Load local development configuration\r\n */\r\nconst loadLocalDevConfig = async (configVariant = 'default'): Promise<PluginConfig | null> => {\r\n try {\r\n // Check for explicit environment override\r\n const env = resolveEnvValue('TAGADA_ENV') || resolveEnvValue('TAGADA_ENVIRONMENT');\r\n if (env === 'production') {\r\n // Skip local config loading if explicitly in production mode\r\n return null;\r\n }\r\n\r\n // Only try to load local config in TRUE local development (not deployed CDN instances)\r\n // Exclude CDN subdomains (e.g., instance-id.cdn.localhost)\r\n if (!isLocalEnvironment(true)) {\r\n return null;\r\n }\r\n\r\n // Load local store/account config\r\n const localResponse = await fetch('/.local.json');\r\n if (!localResponse.ok) {\r\n return null;\r\n }\r\n const localConfig = await localResponse.json();\r\n\r\n // Load deployment config (specified variant or fallback to default)\r\n let config: Record<string, any> = {};\r\n let configLoaded = false;\r\n\r\n try {\r\n // Try .tgd.json first (new format), then fallback to .json\r\n let deploymentResponse = await fetch(`/config/${configVariant}.tgd.json`);\r\n if (!deploymentResponse.ok) {\r\n deploymentResponse = await fetch(`/config/${configVariant}.json`);\r\n }\r\n\r\n if (deploymentResponse.ok) {\r\n config = await deploymentResponse.json();\r\n configLoaded = true;\r\n }\r\n } catch {\r\n // Config fetch failed, will try fallback\r\n }\r\n\r\n // If config didn't load and it's not 'default', try fallback to default\r\n if (!configLoaded && configVariant !== 'default') {\r\n console.warn(`\u26A0\uFE0F Config variant '${configVariant}' not found, falling back to 'default'`);\r\n try {\r\n let defaultResponse = await fetch('/config/default.tgd.json');\r\n if (!defaultResponse.ok) {\r\n defaultResponse = await fetch('/config/default.json');\r\n }\r\n\r\n if (defaultResponse.ok) {\r\n config = await defaultResponse.json();\r\n configLoaded = true;\r\n console.log(`\u2705 Fallback to 'default' config successful`);\r\n }\r\n } catch {\r\n // Default config also failed\r\n }\r\n }\r\n\r\n // Final warning if no config was loaded\r\n if (!configLoaded) {\r\n if (configVariant === 'default') {\r\n console.warn(`\u26A0\uFE0F No 'default' config found. Create /config/default.tgd.json`);\r\n } else {\r\n console.warn(`\u26A0\uFE0F Neither '${configVariant}' nor 'default' config found. Create /config/default.tgd.json`);\r\n }\r\n }\r\n\r\n const result = {\r\n storeId: localConfig.storeId,\r\n accountId: localConfig.accountId,\r\n basePath: localConfig.basePath,\r\n config,\r\n };\r\n\r\n console.log('\uD83D\uDEE0\uFE0F Using local development plugin config:', result);\r\n\r\n return result;\r\n } catch {\r\n return null;\r\n }\r\n};\r\n\r\n/**\r\n * Load static resources for local development\r\n * \r\n * Priority:\r\n * 1. /config/funnel.local.json (NEW - recommended)\r\n * 2. /config/resources.static.json (OLD - deprecated, for backward compatibility)\r\n */\r\nconst loadStaticResources = async (): Promise<Record<string, any> | null> => {\r\n try {\r\n // Check for explicit environment override\r\n const env = resolveEnvValue('TAGADA_ENV') || resolveEnvValue('TAGADA_ENVIRONMENT');\r\n if (env === 'production') {\r\n return null;\r\n }\r\n\r\n // Only try to load in TRUE local development (not deployed CDN instances)\r\n // Exclude CDN subdomains (e.g., instance-id.cdn.localhost)\r\n if (!isLocalEnvironment(true)) {\r\n return null;\r\n }\r\n\r\n // ============================================================\r\n // PRIORITY 1: NEW format - funnel.local.json\r\n // Also populates the stepConfig cache for getAssignedStepConfig()\r\n // ============================================================\r\n try {\r\n console.log('\uD83D\uDEE0\uFE0F [V2] Attempting to load /config/funnel.local.json...');\r\n const funnelResponse = await fetch('/config/funnel.local.json');\r\n if (funnelResponse.ok) {\r\n const funnelConfig = await funnelResponse.json();\r\n console.log('\uD83D\uDEE0\uFE0F [V2] \u2705 Loaded local funnel config (NEW format):', funnelConfig);\r\n \r\n // Also trigger loadLocalFunnelConfig to populate the cache\r\n // Import dynamically to avoid circular dependency\r\n const { loadLocalFunnelConfig } = await import('../funnelClient');\r\n await loadLocalFunnelConfig();\r\n \r\n // Return staticResources in the old format for backward compatibility\r\n // The new stepConfig system reads from funnel.local.json via getAssignedStepConfig()\r\n if (funnelConfig.staticResources) {\r\n // Transform flat format to old nested format for legacy compatibility\r\n const transformed: Record<string, any> = {};\r\n for (const [key, value] of Object.entries(funnelConfig.staticResources)) {\r\n transformed[key] = { id: value };\r\n }\r\n return transformed;\r\n }\r\n return null;\r\n }\r\n } catch (e) {\r\n console.log('\uD83D\uDEE0\uFE0F [V2] funnel.local.json not found, trying legacy format...');\r\n }\r\n\r\n // ============================================================\r\n // PRIORITY 2: OLD format - resources.static.json (deprecated)\r\n // ============================================================\r\n console.log('\uD83D\uDEE0\uFE0F [V2] Attempting to load /config/resources.static.json (legacy)...');\r\n const response = await fetch('/config/resources.static.json');\r\n if (!response.ok) {\r\n console.log('\uD83D\uDEE0\uFE0F [V2] No local static resources found');\r\n return null;\r\n }\r\n\r\n const staticResources = await response.json();\r\n console.log('\uD83D\uDEE0\uFE0F [V2] \u2705 Loaded legacy static resources:', staticResources);\r\n return staticResources;\r\n } catch (error) {\r\n console.error('\uD83D\uDEE0\uFE0F [V2] \u274C Error loading static resources:', error);\r\n return null;\r\n }\r\n};\r\n\r\n/**\r\n * Helper to get content from meta tag\r\n */\r\nconst getMetaContent = (name: string): string | undefined => {\r\n const metaTag = document.querySelector(`meta[name=\"${name}\"]`);\r\n return metaTag?.getAttribute('content') || undefined;\r\n};\r\n\r\n/**\r\n * Load production config from meta tags (HIGHEST PRIORITY)\r\n * Meta tags are injected by the plugin middleware during HTML serving\r\n * This avoids making an additional HEAD request (~300ms savings)\r\n * \r\n * Returns null if meta tags are not present (not in production deployment)\r\n */\r\nconst loadProductionConfig = async (): Promise<PluginConfig | null> => {\r\n try {\r\n // Check if we're in a browser environment\r\n if (typeof document === 'undefined') {\r\n return null;\r\n }\r\n\r\n // Read store/account info from meta tags (injected by middleware)\r\n const storeId = getMetaContent('x-plugin-store-id');\r\n const accountId = getMetaContent('x-plugin-account-id');\r\n\r\n // If no store ID in meta tags, this is not a production deployment with injected config\r\n if (!storeId) {\r\n return null;\r\n }\r\n\r\n const basePath = getMetaContent('x-plugin-base-path') || '/';\r\n\r\n // Get deployment config from meta tags\r\n let config: Record<string, any> = {};\r\n try {\r\n const encodedConfig = getMetaContent('x-plugin-config');\r\n if (encodedConfig) {\r\n const decodedConfig = decodeURIComponent(encodedConfig);\r\n config = JSON.parse(decodedConfig);\r\n }\r\n } catch (error) {\r\n console.warn('\u26A0\uFE0F Failed to parse plugin config from meta tag:', error);\r\n }\r\n\r\n // Final validation\r\n if (!accountId) {\r\n console.warn('\u26A0\uFE0F Plugin config: Account ID not found in meta tags');\r\n }\r\n\r\n const result = { storeId, accountId, basePath, config };\r\n console.log('\uD83D\uDE80 [HIGHEST PRIORITY] Plugin config loaded from meta tags (runtime injected config):', {\r\n storeId,\r\n accountId,\r\n basePath,\r\n configKeys: Object.keys(config),\r\n configSize: JSON.stringify(config).length\r\n });\r\n\r\n return result;\r\n } catch (error) {\r\n console.warn('\u26A0\uFE0F Error loading production config from meta tags:', error);\r\n return null;\r\n }\r\n};\r\n\r\n/**\r\n * Core plugin config loading function\r\n * \r\n * PRIORITY ORDER (highest to lowest):\r\n * 1. Injected meta tags (runtime config) - ALWAYS CHECK FIRST\r\n * 2. Raw config parameter (programmatic override)\r\n * 3. Environment variables (build-time config)\r\n * 4. Local dev files (.local.json + config files)\r\n * 5. Defaults\r\n */\r\nexport const loadPluginConfig = async (\r\n configVariant = 'default',\r\n rawConfig?: RawPluginConfig,\r\n): Promise<PluginConfig> => {\r\n console.log('\uD83D\uDD27 [V2] loadPluginConfig called with variant:', configVariant);\r\n\r\n // Load static resources first (only in local dev)\r\n const staticResources = await loadStaticResources();\r\n\r\n // ============================================================\r\n // PRIORITY 1: Check meta tags FIRST (runtime injected config)\r\n // This ensures deployed plugins always use injected config\r\n // ============================================================\r\n const productionConfig = await loadProductionConfig();\r\n if (productionConfig) {\r\n const result = {\r\n ...productionConfig,\r\n staticResources: staticResources ?? undefined,\r\n };\r\n console.log('\u2705 [V2] Using INJECTED config from meta tags (HIGHEST PRIORITY)');\r\n return result;\r\n }\r\n\r\n // ============================================================\r\n // PRIORITY 2: Raw config parameter (programmatic override)\r\n // ============================================================\r\n if (rawConfig) {\r\n const result = {\r\n storeId: rawConfig.storeId,\r\n accountId: rawConfig.accountId,\r\n basePath: rawConfig.basePath ?? '/',\r\n config: rawConfig.config ?? {},\r\n staticResources: staticResources ?? undefined,\r\n };\r\n console.log('\u2705 [V2] Using raw config parameter (PRIORITY 2)');\r\n return result;\r\n }\r\n\r\n // ============================================================\r\n // PRIORITY 3: Environment variables (build-time config)\r\n // Only in localhost - production should use meta tags\r\n // ============================================================\r\n const envConfig = await createRawPluginConfig();\r\n if (envConfig) {\r\n const result = {\r\n ...envConfig,\r\n staticResources: staticResources ?? undefined,\r\n };\r\n console.log('\u2705 [V2] Using environment variables config (PRIORITY 3 - build time)');\r\n return result;\r\n }\r\n\r\n // ============================================================\r\n // PRIORITY 4: Local development config files\r\n // ============================================================\r\n const localConfig = await loadLocalDevConfig(configVariant);\r\n if (localConfig) {\r\n const result = {\r\n ...localConfig,\r\n staticResources: staticResources ?? undefined,\r\n };\r\n console.log('\u2705 [V2] Using local dev config files (PRIORITY 4)');\r\n return result;\r\n }\r\n\r\n // ============================================================\r\n // PRIORITY 5: Defaults (no config found)\r\n // ============================================================\r\n console.warn('\u26A0\uFE0F [V2] No plugin config found - using defaults');\r\n return {\r\n basePath: '/',\r\n config: {},\r\n staticResources: staticResources ?? undefined,\r\n };\r\n};\r\n/**\r\n * Helper to load local config file for development (from /config directory)\r\n * Returns the config object that can be passed to TagadaProvider\r\n */\r\nexport async function loadLocalConfig(configName: string = 'default', defaultConfig?: any): Promise<Record<string, unknown> | null> {\r\n try {\r\n // Only load in localhost\r\n if (!isLocalEnvironment()) {\r\n return null;\r\n }\r\n\r\n if (defaultConfig) {\r\n return defaultConfig;\r\n }\r\n\r\n // Try .tgd.json first, then .json, then .config.json\r\n const possiblePaths = [\r\n `/config/${configName}.config.json`,\r\n `/config/${configName}.tgd.json`,\r\n `/config/${configName}.json`,\r\n ];\r\n\r\n for (const path of possiblePaths) {\r\n try {\r\n const response = await fetch(path);\r\n if (response.ok) {\r\n const config = await response.json() as Record<string, unknown>;\r\n\r\n return config;\r\n }\r\n } catch {\r\n continue;\r\n }\r\n }\r\n\r\n\r\n console.warn(`\u26A0\uFE0F [loadLocalConfig] No config found for '${configName}'`);\r\n return null;\r\n } catch (error) {\r\n console.error('[loadLocalConfig] Error loading config:', error);\r\n return null;\r\n }\r\n}\r\n/**\r\n * Creates a RawPluginConfig from environment variables (build-time config)\r\n * \r\n * This should ONLY be used when:\r\n * 1. Running in localhost development\r\n * 2. Meta tags are not present (not a deployed plugin)\r\n * \r\n * @returns A RawPluginConfig object or undefined if not applicable\r\n */\r\nexport async function createRawPluginConfig(): Promise<RawPluginConfig | undefined> {\r\n try {\r\n // Only run in true localhost - production MUST use meta tags\r\n if (!isLocalEnvironment()) {\r\n return undefined;\r\n }\r\n\r\n const storeId = resolveEnvValue('TAGADA_STORE_ID');\r\n const accountId = resolveEnvValue('TAGADA_ACCOUNT_ID');\r\n const basePath = resolveEnvValue('TAGADA_BASE_PATH');\r\n const configName = resolveEnvValue('TAGADA_CONFIG_NAME');\r\n\r\n if (!storeId || !accountId) {\r\n return undefined;\r\n }\r\n\r\n const resolvedConfig = await loadLocalConfig(configName);\r\n\r\n if (!resolvedConfig) {\r\n return undefined;\r\n }\r\n\r\n const rawConfig: RawPluginConfig = {\r\n storeId: storeId,\r\n accountId: accountId,\r\n basePath: basePath || '/',\r\n config: resolvedConfig,\r\n };\r\n\r\n console.log('\uD83D\uDEE0\uFE0F [createRawPluginConfig] Using environment variables (build-time config):', {\r\n hasStoreId: !!rawConfig.storeId,\r\n hasAccountId: !!rawConfig.accountId,\r\n basePath: rawConfig.basePath,\r\n hasConfig: !!rawConfig.config,\r\n });\r\n\r\n return rawConfig;\r\n } catch (error) {\r\n console.error('[createRawPluginConfig] Error creating config:', error);\r\n return undefined;\r\n }\r\n}\r\n\r\nexport class PluginConfigUtils {\r\n /**\r\n * Get plugin configuration from various sources\r\n */\r\n static getPluginConfig<TConfig = Record<string, any>>(\r\n rawConfig?: RawPluginConfig<TConfig>,\r\n context?: {\r\n storeId?: string;\r\n accountId?: string;\r\n basePath?: string;\r\n }\r\n ): PluginConfig<TConfig> {\r\n // Priority: rawConfig > context > defaults\r\n return {\r\n storeId: rawConfig?.storeId || context?.storeId,\r\n accountId: rawConfig?.accountId || context?.accountId,\r\n basePath: rawConfig?.basePath || context?.basePath || '/',\r\n config: rawConfig?.config || ({} as TConfig),\r\n } as PluginConfig<TConfig>;\r\n }\r\n\r\n /**\r\n * Validate plugin configuration\r\n */\r\n static validateConfig(config: PluginConfig): boolean {\r\n return !!(config.storeId && config.accountId);\r\n }\r\n}\r\n", "const DEFAULT_PREFIXES = ['', 'VITE_', 'REACT_APP_', 'NEXT_PUBLIC_'];\r\n\r\n/**\r\n * Resolves a value from multiple possible environment sources (Node, Vite, CRA, Next, window)\r\n * using a list of supported prefixes.\r\n */\r\nexport function resolveEnvValue(key: string, prefixes: string[] = DEFAULT_PREFIXES): string | undefined {\r\n for (const prefix of prefixes) {\r\n const envKey = prefix ? `${prefix}${key}` : key;\r\n\r\n if (typeof process !== 'undefined' && process?.env?.[envKey]) {\r\n console.log(`process.env[${envKey}]`, process.env[envKey]);\r\n return process.env[envKey];\r\n }\r\n\r\n if (typeof import.meta !== 'undefined' && (import.meta as any)?.env?.[envKey]) {\r\n console.log(`import.meta.env[${envKey}]`, (import.meta as any).env[envKey]);\r\n return (import.meta as any).env[envKey];\r\n }\r\n\r\n if (typeof window !== 'undefined' && (window as any)?.__TAGADA_ENV__?.[envKey]) {\r\n console.log(`window.__TAGADA_ENV__[${envKey}]`, (window as any).__TAGADA_ENV__[envKey]);\r\n return (window as any).__TAGADA_ENV__[envKey];\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n", "/**\r\n * Cross-Domain Auth Handoff Utilities\r\n * \r\n * Handles automatic resolution of authCode query parameters for seamless\r\n * cross-domain authentication.\r\n * \r\n * Flow:\r\n * 1. Check URL for authCode parameter\r\n * 2. If present, resolve it with backend\r\n * 3. Store the returned token (overrides any existing token)\r\n * 4. Clean the URL (remove authCode)\r\n * 5. Return resolved customer and context\r\n */\r\n\r\nimport { setClientToken } from './tokenStorage';\r\n\r\nexport interface AuthHandoffResolveResponse {\r\n sessionId: string;\r\n token: string;\r\n customer: {\r\n id: string;\r\n email?: string;\r\n firstName?: string;\r\n lastName?: string;\r\n role: 'authenticated' | 'anonymous';\r\n };\r\n context: Record<string, unknown>;\r\n}\r\n\r\n// Track in-flight and completed resolutions to prevent duplicates\r\nconst resolutionCache = new Map<string, Promise<AuthHandoffResolveResponse>>();\r\nconst resolvedCodes = new Set<string>();\r\n\r\n/**\r\n * Check if authCode is present in URL\r\n */\r\nexport function hasAuthCode(): boolean {\r\n if (typeof window === 'undefined') return false;\r\n const urlParams = new URLSearchParams(window.location.search);\r\n return urlParams.has('authCode');\r\n}\r\n\r\n/**\r\n * Get authCode from URL\r\n */\r\nexport function getAuthCode(): string | null {\r\n if (typeof window === 'undefined') return null;\r\n const urlParams = new URLSearchParams(window.location.search);\r\n return urlParams.get('authCode');\r\n}\r\n\r\n/**\r\n * Check if a code has already been resolved\r\n */\r\nexport function isCodeAlreadyResolved(code: string): boolean {\r\n return resolvedCodes.has(code);\r\n}\r\n\r\n/**\r\n * Resolve auth handoff and return token + customer info\r\n * \r\n * This function:\r\n * 1. Calls POST /api/v1/cms/auth/resolve-handoff\r\n * 2. Stores the returned token (overrides existing)\r\n * 3. Cleans the URL (removes authCode)\r\n * 4. Returns customer and context data\r\n * \r\n * \uD83D\uDD12 Deduplication: Multiple calls with the same code will return the same promise\r\n * to prevent duplicate API requests (e.g., React StrictMode double-mounting)\r\n */\r\nexport async function resolveAuthHandoff(\r\n authCode: string,\r\n storeId: string,\r\n apiBaseUrl: string,\r\n debugMode = false\r\n): Promise<AuthHandoffResolveResponse> {\r\n // Check if already resolved\r\n if (resolvedCodes.has(authCode)) {\r\n if (debugMode) {\r\n console.log('[AuthHandoff] Code already resolved, skipping duplicate request');\r\n }\r\n throw new Error('Auth code already resolved');\r\n }\r\n\r\n // Check if resolution is in-flight\r\n const inFlightResolution = resolutionCache.get(authCode);\r\n if (inFlightResolution) {\r\n if (debugMode) {\r\n console.log('[AuthHandoff] Resolution already in progress, waiting for existing request');\r\n }\r\n return inFlightResolution;\r\n }\r\n\r\n if (debugMode) {\r\n console.log('[AuthHandoff] Resolving authCode:', authCode.substring(0, 15) + '...');\r\n }\r\n\r\n // Create resolution promise\r\n const resolutionPromise = (async () => {\r\n try {\r\n // Call resolve endpoint (no authentication required)\r\n const response = await fetch(`${apiBaseUrl}/api/v1/cms/auth/resolve-handoff`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n code: authCode,\r\n storeId,\r\n }),\r\n });\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({ message: 'Unknown error' }));\r\n throw new Error(errorData.message || `Failed to resolve auth handoff: ${response.status}`);\r\n }\r\n\r\n const data: AuthHandoffResolveResponse = await response.json();\r\n\r\n if (debugMode) {\r\n console.log('[AuthHandoff] \u2705 Resolved successfully:', {\r\n customerId: data.customer.id,\r\n role: data.customer.role,\r\n hasContext: Object.keys(data.context).length > 0,\r\n });\r\n }\r\n\r\n // Store token (overrides any existing token)\r\n if (debugMode) {\r\n console.log('[AuthHandoff] Storing new token (overriding existing)');\r\n }\r\n setClientToken(data.token);\r\n\r\n // Clean URL (remove authCode parameter)\r\n cleanAuthCodeFromUrl(debugMode);\r\n\r\n // Mark as resolved\r\n resolvedCodes.add(authCode);\r\n\r\n return data;\r\n } catch (error) {\r\n console.error('[AuthHandoff] \u274C Failed to resolve:', error);\r\n throw error;\r\n } finally {\r\n // Remove from in-flight cache after completion (success or failure)\r\n resolutionCache.delete(authCode);\r\n }\r\n })();\r\n\r\n // Cache the in-flight promise\r\n resolutionCache.set(authCode, resolutionPromise);\r\n\r\n return resolutionPromise;\r\n}\r\n\r\n/**\r\n * Remove authCode from URL without page reload\r\n * Uses history.replaceState to update URL cleanly\r\n */\r\nexport function cleanAuthCodeFromUrl(debugMode = false): void {\r\n if (typeof window === 'undefined') return;\r\n\r\n const url = new URL(window.location.href);\r\n\r\n if (url.searchParams.has('authCode')) {\r\n url.searchParams.delete('authCode');\r\n\r\n // Use replaceState to update URL without reload\r\n window.history.replaceState({}, '', url.pathname + url.search + url.hash);\r\n\r\n if (debugMode) {\r\n console.log('[AuthHandoff] Cleaned authCode from URL');\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Check if we should resolve authCode\r\n * Returns true if authCode is present and valid format\r\n */\r\nexport function shouldResolveAuthCode(): boolean {\r\n const authCode = getAuthCode();\r\n if (!authCode || !authCode.startsWith('ah_')) {\r\n return false;\r\n }\r\n\r\n // Don't resolve if already resolved\r\n if (resolvedCodes.has(authCode)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n", "/**\r\n * Standalone Adapter for TagadaPay SDK v2\r\n *\r\n * Provides a vanilla JS interface for using the SDK without a framework.\r\n * Suitable for standard HTML/JS sites or other frameworks (Svelte, Angular, etc).\r\n *\r\n * This layer is a very thin wrapper over the Core SDK.\r\n */\r\n\r\nimport { TagadaClient, TagadaClientConfig, TagadaState } from '../core/client';\r\nimport { ApiClient } from '../core/resources/apiClient';\r\nimport { CheckoutResource } from '../core/resources/checkout';\r\n\r\n/**\r\n * Factory function to create a Tagada Client instance.\r\n * Features (like funnel) can be toggled via the config.\r\n */\r\nexport function createTagadaClient(config: TagadaClientConfig = {}): TagadaClient {\r\n return new TagadaClient(config);\r\n}\r\n\r\n// Re-export Core Classes\r\nexport { TagadaClient, ApiClient, CheckoutResource };\r\n\r\n// Re-export Types\r\nexport type { TagadaClientConfig, TagadaState };\r\nexport { FunnelActionType } from '../core/resources/funnel';\r\nexport type { FunnelAction, FunnelNavigationResult, SimpleFunnelContext } from '../core/resources/funnel';\r\n\r\n// Re-export Utilities\r\nexport * from '../core/utils';\r\n\r\n// ============================================================================\r\n// EXTERNAL PAGE TRACKER\r\n// ============================================================================\r\n// Lightweight tracker for external pages not hosted on Tagadapay\r\n// NOTE: This is also available as a standalone CDN bundle (external-tracker.min.js)\r\nexport {\r\n TagadaTracker,\r\n TagadaExternalTracker,\r\n} from './external-tracker';\r\n\r\nexport type {\r\n TagadaTrackerConfig,\r\n ExternalTrackerSession,\r\n NavigateOptions,\r\n} from './external-tracker';\r\n", "/**\r\n * Core Utility Functions\r\n * Pure functions without React dependencies\r\n */\r\n\r\nexport * from './products';\r\nexport * from './order';\r\nexport * from './currency';\r\nexport * from './pluginConfig';\r\nexport * from './checkout';\r\nexport * from './promotions';\r\nexport * from './postPurchases';\r\nexport * from './orderBump';\r\nexport * from './sessionStorage';\r\nexport * from './funnelQueryKeys';\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["getCookie", "name", "_a", "parts", "getEnvironmentConfig", "environment", "apiConfig", "ENVIRONMENT_CONFIGS", "customBaseUrl", "e", "__spreadProps", "__spreadValues", "detectEnvironment", "urlEnv", "storageEnv", "hostname", "href", "override", "isLocalEnvironment", "excludeCdn", "init_environment", "__esmMin", "FunnelResource", "init_funnel", "__esmMin", "apiClient", "request", "sessionId", "currentUrl", "includeDebugData", "params", "url", "EventDispatcher", "init_eventDispatcher", "__esmMin", "listener", "data", "error", "setClientToken", "token", "tokenChanged", "TOKEN_KEY", "error", "getClientToken", "clearClientToken", "init_tokenStorage", "__esmMin", "setFunnelSessionCookie", "sessionId", "FUNNEL_SESSION_COOKIE_NAME", "getFunnelSessionCookie", "cookie", "row", "clearFunnelSessionCookie", "init_sessionStorage", "__esmMin", "getFromStorage", "key", "setInStorage", "value", "e", "getFromCookie", "_a", "cookie", "c", "setInCookie", "maxAge", "clearFromCookie", "getSDKParams", "urlParams", "draft", "urlDraft", "storageDraft", "STORAGE_KEYS", "funnelTracking", "urlTracking", "storageTracking", "token", "getClientToken", "funnelSessionId", "funnelId", "funnelEnv", "urlFunnelEnv", "forceReset", "tagadaClientEnv", "urlEnv", "storageEnv", "tagadaClientBaseUrl", "urlBaseUrl", "storageBaseUrl", "currency", "urlCurrency", "storageCurrency", "locale", "urlLocale", "storageLocale", "isDraftMode", "setDraftMode", "handlePreviewMode", "debugMode", "urlToken", "params", "shouldReset", "persistSDKParamsFromURL", "clearClientToken", "clearFunnelSessionCookie", "tokenToSet", "setClientToken", "setFunnelTracking", "setClientEnvironment", "setClientBaseUrl", "enabled", "env", "clearClientEnvironment", "baseUrl", "clearClientBaseUrl", "isFunnelTrackingEnabled", "init_previewMode", "__esmMin", "init_tokenStorage", "init_sessionStorage", "clearSpecificCookie", "cookieName", "hostname", "parts", "domains", "i", "domain", "pathParts", "p", "paths", "currentPath", "part", "path", "baseDelete", "domainPart", "leavePreviewMode", "url", "param", "cookieDescriptor", "val", "normalizedVal", "e", "clearClientToken", "clearFunnelSessionCookie", "clearClientEnvironment", "clearClientBaseUrl", "cookie", "injectPreviewModeIndicator", "isInjected", "params", "getSDKParams", "draftMode", "isDraftMode", "trackingDisabled", "isFunnelTrackingEnabled", "hasCustomEnv", "container", "badge", "details", "bridge", "detailsHTML", "isHovering", "showDetails", "hideDetails", "leavePreviewBtn", "indicatorElement", "init_previewModeIndicator", "__esmMin", "init_previewMode", "init_tokenStorage", "init_sessionStorage", "funnelClient_exports", "__export", "FunnelClient", "TrackingProvider", "getAssignedPaymentFlowId", "getAssignedPixels", "getAssignedScripts", "getAssignedStaticResources", "getAssignedStepConfig", "getLocalFunnelConfig", "loadLocalFunnelConfig", "getAssignedFunnelId", "meta", "getAssignedFunnelVariant", "getAssignedFunnelStep", "parseStepConfig", "value", "trimmed", "strategies", "strategy", "result", "e", "isLocalDevelopment", "hostname", "localFunnelConfigCache", "localFunnelConfigLoading", "resolve", "response", "config", "error", "localConfigToStepConfig", "local", "localConfig", "windowValue", "parsed", "content", "_a", "stepConfig", "position", "scripts", "s", "rawPixels", "normalized", "key", "init_funnelClient", "__esmMin", "init_environment", "init_funnel", "init_eventDispatcher", "init_previewMode", "init_previewModeIndicator", "init_sessionStorage", "EventDispatcher", "FunnelResource", "__spreadValues", "listener", "urlSessionId", "getFunnelSessionCookie", "authSession", "store", "funnelId", "existingSessionId", "effectiveFunnelId", "injectedFunnelId", "funnelVariantId", "injectedStepId", "sdkParams", "getSDKParams", "finalFunnelId", "finalStepId", "urlParams", "funnelEnv", "enriched", "injectPreviewModeIndicator", "err", "entryStepId", "funnelStepId", "event", "options", "_b", "_c", "_d", "_e", "_f", "maxWaitTime", "startTime", "currentUrl", "fireAndForget", "shouldAutoRedirect", "stepId", "updates", "context", "setFunnelSessionCookie", "ctx", "detectEnvironment", "localResources", "existingStatic", "__spreadProps", "external_tracker_exports", "__export", "TagadaExternalTracker", "TagadaTracker", "init_environment", "init_funnelClient", "bind", "fn", "thisArg", "toString", "getPrototypeOf", "iterator", "toStringTag", "kindOf", "cache", "thing", "str", "kindOfTest", "type", "typeOfTest", "isArray", "isUndefined", "isBuffer", "val", "isFunction", "isArrayBuffer", "isArrayBufferView", "result", "isString", "isNumber", "isObject", "isBoolean", "isPlainObject", "prototype", "isEmptyObject", "isDate", "isFile", "isBlob", "isFileList", "isStream", "isFormData", "kind", "isURLSearchParams", "isReadableStream", "isRequest", "isResponse", "isHeaders", "trim", "forEach", "obj", "fn", "allOwnKeys", "l", "keys", "len", "key", "findKey", "_key", "_global", "isContextDefined", "context", "merge", "caseless", "skipUndefined", "assignValue", "targetKey", "i", "extend", "a", "b", "thisArg", "bind", "stripBOM", "content", "inherits", "constructor", "superConstructor", "props", "descriptors", "toFlatObject", "sourceObj", "destObj", "filter", "propFilter", "prop", "merged", "endsWith", "searchString", "position", "lastIndex", "toArray", "arr", "isTypedArray", "TypedArray", "forEachEntry", "_iterator", "pair", "matchAll", "regExp", "matches", "isHTMLForm", "toCamelCase", "m", "p1", "p2", "hasOwnProperty", "isRegExp", "reduceDescriptors", "reducer", "reducedDescriptors", "descriptor", "name", "ret", "freezeMethods", "value", "toObjectSet", "arrayOrString", "delimiter", "define", "noop", "toFiniteNumber", "defaultValue", "isSpecCompliantForm", "toJSONObject", "stack", "visit", "source", "target", "reducedValue", "isAsyncFn", "isThenable", "_setImmediate", "setImmediateSupported", "postMessageSupported", "token", "callbacks", "data", "cb", "asap", "isIterable", "utils_default", "AxiosError", "message", "code", "config", "request", "response", "utils_default", "prototype", "descriptors", "error", "customProps", "axiosError", "obj", "prop", "msg", "errCode", "AxiosError_default", "null_default", "isVisitable", "thing", "utils_default", "removeBrackets", "key", "renderKey", "path", "dots", "token", "i", "isFlatArray", "arr", "predicates", "prop", "toFormData", "obj", "formData", "options", "null_default", "option", "source", "metaTokens", "visitor", "defaultVisitor", "indexes", "useBlob", "convertValue", "value", "AxiosError_default", "el", "index", "stack", "exposedHelpers", "build", "toFormData_default", "encode", "str", "charMap", "match", "AxiosURLSearchParams", "params", "options", "toFormData_default", "prototype", "name", "value", "encoder", "_encode", "pair", "AxiosURLSearchParams_default", "encode", "val", "buildURL", "url", "params", "options", "_encode", "utils_default", "serializeFn", "serializedParams", "AxiosURLSearchParams_default", "hashmarkIndex", "InterceptorManager", "fulfilled", "rejected", "options", "id", "fn", "utils_default", "h", "InterceptorManager_default", "transitional_default", "URLSearchParams_default", "AxiosURLSearchParams_default", "FormData_default", "Blob_default", "browser_default", "URLSearchParams_default", "FormData_default", "Blob_default", "utils_exports", "__export", "hasBrowserEnv", "hasStandardBrowserEnv", "hasStandardBrowserWebWorkerEnv", "_navigator", "origin", "platform_default", "__spreadValues", "utils_exports", "browser_default", "toURLEncodedForm", "data", "options", "toFormData_default", "platform_default", "__spreadValues", "value", "key", "path", "helpers", "utils_default", "parsePropPath", "name", "utils_default", "match", "arrayToObject", "arr", "obj", "keys", "len", "key", "formDataToJSON", "formData", "buildPath", "path", "value", "target", "index", "isNumericKey", "isLast", "formDataToJSON_default", "stringifySafely", "rawValue", "parser", "encoder", "utils_default", "e", "defaults", "transitional_default", "data", "headers", "contentType", "hasJSONContentType", "isObjectPayload", "formDataToJSON_default", "isFileList", "toURLEncodedForm", "_FormData", "toFormData_default", "transitional", "forcedJSONParsing", "JSONRequested", "strictJSONParsing", "AxiosError_default", "platform_default", "status", "method", "defaults_default", "ignoreDuplicateOf", "utils_default", "parseHeaders_default", "rawHeaders", "parsed", "key", "val", "i", "line", "$internals", "normalizeHeader", "header", "normalizeValue", "value", "utils_default", "parseTokens", "str", "tokens", "tokensRE", "match", "isValidHeaderName", "matchHeaderValue", "context", "filter", "isHeaderNameFilter", "formatHeader", "w", "char", "buildAccessors", "obj", "accessorName", "methodName", "arg1", "arg2", "arg3", "AxiosHeaders", "headers", "valueOrRewrite", "rewrite", "self", "setHeader", "_value", "_header", "_rewrite", "lHeader", "key", "setHeaders", "parseHeaders_default", "dest", "entry", "parser", "matcher", "deleted", "deleteHeader", "keys", "format", "normalized", "targets", "asStrings", "thing", "first", "computed", "target", "accessors", "prototype", "defineAccessor", "mapped", "headerValue", "AxiosHeaders_default", "transformData", "fns", "response", "config", "defaults_default", "context", "headers", "AxiosHeaders_default", "data", "utils_default", "fn", "isCancel", "value", "CanceledError", "message", "config", "request", "AxiosError_default", "utils_default", "CanceledError_default", "settle", "resolve", "reject", "response", "validateStatus", "AxiosError_default", "parseProtocol", "url", "match", "speedometer", "samplesCount", "min", "bytes", "timestamps", "head", "tail", "firstSampleTS", "chunkLength", "now", "startedAt", "i", "bytesCount", "passed", "speedometer_default", "throttle", "fn", "freq", "timestamp", "threshold", "lastArgs", "timer", "invoke", "args", "now", "passed", "throttle_default", "progressEventReducer", "listener", "isDownloadStream", "freq", "bytesNotified", "_speedometer", "speedometer_default", "throttle_default", "e", "loaded", "total", "progressBytes", "rate", "inRange", "data", "progressEventDecorator", "throttled", "lengthComputable", "asyncDecorator", "fn", "args", "utils_default", "isURLSameOrigin_default", "platform_default", "origin", "isMSIE", "url", "cookies_default", "platform_default", "name", "value", "expires", "path", "domain", "secure", "sameSite", "cookie", "utils_default", "match", "isAbsoluteURL", "url", "combineURLs", "baseURL", "relativeURL", "buildFullPath", "baseURL", "requestedURL", "allowAbsoluteUrls", "isRelativeUrl", "isAbsoluteURL", "combineURLs", "headersToObject", "thing", "AxiosHeaders_default", "__spreadValues", "mergeConfig", "config1", "config2", "config", "getMergedValue", "target", "source", "prop", "caseless", "utils_default", "mergeDeepProperties", "a", "b", "valueFromConfig2", "defaultToConfig2", "mergeDirectKeys", "mergeMap", "merge", "configValue", "resolveConfig_default", "config", "newConfig", "mergeConfig", "data", "withXSRFToken", "xsrfHeaderName", "xsrfCookieName", "headers", "auth", "AxiosHeaders_default", "buildURL", "buildFullPath", "utils_default", "platform_default", "formHeaders", "allowedHeaders", "key", "val", "isURLSameOrigin_default", "xsrfValue", "cookies_default", "isXHRAdapterSupported", "xhr_default", "config", "resolve", "reject", "_config", "resolveConfig_default", "requestData", "requestHeaders", "AxiosHeaders_default", "responseType", "onUploadProgress", "onDownloadProgress", "onCanceled", "uploadThrottled", "downloadThrottled", "flushUpload", "flushDownload", "done", "request", "onloadend", "responseHeaders", "response", "settle", "value", "err", "AxiosError_default", "event", "msg", "timeoutErrorMessage", "transitional", "transitional_default", "utils_default", "val", "key", "progressEventReducer", "cancel", "CanceledError_default", "protocol", "parseProtocol", "platform_default", "composeSignals", "signals", "timeout", "length", "controller", "aborted", "onabort", "reason", "unsubscribe", "err", "AxiosError_default", "CanceledError_default", "timer", "signal", "utils_default", "composeSignals_default", "streamChunk", "chunk", "chunkSize", "len", "pos", "end", "readBytes", "iterable", "__asyncGenerator", "iter", "__forAwait", "readStream", "more", "temp", "error", "__await", "__yieldStar", "stream", "reader", "done", "value", "trackStream", "onProgress", "onFinish", "iterator", "bytes", "_onFinish", "e", "controller", "loadedBytes", "err", "reason", "DEFAULT_CHUNK_SIZE", "isFunction", "utils_default", "globalFetchAPI", "Request", "Response", "ReadableStream", "TextEncoder", "test", "fn", "args", "e", "factory", "env", "envFetch", "isFetchSupported", "isRequestSupported", "isResponseSupported", "isReadableStreamSupported", "encodeText", "encoder", "str", "supportsRequestStream", "duplexAccessed", "hasContentType", "platform_default", "supportsResponseStream", "resolvers", "res", "type", "config", "method", "AxiosError_default", "getBodyLength", "body", "resolveBodyLength", "headers", "length", "url", "data", "signal", "cancelToken", "timeout", "onDownloadProgress", "onUploadProgress", "responseType", "withCredentials", "fetchOptions", "resolveConfig_default", "_fetch", "composedSignal", "composeSignals_default", "request", "unsubscribe", "requestContentLength", "_request", "contentTypeHeader", "onProgress", "flush", "progressEventDecorator", "progressEventReducer", "asyncDecorator", "trackStream", "isCredentialsSupported", "resolvedOptions", "__spreadProps", "__spreadValues", "response", "isStreamResponse", "options", "prop", "responseContentLength", "responseData", "resolve", "reject", "settle", "AxiosHeaders_default", "err", "seedCache", "getFetch", "fetch", "seeds", "len", "i", "seed", "target", "map", "adapter", "knownAdapters", "null_default", "xhr_default", "getFetch", "utils_default", "fn", "value", "e", "renderReason", "reason", "isResolvedHandle", "adapter", "getAdapter", "adapters", "config", "length", "nameOrAdapter", "rejectedReasons", "i", "id", "AxiosError_default", "reasons", "state", "s", "adapters_default", "throwIfCancellationRequested", "config", "CanceledError_default", "dispatchRequest", "AxiosHeaders_default", "transformData", "adapters_default", "defaults_default", "response", "reason", "isCancel", "VERSION", "validators", "type", "i", "thing", "deprecatedWarnings", "validator", "version", "message", "formatMessage", "opt", "desc", "VERSION", "value", "opts", "AxiosError_default", "correctSpelling", "assertOptions", "options", "schema", "allowUnknown", "keys", "result", "validator_default", "validators", "validator_default", "Axios", "instanceConfig", "InterceptorManager_default", "configOrUrl", "config", "err", "dummy", "stack", "e", "mergeConfig", "transitional", "paramsSerializer", "headers", "utils_default", "contextHeaders", "method", "AxiosHeaders_default", "requestInterceptorChain", "synchronousRequestInterceptors", "interceptor", "responseInterceptorChain", "promise", "i", "len", "chain", "dispatchRequest", "newConfig", "onFulfilled", "onRejected", "error", "fullPath", "buildFullPath", "buildURL", "url", "generateHTTPMethod", "isForm", "data", "Axios_default", "CancelToken", "_CancelToken", "executor", "resolvePromise", "resolve", "token", "cancel", "i", "onfulfilled", "_resolve", "promise", "message", "config", "request", "CanceledError_default", "listener", "index", "controller", "abort", "err", "c", "CancelToken_default", "spread", "callback", "arr", "isAxiosError", "payload", "utils_default", "HttpStatusCode", "key", "value", "HttpStatusCode_default", "createInstance", "defaultConfig", "context", "Axios_default", "instance", "bind", "utils_default", "instanceConfig", "mergeConfig", "axios", "defaults_default", "CanceledError_default", "CancelToken_default", "isCancel", "VERSION", "toFormData_default", "AxiosError_default", "promises", "spread", "isAxiosError", "AxiosHeaders_default", "thing", "formDataToJSON_default", "adapters_default", "HttpStatusCode_default", "axios_default", "Axios", "AxiosError", "CanceledError", "isCancel", "CancelToken", "VERSION", "all", "Cancel", "isAxiosError", "spread", "toFormData", "AxiosHeaders", "HttpStatusCode", "formToJSON", "getAdapter", "mergeConfig", "axios_default", "ApiClient", "config", "axios_default", "__spreadValues", "_a", "_b", "error", "token", "response", "provider", "url", "data", "key", "value", "now", "history", "LIBVERSION", "UA_MAX_LENGTH", "USER_AGENT", "EMPTY", "UNKNOWN", "TYPEOF", "BROWSER", "CPU", "DEVICE", "ENGINE", "OS", "RESULT", "NAME", "TYPE", "VENDOR", "VERSION", "ARCHITECTURE", "MAJOR", "MODEL", "CONSOLE", "MOBILE", "TABLET", "SMARTTV", "WEARABLE", "XR", "EMBEDDED", "INAPP", "BRANDS", "FORMFACTORS", "FULLVERLIST", "PLATFORM", "PLATFORMVER", "BITNESS", "CH", "CH_FULL_VER_LIST", "CH_ARCH", "CH_BITNESS", "CH_FORM_FACTORS", "CH_MOBILE", "CH_MODEL", "CH_PLATFORM", "CH_PLATFORM_VER", "CH_ALL_VALUES", "AMAZON", "APPLE", "ASUS", "BLACKBERRY", "GOOGLE", "HUAWEI", "LENOVO", "HONOR", "LG", "MICROSOFT", "MOTOROLA", "NVIDIA", "ONEPLUS", "OPPO", "SAMSUNG", "SHARP", "SONY", "XIAOMI", "ZEBRA", "CHROME", "CHROMIUM", "CHROMECAST", "EDGE", "FIREFOX", "OPERA", "FACEBOOK", "SOGOU", "PREFIX_MOBILE", "SUFFIX_BROWSER", "WINDOWS", "isWindow", "NAVIGATOR", "NAVIGATOR_UADATA", "extend", "defaultRgx", "extensions", "mergedRgx", "extraRgx", "isExtensions", "i", "j", "k", "enumerize", "arr", "enums", "has", "str1", "str2", "lowerize", "isString", "obj", "deep", "prop", "val", "itemListToArray", "header", "tokens", "strip", "token", "trim", "str", "majorize", "version", "setProps", "propName", "pattern", "stripQuotes", "len", "rgxMapper", "ua", "arrays", "p", "q", "matches", "match", "regex", "props", "strMapper", "map", "windowsVersionMap", "formFactorsMap", "browserHintsMap", "defaultRegexes", "defaultProps", "createIData", "item", "itemType", "init_props", "is_ignoreProps", "is_ignoreRgx", "toString_props", "IData", "res", "UACHData", "strToCheck", "is", "cb", "that", "IDataResolve", "resolveData", "uach", "isHttpUACH", "UAItem", "rgxMap", "uaCH", "ch", "data", "detect", "realVersion", "brands", "prevName", "brandName", "brandVersion", "archName", "reParse", "ff", "idx", "osName", "osVersion", "parse", "UAParser", "headers", "kv", "v", "normalized", "userAgent", "httpUACH", "regexMap", "createItemFunc", "BrowserName", "BrowserType", "CPUArch", "DeviceType", "DeviceVendor", "EngineName", "OSName", "Extension", "MODEL", "NAME", "TYPE", "VENDOR", "VERSION", "MOBILE", "TABLET", "CRAWLER", "CLI", "EMAIL", "FETCHER", "INAPP", "MEDIAPLAYER", "LIBRARY", "CLIs", "Crawlers", "ExtraDevices", "Emails", "Fetchers", "os", "InApps", "MediaPlayers", "Libraries", "Vehicles", "Bots", "TIMEZONE", "EU_TIMEZONE", "EEA_EFTA_TIMEZONE", "EEA_TIMEZONE", "EFTA_TIMEZONE", "SCHENGEN_TIMEZONE", "isStandalonePWA", "_a", "Crawler", "Extension", "toResult", "value", "head", "ext", "UAParser", "isAppleSilicon", "resultOrUA", "res", "toResult", "OSName", "CPUArch", "canvas", "webgl", "debug", "e", "isBot", "resultOrUA", "BrowserType", "toResult", "Bots", "isChromeFamily", "EngineName", "getScreenResolution", "getTimeZone", "error", "getBrowserLocale", "collectDeviceInfo", "result", "UAParser", "flags", "isBot", "isChromeFamily", "isStandalonePWA", "isAppleSilicon", "getUrlParams", "params", "EventBus", "event", "callback", "data", "callbacks", "cb", "e", "init_eventDispatcher", "decodeJWTClient", "token", "parts", "payload", "paddedPayload", "decoded", "parsedPayload", "error", "isTokenExpired", "init_environment", "import_meta", "DEFAULT_PREFIXES", "resolveEnvValue", "key", "prefixes", "_a", "_b", "_c", "prefix", "envKey", "loadLocalDevConfig", "configVariant", "resolveEnvValue", "isLocalEnvironment", "localResponse", "localConfig", "config", "configLoaded", "deploymentResponse", "e", "defaultResponse", "result", "loadStaticResources", "funnelResponse", "funnelConfig", "loadLocalFunnelConfig", "transformed", "key", "value", "response", "staticResources", "error", "getMetaContent", "name", "metaTag", "loadProductionConfig", "storeId", "accountId", "basePath", "encodedConfig", "decodedConfig", "loadPluginConfig", "rawConfig", "_a", "_b", "productionConfig", "__spreadProps", "__spreadValues", "envConfig", "createRawPluginConfig", "loadLocalConfig", "configName", "defaultConfig", "possiblePaths", "path", "resolvedConfig", "init_previewMode", "init_tokenStorage", "init_tokenStorage", "resolutionCache", "resolvedCodes", "getAuthCode", "resolveAuthHandoff", "authCode", "storeId", "apiBaseUrl", "debugMode", "resolvedCodes", "inFlightResolution", "resolutionCache", "resolutionPromise", "response", "errorData", "data", "setClientToken", "cleanAuthCodeFromUrl", "error", "url", "shouldResolveAuthCode", "getAuthCode", "TagadaClient", "config", "EventBus", "EventDispatcher", "_a", "_b", "_c", "_d", "event", "accountId", "funnelId", "err", "handlePreviewMode", "env", "envConfig", "getEnvironmentConfig", "__spreadProps", "__spreadValues", "ApiClient", "funnelFeature", "funnelConfig", "FunnelClient", "getClientToken", "listener", "updates", "detectEnvironment", "error", "configVariant", "loadPluginConfig", "shouldResolveAuthCode", "storeId", "authCode", "handoffData", "resolveAuthHandoff", "decodedSession", "decodeJWTClient", "queryToken", "setClientToken", "existingToken", "tokenToUse", "shouldPersist", "isTokenExpired", "token", "resolve", "urlToken", "draft", "isDraftMode", "response", "sessionData", "_e", "_f", "_g", "_h", "_i", "_j", "_k", "deviceInfo", "collectDeviceInfo", "urlParams", "getUrlParams", "browserLocale", "getBrowserLocale", "draftParam", "setDraftMode", "sessionInitData", "storeData", "storeConfig", "localeConfig", "currencyConfig", "authState", "code", "newConfig", "updatedConfig", "handleMessage", "elementId", "styles", "staticHighlightId", "existingHighlight", "applyToElement", "element", "isVoidElement", "targetElement", "parent", "newWrapper", "computedStyle", "elementDisplay", "verticalAlign", "prop", "camelProp", "value", "inlineValue", "highlightDiv", "borderRadius", "stylesToApply", "property", "camelProperty", "_", "letter", "appliedStyles", "k", "v", "maxAttempts", "intervalMs", "attempts", "isElementHidden", "style", "findAndApply", "elements", "i", "init_funnel", "init_sessionStorage", "createTagadaClient", "config", "TagadaClient", "init_tokenStorage", "getUrlParam", "name", "log", "debug", "args", "TagadaExternalTracker", "config", "_a", "_b", "_c", "_d", "__spreadValues", "urlToken", "setClientToken", "createTagadaClient", "funnelContext", "session", "error", "err", "ctx", "options", "shouldAutoRedirect", "result", "_e", "baseUrl", "additionalParams", "url", "key", "value", "resolve", "retries", "checkReady", "authSession", "store", "entryStepId", "TagadaTracker", "TagadaTracker"]
|
|
7
7
|
}
|