@perspective-ai/sdk 1.7.0 → 1.7.1

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts","../src/constants.ts","../src/utils.ts","../src/iframe.ts","../src/loading.ts","../src/styles.ts","../src/attribution.ts","../src/widget.ts","../src/state.ts","../src/popup.ts","../src/slider.ts","../src/float.ts","../src/fullpage.ts","../src/triggers.ts","../src/embed-api.ts"],"names":["createNoOpHandle"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Embed SDK configuration\n * SSR-safe - DOM access is guarded and lazy\n */\n\nimport type { SDKConfig } from \"./types\";\n\n/** Default production host */\nconst DEFAULT_HOST = \"https://getperspective.ai\";\n\n/** Global SDK configuration - can be set before creating embeds */\nlet globalConfig: SDKConfig = {};\n\n/**\n * Configure the SDK globally\n * Call this before creating any embeds if you need to override defaults\n */\nexport function configure(config: SDKConfig): void {\n globalConfig = { ...globalConfig, ...config };\n}\n\n/**\n * Get the current SDK configuration\n */\nexport function getConfig(): SDKConfig {\n return { ...globalConfig };\n}\n\n/**\n * Check if DOM is available (SSR safety)\n */\nexport function hasDom(): boolean {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n}\n\nfunction normalizeToOrigin(host: string): string {\n try {\n return new URL(host).origin;\n } catch {\n return host;\n }\n}\n\nexport function getHost(instanceHost?: string): string {\n // Instance-level override\n if (instanceHost) {\n return normalizeToOrigin(instanceHost);\n }\n\n // Global config override\n if (globalConfig.host) {\n return normalizeToOrigin(globalConfig.host);\n }\n\n // Try to infer from script src (only in browser, only at load time)\n if (hasDom()) {\n const scriptHost = getScriptHost();\n if (scriptHost) {\n return scriptHost;\n }\n }\n\n return DEFAULT_HOST;\n}\n\n// Capture script src at load time - document.currentScript only available during initial execution\nlet capturedScriptHost: string | null = null;\n\nfunction getScriptHost(): string | null {\n if (capturedScriptHost !== null) {\n return capturedScriptHost;\n }\n\n if (!hasDom()) {\n return null;\n }\n\n const currentScript = document.currentScript as HTMLScriptElement | null;\n if (currentScript?.src) {\n try {\n capturedScriptHost = new URL(currentScript.src).origin;\n return capturedScriptHost;\n } catch {\n // Invalid URL, ignore\n }\n }\n\n capturedScriptHost = \"\"; // Mark as attempted\n return null;\n}\n\n// Capture script host immediately when module loads (in browser)\nif (hasDom()) {\n getScriptHost();\n}\n","/**\n * Shared constants for Perspective Embed SDK\n * This file is SSR-safe - no DOM access at import time\n * Used by both SDK bundle and the main Perspective app\n */\n\n// ============================================================================\n// SDK Version & Features\n// ============================================================================\n\n/** SDK version for handshake protocol — replaced at build time by tsup define */\ndeclare const PKG_VERSION: string;\nexport const SDK_VERSION = PKG_VERSION;\n\n/** Feature flags as bitset for version negotiation */\nexport const FEATURES = {\n RESIZE: 1 << 0, // 0b0001\n THEME_SYNC: 1 << 1, // 0b0010\n ANON_ID: 1 << 2, // 0b0100\n SCROLLBAR_STYLES: 1 << 3, // 0b1000\n EMBED_AUTH: 1 << 4, // 0b10000\n} as const;\n\n/** Current SDK feature set */\nexport const CURRENT_FEATURES =\n FEATURES.RESIZE |\n FEATURES.THEME_SYNC |\n FEATURES.ANON_ID |\n FEATURES.SCROLLBAR_STYLES |\n FEATURES.EMBED_AUTH;\n\n// ============================================================================\n// URL Parameter Keys\n// ============================================================================\n\n// Embed parameters\nexport const PARAM_KEYS = {\n embed: \"embed\",\n embedType: \"embed_type\",\n theme: \"theme\",\n} as const;\n\nexport type ParamKey = (typeof PARAM_KEYS)[keyof typeof PARAM_KEYS];\n\n// ============================================================================\n// Brand Color Keys\n// ============================================================================\n\nexport const BRAND_KEYS = {\n // Light mode\n primary: \"brand.primary\",\n secondary: \"brand.secondary\",\n bg: \"brand.bg\",\n text: \"brand.text\",\n\n // Dark mode\n darkPrimary: \"brand.dark.primary\",\n darkSecondary: \"brand.dark.secondary\",\n darkBg: \"brand.dark.bg\",\n darkText: \"brand.dark.text\",\n} as const;\n\nexport type BrandKey = (typeof BRAND_KEYS)[keyof typeof BRAND_KEYS];\n\n// ============================================================================\n// Reserved Parameters (cannot be overridden via custom params or parent URL)\n// ============================================================================\n\nexport const RESERVED_PARAMS: Set<string> = new Set([\n ...Object.values(PARAM_KEYS),\n ...Object.values(BRAND_KEYS),\n]);\n\n// ============================================================================\n// Data Attributes (HTML declarative initialization)\n// ============================================================================\n\nexport const DATA_ATTRS = {\n widget: \"data-perspective-widget\",\n popup: \"data-perspective-popup\",\n slider: \"data-perspective-slider\",\n float: \"data-perspective-float\", // Primary name\n chat: \"data-perspective-chat\", // Legacy alias\n fullpage: \"data-perspective-fullpage\",\n params: \"data-perspective-params\",\n brand: \"data-perspective-brand\",\n brandDark: \"data-perspective-brand-dark\",\n theme: \"data-perspective-theme\",\n noStyle: \"data-perspective-no-style\",\n autoOpen: \"data-perspective-auto-open\",\n showOnce: \"data-perspective-show-once\",\n disableClose: \"data-perspective-disable-close\",\n launcherIcon: \"data-perspective-launcher-icon\",\n launcherStyle: \"data-perspective-launcher-style\",\n launcherClass: \"data-perspective-launcher-class\",\n disableJsonLdAttribution: \"data-perspective-disable-jsonld-attribution\",\n} as const;\n\nexport type DataAttr = (typeof DATA_ATTRS)[keyof typeof DATA_ATTRS];\n\n// ============================================================================\n// PostMessage Event Types\n// ============================================================================\n\nexport const MESSAGE_TYPES = {\n // SDK -> Iframe (initialization)\n init: \"perspective:init\",\n\n // Iframe -> SDK\n ready: \"perspective:ready\",\n resize: \"perspective:resize\",\n submit: \"perspective:submit\",\n close: \"perspective:close\",\n error: \"perspective:error\",\n redirect: \"perspective:redirect\",\n\n // SDK -> Iframe (internal)\n anonId: \"perspective:anon-id\",\n injectStyles: \"perspective:inject-styles\",\n themeChange: \"perspective:theme-change\",\n\n // Iframe -> SDK (auth)\n authRequest: \"perspective:auth-request\",\n authSignout: \"perspective:auth-signout\",\n\n // SDK -> Iframe (auth)\n authComplete: \"perspective:auth-complete\",\n authCancelled: \"perspective:auth-cancelled\",\n\n // Popup -> SDK (auth callback from popup/tab opened by SDK)\n popupAuthComplete: \"perspective:popup-auth-complete\",\n\n // Iframe -> SDK (internal)\n requestScrollbarStyles: \"perspective:request-scrollbar-styles\",\n} as const;\n\nexport type MessageType = (typeof MESSAGE_TYPES)[keyof typeof MESSAGE_TYPES];\n\n// ============================================================================\n// Error Codes\n// ============================================================================\n\nexport const ERROR_CODES = {\n SDK_OUTDATED: \"SDK_OUTDATED\",\n INVALID_RESEARCH: \"INVALID_RESEARCH\",\n UNKNOWN: \"UNKNOWN\",\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\n// ============================================================================\n// Param Values (for boolean-like string params)\n// ============================================================================\n\nexport const PARAM_VALUES = {\n true: \"true\",\n false: \"false\",\n} as const;\n\n// ============================================================================\n// Theme Values\n// ============================================================================\n\nexport const THEME_VALUES = {\n dark: \"dark\",\n light: \"light\",\n system: \"system\",\n} as const;\n\nexport type ThemeValue = (typeof THEME_VALUES)[keyof typeof THEME_VALUES];\n\n// ============================================================================\n// Interview Mode Values (for mode param)\n// ============================================================================\n\nexport const MODE_VALUES = {\n preview: \"preview\",\n restart: \"restart\",\n normal: \"normal\",\n simulated: \"simulated\",\n} as const;\n\nexport type ModeValue = (typeof MODE_VALUES)[keyof typeof MODE_VALUES];\n\n// ============================================================================\n// localStorage Keys\n// ============================================================================\n\nexport const STORAGE_KEYS = {\n anonId: \"perspective-anon-id\",\n triggerShown: \"perspective-trigger-shown\",\n embedAuthToken: \"perspective-embed-auth-token\",\n embedState: \"perspective-embed-state\",\n} as const;\n","/**\n * Shared utilities for the Perspective Embed SDK\n * SSR-safe - DOM access is guarded\n */\n\nimport { THEME_VALUES, type ThemeValue } from \"./constants\";\nimport { hasDom } from \"./config\";\n\n/**\n * Join class names, filtering out falsy values\n */\nexport function cn(...classes: (string | false | null | undefined)[]): string {\n return classes\n .map((c) => (c || \"\").split(\" \"))\n .flat()\n .filter(Boolean)\n .join(\" \");\n}\n\n/**\n * Get the perspective theme class based on the theme value\n * Returns \"perspective-{theme}-theme\" when theme is available, undefined otherwise\n */\nexport function getThemeClass(theme: string | undefined): string | undefined {\n return theme && theme !== THEME_VALUES.system\n ? `perspective-${theme}-theme`\n : undefined;\n}\n\n/**\n * Resolve whether dark mode should be used.\n * Priority: 1) explicit theme override, 2) system preference\n * SSR-safe: defaults to light theme on server\n */\nexport function resolveIsDark(theme?: ThemeValue | string): boolean {\n if (theme === THEME_VALUES.dark) return true;\n if (theme === THEME_VALUES.light) return false;\n // system or undefined → use system preference (or light on server)\n if (!hasDom()) return false;\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n}\n\n/**\n * Resolve effective theme based on override and system preference\n * Returns the theme string ('light' or 'dark')\n */\nexport function resolveTheme(themeOverride?: ThemeValue): \"light\" | \"dark\" {\n return resolveIsDark(themeOverride) ? \"dark\" : \"light\";\n}\n\n/**\n * Normalize and validate hex color. Returns undefined for invalid colors.\n */\nexport function normalizeHex(color: string): string | undefined {\n const trimmed = color.trim();\n if (!trimmed) return undefined;\n\n const normalized = trimmed.startsWith(\"#\") ? trimmed : `#${trimmed}`;\n\n // Validate hex format (#RGB, #RRGGBB, or #RRGGBBAA)\n if (/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/.test(normalized)) {\n return normalized;\n }\n\n // Try to extract valid hex chars\n const hexChars = normalized.slice(1).replace(/[^0-9a-fA-F]/g, \"\");\n if (hexChars.length >= 6) return `#${hexChars.slice(0, 6)}`;\n if (hexChars.length >= 3) return `#${hexChars.slice(0, 3)}`;\n\n return undefined;\n}\n\n/**\n * Convert hex to rgba for spinner track\n */\nexport function hexToRgba(hex: string, alpha: number): string {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result || !result[1] || !result[2] || !result[3]) {\n return `rgba(118, 41, 200, ${alpha})`;\n }\n\n const r = parseInt(result[1], 16);\n const g = parseInt(result[2], 16);\n const b = parseInt(result[3], 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n","/**\n * iframe creation and postMessage communication\n * SSR-safe - all DOM access is guarded\n */\n\nimport type {\n BrandColors,\n EmbedConfig,\n EmbedMessage,\n EmbedType,\n ThemeConfig,\n} from \"./types\";\nimport { hasDom } from \"./config\";\nimport {\n RESERVED_PARAMS,\n PARAM_KEYS,\n BRAND_KEYS,\n MESSAGE_TYPES,\n THEME_VALUES,\n PARAM_VALUES,\n STORAGE_KEYS,\n SDK_VERSION,\n CURRENT_FEATURES,\n ERROR_CODES,\n} from \"./constants\";\nimport { normalizeHex } from \"./utils\";\n\n/** Validate redirect URL - allow https, http localhost, and relative URLs */\nfunction isAllowedRedirectUrl(url: string): boolean {\n if (!url || typeof url !== \"string\") return false;\n // Relative URLs (path, query, hash) are always safe — same origin by definition\n // Exclude protocol-relative URLs (// prefix) which resolve to an external origin\n if (\n (url.startsWith(\"/\") && !url.startsWith(\"//\")) ||\n url.startsWith(\"?\") ||\n url.startsWith(\"#\")\n )\n return true;\n try {\n const parsed = new URL(url, window.location.origin);\n const protocol = parsed.protocol.toLowerCase();\n const hostname = parsed.hostname.toLowerCase();\n\n if (protocol === \"https:\") return true;\n if (\n protocol === \"http:\" &&\n (hostname === \"localhost\" || hostname === \"127.0.0.1\")\n )\n return true;\n\n return false;\n } catch {\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Embed Auth Token Caching (Parent-side — Layer 2 of 2)\n//\n// Why two layers? Safari (and any browser following WebKit's Intelligent\n// Tracking Prevention) makes third-party iframe localStorage \"partitioned\n// and ephemeral\" — it works within a tab session but is wiped when the\n// user closes the tab or quits the browser.\n// Ref: https://webkit.org/tracking-prevention/#intelligenttrackingprevention\n// \"Third-party LocalStorage and IndexedDB are partitioned per\n// first-party website and also made ephemeral.\"\n//\n// Chrome and Firefox persist cross-origin iframe localStorage across\n// sessions, so Layer 1 alone would suffice there. Layer 2 exists\n// specifically for Safari and similar browsers.\n//\n// Layer 1 (iframe — useEmbedAuth.ts): Stores token in iframe's own\n// localStorage. Fast synchronous restore on re-render. Works across\n// sessions in Chrome/Firefox. Ephemeral on Safari (lost on tab close).\n//\n// Layer 2 (parent — this code): Caches token in the PARENT page's\n// first-party localStorage, which persists on all browsers. On iframe\n// load, relays any cached token via postMessage (perspective:auth-complete\n// in the perspective:ready handler). The iframe's storeToken() writes it\n// back to Layer 1, repopulating the ephemeral cache for this tab session.\n//\n// Direct iframe embeds (without SDK) only have Layer 1. On Safari, auth\n// won't survive tab close — inherent limitation without the SDK.\n// ---------------------------------------------------------------------------\n\n/** Decode JWT payload without verification (client-side — server verifies) */\nfunction decodeTokenExpiry(token: string): number | null {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3) return null;\n const base64 = parts[1]!.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const payload = JSON.parse(atob(base64));\n return payload.data?.expiresAt ?? null;\n } catch {\n return null;\n }\n}\n\nfunction authTokenKey(researchId: string): string {\n return `${STORAGE_KEYS.embedAuthToken}:${researchId}`;\n}\n\n/** Get cached embed auth token from parent's first-party localStorage (Layer 2).\n * Called on iframe ready to relay token back — critical for Safari where\n * iframe localStorage (Layer 1) is wiped on tab close. */\nfunction getCachedAuthToken(researchId: string): string | null {\n if (!hasDom()) return null;\n try {\n const key = authTokenKey(researchId);\n const token = localStorage.getItem(key);\n if (!token) return null;\n const expiresAt = decodeTokenExpiry(token);\n if (expiresAt && expiresAt > Date.now()) return token;\n // Expired — clean up\n localStorage.removeItem(key);\n return null;\n } catch {\n return null;\n }\n}\n\n/** Cache embed auth token in parent's first-party localStorage (Layer 2).\n * Survives tab close and browser restart on all browsers including Safari. */\nfunction cacheAuthToken(researchId: string, token: string): void {\n if (!hasDom()) return;\n try {\n localStorage.setItem(authTokenKey(researchId), token);\n } catch {\n // localStorage blocked\n }\n}\n\n/** Clear cached embed auth token for a research */\nfunction clearAuthToken(researchId: string): void {\n if (!hasDom()) return;\n try {\n localStorage.removeItem(authTokenKey(researchId));\n } catch {\n // localStorage blocked\n }\n}\n\n/** Get or create persistent anonymous ID */\nfunction getOrCreateAnonId(): string {\n if (!hasDom()) return \"\";\n\n try {\n let id = localStorage.getItem(STORAGE_KEYS.anonId);\n if (!id) {\n id = crypto.randomUUID();\n localStorage.setItem(STORAGE_KEYS.anonId, id);\n }\n return id;\n } catch {\n // localStorage might be blocked\n return crypto.randomUUID();\n }\n}\n\n/** Collect all search params from the parent page URL (excluding reserved SDK params) */\nfunction getParentSearchParams(): Record<string, string> {\n if (!hasDom()) return {};\n\n const params: Record<string, string> = {};\n const searchParams = new URLSearchParams(window.location.search);\n\n for (const [key, value] of searchParams.entries()) {\n if (!RESERVED_PARAMS.has(key)) {\n params[key] = value;\n }\n }\n\n return params;\n}\n\n/** Build iframe URL with all params */\nfunction buildIframeUrl(\n researchId: string,\n type: EmbedType,\n host: string,\n customParams?: Record<string, string>,\n brand?: { light?: BrandColors; dark?: BrandColors },\n themeOverride?: \"dark\" | \"light\" | \"system\"\n): string {\n const url = new URL(`${host}/interview/${researchId}`);\n\n // Base embed params\n url.searchParams.set(PARAM_KEYS.embed, PARAM_VALUES.true);\n url.searchParams.set(PARAM_KEYS.embedType, type === \"float\" ? \"chat\" : type);\n\n // Detect and pass system theme preference (can be overridden)\n if (hasDom()) {\n const isDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n if (themeOverride && themeOverride !== THEME_VALUES.system) {\n url.searchParams.set(PARAM_KEYS.theme, themeOverride);\n } else {\n url.searchParams.set(\n PARAM_KEYS.theme,\n isDark ? THEME_VALUES.dark : THEME_VALUES.light\n );\n }\n } else {\n // SSR fallback\n url.searchParams.set(PARAM_KEYS.theme, themeOverride || THEME_VALUES.light);\n }\n\n // Auto-forward all parent page search params (e.g. ?ref=pricing-enterprise)\n // These are added first so that explicit customParams can override them\n const parentParams = getParentSearchParams();\n for (const [key, value] of Object.entries(parentParams)) {\n url.searchParams.set(key, value);\n }\n\n // Helper to set param only if color is valid\n const setColor = (key: string, color: string | undefined) => {\n if (!color) return;\n const normalized = normalizeHex(color);\n if (normalized) url.searchParams.set(key, normalized);\n };\n\n // Add brand colors using short keys\n if (brand?.light) {\n setColor(BRAND_KEYS.primary, brand.light.primary);\n setColor(BRAND_KEYS.secondary, brand.light.secondary);\n setColor(BRAND_KEYS.bg, brand.light.bg);\n setColor(BRAND_KEYS.text, brand.light.text);\n }\n\n // Add dark mode brand colors\n if (brand?.dark) {\n setColor(BRAND_KEYS.darkPrimary, brand.dark.primary);\n setColor(BRAND_KEYS.darkSecondary, brand.dark.secondary);\n setColor(BRAND_KEYS.darkBg, brand.dark.bg);\n setColor(BRAND_KEYS.darkText, brand.dark.text);\n }\n\n // Add custom params, filtering out reserved keys\n if (customParams) {\n for (const [key, value] of Object.entries(customParams)) {\n if (!RESERVED_PARAMS.has(key)) {\n url.searchParams.set(key, value);\n }\n }\n }\n\n return url.toString();\n}\n\n/** Known appearance param keys — only these are allowed as overrides */\nconst APPEARANCE_KEYS = new Set([\n \"hideProgress\",\n \"hideGreeting\",\n \"hideBranding\",\n \"enableFullScreen\",\n]);\n\n/** Convert embedSettings.appearance to URL query params. Emits both true/false so API can override embed code in either direction. */\nexport function appearanceToParams(\n embedSettings?: ThemeConfig[\"embedSettings\"]\n): Record<string, string> | undefined {\n const a = embedSettings?.appearance;\n if (!a) return undefined;\n const params: Record<string, string> = {};\n if (a.hideProgress !== undefined)\n params.hideProgress = a.hideProgress ? \"true\" : \"false\";\n if (a.hideGreeting !== undefined)\n params.hideGreeting = a.hideGreeting ? \"true\" : \"false\";\n if (a.hideBranding !== undefined)\n params.hideBranding = a.hideBranding ? \"true\" : \"false\";\n if (a.enableFullScreen !== undefined)\n params.enableFullScreen = a.enableFullScreen ? \"true\" : \"false\";\n return Object.keys(params).length > 0 ? params : undefined;\n}\n\nexport function createIframe(\n researchId: string,\n type: EmbedType,\n host: string,\n params?: Record<string, string>,\n brand?: { light?: BrandColors; dark?: BrandColors },\n themeOverride?: \"dark\" | \"light\" | \"system\",\n appearanceOverrides?: Record<string, string>\n): HTMLIFrameElement {\n if (!hasDom()) {\n // Return a stub for SSR\n return {} as HTMLIFrameElement;\n }\n\n const iframe = document.createElement(\"iframe\");\n iframe.src = buildIframeUrl(\n researchId,\n type,\n host,\n params,\n brand,\n themeOverride\n );\n\n // Apply appearance overrides from API config (API wins over embed code)\n // Restricted to APPEARANCE_KEYS to prevent overwriting reserved params\n if (appearanceOverrides && Object.keys(appearanceOverrides).length > 0) {\n const url = new URL(iframe.src);\n for (const [key, value] of Object.entries(appearanceOverrides)) {\n if (APPEARANCE_KEYS.has(key)) {\n url.searchParams.set(key, value);\n }\n }\n iframe.src = url.toString();\n }\n\n iframe.setAttribute(\"allow\", \"microphone; camera\");\n iframe.setAttribute(\"allowfullscreen\", \"true\");\n iframe.setAttribute(\n \"sandbox\",\n \"allow-scripts allow-same-origin allow-forms allow-popups allow-modals allow-top-navigation\"\n );\n iframe.setAttribute(\"data-perspective\", \"true\");\n iframe.setAttribute(\"title\", \"Powered by Perspective AI concierge\");\n iframe.style.cssText = \"border:none;\";\n\n return iframe;\n}\n\nexport function setupMessageListener(\n researchId: string,\n config: Partial<EmbedConfig>,\n iframe: HTMLIFrameElement,\n host: string,\n options?: { skipResize?: boolean; hasCloseButton?: boolean }\n): () => void {\n if (!hasDom()) {\n return () => {};\n }\n\n // Track active auth flow cleanup for concurrent request prevention and embed teardown\n let activeAuthCleanup: (() => void) | null = null;\n\n const handler = (event: MessageEvent<EmbedMessage>) => {\n // Security: Only accept messages from our embed host and from the expected iframe\n if (event.origin !== host) return;\n if (event.source !== iframe.contentWindow) return;\n\n // Only process messages from our embed\n if (typeof event.data?.type !== \"string\") return;\n if (!event.data.type.startsWith(\"perspective:\")) return;\n if (event.data.researchId !== researchId) {\n return;\n }\n\n switch (event.data.type) {\n case MESSAGE_TYPES.ready: {\n // Send scrollbar styles when iframe is ready\n sendScrollbarStyles(iframe, host);\n // Send anon_id for anonymous auth\n sendMessage(iframe, host, {\n type: MESSAGE_TYPES.anonId,\n anonId: getOrCreateAnonId(),\n });\n // Send init message with version/features for handshake\n sendMessage(iframe, host, {\n type: MESSAGE_TYPES.init,\n version: SDK_VERSION,\n features: CURRENT_FEATURES,\n researchId,\n hasCloseButton: options?.hasCloseButton ?? false,\n });\n // Layer 2 → Layer 1 relay: on iframe load, send any cached token from\n // parent's first-party localStorage back to the iframe. On Safari this\n // is the only restore path — iframe localStorage (Layer 1) was wiped\n // on tab close. The iframe's storeToken() writes it back to Layer 1\n // for fast sync access during this tab session.\n const cachedToken = getCachedAuthToken(researchId);\n if (cachedToken) {\n sendMessage(iframe, host, {\n type: MESSAGE_TYPES.authComplete,\n token: cachedToken,\n researchId,\n });\n config.onAuth?.({ researchId, token: cachedToken });\n }\n config.onReady?.();\n break;\n }\n\n case MESSAGE_TYPES.resize:\n // Auto-resize iframe height (skip for fixed-container embeds)\n if (!options?.skipResize) {\n iframe.style.height = `${event.data.height}px`;\n }\n break;\n\n case MESSAGE_TYPES.submit:\n config.onSubmit?.({ researchId });\n break;\n\n case MESSAGE_TYPES.close:\n config.onClose?.();\n break;\n\n case MESSAGE_TYPES.error: {\n const error = new Error(\n event.data.error\n ) as import(\"./types\").EmbedError;\n error.code =\n (event.data.code as import(\"./types\").ErrorCode) || \"UNKNOWN\";\n\n // Always log critical errors to console\n if (error.code === ERROR_CODES.SDK_OUTDATED) {\n console.error(\n \"[Perspective] SDK version outdated. Please update @perspective-ai/sdk to the latest version.\",\n error.message\n );\n } else {\n console.error(\"[Perspective] Embed error:\", error.message);\n }\n\n config.onError?.(error);\n break;\n }\n\n case MESSAGE_TYPES.redirect: {\n const redirectUrl = event.data.url;\n // Security: Only allow http(s) and localhost URLs\n if (!isAllowedRedirectUrl(redirectUrl)) {\n console.warn(\n \"[Perspective] Blocked unsafe redirect URL:\",\n redirectUrl\n );\n return;\n }\n if (config.onNavigate) {\n config.onNavigate(redirectUrl);\n } else {\n // Fallback: auto-navigate parent page\n window.location.href = redirectUrl;\n }\n break;\n }\n\n case MESSAGE_TYPES.authRequest: {\n // The iframe can't do OAuth itself (cross-origin context, third-party\n // cookie blocking). So the iframe asks the SDK to open auth in a\n // first-party popup where cookies work normally. After auth, the\n // callback page sends the token back via window.opener.postMessage.\n const { authUrl } = event.data;\n if (!authUrl || typeof authUrl !== \"string\") return;\n\n const expectedOrigin = new URL(host).origin;\n\n // Security: ensure authUrl points to the expected host origin\n try {\n const parsedAuthUrl = new URL(authUrl);\n if (parsedAuthUrl.origin !== expectedOrigin) {\n console.warn(\n \"[Perspective] Blocked auth URL with unexpected origin:\",\n authUrl\n );\n return;\n }\n } catch {\n console.warn(\"[Perspective] Blocked malformed auth URL:\", authUrl);\n return;\n }\n\n // Clean up any previous auth flow before starting a new one\n activeAuthCleanup?.();\n\n // Open auth popup — user completes OAuth on perspective.ai (first-party)\n const fullAuthUrl = `${authUrl}&return_url=${encodeURIComponent(window.location.href)}`;\n const width = 500;\n const height = 700;\n const left =\n (window.screen.width - width) / 2 +\n (window.screenLeft ?? window.screenX ?? 0);\n const top =\n (window.screen.height - height) / 2 +\n (window.screenTop ?? window.screenY ?? 0);\n const popupFeatures = `width=${width},height=${height},top=${top},left=${left},menubar=no,toolbar=no,location=no,status=no,scrollbars=yes`;\n const authWindow =\n window.open(fullAuthUrl, \"perspective-auth\", popupFeatures) ??\n window.open(fullAuthUrl, \"_blank\"); // Popup blocked — fall back to new tab\n\n // Token handling: cache in Layer 2 (parent localStorage for persistence),\n // relay to iframe (which stores in Layer 1), and notify host app\n const relayToken = (token: string) => {\n cacheAuthToken(researchId, token);\n sendMessage(iframe, host, {\n type: MESSAGE_TYPES.authComplete,\n token,\n researchId,\n });\n config.onAuth?.({ researchId, token });\n };\n\n // Ensures only one auth flow is active at a time\n const cleanupAuthListeners = () => {\n clearInterval(pollPopupClosed);\n window.removeEventListener(\"message\", onPopupMessage);\n activeAuthCleanup = null;\n };\n\n // Listen for postMessage from popup with the auth token\n const onPopupMessage = (popupEvent: MessageEvent) => {\n if (\n popupEvent.source !== authWindow ||\n popupEvent.data?.type !== MESSAGE_TYPES.popupAuthComplete ||\n popupEvent.origin !== expectedOrigin\n )\n return;\n const token = popupEvent.data?.token;\n if (token) {\n relayToken(token);\n }\n cleanupAuthListeners();\n };\n window.addEventListener(\"message\", onPopupMessage);\n\n // Poll for popup close — if user closes without completing auth,\n // notify the iframe so it can reset loading state\n const pollPopupClosed = authWindow\n ? setInterval(() => {\n if (authWindow.closed) {\n cleanupAuthListeners();\n sendMessage(iframe, host, {\n type: MESSAGE_TYPES.authCancelled,\n researchId,\n });\n }\n }, 500)\n : undefined;\n\n activeAuthCleanup = cleanupAuthListeners;\n break;\n }\n\n case MESSAGE_TYPES.authSignout: {\n // User signed out in iframe — clear cached token so the next visit\n // requires re-authentication (no stale session)\n clearAuthToken(researchId);\n\n // Open a hidden popup to clear the NextAuth session on the first-party\n // domain. The iframe can't clear first-party cookies (third-party cookie\n // blocking), so the SDK opens this from the parent context.\n try {\n const signoutOrigin = new URL(host).origin;\n const signoutPopup = window.open(\n `${signoutOrigin}/embed-auth/signout`,\n \"perspective-signout\",\n \"width=1,height=1,top=0,left=0\"\n );\n if (signoutPopup) {\n setTimeout(() => {\n try {\n signoutPopup.close();\n } catch {\n /* cross-origin */\n }\n }, 3000);\n }\n } catch {\n /* invalid host URL — skip signout popup */\n }\n break;\n }\n }\n };\n\n window.addEventListener(\"message\", handler);\n return () => {\n window.removeEventListener(\"message\", handler);\n activeAuthCleanup?.();\n };\n}\n\n/** Send a message to the embed iframe */\nexport function sendMessage(\n iframe: HTMLIFrameElement,\n host: string,\n message: { type: string; [key: string]: unknown }\n): void {\n if (!hasDom()) return;\n iframe.contentWindow?.postMessage(message, host);\n}\n\n/** Track all active iframes for theme change notifications */\nconst activeIframes = new Map<HTMLIFrameElement, string>();\n\nexport function registerIframe(\n iframe: HTMLIFrameElement,\n host: string\n): () => void {\n activeIframes.set(iframe, host);\n return () => {\n activeIframes.delete(iframe);\n if (activeIframes.size === 0) {\n teardownGlobalListeners();\n }\n };\n}\n\n/** Get scrollbar CSS styles */\nfunction getScrollbarStyles(): string {\n if (!hasDom()) return \"\";\n\n const isDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n const borderColor = isDark ? \"hsl(217 33% 17%)\" : \"hsl(240 6% 90%)\";\n\n return `\n * {\n scrollbar-width: thin;\n scrollbar-color: ${borderColor} transparent;\n }\n *::-webkit-scrollbar {\n width: 10px;\n height: 10px;\n }\n *::-webkit-scrollbar-track {\n background: transparent;\n }\n *::-webkit-scrollbar-thumb {\n background-color: ${borderColor};\n border-radius: 9999px;\n border: 2px solid transparent;\n background-clip: padding-box;\n }\n *::-webkit-scrollbar-thumb:hover {\n background-color: color-mix(in srgb, ${borderColor} 80%, currentColor);\n }\n `;\n}\n\n/** Send scrollbar styles to an iframe */\nexport function sendScrollbarStyles(\n iframe: HTMLIFrameElement,\n host: string\n): void {\n const styles = getScrollbarStyles();\n sendMessage(iframe, host, {\n type: MESSAGE_TYPES.injectStyles,\n styles,\n });\n}\n\n/** Notify all active iframes of theme change */\nexport function notifyThemeChange(): void {\n if (!hasDom()) return;\n\n const isDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n\n activeIframes.forEach((host, iframe) => {\n const message = {\n type: MESSAGE_TYPES.themeChange,\n theme: isDark ? THEME_VALUES.dark : THEME_VALUES.light,\n };\n sendMessage(iframe, host, message);\n sendScrollbarStyles(iframe, host);\n });\n}\n\nlet themeListener: ((e: MediaQueryListEvent) => void) | null = null;\nlet themeMediaQuery: MediaQueryList | null = null;\nlet globalMessageHandler: ((event: MessageEvent) => void) | null = null;\nlet globalListenersInitialized = false;\n\nfunction setupThemeListener(): void {\n if (themeListener || !hasDom()) return;\n\n themeMediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n themeListener = () => notifyThemeChange();\n themeMediaQuery.addEventListener(\"change\", themeListener);\n}\n\nfunction teardownThemeListener(): void {\n if (themeListener && themeMediaQuery) {\n themeMediaQuery.removeEventListener(\"change\", themeListener);\n themeListener = null;\n themeMediaQuery = null;\n }\n}\n\nfunction setupGlobalListeners(): void {\n if (!hasDom() || globalMessageHandler) return;\n\n setupThemeListener();\n\n globalMessageHandler = (event: MessageEvent) => {\n if (!event.data?.type?.startsWith(\"perspective:\")) return;\n if (event.data.type === MESSAGE_TYPES.requestScrollbarStyles) {\n const iframes = Array.from(\n document.querySelectorAll(\"iframe[data-perspective]\")\n );\n const sourceIframe = iframes.find(\n (iframe) => (iframe as HTMLIFrameElement).contentWindow === event.source\n ) as HTMLIFrameElement | undefined;\n if (sourceIframe) {\n const host = activeIframes.get(sourceIframe);\n if (host && event.origin === host) {\n sendScrollbarStyles(sourceIframe, host);\n }\n }\n }\n };\n\n window.addEventListener(\"message\", globalMessageHandler);\n}\n\nfunction teardownGlobalListeners(): void {\n if (globalMessageHandler) {\n window.removeEventListener(\"message\", globalMessageHandler);\n globalMessageHandler = null;\n }\n teardownThemeListener();\n globalListenersInitialized = false;\n}\n\nexport function ensureGlobalListeners(): void {\n if (globalListenersInitialized) return;\n globalListenersInitialized = true;\n setupGlobalListeners();\n}\n","/**\n * Loading skeleton for embed iframes\n *\n * Shows a skeleton that matches the conversation UI layout (welcome card +\n * input area) instead of a generic spinner. This makes the loading feel\n * faster because it sets visual expectations.\n *\n * SSR-safe - returns no-op on server\n */\n\nimport type { BrandColors, ThemeValue } from \"./types\";\nimport { hasDom } from \"./config\";\nimport { resolveTheme } from \"./utils\";\n\n/** Default background + semi-transparent shimmer that works on any bg */\nconst DEFAULT_COLORS = {\n light: {\n bg: \"#ffffff\",\n shimmer: \"rgba(0, 0, 0, 0.06)\",\n shimmerHighlight: \"rgba(0, 0, 0, 0.10)\",\n border: \"rgba(0, 0, 0, 0.08)\",\n },\n dark: {\n bg: \"#02040a\",\n shimmer: \"rgba(255, 255, 255, 0.08)\",\n shimmerHighlight: \"rgba(255, 255, 255, 0.13)\",\n border: \"rgba(255, 255, 255, 0.08)\",\n },\n};\n\nexport interface LoadingOptions {\n /** Theme override: 'dark', 'light', or 'system' (uses system preference) */\n theme?: ThemeValue;\n /** Brand colors */\n brand?: {\n light?: BrandColors;\n dark?: BrandColors;\n };\n /** Appearance overrides from API config */\n appearance?: {\n hideBranding?: boolean;\n hideProgress?: boolean;\n hideGreeting?: boolean;\n };\n}\n\n/** Get colors for loading skeleton based on theme and brand */\nfunction getLoadingColors(options?: LoadingOptions): {\n bg: string;\n shimmer: string;\n shimmerHighlight: string;\n border: string;\n} {\n const theme = resolveTheme(options?.theme);\n const isDark = theme === \"dark\";\n const brandColors = isDark ? options?.brand?.dark : options?.brand?.light;\n const defaults = isDark ? DEFAULT_COLORS.dark : DEFAULT_COLORS.light;\n\n return {\n bg: brandColors?.bg || defaults.bg,\n shimmer: defaults.shimmer,\n shimmerHighlight: defaults.shimmerHighlight,\n border: defaults.border,\n };\n}\n\n/** Inject shimmer keyframes once globally (shared across all embed instances) */\nlet shimmerInjected = false;\nfunction injectShimmerKeyframes(): void {\n if (shimmerInjected || !hasDom()) return;\n shimmerInjected = true;\n\n const styleEl = document.createElement(\"style\");\n styleEl.id = \"perspective-shimmer-keyframes\";\n styleEl.textContent = `\n @keyframes perspective-shimmer {\n 0% { background-position: -400px 0; }\n 100% { background-position: 400px 0; }\n }\n `;\n document.head.appendChild(styleEl);\n}\n\nexport function createLoadingIndicator(options?: LoadingOptions): HTMLElement {\n // SSR safety - return empty div on server\n if (!hasDom()) {\n return { remove: () => {}, style: {} } as unknown as HTMLElement;\n }\n\n injectShimmerKeyframes();\n\n const colors = getLoadingColors(options);\n const appearance = options?.appearance;\n\n const container = document.createElement(\"div\");\n container.className = \"perspective-loading\";\n container.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n flex-direction: column;\n background: ${colors.bg};\n transition: opacity 0.15s ease;\n z-index: 1;\n overflow: hidden;\n padding: 1.5rem;\n box-sizing: border-box;\n `;\n\n const shimmerBg = `linear-gradient(90deg, ${colors.shimmer} 25%, ${colors.shimmerHighlight} 50%, ${colors.shimmer} 75%)`;\n const shimmer = (width: string, height: string): HTMLElement => {\n const el = document.createElement(\"div\");\n el.style.cssText = `background:${shimmerBg};background-size:800px 100%;animation:perspective-shimmer 1.5s infinite linear;border-radius:8px;height:${height};width:${width};margin-bottom:0.5rem;`;\n return el;\n };\n\n // -- Header: logo placeholder + progress bar --\n if (!appearance?.hideBranding || !appearance?.hideProgress) {\n const header = document.createElement(\"div\");\n header.style.cssText = `display:flex;flex-direction:column;align-items:center;gap:0.5rem;margin-bottom:1rem;`;\n if (!appearance?.hideBranding) {\n const logo = shimmer(\"7rem\", \"1.25rem\");\n logo.style.margin = \"0 auto\";\n header.appendChild(logo);\n }\n if (!appearance?.hideProgress) {\n const progressBar = shimmer(\"100%\", \"0.25rem\");\n progressBar.style.borderRadius = \"9999px\";\n header.appendChild(progressBar);\n }\n container.appendChild(header);\n }\n\n // -- Welcome card: avatar + name, title, body lines --\n if (!appearance?.hideGreeting) {\n const card = document.createElement(\"div\");\n card.style.cssText = `border:1px solid ${colors.border};border-radius:16px;padding:1.25rem;margin-bottom:1.25rem;`;\n\n // Avatar row: circle + name\n const avatarRow = document.createElement(\"div\");\n avatarRow.style.cssText = `display:flex;align-items:center;gap:0.625rem;margin-bottom:0.875rem;`;\n const avatar = shimmer(\"2.25rem\", \"2.25rem\");\n avatar.style.borderRadius = \"50%\";\n avatar.style.flexShrink = \"0\";\n avatar.style.marginBottom = \"0\";\n const name = shimmer(\"6rem\", \"0.875rem\");\n name.style.marginBottom = \"0\";\n avatarRow.appendChild(avatar);\n avatarRow.appendChild(name);\n card.appendChild(avatarRow);\n\n // Title line\n const title = shimmer(\"60%\", \"1.125rem\");\n title.style.marginBottom = \"0.875rem\";\n card.appendChild(title);\n\n // Body lines (3 lines — welcome message paragraph)\n card.appendChild(shimmer(\"95%\", \"0.75rem\"));\n card.appendChild(shimmer(\"90%\", \"0.75rem\"));\n const lastBodyLine = shimmer(\"75%\", \"0.75rem\");\n lastBodyLine.style.marginBottom = \"0\";\n card.appendChild(lastBodyLine);\n\n container.appendChild(card);\n }\n\n // -- Chat message: greeting text + small icon --\n const message = document.createElement(\"div\");\n message.style.cssText = `padding:0 0.25rem;margin-bottom:auto;`;\n message.appendChild(shimmer(\"92%\", \"0.75rem\"));\n const msgLine2 = shimmer(\"50%\", \"0.75rem\");\n msgLine2.style.marginBottom = \"0.75rem\";\n message.appendChild(msgLine2);\n const icon = shimmer(\"1.5rem\", \"1.5rem\");\n icon.style.marginBottom = \"0\";\n message.appendChild(icon);\n container.appendChild(message);\n\n // -- Input area: reply field + talk button pill --\n const inputArea = document.createElement(\"div\");\n inputArea.style.cssText = `\n margin-top: 1rem;\n border: 1px solid ${colors.border};\n border-radius: 28px;\n height: 3rem;\n padding: 0.375rem 0.375rem 0.375rem 1rem;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n box-sizing: border-box;\n `;\n const buttonPill = shimmer(\"4.5rem\", \"2.25rem\");\n buttonPill.style.borderRadius = \"9999px\";\n buttonPill.style.marginBottom = \"0\";\n inputArea.appendChild(buttonPill);\n container.appendChild(inputArea);\n\n // -- Footer: centered hint text --\n // const footer = shimmer(\"14rem\", \"0.75rem\");\n // footer.style.margin = \"0.75rem auto 0\";\n // container.appendChild(footer);\n\n return container;\n}\n","/**\n * CSS styles injected by the embed script\n * SSR-safe - DOM access is guarded\n */\n\nimport { hasDom } from \"./config\";\n\nlet stylesInjected = false;\n\nconst LIGHT_THEME = `\n --perspective-overlay-bg: rgba(0, 0, 0, 0.5);\n --perspective-modal-bg: #ffffff;\n --perspective-modal-text: #151B23;\n --perspective-close-bg: rgba(0, 0, 0, 0.1);\n --perspective-close-text: #666666;\n --perspective-close-hover-bg: rgba(0, 0, 0, 0.2);\n --perspective-close-hover-text: #333333;\n --perspective-border: hsl(240 6% 90%);\n --perspective-teaser-bg: #fff;\n --perspective-teaser-text: #1a1a18;\n --perspective-teaser-border: #f0eef2;\n --perspective-teaser-shadow: 0 4px 24px rgba(0, 0, 0, 0.1);\n`;\n\nconst DARK_THEME = `\n --perspective-overlay-bg: rgba(0, 0, 0, 0.7);\n --perspective-modal-bg: #02040a;\n --perspective-modal-text: #ffffff;\n --perspective-close-bg: rgba(255, 255, 255, 0.1);\n --perspective-close-text: #a0a0a0;\n --perspective-close-hover-bg: rgba(255, 255, 255, 0.2);\n --perspective-close-hover-text: #ffffff;\n --perspective-border: hsl(217 33% 17%);\n --perspective-teaser-bg: #1e1e2e;\n --perspective-teaser-text: #e4e4e7;\n --perspective-teaser-border: #2e2e3e;\n --perspective-teaser-shadow: 0 4px 24px rgba(0, 0, 0, 0.3);\n`;\n\nexport function injectStyles(): void {\n if (!hasDom()) return;\n if (stylesInjected) return;\n stylesInjected = true;\n\n const style = document.createElement(\"style\");\n style.id = \"perspective-embed-styles\";\n style.textContent = `\n /* Theme-aware color variables */\n .perspective-embed-root, .perspective-light-theme {\n ${LIGHT_THEME}\n --perspective-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n --perspective-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n --perspective-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n --perspective-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n --perspective-radius: 1.2rem;\n --perspective-radius-sm: calc(var(--perspective-radius) - 4px);\n }\n\n /* Dark theme */\n .perspective-dark-theme {\n ${DARK_THEME}\n }\n\n /* System dark mode support */\n @media (prefers-color-scheme: dark) {\n .perspective-embed-root:not(.perspective-light-theme) {\n ${DARK_THEME}\n }\n }\n\n /* Scrollbar styling */\n .perspective-modal,\n .perspective-slider,\n .perspective-float-window,\n .perspective-chat-window {\n scrollbar-width: thin;\n scrollbar-color: var(--perspective-border) transparent;\n }\n\n .perspective-modal::-webkit-scrollbar,\n .perspective-slider::-webkit-scrollbar,\n .perspective-float-window::-webkit-scrollbar,\n .perspective-chat-window::-webkit-scrollbar {\n width: 10px;\n height: 10px;\n }\n\n .perspective-modal::-webkit-scrollbar-track,\n .perspective-slider::-webkit-scrollbar-track,\n .perspective-float-window::-webkit-scrollbar-track,\n .perspective-chat-window::-webkit-scrollbar-track {\n background: transparent;\n }\n\n .perspective-modal::-webkit-scrollbar-thumb,\n .perspective-slider::-webkit-scrollbar-thumb,\n .perspective-float-window::-webkit-scrollbar-thumb,\n .perspective-chat-window::-webkit-scrollbar-thumb {\n background-color: var(--perspective-border);\n border-radius: 9999px;\n border: 2px solid transparent;\n background-clip: padding-box;\n }\n\n .perspective-modal::-webkit-scrollbar-thumb:hover,\n .perspective-slider::-webkit-scrollbar-thumb:hover,\n .perspective-float-window::-webkit-scrollbar-thumb:hover,\n .perspective-chat-window::-webkit-scrollbar-thumb:hover {\n background-color: color-mix(in srgb, var(--perspective-border) 80%, currentColor);\n }\n\n /* Overlay for popup/modal */\n .perspective-overlay {\n position: fixed;\n inset: 0;\n background: var(--perspective-overlay-bg);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 9999;\n animation: perspective-fade-in 0.2s ease-out;\n }\n\n @keyframes perspective-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n /* Modal container */\n .perspective-modal {\n position: relative;\n width: 90%;\n max-width: 600px;\n height: 80vh;\n max-height: 700px;\n background: var(--perspective-modal-bg);\n color: var(--perspective-modal-text);\n border-radius: var(--perspective-radius);\n overflow: hidden;\n box-shadow: var(--perspective-shadow-xl);\n animation: perspective-slide-up 0.3s ease-out;\n }\n\n @keyframes perspective-slide-up {\n from {\n opacity: 0;\n transform: translateY(20px) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n }\n\n .perspective-modal iframe {\n width: 100%;\n height: 100%;\n border: none;\n }\n\n /* Close button */\n .perspective-close {\n position: absolute;\n top: 1rem;\n right: 1.5rem;\n width: 2rem;\n height: 2rem;\n border: none;\n background: var(--perspective-close-bg);\n color: var(--perspective-close-text);\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1rem;\n z-index: 10;\n transition: background-color 0.2s ease, color 0.2s ease;\n }\n\n .perspective-close:hover {\n background: var(--perspective-close-hover-bg);\n color: var(--perspective-close-hover-text);\n }\n\n .perspective-close:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: 2px;\n }\n\n .perspective-close svg {\n width: 1rem;\n height: 1rem;\n stroke-width: 2;\n }\n\n /* Slider drawer */\n .perspective-slider {\n position: fixed;\n top: 0;\n right: 0;\n width: 100%;\n max-width: 450px;\n height: 100%;\n background: var(--perspective-modal-bg);\n color: var(--perspective-modal-text);\n box-shadow: var(--perspective-shadow-xl);\n z-index: 9999;\n animation: perspective-slide-in 0.3s ease-out;\n }\n\n @keyframes perspective-slide-in {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n }\n\n .perspective-slider iframe {\n width: 100%;\n height: 100%;\n border: none;\n }\n\n .perspective-slider .perspective-close {\n top: 1rem;\n right: 2rem;\n }\n\n /* Slider backdrop */\n .perspective-slider-backdrop {\n position: fixed;\n inset: 0;\n background: var(--perspective-overlay-bg);\n z-index: 9998;\n animation: perspective-fade-in 0.2s ease-out;\n }\n\n /* Float bubble (and legacy chat-bubble alias) */\n .perspective-float-bubble,\n .perspective-chat-bubble {\n position: fixed;\n bottom: 20px;\n right: 20px;\n width: 58px;\n height: 58px;\n padding: 0;\n border-radius: 50%;\n background: var(--perspective-float-bg, var(--perspective-chat-bg, #7629C8));\n color: white;\n border: none;\n cursor: pointer;\n box-shadow: var(--perspective-float-shadow, var(--perspective-chat-shadow, 0 4px 12px rgba(118, 41, 200, 0.4)));\n z-index: 9996;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: box-shadow 0.2s ease;\n --animate-click-draw: click-draw 3s ease-in-out infinite;\n animation: var(--animate-click-draw);\n }\n\n .perspective-float-bubble:hover,\n .perspective-chat-bubble:hover {\n box-shadow: var(--perspective-float-shadow-hover, var(--perspective-chat-shadow-hover, 0 6px 16px rgba(118, 41, 200, 0.5)));\n }\n\n .perspective-float-bubble.perspective-float-bubble-open,\n .perspective-chat-bubble.perspective-float-bubble-open {\n animation: none;\n }\n\n .perspective-float-bubble:focus-visible,\n .perspective-chat-bubble:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: 2px;\n }\n\n .perspective-float-bubble svg,\n .perspective-chat-bubble svg {\n width: 1.75rem;\n height: 1.75rem;\n stroke-width: 2;\n }\n\n @keyframes click-draw {\n 0%,\n 35%,\n 65%,\n 100% {\n transform: scale(1);\n }\n 50% {\n transform: scale(1.1);\n }\n }\n\n .perspective-float-notification-dot {\n position: absolute;\n top: -1px;\n right: -1px;\n width: 13px;\n height: 13px;\n border-radius: 50%;\n background: #ff5252;\n border: 2px solid #fff;\n pointer-events: none;\n animation: perspective-slide-up 0.25s ease-out;\n }\n\n .perspective-float-teaser {\n position: fixed;\n right: 20px;\n bottom: 88px;\n z-index: 9996;\n background: var(--perspective-teaser-bg);\n color: var(--perspective-teaser-text);\n border-radius: 14px 14px 4px 14px;\n border: 1px solid var(--perspective-teaser-border);\n box-shadow: var(--perspective-teaser-shadow);\n max-width: 230px;\n padding: 11px 15px 9px;\n line-height: 1.45;\n cursor: pointer;\n animation: perspective-teaser-in 0.35s ease-out;\n user-select: none;\n }\n\n .perspective-float-teaser-message {\n font-size: 14px;\n font-weight: 500;\n }\n\n @keyframes perspective-teaser-in {\n from {\n opacity: 0;\n transform: translateY(10px) scale(0.96);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n }\n\n /* Float window (and legacy chat-window alias) */\n .perspective-float-window,\n .perspective-chat-window {\n position: fixed;\n bottom: 6.25rem;\n right: 1.5rem;\n width: 380px;\n height: calc(100vh - 8.75rem);\n max-height: 600px;\n background: var(--perspective-modal-bg);\n color: var(--perspective-modal-text);\n border-radius: var(--perspective-radius);\n overflow: hidden;\n box-shadow: var(--perspective-shadow-xl);\n z-index: 9997;\n animation: perspective-float-open 0.3s ease-out;\n }\n\n @keyframes perspective-float-open {\n from {\n opacity: 0;\n transform: translateY(20px) scale(0.9);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n }\n\n .perspective-float-window iframe,\n .perspective-chat-window iframe {\n width: 100%;\n height: 100%;\n border: none;\n }\n\n .perspective-float-window .perspective-close,\n .perspective-chat-window .perspective-close {\n top: 1rem;\n right: 1.5rem;\n }\n\n /* Fullpage */\n .perspective-fullpage {\n position: fixed;\n inset: 0;\n z-index: 9999;\n background: var(--perspective-modal-bg);\n }\n\n .perspective-fullpage iframe {\n width: 100%;\n height: 100%;\n border: none;\n }\n\n /* Responsive */\n @media (max-width: 640px) {\n .perspective-modal {\n width: 100%;\n height: 100%;\n max-width: none;\n max-height: none;\n border-radius: 0;\n }\n\n .perspective-slider {\n max-width: 100%;\n }\n\n .perspective-float-window,\n .perspective-chat-window {\n inset: 0;\n width: 100%;\n height: 100%;\n max-height: none;\n border-radius: 0;\n }\n\n .perspective-float-bubble.perspective-float-bubble-open,\n .perspective-chat-bubble.perspective-float-bubble-open {\n display: none;\n }\n }\n `;\n\n document.head.appendChild(style);\n}\n\nexport const MIC_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 18.75a6 6 0 006-6v-1.5m-6 7.5a6 6 0 01-6-6v-1.5m6 7.5v3.75m-3.75 0h7.5M12 15.75a3 3 0 01-3-3V4.5a3 3 0 116 0v8.25a3 3 0 01-3 3z\" />\n</svg>`;\n\nexport const MESSAGES_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-messages-square-icon lucide-messages-square\">\n <path d=\"M16 10a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 14.286V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z\"/>\n <path d=\"M20 9a2 2 0 0 1 2 2v10.286a.71.71 0 0 1-1.212.502l-2.202-2.202A2 2 0 0 0 17.172 19H10a2 2 0 0 1-2-2v-1\"/>\n</svg>`;\n\n/** @deprecated Use MIC_ICON instead */\nexport const CHAT_ICON = MIC_ICON;\n\nexport const CLOSE_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"lucide-x\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n</svg>`;\n","/**\n * AEO (Answer Engine Optimization) attribution signals.\n *\n * Injects machine-readable metadata into the parent page DOM so that\n * AI crawlers, tech detection tools, and search engines can identify\n * Perspective AI on customer sites — even though the widget content\n * is sandboxed inside a cross-origin iframe.\n *\n * All functions are SSR-safe (guarded by hasDom()).\n */\n\nimport type { EmbedType } from \"./types\";\nimport { hasDom } from \"./config\";\nimport { SDK_VERSION } from \"./constants\";\n\n/** Canonical brand URL — always used regardless of configured host */\nconst PERSPECTIVE_URL = \"https://getperspective.ai\";\n\n/** JSON-LD structured data for the widget */\nconst JSON_LD = {\n \"@context\": \"https://schema.org\",\n \"@graph\": [\n {\n \"@type\": \"SoftwareApplication\",\n \"@id\": `${PERSPECTIVE_URL}/#widget`,\n name: \"Perspective AI\",\n description: \"AI-powered customer research interview widget\",\n url: PERSPECTIVE_URL,\n applicationCategory: \"BusinessApplication\",\n softwareVersion: SDK_VERSION,\n provider: { \"@id\": `${PERSPECTIVE_URL}/#organization` },\n aggregateRating: {\n \"@type\": \"AggregateRating\",\n ratingValue: \"5\",\n bestRating: \"5\",\n worstRating: \"1\",\n ratingCount: 7,\n reviewCount: 7,\n },\n },\n {\n \"@type\": \"Organization\",\n \"@id\": `${PERSPECTIVE_URL}/#organization`,\n name: \"Perspective AI\",\n url: PERSPECTIVE_URL,\n },\n ],\n};\n\n/**\n * Inject JSON-LD structured data into the page.\n * Idempotent — skips if a `[data-perspective-jsonld]` element already exists\n * (e.g. from SSR via DiscoveryMetadata or a previous call).\n */\nexport function injectJsonLd(): void {\n if (!hasDom()) return;\n if (document.querySelector(\"script[data-perspective-jsonld]\")) return;\n\n const script = document.createElement(\"script\");\n script.type = \"application/ld+json\";\n script.setAttribute(\"data-perspective-jsonld\", \"\");\n script.textContent = JSON.stringify(JSON_LD);\n document.body.appendChild(script);\n}\n\ndeclare global {\n interface Window {\n PerspectiveAI?: {\n readonly version: string;\n readonly provider: string;\n readonly url: string;\n };\n }\n}\n\n/**\n * Set the `window.PerspectiveAI` frozen global for tech detectors.\n * Idempotent — skips if the global already exists.\n */\nexport function injectGlobalMetadata(): void {\n if (!hasDom()) return;\n if (window.PerspectiveAI) return;\n\n window.PerspectiveAI = Object.freeze({\n version: SDK_VERSION,\n provider: \"Perspective AI\",\n url: PERSPECTIVE_URL,\n });\n}\n\n/**\n * Enrich a container element with attribution data attributes,\n * insert an HTML comment, and trigger global signal injection.\n *\n * Called from each embed creation function (widget, popup, slider,\n * float, fullpage) to cover all SDK entry points (CDN, npm, React).\n */\nexport function enrichContainer(\n el: HTMLElement,\n type: EmbedType,\n options?: { disableJsonLdAttribution?: boolean }\n): void {\n if (!hasDom()) return;\n\n el.setAttribute(\"data-perspective-version\", SDK_VERSION);\n el.setAttribute(\"data-perspective-type\", type);\n\n if (el.parentNode) {\n el.parentNode.insertBefore(\n document.createComment(\n ` Powered by Perspective AI \\u2014 ${PERSPECTIVE_URL} `\n ),\n el\n );\n }\n\n if (!options?.disableJsonLdAttribution) {\n injectJsonLd();\n }\n injectGlobalMetadata();\n}\n","/**\n * Inline widget embed - renders directly in a container element\n * SSR-safe - returns no-op handle on server\n */\n\nimport type { EmbedHandle, InternalEmbedConfig } from \"./types\";\nimport { hasDom, getHost } from \"./config\";\nimport {\n createIframe,\n appearanceToParams,\n setupMessageListener,\n registerIframe,\n ensureGlobalListeners,\n} from \"./iframe\";\nimport { createLoadingIndicator } from \"./loading\";\nimport { injectStyles } from \"./styles\";\nimport { cn, getThemeClass } from \"./utils\";\nimport { enrichContainer } from \"./attribution\";\n\ntype WidgetResources = {\n cleanup: () => void;\n unregister: () => void;\n wrapper: HTMLElement;\n};\n\nconst widgetResources = new WeakMap<HTMLIFrameElement, WidgetResources>();\n\nfunction createNoOpHandle(researchId: string, type: \"widget\"): EmbedHandle {\n return {\n unmount: () => {},\n update: () => {},\n destroy: () => {},\n researchId,\n type,\n iframe: null,\n container: null,\n };\n}\n\nfunction createExistingWidgetHandle(\n container: HTMLElement,\n researchId: string\n): EmbedHandle {\n const existingWrapper = container.querySelector<HTMLElement>(\n \".perspective-embed-root\"\n );\n const existingIframe = container.querySelector<HTMLIFrameElement>(\n \"iframe[data-perspective]\"\n );\n\n let destroyed = false;\n\n const unmount = () => {\n if (destroyed) return;\n destroyed = true;\n\n if (existingIframe) {\n const resources = widgetResources.get(existingIframe);\n if (resources) {\n resources.cleanup();\n resources.unregister();\n widgetResources.delete(existingIframe);\n }\n }\n existingWrapper?.remove();\n };\n\n return {\n unmount,\n update: () => {},\n destroy: unmount,\n researchId,\n type: \"widget\" as const,\n iframe: existingIframe,\n container,\n };\n}\n\nexport function createWidget(\n container: HTMLElement | null,\n config: InternalEmbedConfig\n): EmbedHandle {\n const { researchId } = config;\n\n // SSR safety: return no-op handle\n if (!hasDom() || !container) {\n return createNoOpHandle(researchId, \"widget\");\n }\n\n // Idempotency check for React Strict Mode\n if (container.querySelector(\"iframe[data-perspective]\")) {\n return createExistingWidgetHandle(container, researchId);\n }\n\n const host = getHost(config.host);\n\n injectStyles();\n ensureGlobalListeners();\n\n // Create wrapper for positioning\n const wrapper = document.createElement(\"div\");\n wrapper.className = cn(\"perspective-embed-root\", getThemeClass(config.theme));\n wrapper.style.cssText =\n \"position:relative;width:100%;height:100%;min-height:500px;\";\n\n // Create loading indicator with theme and brand colors\n const loading = createLoadingIndicator({\n theme: config.theme,\n brand: config.brand,\n appearance: config._apiConfig?.embedSettings?.appearance,\n });\n wrapper.appendChild(loading);\n\n // Create iframe (hidden initially)\n const overrides = appearanceToParams(config._apiConfig?.embedSettings);\n const iframe = createIframe(\n researchId,\n \"widget\",\n host,\n config.params,\n config.brand,\n config.theme,\n overrides\n );\n iframe.style.width = \"100%\";\n iframe.style.height = \"100%\";\n iframe.style.minHeight = \"500px\";\n iframe.style.opacity = \"0\";\n iframe.style.transition = \"opacity 0.3s ease\";\n\n wrapper.appendChild(iframe);\n container.appendChild(wrapper);\n enrichContainer(wrapper, \"widget\", config);\n\n // Mutable config reference for updates\n let currentConfig = { ...config };\n\n // Set up message listener with loading state handling\n const cleanup = setupMessageListener(\n researchId,\n {\n get onReady() {\n return () => {\n // Hide loading, show iframe\n loading.style.opacity = \"0\";\n iframe.style.opacity = \"1\";\n setTimeout(() => loading.remove(), 300);\n currentConfig.onReady?.();\n };\n },\n get onSubmit() {\n return currentConfig.onSubmit;\n },\n get onNavigate() {\n return currentConfig.onNavigate;\n },\n get onClose() {\n return currentConfig.onClose;\n },\n get onError() {\n return currentConfig.onError;\n },\n },\n iframe,\n host,\n { skipResize: true }\n );\n\n // Register iframe for theme change notifications\n const unregisterIframe = registerIframe(iframe, host);\n\n widgetResources.set(iframe, {\n cleanup,\n unregister: unregisterIframe,\n wrapper,\n });\n\n let destroyed = false;\n\n const unmount = () => {\n if (destroyed) return;\n destroyed = true;\n\n cleanup();\n unregisterIframe();\n widgetResources.delete(iframe);\n wrapper.remove();\n };\n\n return {\n unmount,\n update: (options) => {\n currentConfig = { ...currentConfig, ...options };\n },\n destroy: unmount,\n researchId,\n type: \"widget\" as const,\n iframe,\n container,\n };\n}\n","import { STORAGE_KEYS } from \"./constants\";\nimport { getHost, hasDom } from \"./config\";\n\nexport type PersistedOpenStateType = \"popup\" | \"slider\" | \"float\";\n\ntype PersistedOpenState = {\n v: 1;\n open: boolean;\n};\n\ntype PersistedOpenStateKey = {\n researchId: string;\n type: PersistedOpenStateType;\n host?: string;\n};\n\nfunction getPersistedOpenStateKey({\n researchId,\n type,\n host,\n}: PersistedOpenStateKey): string {\n return `${STORAGE_KEYS.embedState}:${getHost(host)}:${type}:${researchId}`;\n}\n\nexport function getPersistedOpenState(\n key: PersistedOpenStateKey\n): boolean | null {\n if (!hasDom()) {\n return null;\n }\n\n try {\n const raw = sessionStorage.getItem(getPersistedOpenStateKey(key));\n if (!raw) {\n return null;\n }\n\n const parsed = JSON.parse(raw) as Partial<PersistedOpenState>;\n return typeof parsed.open === \"boolean\" ? parsed.open : null;\n } catch {\n return null;\n }\n}\n\nexport function setPersistedOpenState(\n key: PersistedOpenStateKey & { open: boolean }\n): void {\n if (!hasDom()) {\n return;\n }\n\n try {\n const value: PersistedOpenState = { v: 1, open: key.open };\n sessionStorage.setItem(\n getPersistedOpenStateKey(key),\n JSON.stringify(value)\n );\n } catch {\n // Storage can be unavailable in some browser/privacy modes.\n }\n}\n","/**\n * Popup/modal embed - opens in a centered modal overlay\n * SSR-safe - returns no-op handle on server\n */\n\nimport type { EmbedHandle, InternalEmbedConfig } from \"./types\";\nimport { hasDom, getHost } from \"./config\";\nimport {\n createIframe,\n appearanceToParams,\n setupMessageListener,\n registerIframe,\n ensureGlobalListeners,\n} from \"./iframe\";\nimport { createLoadingIndicator } from \"./loading\";\nimport { injectStyles, CLOSE_ICON } from \"./styles\";\nimport { setPersistedOpenState } from \"./state\";\nimport { cn, getThemeClass } from \"./utils\";\nimport { enrichContainer } from \"./attribution\";\n\nfunction createNoOpHandle(researchId: string): EmbedHandle {\n return {\n unmount: () => {},\n update: () => {},\n destroy: () => {},\n researchId,\n type: \"popup\",\n iframe: null,\n container: null,\n };\n}\n\nexport function openPopup(config: InternalEmbedConfig): EmbedHandle {\n const { researchId } = config;\n\n // SSR safety: return no-op handle\n if (!hasDom()) {\n return createNoOpHandle(researchId);\n }\n const host = getHost(config.host);\n\n injectStyles();\n ensureGlobalListeners();\n\n // Create overlay\n const overlay = document.createElement(\"div\");\n overlay.className = cn(\n \"perspective-overlay perspective-embed-root\",\n getThemeClass(config.theme)\n );\n\n // Create modal container\n const modal = document.createElement(\"div\");\n modal.className = \"perspective-modal\";\n\n // Create close button (hidden when disableClose is enabled)\n const closeBtn = document.createElement(\"button\");\n closeBtn.className = \"perspective-close\";\n closeBtn.innerHTML = CLOSE_ICON;\n closeBtn.setAttribute(\"aria-label\", \"Close\");\n if (config.disableClose) {\n closeBtn.style.display = \"none\";\n }\n\n // Create loading indicator with theme and brand colors\n const loading = createLoadingIndicator({\n theme: config.theme,\n brand: config.brand,\n appearance: config._apiConfig?.embedSettings?.appearance,\n });\n loading.style.borderRadius = \"16px\";\n\n // Create iframe (hidden initially)\n const overrides = appearanceToParams(config._apiConfig?.embedSettings);\n const iframe = createIframe(\n researchId,\n \"popup\",\n host,\n config.params,\n config.brand,\n config.theme,\n overrides\n );\n iframe.style.opacity = \"0\";\n iframe.style.transition = \"opacity 0.3s ease\";\n\n modal.appendChild(closeBtn);\n modal.appendChild(loading);\n modal.appendChild(iframe);\n overlay.appendChild(modal);\n document.body.appendChild(overlay);\n enrichContainer(overlay, \"popup\", config);\n\n // Mutable config reference for updates\n let currentConfig = { ...config };\n let isOpen = true;\n let messageCleanup: (() => void) | null = null;\n const persistOpenState = (open: boolean) => {\n setPersistedOpenState({\n researchId,\n type: \"popup\",\n host: config.host,\n open,\n });\n };\n\n // Register iframe for theme change notifications\n const unregisterIframe = registerIframe(iframe, host);\n\n persistOpenState(true);\n\n const removePopup = () => {\n if (!isOpen) return;\n isOpen = false;\n messageCleanup?.();\n unregisterIframe();\n overlay.remove();\n document.removeEventListener(\"keydown\", escHandler);\n currentConfig.onClose?.();\n };\n\n const destroy = () => {\n persistOpenState(false);\n removePopup();\n };\n\n const unmount = () => {\n removePopup();\n };\n\n // Set up message listener with loading state handling\n messageCleanup = setupMessageListener(\n researchId,\n {\n get onReady() {\n return () => {\n loading.style.opacity = \"0\";\n iframe.style.opacity = \"1\";\n setTimeout(() => loading.remove(), 300);\n currentConfig.onReady?.();\n };\n },\n get onSubmit() {\n return currentConfig.onSubmit;\n },\n get onNavigate() {\n return currentConfig.onNavigate;\n },\n get onClose() {\n return destroy;\n },\n get onError() {\n return currentConfig.onError;\n },\n },\n iframe,\n host,\n { skipResize: true, hasCloseButton: !config.disableClose }\n );\n\n // Close handlers (disabled when disableClose is enabled)\n const escHandler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n destroy();\n }\n };\n\n if (!config.disableClose) {\n closeBtn.addEventListener(\"click\", destroy);\n overlay.addEventListener(\"click\", (e) => {\n if (e.target === overlay) destroy();\n });\n document.addEventListener(\"keydown\", escHandler);\n }\n\n return {\n unmount,\n update: (options: Parameters<EmbedHandle[\"update\"]>[0]) => {\n currentConfig = { ...currentConfig, ...options };\n },\n destroy,\n researchId,\n type: \"popup\" as const,\n iframe,\n container: overlay,\n };\n}\n","/**\n * Slider/drawer embed - slides in from the right\n * SSR-safe - returns no-op handle on server\n */\n\nimport type { EmbedHandle, InternalEmbedConfig } from \"./types\";\nimport { hasDom, getHost } from \"./config\";\nimport {\n createIframe,\n appearanceToParams,\n setupMessageListener,\n registerIframe,\n ensureGlobalListeners,\n} from \"./iframe\";\nimport { createLoadingIndicator } from \"./loading\";\nimport { injectStyles, CLOSE_ICON } from \"./styles\";\nimport { setPersistedOpenState } from \"./state\";\nimport { cn, getThemeClass } from \"./utils\";\nimport { enrichContainer } from \"./attribution\";\n\nfunction createNoOpHandle(researchId: string): EmbedHandle {\n return {\n unmount: () => {},\n update: () => {},\n destroy: () => {},\n researchId,\n type: \"slider\",\n iframe: null,\n container: null,\n };\n}\n\nexport function openSlider(config: InternalEmbedConfig): EmbedHandle {\n const { researchId } = config;\n\n // SSR safety: return no-op handle\n if (!hasDom()) {\n return createNoOpHandle(researchId);\n }\n const host = getHost(config.host);\n\n injectStyles();\n ensureGlobalListeners();\n\n // Create backdrop\n const backdrop = document.createElement(\"div\");\n backdrop.className = cn(\n \"perspective-slider-backdrop perspective-embed-root\",\n getThemeClass(config.theme)\n );\n\n // Create slider container\n const slider = document.createElement(\"div\");\n slider.className = cn(\n \"perspective-slider perspective-embed-root\",\n getThemeClass(config.theme)\n );\n\n // Create close button (hidden when disableClose is enabled)\n const closeBtn = document.createElement(\"button\");\n closeBtn.className = \"perspective-close\";\n closeBtn.innerHTML = CLOSE_ICON;\n closeBtn.setAttribute(\"aria-label\", \"Close\");\n if (config.disableClose) {\n closeBtn.style.display = \"none\";\n }\n\n // Create loading indicator with theme and brand colors\n const loading = createLoadingIndicator({\n theme: config.theme,\n brand: config.brand,\n appearance: config._apiConfig?.embedSettings?.appearance,\n });\n\n // Create iframe (hidden initially)\n const overrides = appearanceToParams(config._apiConfig?.embedSettings);\n const iframe = createIframe(\n researchId,\n \"slider\",\n host,\n config.params,\n config.brand,\n config.theme,\n overrides\n );\n iframe.style.opacity = \"0\";\n iframe.style.transition = \"opacity 0.3s ease\";\n\n slider.appendChild(closeBtn);\n slider.appendChild(loading);\n slider.appendChild(iframe);\n document.body.appendChild(backdrop);\n document.body.appendChild(slider);\n enrichContainer(slider, \"slider\", config);\n\n // Mutable config reference for updates\n let currentConfig = { ...config };\n let isOpen = true;\n let messageCleanup: (() => void) | null = null;\n const persistOpenState = (open: boolean) => {\n setPersistedOpenState({\n researchId,\n type: \"slider\",\n host: config.host,\n open,\n });\n };\n\n // Register iframe for theme change notifications\n const unregisterIframe = registerIframe(iframe, host);\n\n persistOpenState(true);\n\n const removeSlider = () => {\n if (!isOpen) return;\n isOpen = false;\n messageCleanup?.();\n unregisterIframe();\n slider.remove();\n backdrop.remove();\n document.removeEventListener(\"keydown\", escHandler);\n currentConfig.onClose?.();\n };\n\n const destroy = () => {\n persistOpenState(false);\n removeSlider();\n };\n\n const unmount = () => {\n removeSlider();\n };\n\n // Set up message listener with loading state handling\n messageCleanup = setupMessageListener(\n researchId,\n {\n get onReady() {\n return () => {\n loading.style.opacity = \"0\";\n iframe.style.opacity = \"1\";\n setTimeout(() => loading.remove(), 300);\n currentConfig.onReady?.();\n };\n },\n get onSubmit() {\n return currentConfig.onSubmit;\n },\n get onNavigate() {\n return currentConfig.onNavigate;\n },\n get onClose() {\n return destroy;\n },\n get onError() {\n return currentConfig.onError;\n },\n },\n iframe,\n host,\n { skipResize: true, hasCloseButton: !config.disableClose }\n );\n\n // Close handlers (disabled when disableClose is enabled)\n const escHandler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n destroy();\n }\n };\n\n if (!config.disableClose) {\n closeBtn.addEventListener(\"click\", destroy);\n backdrop.addEventListener(\"click\", destroy);\n document.addEventListener(\"keydown\", escHandler);\n }\n\n return {\n unmount,\n update: (options: Parameters<EmbedHandle[\"update\"]>[0]) => {\n currentConfig = { ...currentConfig, ...options };\n },\n destroy,\n researchId,\n type: \"slider\" as const,\n iframe,\n container: slider,\n };\n}\n","/**\n * Floating bubble embed - floating button that opens a chat window\n * SSR-safe - returns no-op handle on server\n */\n\nimport type {\n AIAssistantChannel,\n FloatHandle,\n InternalEmbedConfig,\n LauncherIcon,\n ThemeConfig,\n} from \"./types\";\nimport { hasDom, getHost } from \"./config\";\nimport {\n createIframe,\n appearanceToParams,\n setupMessageListener,\n registerIframe,\n ensureGlobalListeners,\n} from \"./iframe\";\nimport { createLoadingIndicator } from \"./loading\";\nimport { injectStyles, MIC_ICON, MESSAGES_ICON, CLOSE_ICON } from \"./styles\";\nimport { getPersistedOpenState, setPersistedOpenState } from \"./state\";\nimport { cn, getThemeClass, resolveIsDark } from \"./utils\";\nimport { enrichContainer } from \"./attribution\";\n\n/** Merge API launcher config over a base launcher (API is source of truth) */\nfunction mergeApiLauncher(\n base: InternalEmbedConfig,\n apiLauncher: NonNullable<ThemeConfig[\"embedSettings\"]>[\"launcher\"]\n): InternalEmbedConfig {\n if (!apiLauncher) return base;\n const customerLauncher = base.launcher ?? {};\n return {\n ...base,\n launcher: {\n ...customerLauncher,\n ...apiLauncher,\n style: { ...customerLauncher.style, ...apiLauncher.style },\n },\n };\n}\ntype ChannelMode = \"voice\" | \"text\" | \"both\";\n\nconst SOUND_DELAY_MS = 2000;\nconst TEASER_DELAY_MS = 3000;\nconst TYPEWRITER_SPEED_MS = 40;\nconst DEFAULT_WELCOME_MESSAGE = \"Have a question? I'm here to help.\";\n\nfunction getChannelMode(\n channel?: AIAssistantChannel | AIAssistantChannel[] | null\n): ChannelMode {\n const entries = Array.isArray(channel) ? channel : channel ? [channel] : [];\n const hasVoice = entries.includes(\"VOICE\");\n const hasText = entries.includes(\"TEXT\");\n\n if (hasVoice && hasText) return \"both\";\n if (hasText) return \"text\";\n return \"voice\";\n}\n\nfunction resolveChannel(\n config: InternalEmbedConfig\n): AIAssistantChannel | AIAssistantChannel[] | undefined {\n return (\n config.channel ??\n config._apiConfig?.allowedChannels ??\n config._apiConfig?.channel ??\n undefined\n );\n}\n\nfunction resolveWelcomeMessage(config: InternalEmbedConfig): string {\n const message = config.welcomeMessage ?? config._apiConfig?.welcomeMessage;\n const trimmed = typeof message === \"string\" ? message.trim() : \"\";\n return trimmed.length > 0 ? trimmed : DEFAULT_WELCOME_MESSAGE;\n}\n\nexport function getDefaultIconHtml(config: InternalEmbedConfig): string {\n return getChannelMode(resolveChannel(config)) === \"text\"\n ? MESSAGES_ICON\n : MIC_ICON;\n}\n\nexport function createIconImg(\n src: string,\n fallbackHtml: string\n): HTMLImageElement {\n const img = document.createElement(\"img\");\n img.src = src;\n img.alt = \"\";\n img.style.width = \"100%\";\n img.style.height = \"100%\";\n img.style.objectFit = \"cover\";\n img.style.borderRadius = \"inherit\";\n img.onerror = () => {\n const parent = img.parentElement;\n if (parent) {\n img.remove();\n parent.innerHTML = fallbackHtml;\n }\n };\n return img;\n}\n\nfunction applyBubbleIcon(\n bubble: HTMLButtonElement,\n config: InternalEmbedConfig\n): void {\n const icon: LauncherIcon = config.launcher?.icon ?? \"default\";\n const fallbackHtml = getDefaultIconHtml(config);\n\n if (icon === \"default\") {\n bubble.innerHTML = fallbackHtml;\n return;\n }\n\n if (icon === \"avatar\") {\n const avatarUrl = config._apiConfig?.avatarUrl;\n if (avatarUrl) {\n bubble.innerHTML = \"\";\n bubble.appendChild(createIconImg(avatarUrl, fallbackHtml));\n } else {\n bubble.innerHTML = fallbackHtml;\n }\n return;\n }\n\n if (typeof icon === \"object\" && icon !== null) {\n if (\"url\" in icon) {\n bubble.innerHTML = \"\";\n bubble.appendChild(createIconImg(icon.url, fallbackHtml));\n return;\n }\n\n if (\"svg\" in icon) {\n bubble.innerHTML = icon.svg;\n return;\n }\n }\n\n // Exhaustive — should never reach here\n bubble.innerHTML = fallbackHtml;\n}\n\nfunction createChimeSound(audioCtx: AudioContext): void {\n const t = audioCtx.currentTime;\n\n const osc = audioCtx.createOscillator();\n const gain = audioCtx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(880, t);\n osc.frequency.setValueAtTime(1175, t + 0.1);\n gain.gain.setValueAtTime(0.15, t);\n gain.gain.linearRampToValueAtTime(0.18, t + 0.1);\n gain.gain.exponentialRampToValueAtTime(0.001, t + 0.6);\n osc.connect(gain).connect(audioCtx.destination);\n osc.start(t);\n osc.stop(t + 0.65);\n\n const osc2 = audioCtx.createOscillator();\n const gain2 = audioCtx.createGain();\n osc2.type = \"sine\";\n osc2.frequency.setValueAtTime(1175, t + 0.15);\n osc2.frequency.setValueAtTime(1400, t + 0.25);\n gain2.gain.setValueAtTime(0, t);\n gain2.gain.setValueAtTime(0.12, t + 0.15);\n gain2.gain.exponentialRampToValueAtTime(0.001, t + 0.55);\n osc2.connect(gain2).connect(audioCtx.destination);\n osc2.start(t + 0.15);\n osc2.stop(t + 0.6);\n}\n\nfunction createNoOpHandle(researchId: string): FloatHandle {\n return {\n unmount: () => {},\n update: () => {},\n destroy: () => {},\n open: () => {},\n close: () => {},\n toggle: () => {},\n isOpen: false,\n researchId,\n type: \"float\",\n iframe: null,\n container: null,\n };\n}\n\nexport function createFloatBubble(config: InternalEmbedConfig): FloatHandle {\n const { researchId, _apiConfig, theme, brand } = config;\n\n // SSR safety: return no-op handle\n if (!hasDom()) {\n return createNoOpHandle(researchId);\n }\n const host = getHost(config.host);\n\n injectStyles();\n ensureGlobalListeners();\n\n // Create bubble button\n const bubble = document.createElement(\"button\");\n bubble.className = cn(\n \"perspective-float-bubble perspective-embed-root\",\n getThemeClass(config.theme)\n );\n applyBubbleIcon(bubble, config);\n bubble.setAttribute(\"aria-label\", \"Open chat\");\n bubble.setAttribute(\"data-perspective\", \"float-bubble\");\n\n // Apply theme color if available\n if (_apiConfig || brand) {\n const isDark = resolveIsDark(theme);\n const bg = isDark\n ? (brand?.dark?.primary ?? _apiConfig?.darkPrimaryColor ?? \"#a78bfa\")\n : (brand?.light?.primary ?? _apiConfig?.primaryColor ?? \"#7c3aed\");\n bubble.style.setProperty(\"--perspective-float-bg\", bg);\n bubble.style.setProperty(\n \"--perspective-float-shadow\",\n `0 4px 12px ${bg}66`\n );\n bubble.style.setProperty(\n \"--perspective-float-shadow-hover\",\n `0 6px 16px ${bg}80`\n );\n bubble.style.backgroundColor = bg;\n bubble.style.boxShadow = `0 4px 12px ${bg}66`;\n }\n\n // Merge API launcher config over customer config (API is source of truth)\n let mergedConfig = mergeApiLauncher(\n config,\n _apiConfig?.embedSettings?.launcher\n );\n if (mergedConfig !== config) {\n applyBubbleIcon(bubble, mergedConfig);\n }\n\n // Apply launcher style overrides (highest precedence)\n if (mergedConfig.launcher?.style) {\n Object.assign(bubble.style, mergedConfig.launcher.style);\n }\n\n // Apply launcher className (additive)\n if (mergedConfig.launcher?.className) {\n for (const cls of mergedConfig.launcher.className\n .split(/\\s+/)\n .filter(Boolean)) {\n bubble.classList.add(cls);\n }\n }\n\n document.body.appendChild(bubble);\n enrichContainer(bubble, \"float\", config);\n\n // Auto-fetch config when avatar icon is requested but no _apiConfig provided\n // (programmatic API — browser.ts auto-init handles this separately)\n if (config.launcher?.icon === \"avatar\" && !_apiConfig?.avatarUrl) {\n fetch(`${host}/api/v1/embed/config/${researchId}`)\n .then((res) => (res.ok ? res.json() : null))\n .then((fetchedConfig) => {\n if (fetchedConfig?.avatarUrl) {\n currentConfig = {\n ...currentConfig,\n _apiConfig: { ...currentConfig._apiConfig, ...fetchedConfig },\n };\n if (!isOpen) {\n applyBubbleIcon(bubble, currentConfig);\n }\n }\n })\n .catch(() => {\n // Silently fall back to default icon\n });\n }\n\n let floatWindow: HTMLElement | null = null;\n let iframe: HTMLIFrameElement | null = null;\n let cleanup: (() => void) | null = null;\n let unregisterIframe: (() => void) | null = null;\n let isOpen = false;\n let teaser: HTMLElement | null = null;\n let teaserTypewriter: number | null = null;\n let notificationDot: HTMLElement | null = null;\n let audioCtx: AudioContext | null = null;\n let welcomeSequenceStarted = false;\n let welcomeDismissed = false;\n let welcomeTimers: number[] = [];\n const persistOpenState = (open: boolean) => {\n setPersistedOpenState({\n researchId,\n type: \"float\",\n host: config.host,\n open,\n });\n };\n const shouldRestoreOpen =\n getPersistedOpenState({\n researchId,\n type: \"float\",\n host: config.host,\n }) === true;\n\n // Mutable config reference for updates\n let currentConfig = { ...mergedConfig };\n\n const setBubbleClosedState = () => {\n applyBubbleIcon(bubble, currentConfig);\n bubble.setAttribute(\"aria-label\", \"Open chat\");\n bubble.classList.remove(\"perspective-float-bubble-open\");\n };\n\n const setBubbleOpenState = () => {\n bubble.innerHTML = CLOSE_ICON;\n bubble.setAttribute(\"aria-label\", \"Close chat\");\n bubble.classList.add(\"perspective-float-bubble-open\");\n };\n\n const clearWelcomeTimers = () => {\n for (const timer of welcomeTimers) {\n window.clearTimeout(timer);\n }\n welcomeTimers = [];\n\n if (teaserTypewriter !== null) {\n window.clearInterval(teaserTypewriter);\n teaserTypewriter = null;\n }\n };\n\n const removeNotificationDot = () => {\n notificationDot?.remove();\n notificationDot = null;\n };\n\n const removeTeaser = () => {\n if (teaserTypewriter !== null) {\n window.clearInterval(teaserTypewriter);\n teaserTypewriter = null;\n }\n teaser?.remove();\n teaser = null;\n removeNotificationDot();\n };\n\n const showNotificationDot = () => {\n if (notificationDot || isOpen) return;\n notificationDot = document.createElement(\"span\");\n notificationDot.className = \"perspective-float-notification-dot\";\n bubble.appendChild(notificationDot);\n };\n\n const playChime = () => {\n try {\n const AudioContextCtor =\n window.AudioContext ||\n (\n window as Window & {\n webkitAudioContext?: typeof AudioContext;\n }\n ).webkitAudioContext;\n\n if (!AudioContextCtor) return;\n\n if (!audioCtx) {\n audioCtx = new AudioContextCtor();\n }\n\n if (audioCtx.state === \"suspended\") {\n void audioCtx.resume();\n }\n createChimeSound(audioCtx);\n } catch {\n // Browser may block autoplayed audio until user gesture.\n }\n };\n\n const renderTeaser = (message: string) => {\n removeTeaser();\n if (isOpen) return;\n\n const teaserEl = document.createElement(\"div\");\n teaserEl.className = cn(\n \"perspective-float-teaser perspective-embed-root\",\n getThemeClass(currentConfig.theme)\n );\n\n const messageEl = document.createElement(\"div\");\n messageEl.className = \"perspective-float-teaser-message\";\n const textEl = document.createElement(\"span\");\n messageEl.appendChild(textEl);\n\n teaserEl.appendChild(messageEl);\n teaserEl.addEventListener(\"click\", () => openFloat());\n\n document.body.appendChild(teaserEl);\n teaser = teaserEl;\n showNotificationDot();\n\n let charIndex = 0;\n teaserTypewriter = window.setInterval(() => {\n charIndex += 1;\n textEl.textContent = message.slice(0, charIndex);\n\n if (charIndex >= message.length) {\n if (teaserTypewriter !== null) {\n window.clearInterval(teaserTypewriter);\n teaserTypewriter = null;\n }\n }\n }, TYPEWRITER_SPEED_MS);\n };\n\n const maybeStartWelcomeSequence = () => {\n if (welcomeSequenceStarted || welcomeDismissed || isOpen) return;\n\n welcomeSequenceStarted = true;\n\n const soundTimer = window.setTimeout(() => {\n if (isOpen || welcomeDismissed) return;\n playChime();\n }, SOUND_DELAY_MS);\n\n const teaserTimer = window.setTimeout(() => {\n if (isOpen || welcomeDismissed) return;\n renderTeaser(resolveWelcomeMessage(currentConfig));\n }, TEASER_DELAY_MS);\n\n welcomeTimers.push(soundTimer, teaserTimer);\n };\n\n const openFloat = () => {\n if (isOpen) return;\n isOpen = true;\n persistOpenState(true);\n clearWelcomeTimers();\n removeTeaser();\n\n // Create float window\n floatWindow = document.createElement(\"div\");\n floatWindow.className = cn(\n \"perspective-float-window perspective-embed-root\",\n getThemeClass(currentConfig.theme)\n );\n\n // Create close button\n const closeBtn = document.createElement(\"button\");\n closeBtn.className = \"perspective-close\";\n closeBtn.innerHTML = CLOSE_ICON;\n closeBtn.setAttribute(\"aria-label\", \"Close chat\");\n closeBtn.addEventListener(\"click\", () => closeFloat());\n\n // Create loading indicator with theme and brand colors\n const loading = createLoadingIndicator({\n theme: currentConfig.theme,\n brand: currentConfig.brand,\n appearance: currentConfig._apiConfig?.embedSettings?.appearance,\n });\n loading.style.borderRadius = \"16px\";\n\n // Create iframe (hidden initially)\n const overrides = appearanceToParams(\n currentConfig._apiConfig?.embedSettings\n );\n iframe = createIframe(\n researchId,\n \"float\",\n host,\n currentConfig.params,\n currentConfig.brand,\n currentConfig.theme,\n overrides\n );\n iframe.style.opacity = \"0\";\n iframe.style.transition = \"opacity 0.3s ease\";\n\n floatWindow.appendChild(closeBtn);\n floatWindow.appendChild(loading);\n floatWindow.appendChild(iframe);\n document.body.appendChild(floatWindow);\n\n // Set up message listener with loading state handling\n cleanup = setupMessageListener(\n researchId,\n {\n get onReady() {\n return () => {\n loading.style.opacity = \"0\";\n iframe!.style.opacity = \"1\";\n setTimeout(() => loading.remove(), 300);\n currentConfig.onReady?.();\n };\n },\n get onSubmit() {\n return currentConfig.onSubmit;\n },\n get onNavigate() {\n return currentConfig.onNavigate;\n },\n get onClose() {\n return closeFloat;\n },\n get onError() {\n return currentConfig.onError;\n },\n },\n iframe,\n host,\n { skipResize: true, hasCloseButton: true }\n );\n\n // Register iframe for theme change notifications\n if (iframe) {\n unregisterIframe = registerIframe(iframe, host);\n }\n\n // Update bubble icon to close\n setBubbleOpenState();\n };\n\n const closeFloat = (options?: { persistState?: boolean }) => {\n if (!isOpen) return;\n if (options?.persistState !== false) {\n persistOpenState(false);\n }\n isOpen = false;\n\n cleanup?.();\n unregisterIframe?.();\n floatWindow?.remove();\n floatWindow = null;\n iframe = null;\n cleanup = null;\n unregisterIframe = null;\n\n // Restore bubble icon\n setBubbleClosedState();\n\n currentConfig.onClose?.();\n };\n\n // Toggle on bubble click\n bubble.addEventListener(\"click\", () => {\n if (isOpen) {\n closeFloat();\n } else {\n openFloat();\n }\n });\n\n const unmount = () => {\n clearWelcomeTimers();\n removeTeaser();\n closeFloat({ persistState: false });\n bubble.remove();\n void audioCtx?.close();\n audioCtx = null;\n };\n\n const destroy = () => {\n persistOpenState(false);\n unmount();\n };\n\n if (shouldRestoreOpen) {\n welcomeSequenceStarted = true;\n openFloat();\n } else {\n maybeStartWelcomeSequence();\n }\n\n return {\n unmount,\n update: (\n options: Parameters<FloatHandle[\"update\"]>[0] & {\n _apiConfig?: ThemeConfig;\n }\n ) => {\n currentConfig = { ...currentConfig, ...options };\n\n // Recompute bubble color from updated API config or brand\n const apiCfg = currentConfig._apiConfig;\n if (apiCfg || currentConfig.brand) {\n const isDark = resolveIsDark(currentConfig.theme);\n const bg = isDark\n ? (currentConfig.brand?.dark?.primary ??\n apiCfg?.darkPrimaryColor ??\n \"#a78bfa\")\n : (currentConfig.brand?.light?.primary ??\n apiCfg?.primaryColor ??\n \"#7c3aed\");\n // Only update if launcher.style didn't override backgroundColor\n if (!currentConfig.launcher?.style?.backgroundColor) {\n bubble.style.setProperty(\"--perspective-float-bg\", bg);\n bubble.style.setProperty(\n \"--perspective-float-shadow\",\n `0 4px 12px ${bg}66`\n );\n bubble.style.setProperty(\n \"--perspective-float-shadow-hover\",\n `0 6px 16px ${bg}80`\n );\n bubble.style.backgroundColor = bg;\n bubble.style.boxShadow = `0 4px 12px ${bg}66`;\n }\n }\n\n // Apply API launcher config when _apiConfig is updated (e.g. from async config fetch)\n currentConfig = mergeApiLauncher(\n currentConfig,\n currentConfig._apiConfig?.embedSettings?.launcher\n );\n\n // Re-apply bubble icon from merged launcher config\n applyBubbleIcon(bubble, currentConfig);\n\n // Re-apply launcher style to bubble DOM (e.g. borderRadius from API)\n if (currentConfig.launcher?.style) {\n Object.assign(bubble.style, currentConfig.launcher.style);\n }\n\n if (!isOpen) {\n setBubbleClosedState();\n }\n\n maybeStartWelcomeSequence();\n },\n destroy,\n open: openFloat,\n close: closeFloat,\n toggle: () => {\n if (isOpen) {\n closeFloat();\n } else {\n openFloat();\n }\n },\n get isOpen() {\n return isOpen;\n },\n researchId,\n type: \"float\" as const,\n get iframe() {\n return iframe;\n },\n container: bubble,\n };\n}\n\n/** @deprecated Use createFloatBubble instead */\nexport const createChatBubble = createFloatBubble;\n","/**\n * Fullpage embed - takes over entire viewport\n * SSR-safe - returns no-op handle on server\n */\n\nimport type { EmbedHandle, InternalEmbedConfig } from \"./types\";\nimport { hasDom, getHost } from \"./config\";\nimport {\n createIframe,\n appearanceToParams,\n setupMessageListener,\n registerIframe,\n ensureGlobalListeners,\n} from \"./iframe\";\nimport { createLoadingIndicator } from \"./loading\";\nimport { injectStyles } from \"./styles\";\nimport { cn, getThemeClass } from \"./utils\";\nimport { enrichContainer } from \"./attribution\";\n\nfunction createNoOpHandle(researchId: string): EmbedHandle {\n return {\n unmount: () => {},\n update: () => {},\n destroy: () => {},\n researchId,\n type: \"fullpage\" as const,\n iframe: null,\n container: null,\n };\n}\n\nexport function createFullpage(config: InternalEmbedConfig): EmbedHandle {\n const { researchId } = config;\n\n // SSR safety: return no-op handle\n if (!hasDom()) {\n return createNoOpHandle(researchId);\n }\n const host = getHost(config.host);\n\n injectStyles();\n ensureGlobalListeners();\n\n // Create fullpage container\n const container = document.createElement(\"div\");\n container.className = cn(\n \"perspective-embed-root perspective-fullpage\",\n getThemeClass(config.theme)\n );\n\n // Create loading indicator with theme and brand colors\n const loading = createLoadingIndicator({\n theme: config.theme,\n brand: config.brand,\n appearance: config._apiConfig?.embedSettings?.appearance,\n });\n container.appendChild(loading);\n\n // Create iframe (hidden initially)\n const overrides = appearanceToParams(config._apiConfig?.embedSettings);\n const iframe = createIframe(\n researchId,\n \"fullpage\",\n host,\n config.params,\n config.brand,\n config.theme,\n overrides\n );\n iframe.style.opacity = \"0\";\n iframe.style.transition = \"opacity 0.3s ease\";\n\n container.appendChild(iframe);\n document.body.appendChild(container);\n enrichContainer(container, \"fullpage\", config);\n\n // Mutable config reference for updates\n let currentConfig = { ...config };\n let messageCleanup: (() => void) | null = null;\n\n // Register iframe for theme change notifications\n const unregisterIframe = registerIframe(iframe, host);\n\n const unmount = () => {\n messageCleanup?.();\n unregisterIframe();\n container.remove();\n currentConfig.onClose?.();\n };\n\n // Set up message listener\n messageCleanup = setupMessageListener(\n researchId,\n {\n get onReady() {\n return () => {\n loading.style.opacity = \"0\";\n iframe.style.opacity = \"1\";\n setTimeout(() => loading.remove(), 300);\n currentConfig.onReady?.();\n };\n },\n get onSubmit() {\n return currentConfig.onSubmit;\n },\n get onNavigate() {\n return currentConfig.onNavigate;\n },\n get onClose() {\n return unmount;\n },\n get onError() {\n return currentConfig.onError;\n },\n },\n iframe,\n host,\n { skipResize: true }\n );\n\n return {\n unmount,\n update: (options) => {\n currentConfig = { ...currentConfig, ...options };\n },\n destroy: unmount,\n researchId,\n type: \"fullpage\" as const,\n iframe,\n container,\n };\n}\n","/**\n * Auto-open trigger system for popup embeds.\n *\n * Supports:\n * - Timeout: Open after a delay (ms)\n * - Exit intent: Open when user moves cursor above viewport\n *\n * Show-once dedup:\n * - \"session\" -> sessionStorage\n * - \"visitor\" -> localStorage\n * - false -> always show\n */\n\nimport { STORAGE_KEYS } from \"./constants\";\nimport type { TriggerConfig, ShowOnce } from \"./types\";\n\n/**\n * Parse a trigger attribute value into a TriggerConfig.\n *\n * Formats:\n * - \"timeout:5000\" -> { type: \"timeout\", delay: 5000 }\n * - \"exit-intent\" -> { type: \"exit-intent\" }\n */\nexport function parseTriggerAttr(value: string): TriggerConfig {\n const trimmed = value.trim();\n\n if (trimmed.startsWith(\"timeout:\")) {\n const delay = parseInt(trimmed.slice(\"timeout:\".length), 10);\n if (isNaN(delay) || delay < 0) {\n throw new Error(`Invalid timeout delay: \"${value}\"`);\n }\n return { type: \"timeout\", delay };\n }\n\n if (trimmed === \"timeout\") {\n return { type: \"timeout\", delay: 5000 };\n }\n\n if (trimmed === \"exit-intent\") {\n return { type: \"exit-intent\" };\n }\n\n throw new Error(\n `Unknown trigger type: \"${value}\". Expected \"timeout:<ms>\" or \"exit-intent\".`\n );\n}\n\n/**\n * Set up a trigger that calls `callback` when fired.\n * Returns a cleanup function to teardown the trigger.\n */\nexport function setupTrigger(\n config: TriggerConfig,\n callback: () => void\n): () => void {\n if (config.type === \"timeout\") {\n const timer = setTimeout(callback, config.delay);\n return () => clearTimeout(timer);\n }\n\n if (config.type === \"exit-intent\") {\n const handler = (e: MouseEvent) => {\n if (e.clientY <= 0) {\n callback();\n document.removeEventListener(\"mouseleave\", handler);\n }\n };\n document.addEventListener(\"mouseleave\", handler);\n return () => document.removeEventListener(\"mouseleave\", handler);\n }\n\n // Exhaustive check\n const _exhaustive: never = config;\n throw new Error(\n `Unknown trigger type: ${(_exhaustive as TriggerConfig).type}`\n );\n}\n\nfunction storageKey(researchId: string): string {\n return `${STORAGE_KEYS.triggerShown}:${researchId}`;\n}\n\n/**\n * Parse a show-once attribute value into a ShowOnce.\n *\n * Formats:\n * - \"session\" -> \"session\"\n * - \"visitor\" -> \"visitor\"\n * - \"false\" -> false\n * - anything else -> defaults to \"session\"\n */\nexport function parseShowOnceAttr(value: string | null): ShowOnce {\n if (!value) return \"session\";\n const trimmed = value.trim();\n if (trimmed === \"visitor\") return \"visitor\";\n if (trimmed === \"false\") return false;\n return \"session\";\n}\n\n/**\n * Check if the popup should be shown based on show-once dedup.\n */\nexport function shouldShow(researchId: string, showOnce: ShowOnce): boolean {\n if (showOnce === false) return true;\n\n try {\n const storage = showOnce === \"visitor\" ? localStorage : sessionStorage;\n return storage.getItem(storageKey(researchId)) === null;\n } catch {\n // Storage unavailable (private browsing, etc.) — show anyway\n return true;\n }\n}\n\n/**\n * Mark the popup as shown for dedup purposes.\n */\nexport function markShown(researchId: string, showOnce: ShowOnce): void {\n if (showOnce === false) return;\n\n try {\n const storage = showOnce === \"visitor\" ? localStorage : sessionStorage;\n storage.setItem(storageKey(researchId), \"1\");\n } catch {\n // Storage unavailable — ignore\n }\n}\n","/**\n * Embed config API — fetch theme/appearance/launcher config from the API\n * Shared between CDN (browser.ts) and NPM (React hooks) entry points\n */\n\nimport type { ThemeConfig } from \"./types\";\nimport { getHost } from \"./config\";\n\nexport type EmbedApiConfig = ThemeConfig;\n\nexport const DEFAULT_THEME: ThemeConfig = {\n primaryColor: \"#7c3aed\",\n textColor: \"#ffffff\",\n darkPrimaryColor: \"#a78bfa\",\n darkTextColor: \"#ffffff\",\n};\n\n/** Timeout before falling back to defaults (ms) */\nconst CONFIG_TIMEOUT_MS = 3000;\n\nconst configCache: Map<string, EmbedApiConfig> = new Map();\nconst configInflight: Map<string, Promise<EmbedApiConfig>> = new Map();\n\nfunction cacheKey(researchId: string, host?: string): string {\n return `${getHost(host)}::${researchId}`;\n}\n\n/**\n * Fetch embed config from API (cached, deduplicates in-flight requests).\n * Falls back to DEFAULT_THEME on timeout, network error, or non-200 response.\n */\nexport async function fetchEmbedConfig(\n researchId: string,\n host?: string\n): Promise<EmbedApiConfig> {\n const key = cacheKey(researchId, host);\n\n if (configCache.has(key)) {\n return configCache.get(key)!;\n }\n\n if (configInflight.has(key)) {\n return configInflight.get(key)!;\n }\n\n const promise = (async () => {\n try {\n const resolvedHost = getHost(host);\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), CONFIG_TIMEOUT_MS);\n const res = await fetch(\n `${resolvedHost}/api/v1/embed/config/${researchId}`,\n { signal: controller.signal }\n );\n clearTimeout(timeout);\n if (!res.ok) return DEFAULT_THEME;\n const config = (await res.json()) as EmbedApiConfig;\n configCache.set(key, config);\n return config;\n } catch {\n return DEFAULT_THEME;\n } finally {\n configInflight.delete(key);\n }\n })();\n\n configInflight.set(key, promise);\n return promise;\n}\n"]}
1
+ {"version":3,"sources":["../src/config.ts","../src/constants.ts","../src/utils.ts","../src/iframe.ts","../src/loading.ts","../src/styles.ts","../src/attribution.ts","../src/widget.ts","../src/state.ts","../src/popup.ts","../src/slider.ts","../src/float.ts","../src/fullpage.ts","../src/triggers.ts","../src/embed-api.ts"],"names":["createNoOpHandle"],"mappings":";;;AAQA,IAAM,YAAA,GAAe,2BAAA;AAGrB,IAAI,eAA0B,EAAC;AAMxB,SAAS,UAAU,MAAA,EAAyB;AACjD,EAAA,YAAA,GAAe,EAAE,GAAG,YAAA,EAAc,GAAG,MAAA,EAAO;AAC9C;AAKO,SAAS,SAAA,GAAuB;AACrC,EAAA,OAAO,EAAE,GAAG,YAAA,EAAa;AAC3B;AAKO,SAAS,MAAA,GAAkB;AAChC,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,QAAA,KAAa,WAAA;AAC9D;AAEA,SAAS,kBAAkB,IAAA,EAAsB;AAC/C,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,GAAA,CAAI,IAAI,CAAA,CAAE,MAAA;AAAA,EACvB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,QAAQ,YAAA,EAA+B;AAErD,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,kBAAkB,YAAY,CAAA;AAAA,EACvC;AAGA,EAAA,IAAI,aAAa,IAAA,EAAM;AACrB,IAAA,OAAO,iBAAA,CAAkB,aAAa,IAAI,CAAA;AAAA,EAC5C;AAGA,EAAA,IAAI,QAAO,EAAG;AACZ,IAAA,MAAM,aAAa,aAAA,EAAc;AACjC,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,OAAO,UAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,YAAA;AACT;AAGA,IAAI,kBAAA,GAAoC,IAAA;AAExC,SAAS,aAAA,GAA+B;AACtC,EAAA,IAAI,uBAAuB,IAAA,EAAM;AAC/B,IAAA,OAAO,kBAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,QAAO,EAAG;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,gBAAgB,QAAA,CAAS,aAAA;AAC/B,EAAA,IAAI,eAAe,GAAA,EAAK;AACtB,IAAA,IAAI;AACF,MAAA,kBAAA,GAAqB,IAAI,GAAA,CAAI,aAAA,CAAc,GAAG,CAAA,CAAE,MAAA;AAChD,MAAA,OAAO,kBAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,kBAAA,GAAqB,EAAA;AACrB,EAAA,OAAO,IAAA;AACT;AAGA,IAAI,QAAO,EAAG;AACZ,EAAA,aAAA,EAAc;AAChB;;;AClFO,IAAM,WAAA,GAAc;AAGpB,IAAM,QAAA,GAAW;AAAA,EACtB,QAAQ,CAAA,IAAK,CAAA;AAAA;AAAA,EACb,YAAY,CAAA,IAAK,CAAA;AAAA;AAAA,EACjB,SAAS,CAAA,IAAK,CAAA;AAAA;AAAA,EACd,kBAAkB,CAAA,IAAK,CAAA;AAAA;AAAA,EACvB,YAAY,CAAA,IAAK;AAAA;AACnB;AAGO,IAAM,gBAAA,GACX,SAAS,MAAA,GACT,QAAA,CAAS,aACT,QAAA,CAAS,OAAA,GACT,QAAA,CAAS,gBAAA,GACT,QAAA,CAAS;AAOJ,IAAM,UAAA,GAAa;AAAA,EACxB,KAAA,EAAO,OAAA;AAAA,EACP,SAAA,EAAW,YAAA;AAAA,EACX,KAAA,EAAO;AACT;AAQO,IAAM,UAAA,GAAa;AAAA;AAAA,EAExB,OAAA,EAAS,eAAA;AAAA,EACT,SAAA,EAAW,iBAAA;AAAA,EACX,EAAA,EAAI,UAAA;AAAA,EACJ,IAAA,EAAM,YAAA;AAAA;AAAA,EAGN,WAAA,EAAa,oBAAA;AAAA,EACb,aAAA,EAAe,sBAAA;AAAA,EACf,MAAA,EAAQ,eAAA;AAAA,EACR,QAAA,EAAU;AACZ;AAQO,IAAM,eAAA,uBAAmC,GAAA,CAAI;AAAA,EAClD,GAAG,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA;AAAA,EAC3B,GAAG,MAAA,CAAO,MAAA,CAAO,UAAU;AAC7B,CAAC,CAAA;AAMM,IAAM,UAAA,GAAa;AAAA,EACxB,MAAA,EAAQ,yBAAA;AAAA,EACR,KAAA,EAAO,wBAAA;AAAA,EACP,MAAA,EAAQ,yBAAA;AAAA,EACR,KAAA,EAAO,wBAAA;AAAA;AAAA,EACP,IAAA,EAAM,uBAAA;AAAA;AAAA,EACN,QAAA,EAAU,2BAAA;AAAA,EACV,MAAA,EAAQ,yBAAA;AAAA,EACR,KAAA,EAAO,wBAAA;AAAA,EACP,SAAA,EAAW,6BAAA;AAAA,EACX,KAAA,EAAO,wBAAA;AAAA,EACP,OAAA,EAAS,2BAAA;AAAA,EACT,QAAA,EAAU,4BAAA;AAAA,EACV,QAAA,EAAU,4BAAA;AAAA,EACV,YAAA,EAAc,gCAAA;AAAA,EACd,YAAA,EAAc,gCAAA;AAAA,EACd,aAAA,EAAe,iCAAA;AAAA,EACf,aAAA,EAAe,iCAAA;AAAA,EACf,wBAAA,EAA0B;AAC5B;AAQO,IAAM,aAAA,GAAgB;AAAA;AAAA,EAE3B,IAAA,EAAM,kBAAA;AAAA;AAAA,EAGN,KAAA,EAAO,mBAAA;AAAA,EACP,MAAA,EAAQ,oBAAA;AAAA,EACR,MAAA,EAAQ,oBAAA;AAAA,EACR,KAAA,EAAO,mBAAA;AAAA,EACP,KAAA,EAAO,mBAAA;AAAA,EACP,QAAA,EAAU,sBAAA;AAAA;AAAA,EAGV,MAAA,EAAQ,qBAAA;AAAA,EACR,YAAA,EAAc,2BAAA;AAAA,EACd,WAAA,EAAa,0BAAA;AAAA;AAAA,EAGb,WAAA,EAAa,0BAAA;AAAA,EACb,WAAA,EAAa,0BAAA;AAAA;AAAA,EAGb,YAAA,EAAc,2BAAA;AAAA,EACd,aAAA,EAAe,4BAAA;AAAA;AAAA,EAGf,iBAAA,EAAmB,iCAAA;AAAA;AAAA,EAGnB,sBAAA,EAAwB;AAC1B;AAQO,IAAM,WAAA,GAAc;AAAA,EACzB,YAAA,EAAc,cAGhB,CAAA;AAQO,IAAM,YAAA,GAAe;AAAA,EAC1B,IAAA,EAAM,MAER,CAAA;AAMO,IAAM,YAAA,GAAe;AAAA,EAC1B,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ;AACV;AAqBO,IAAM,YAAA,GAAe;AAAA,EAC1B,MAAA,EAAQ,qBAAA;AAAA,EACR,YAAA,EAAc,2BAAA;AAAA,EACd,cAAA,EAAgB,8BAAA;AAAA,EAChB,UAAA,EAAY;AACd,CAAA;;;ACtLO,SAAS,MAAM,OAAA,EAAwD;AAC5E,EAAA,OAAO,QACJ,GAAA,CAAI,CAAC,CAAA,KAAA,CAAO,CAAA,IAAK,IAAI,KAAA,CAAM,GAAG,CAAC,CAAA,CAC/B,MAAK,CACL,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AACb;AAMO,SAAS,cAAc,KAAA,EAA+C;AAC3E,EAAA,OAAO,SAAS,KAAA,KAAU,YAAA,CAAa,MAAA,GACnC,CAAA,YAAA,EAAe,KAAK,CAAA,MAAA,CAAA,GACpB,MAAA;AACN;AAOO,SAAS,cAAc,KAAA,EAAsC;AAClE,EAAA,IAAI,KAAA,KAAU,YAAA,CAAa,IAAA,EAAM,OAAO,IAAA;AACxC,EAAA,IAAI,KAAA,KAAU,YAAA,CAAa,KAAA,EAAO,OAAO,KAAA;AAEzC,EAAA,IAAI,CAAC,MAAA,EAAO,EAAG,OAAO,KAAA;AACtB,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,OAAA;AAC3D;AAMO,SAAS,aAAa,aAAA,EAA8C;AACzE,EAAA,OAAO,aAAA,CAAc,aAAa,CAAA,GAAI,MAAA,GAAS,OAAA;AACjD;AAKO,SAAS,aAAa,KAAA,EAAmC;AAC9D,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AAErB,EAAA,MAAM,aAAa,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,GAAI,OAAA,GAAU,IAAI,OAAO,CAAA,CAAA;AAGlE,EAAA,IAAI,qDAAA,CAAsD,IAAA,CAAK,UAAU,CAAA,EAAG;AAC1E,IAAA,OAAO,UAAA;AAAA,EACT;AAGA,EAAA,MAAM,WAAW,UAAA,CAAW,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,iBAAiB,EAAE,CAAA;AAChE,EAAA,IAAI,QAAA,CAAS,UAAU,CAAA,EAAG,OAAO,IAAI,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACzD,EAAA,IAAI,QAAA,CAAS,UAAU,CAAA,EAAG,OAAO,IAAI,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAEzD,EAAA,OAAO,MAAA;AACT;;;AC1CA,SAAS,qBAAqB,GAAA,EAAsB;AAClD,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,KAAA;AAG5C,EAAA,IACG,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,IAAK,CAAC,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,IAC5C,IAAI,UAAA,CAAW,GAAG,CAAA,IAClB,GAAA,CAAI,WAAW,GAAG,CAAA;AAElB,IAAA,OAAO,IAAA;AACT,EAAA,IAAI;AACF,IAAA,MAAM,SAAS,IAAI,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,SAAS,MAAM,CAAA;AAClD,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,WAAA,EAAY;AAC7C,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,WAAA,EAAY;AAE7C,IAAA,IAAI,QAAA,KAAa,UAAU,OAAO,IAAA;AAClC,IAAA,IACE,QAAA,KAAa,OAAA,KACZ,QAAA,KAAa,WAAA,IAAe,QAAA,KAAa,WAAA,CAAA;AAE1C,MAAA,OAAO,IAAA;AAET,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAgCA,SAAS,kBAAkB,KAAA,EAA8B;AACvD,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,CAAC,CAAA,CAAG,OAAA,CAAQ,MAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAC7D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAM,CAAC,CAAA;AACvC,IAAA,OAAO,OAAA,CAAQ,MAAM,SAAA,IAAa,IAAA;AAAA,EACpC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,aAAa,UAAA,EAA4B;AAChD,EAAA,OAAO,CAAA,EAAG,YAAA,CAAa,cAAc,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA;AACrD;AAKA,SAAS,mBAAmB,UAAA,EAAmC;AAC7D,EAAA,IAAI,CAAC,MAAA,EAAO,EAAG,OAAO,IAAA;AACtB,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,aAAa,UAAU,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AACtC,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,MAAM,SAAA,GAAY,kBAAkB,KAAK,CAAA;AACzC,IAAA,IAAI,SAAA,IAAa,SAAA,GAAY,IAAA,CAAK,GAAA,IAAO,OAAO,KAAA;AAEhD,IAAA,YAAA,CAAa,WAAW,GAAG,CAAA;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAIA,SAAS,cAAA,CAAe,YAAoB,KAAA,EAAqB;AAC/D,EAAA,IAAI,CAAC,QAAO,EAAG;AACf,EAAA,IAAI;AACF,IAAA,YAAA,CAAa,OAAA,CAAQ,YAAA,CAAa,UAAU,CAAA,EAAG,KAAK,CAAA;AAAA,EACtD,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAGA,SAAS,eAAe,UAAA,EAA0B;AAChD,EAAA,IAAI,CAAC,QAAO,EAAG;AACf,EAAA,IAAI;AACF,IAAA,YAAA,CAAa,UAAA,CAAW,YAAA,CAAa,UAAU,CAAC,CAAA;AAAA,EAClD,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAGA,SAAS,iBAAA,GAA4B;AACnC,EAAA,IAAI,CAAC,MAAA,EAAO,EAAG,OAAO,EAAA;AAEtB,EAAA,IAAI;AACF,IAAA,IAAI,EAAA,GAAK,YAAA,CAAa,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA;AACjD,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,EAAA,GAAK,OAAO,UAAA,EAAW;AACvB,MAAA,YAAA,CAAa,OAAA,CAAQ,YAAA,CAAa,MAAA,EAAQ,EAAE,CAAA;AAAA,IAC9C;AACA,IAAA,OAAO,EAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,OAAO,UAAA,EAAW;AAAA,EAC3B;AACF;AAGA,SAAS,qBAAA,GAAgD;AACvD,EAAA,IAAI,CAAC,MAAA,EAAO,EAAG,OAAO,EAAC;AAEvB,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,MAAM,YAAA,GAAe,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AAE/D,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,YAAA,CAAa,SAAQ,EAAG;AACjD,IAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG;AAC7B,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,eACP,UAAA,EACA,IAAA,EACA,IAAA,EACA,YAAA,EACA,OACA,aAAA,EACQ;AACR,EAAA,MAAM,MAAM,IAAI,GAAA,CAAI,GAAG,IAAI,CAAA,WAAA,EAAc,UAAU,CAAA,CAAE,CAAA;AAGrD,EAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,UAAA,CAAW,KAAA,EAAO,aAAa,IAAI,CAAA;AACxD,EAAA,GAAA,CAAI,aAAa,GAAA,CAAI,UAAA,CAAW,WAAW,IAAA,KAAS,OAAA,GAAU,SAAS,IAAI,CAAA;AAG3E,EAAA,IAAI,QAAO,EAAG;AACZ,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,OAAA;AACjE,IAAA,IAAI,aAAA,IAAiB,aAAA,KAAkB,YAAA,CAAa,MAAA,EAAQ;AAC1D,MAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,UAAA,CAAW,KAAA,EAAO,aAAa,CAAA;AAAA,IACtD,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,YAAA,CAAa,GAAA;AAAA,QACf,UAAA,CAAW,KAAA;AAAA,QACX,MAAA,GAAS,YAAA,CAAa,IAAA,GAAO,YAAA,CAAa;AAAA,OAC5C;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,GAAA,CAAI,aAAa,GAAA,CAAI,UAAA,CAAW,KAAA,EAAO,aAAA,IAAiB,aAAa,KAAK,CAAA;AAAA,EAC5E;AAIA,EAAA,MAAM,eAAe,qBAAA,EAAsB;AAC3C,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AACvD,IAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EACjC;AAGA,EAAA,MAAM,QAAA,GAAW,CAAC,GAAA,EAAa,KAAA,KAA8B;AAC3D,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,UAAA,GAAa,aAAa,KAAK,CAAA;AACrC,IAAA,IAAI,UAAA,EAAY,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,KAAK,UAAU,CAAA;AAAA,EACtD,CAAA;AAGA,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,QAAA,CAAS,UAAA,CAAW,OAAA,EAAS,KAAA,CAAM,KAAA,CAAM,OAAO,CAAA;AAChD,IAAA,QAAA,CAAS,UAAA,CAAW,SAAA,EAAW,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA;AACpD,IAAA,QAAA,CAAS,UAAA,CAAW,EAAA,EAAI,KAAA,CAAM,KAAA,CAAM,EAAE,CAAA;AACtC,IAAA,QAAA,CAAS,UAAA,CAAW,IAAA,EAAM,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAAA,EAC5C;AAGA,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,QAAA,CAAS,UAAA,CAAW,WAAA,EAAa,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AACnD,IAAA,QAAA,CAAS,UAAA,CAAW,aAAA,EAAe,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AACvD,IAAA,QAAA,CAAS,UAAA,CAAW,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA;AACzC,IAAA,QAAA,CAAS,UAAA,CAAW,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,EAC/C;AAGA,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AACvD,MAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG;AAC7B,QAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAI,QAAA,EAAS;AACtB;AAGA,IAAM,eAAA,uBAAsB,GAAA,CAAI;AAAA,EAC9B,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGM,SAAS,mBACd,aAAA,EACoC;AACpC,EAAA,MAAM,IAAI,aAAA,EAAe,UAAA;AACzB,EAAA,IAAI,CAAC,GAAG,OAAO,MAAA;AACf,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,IAAI,EAAE,YAAA,KAAiB,MAAA;AACrB,IAAA,MAAA,CAAO,YAAA,GAAe,CAAA,CAAE,YAAA,GAAe,MAAA,GAAS,OAAA;AAClD,EAAA,IAAI,EAAE,YAAA,KAAiB,MAAA;AACrB,IAAA,MAAA,CAAO,YAAA,GAAe,CAAA,CAAE,YAAA,GAAe,MAAA,GAAS,OAAA;AAClD,EAAA,IAAI,EAAE,YAAA,KAAiB,MAAA;AACrB,IAAA,MAAA,CAAO,YAAA,GAAe,CAAA,CAAE,YAAA,GAAe,MAAA,GAAS,OAAA;AAClD,EAAA,IAAI,EAAE,gBAAA,KAAqB,MAAA;AACzB,IAAA,MAAA,CAAO,gBAAA,GAAmB,CAAA,CAAE,gBAAA,GAAmB,MAAA,GAAS,OAAA;AAC1D,EAAA,OAAO,OAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,GAAS,IAAI,MAAA,GAAS,MAAA;AACnD;AAEO,SAAS,aACd,UAAA,EACA,IAAA,EACA,MACA,MAAA,EACA,KAAA,EACA,eACA,mBAAA,EACmB;AACnB,EAAA,IAAI,CAAC,QAAO,EAAG;AAEb,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,GAAA,GAAM,cAAA;AAAA,IACX,UAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AAIA,EAAA,IAAI,uBAAuB,MAAA,CAAO,IAAA,CAAK,mBAAmB,CAAA,CAAE,SAAS,CAAA,EAAG;AACtE,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA;AAC9B,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,mBAAmB,CAAA,EAAG;AAC9D,MAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG;AAC5B,QAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,MACjC;AAAA,IACF;AACA,IAAA,MAAA,CAAO,GAAA,GAAM,IAAI,QAAA,EAAS;AAAA,EAC5B;AAEA,EAAA,MAAA,CAAO,YAAA,CAAa,SAAS,oBAAoB,CAAA;AACjD,EAAA,MAAA,CAAO,YAAA,CAAa,mBAAmB,MAAM,CAAA;AAC7C,EAAA,MAAA,CAAO,YAAA;AAAA,IACL,SAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAA,CAAO,YAAA,CAAa,oBAAoB,MAAM,CAAA;AAC9C,EAAA,MAAA,CAAO,YAAA,CAAa,SAAS,qCAAqC,CAAA;AAClE,EAAA,MAAA,CAAO,MAAM,OAAA,GAAU,cAAA;AAEvB,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,oBAAA,CACd,UAAA,EACA,MAAA,EACA,MAAA,EACA,MACA,OAAA,EACY;AACZ,EAAA,IAAI,CAAC,QAAO,EAAG;AACb,IAAA,OAAO,MAAM;AAAA,IAAC,CAAA;AAAA,EAChB;AAGA,EAAA,IAAI,iBAAA,GAAyC,IAAA;AAE7C,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAsC;AAErD,IAAA,IAAI,KAAA,CAAM,WAAW,IAAA,EAAM;AAC3B,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,CAAO,aAAA,EAAe;AAG3C,IAAA,IAAI,OAAO,KAAA,CAAM,IAAA,EAAM,IAAA,KAAS,QAAA,EAAU;AAC1C,IAAA,IAAI,CAAC,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,cAAc,CAAA,EAAG;AACjD,IAAA,IAAI,KAAA,CAAM,IAAA,CAAK,UAAA,KAAe,UAAA,EAAY;AACxC,MAAA;AAAA,IACF;AAEA,IAAA,QAAQ,KAAA,CAAM,KAAK,IAAA;AAAM,MACvB,KAAK,cAAc,KAAA,EAAO;AAExB,QAAA,mBAAA,CAAoB,QAAQ,IAAI,CAAA;AAEhC,QAAA,WAAA,CAAY,QAAQ,IAAA,EAAM;AAAA,UACxB,MAAM,aAAA,CAAc,MAAA;AAAA,UACpB,QAAQ,iBAAA;AAAkB,SAC3B,CAAA;AAED,QAAA,WAAA,CAAY,QAAQ,IAAA,EAAM;AAAA,UACxB,MAAM,aAAA,CAAc,IAAA;AAAA,UACpB,OAAA,EAAS,WAAA;AAAA,UACT,QAAA,EAAU,gBAAA;AAAA,UACV,UAAA;AAAA,UACA,cAAA,EAAgB,SAAS,cAAA,IAAkB;AAAA,SAC5C,CAAA;AAMD,QAAA,MAAM,WAAA,GAAc,mBAAmB,UAAU,CAAA;AACjD,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,WAAA,CAAY,QAAQ,IAAA,EAAM;AAAA,YACxB,MAAM,aAAA,CAAc,YAAA;AAAA,YACpB,KAAA,EAAO,WAAA;AAAA,YACP;AAAA,WACD,CAAA;AACD,UAAA,MAAA,CAAO,MAAA,GAAS,EAAE,UAAA,EAAY,KAAA,EAAO,aAAa,CAAA;AAAA,QACpD;AACA,QAAA,MAAA,CAAO,OAAA,IAAU;AACjB,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,aAAA,CAAc,MAAA;AAEjB,QAAA,IAAI,CAAC,SAAS,UAAA,EAAY;AACxB,UAAA,MAAA,CAAO,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,KAAK,MAAM,CAAA,EAAA,CAAA;AAAA,QAC5C;AACA,QAAA;AAAA,MAEF,KAAK,aAAA,CAAc,MAAA;AACjB,QAAA,MAAA,CAAO,QAAA,GAAW,EAAE,UAAA,EAAY,CAAA;AAChC,QAAA;AAAA,MAEF,KAAK,aAAA,CAAc,KAAA;AACjB,QAAA,MAAA,CAAO,OAAA,IAAU;AACjB,QAAA;AAAA,MAEF,KAAK,cAAc,KAAA,EAAO;AACxB,QAAA,MAAM,QAAQ,IAAI,KAAA;AAAA,UAChB,MAAM,IAAA,CAAK;AAAA,SACb;AACA,QAAA,KAAA,CAAM,IAAA,GACH,KAAA,CAAM,IAAA,CAAK,IAAA,IAAwC,SAAA;AAGtD,QAAA,IAAI,KAAA,CAAM,IAAA,KAAS,WAAA,CAAY,YAAA,EAAc;AAC3C,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,8FAAA;AAAA,YACA,KAAA,CAAM;AAAA,WACR;AAAA,QACF,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,KAAA,CAAM,4BAAA,EAA8B,KAAA,CAAM,OAAO,CAAA;AAAA,QAC3D;AAEA,QAAA,MAAA,CAAO,UAAU,KAAK,CAAA;AACtB,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,cAAc,QAAA,EAAU;AAC3B,QAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,GAAA;AAE/B,QAAA,IAAI,CAAC,oBAAA,CAAqB,WAAW,CAAA,EAAG;AACtC,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN,4CAAA;AAAA,YACA;AAAA,WACF;AACA,UAAA;AAAA,QACF;AACA,QAAA,IAAI,OAAO,UAAA,EAAY;AACrB,UAAA,MAAA,CAAO,WAAW,WAAW,CAAA;AAAA,QAC/B,CAAA,MAAO;AAEL,UAAA,MAAA,CAAO,SAAS,IAAA,GAAO,WAAA;AAAA,QACzB;AACA,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,cAAc,WAAA,EAAa;AAK9B,QAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,KAAA,CAAM,IAAA;AAC1B,QAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAE7C,QAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,IAAI,CAAA,CAAE,MAAA;AAGrC,QAAA,IAAI;AACF,UAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,OAAO,CAAA;AACrC,UAAA,IAAI,aAAA,CAAc,WAAW,cAAA,EAAgB;AAC3C,YAAA,OAAA,CAAQ,IAAA;AAAA,cACN,wDAAA;AAAA,cACA;AAAA,aACF;AACA,YAAA;AAAA,UACF;AAAA,QACF,CAAA,CAAA,MAAQ;AACN,UAAA,OAAA,CAAQ,IAAA,CAAK,6CAA6C,OAAO,CAAA;AACjE,UAAA;AAAA,QACF;AAGA,QAAA,iBAAA,IAAoB;AAGpB,QAAA,MAAM,WAAA,GAAc,GAAG,OAAO,CAAA,YAAA,EAAe,mBAAmB,MAAA,CAAO,QAAA,CAAS,IAAI,CAAC,CAAA,CAAA;AACrF,QAAA,MAAM,KAAA,GAAQ,GAAA;AACd,QAAA,MAAM,MAAA,GAAS,GAAA;AACf,QAAA,MAAM,IAAA,GAAA,CACH,OAAO,MAAA,CAAO,KAAA,GAAQ,SAAS,CAAA,IAC/B,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,OAAA,IAAW,CAAA,CAAA;AAC1C,QAAA,MAAM,GAAA,GAAA,CACH,OAAO,MAAA,CAAO,MAAA,GAAS,UAAU,CAAA,IACjC,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,OAAA,IAAW,CAAA,CAAA;AACzC,QAAA,MAAM,aAAA,GAAgB,SAAS,KAAK,CAAA,QAAA,EAAW,MAAM,CAAA,KAAA,EAAQ,GAAG,SAAS,IAAI,CAAA,2DAAA,CAAA;AAC7E,QAAA,MAAM,UAAA,GACJ,MAAA,CAAO,IAAA,CAAK,WAAA,EAAa,kBAAA,EAAoB,aAAa,CAAA,IAC1D,MAAA,CAAO,IAAA,CAAK,WAAA,EAAa,QAAQ,CAAA;AAInC,QAAA,MAAM,UAAA,GAAa,CAAC,KAAA,KAAkB;AACpC,UAAA,cAAA,CAAe,YAAY,KAAK,CAAA;AAChC,UAAA,WAAA,CAAY,QAAQ,IAAA,EAAM;AAAA,YACxB,MAAM,aAAA,CAAc,YAAA;AAAA,YACpB,KAAA;AAAA,YACA;AAAA,WACD,CAAA;AACD,UAAA,MAAA,CAAO,MAAA,GAAS,EAAE,UAAA,EAAY,KAAA,EAAO,CAAA;AAAA,QACvC,CAAA;AAGA,QAAA,MAAM,uBAAuB,MAAM;AACjC,UAAA,aAAA,CAAc,eAAe,CAAA;AAC7B,UAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,cAAc,CAAA;AACpD,UAAA,iBAAA,GAAoB,IAAA;AAAA,QACtB,CAAA;AAGA,QAAA,MAAM,cAAA,GAAiB,CAAC,UAAA,KAA6B;AACnD,UAAA,IACE,UAAA,CAAW,WAAW,UAAA,IACtB,UAAA,CAAW,MAAM,IAAA,KAAS,aAAA,CAAc,iBAAA,IACxC,UAAA,CAAW,MAAA,KAAW,cAAA;AAEtB,YAAA;AACF,UAAA,MAAM,KAAA,GAAQ,WAAW,IAAA,EAAM,KAAA;AAC/B,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,UAAA,CAAW,KAAK,CAAA;AAAA,UAClB;AACA,UAAA,oBAAA,EAAqB;AAAA,QACvB,CAAA;AACA,QAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,cAAc,CAAA;AAIjD,QAAA,MAAM,eAAA,GAAkB,UAAA,GACpB,WAAA,CAAY,MAAM;AAChB,UAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,YAAA,oBAAA,EAAqB;AACrB,YAAA,WAAA,CAAY,QAAQ,IAAA,EAAM;AAAA,cACxB,MAAM,aAAA,CAAc,aAAA;AAAA,cACpB;AAAA,aACD,CAAA;AAAA,UACH;AAAA,QACF,CAAA,EAAG,GAAG,CAAA,GACN,MAAA;AAEJ,QAAA,iBAAA,GAAoB,oBAAA;AACpB,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,cAAc,WAAA,EAAa;AAG9B,QAAA,cAAA,CAAe,UAAU,CAAA;AAKzB,QAAA,IAAI;AACF,UAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,IAAI,CAAA,CAAE,MAAA;AACpC,UAAA,MAAM,eAAe,MAAA,CAAO,IAAA;AAAA,YAC1B,GAAG,aAAa,CAAA,mBAAA,CAAA;AAAA,YAChB,qBAAA;AAAA,YACA;AAAA,WACF;AACA,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,UAAA,CAAW,MAAM;AACf,cAAA,IAAI;AACF,gBAAA,YAAA,CAAa,KAAA,EAAM;AAAA,cACrB,CAAA,CAAA,MAAQ;AAAA,cAER;AAAA,YACF,GAAG,GAAI,CAAA;AAAA,UACT;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AACA,QAAA;AAAA,MACF;AAAA;AACF,EACF,CAAA;AAEA,EAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,OAAO,CAAA;AAC1C,EAAA,OAAO,MAAM;AACX,IAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,OAAO,CAAA;AAC7C,IAAA,iBAAA,IAAoB;AAAA,EACtB,CAAA;AACF;AAGO,SAAS,WAAA,CACd,MAAA,EACA,IAAA,EACA,OAAA,EACM;AACN,EAAA,IAAI,CAAC,QAAO,EAAG;AACf,EAAA,MAAA,CAAO,aAAA,EAAe,WAAA,CAAY,OAAA,EAAS,IAAI,CAAA;AACjD;AAGA,IAAM,aAAA,uBAAoB,GAAA,EAA+B;AAElD,SAAS,cAAA,CACd,QACA,IAAA,EACY;AACZ,EAAA,aAAA,CAAc,GAAA,CAAI,QAAQ,IAAI,CAAA;AAC9B,EAAA,OAAO,MAAM;AACX,IAAA,aAAA,CAAc,OAAO,MAAM,CAAA;AAC3B,IAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,MAAA,uBAAA,EAAwB;AAAA,IAC1B;AAAA,EACF,CAAA;AACF;AAGA,SAAS,kBAAA,GAA6B;AACpC,EAAA,IAAI,CAAC,MAAA,EAAO,EAAG,OAAO,EAAA;AAEtB,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,OAAA;AACjE,EAAA,MAAM,WAAA,GAAc,SAAS,kBAAA,GAAqB,iBAAA;AAElD,EAAA,OAAO;AAAA;AAAA;AAAA,uBAAA,EAGgB,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAA,EAUV,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2CAAA,EAMQ,WAAW,CAAA;AAAA;AAAA,EAAA,CAAA;AAGxD;AAGO,SAAS,mBAAA,CACd,QACA,IAAA,EACM;AACN,EAAA,MAAM,SAAS,kBAAA,EAAmB;AAClC,EAAA,WAAA,CAAY,QAAQ,IAAA,EAAM;AAAA,IACxB,MAAM,aAAA,CAAc,YAAA;AAAA,IACpB;AAAA,GACD,CAAA;AACH;AAGO,SAAS,iBAAA,GAA0B;AACxC,EAAA,IAAI,CAAC,QAAO,EAAG;AAEf,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,OAAA;AAEjE,EAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,IAAA,EAAM,MAAA,KAAW;AACtC,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,MAAM,aAAA,CAAc,WAAA;AAAA,MACpB,KAAA,EAAO,MAAA,GAAS,YAAA,CAAa,IAAA,GAAO,YAAA,CAAa;AAAA,KACnD;AACA,IAAA,WAAA,CAAY,MAAA,EAAQ,MAAM,OAAO,CAAA;AACjC,IAAA,mBAAA,CAAoB,QAAQ,IAAI,CAAA;AAAA,EAClC,CAAC,CAAA;AACH;AAEA,IAAI,aAAA,GAA2D,IAAA;AAC/D,IAAI,eAAA,GAAyC,IAAA;AAC7C,IAAI,oBAAA,GAA+D,IAAA;AACnE,IAAI,0BAAA,GAA6B,KAAA;AAEjC,SAAS,kBAAA,GAA2B;AAClC,EAAA,IAAI,aAAA,IAAiB,CAAC,MAAA,EAAO,EAAG;AAEhC,EAAA,eAAA,GAAkB,MAAA,CAAO,WAAW,8BAA8B,CAAA;AAClE,EAAA,aAAA,GAAgB,MAAM,iBAAA,EAAkB;AACxC,EAAA,eAAA,CAAgB,gBAAA,CAAiB,UAAU,aAAa,CAAA;AAC1D;AAEA,SAAS,qBAAA,GAA8B;AACrC,EAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,IAAA,eAAA,CAAgB,mBAAA,CAAoB,UAAU,aAAa,CAAA;AAC3D,IAAA,aAAA,GAAgB,IAAA;AAChB,IAAA,eAAA,GAAkB,IAAA;AAAA,EACpB;AACF;AAEA,SAAS,oBAAA,GAA6B;AACpC,EAAA,IAAI,CAAC,MAAA,EAAO,IAAK,oBAAA,EAAsB;AAEvC,EAAA,kBAAA,EAAmB;AAEnB,EAAA,oBAAA,GAAuB,CAAC,KAAA,KAAwB;AAC9C,IAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAM,IAAA,EAAM,UAAA,CAAW,cAAc,CAAA,EAAG;AACnD,IAAA,IAAI,KAAA,CAAM,IAAA,CAAK,IAAA,KAAS,aAAA,CAAc,sBAAA,EAAwB;AAC5D,MAAA,MAAM,UAAU,KAAA,CAAM,IAAA;AAAA,QACpB,QAAA,CAAS,iBAAiB,0BAA0B;AAAA,OACtD;AACA,MAAA,MAAM,eAAe,OAAA,CAAQ,IAAA;AAAA,QAC3B,CAAC,MAAA,KAAY,MAAA,CAA6B,aAAA,KAAkB,KAAA,CAAM;AAAA,OACpE;AACA,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,MAAM,IAAA,GAAO,aAAA,CAAc,GAAA,CAAI,YAAY,CAAA;AAC3C,QAAA,IAAI,IAAA,IAAQ,KAAA,CAAM,MAAA,KAAW,IAAA,EAAM;AACjC,UAAA,mBAAA,CAAoB,cAAc,IAAI,CAAA;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,oBAAoB,CAAA;AACzD;AAEA,SAAS,uBAAA,GAAgC;AACvC,EAAA,IAAI,oBAAA,EAAsB;AACxB,IAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,oBAAoB,CAAA;AAC1D,IAAA,oBAAA,GAAuB,IAAA;AAAA,EACzB;AACA,EAAA,qBAAA,EAAsB;AACtB,EAAA,0BAAA,GAA6B,KAAA;AAC/B;AAEO,SAAS,qBAAA,GAA8B;AAC5C,EAAA,IAAI,0BAAA,EAA4B;AAChC,EAAA,0BAAA,GAA6B,IAAA;AAC7B,EAAA,oBAAA,EAAqB;AACvB;;;AChsBA,IAAM,cAAA,GAAiB;AAAA,EACrB,KAAA,EAAO;AAAA,IACL,EAAA,EAAI,SAAA;AAAA,IACJ,OAAA,EAAS,qBAAA;AAAA,IACT,gBAAA,EAAkB,qBAAA;AAAA,IAClB,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA,IACJ,OAAA,EAAS,2BAAA;AAAA,IACT,gBAAA,EAAkB,2BAAA;AAAA,IAClB,MAAA,EAAQ;AAAA;AAEZ,CAAA;AAmBA,SAAS,iBAAiB,OAAA,EAKxB;AACA,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,OAAA,EAAS,KAAK,CAAA;AACzC,EAAA,MAAM,SAAS,KAAA,KAAU,MAAA;AACzB,EAAA,MAAM,cAAc,MAAA,GAAS,OAAA,EAAS,KAAA,EAAO,IAAA,GAAO,SAAS,KAAA,EAAO,KAAA;AACpE,EAAA,MAAM,QAAA,GAAW,MAAA,GAAS,cAAA,CAAe,IAAA,GAAO,cAAA,CAAe,KAAA;AAE/D,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,WAAA,EAAa,EAAA,IAAM,QAAA,CAAS,EAAA;AAAA,IAChC,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,kBAAkB,QAAA,CAAS,gBAAA;AAAA,IAC3B,QAAQ,QAAA,CAAS;AAAA,GACnB;AACF;AAGA,IAAI,eAAA,GAAkB,KAAA;AACtB,SAAS,sBAAA,GAA+B;AACtC,EAAA,IAAI,eAAA,IAAmB,CAAC,MAAA,EAAO,EAAG;AAClC,EAAA,eAAA,GAAkB,IAAA;AAElB,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC9C,EAAA,OAAA,CAAQ,EAAA,GAAK,+BAAA;AACb,EAAA,OAAA,CAAQ,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAMtB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,OAAO,CAAA;AACnC;AAEO,SAAS,uBAAuB,OAAA,EAAuC;AAE5E,EAAA,IAAI,CAAC,QAAO,EAAG;AACb,IAAA,OAAO,EAAE,QAAQ,MAAM;AAAA,IAAC,CAAA,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,EACvC;AAEA,EAAA,sBAAA,EAAuB;AAEvB,EAAA,MAAM,MAAA,GAAS,iBAAiB,OAAO,CAAA;AACvC,EAAA,MAAM,aAAa,OAAA,EAAS,UAAA;AAE5B,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,EAAA,SAAA,CAAU,SAAA,GAAY,qBAAA;AACtB,EAAA,SAAA,CAAU,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAA,EAQV,OAAO,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAQzB,EAAA,MAAM,SAAA,GAAY,0BAA0B,MAAA,CAAO,OAAO,SAAS,MAAA,CAAO,gBAAgB,CAAA,MAAA,EAAS,MAAA,CAAO,OAAO,CAAA,KAAA,CAAA;AACjH,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,EAAe,MAAA,KAAgC;AAC9D,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACvC,IAAA,EAAA,CAAG,MAAM,OAAA,GAAU,CAAA,WAAA,EAAc,SAAS,CAAA,wGAAA,EAA2G,MAAM,UAAU,KAAK,CAAA,sBAAA,CAAA;AAC1K,IAAA,OAAO,EAAA;AAAA,EACT,CAAA;AAGA,EAAA,IAAI,CAAC,UAAA,EAAY,YAAA,IAAgB,CAAC,YAAY,YAAA,EAAc;AAC1D,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,IAAA,MAAA,CAAO,MAAM,OAAA,GAAU,CAAA,oFAAA,CAAA;AACvB,IAAA,IAAI,CAAC,YAAY,YAAA,EAAc;AAC7B,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,EAAQ,SAAS,CAAA;AACtC,MAAA,IAAA,CAAK,MAAM,MAAA,GAAS,QAAA;AACpB,MAAA,MAAA,CAAO,YAAY,IAAI,CAAA;AAAA,IACzB;AACA,IAAA,IAAI,CAAC,YAAY,YAAA,EAAc;AAC7B,MAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,EAAQ,SAAS,CAAA;AAC7C,MAAA,WAAA,CAAY,MAAM,YAAA,GAAe,QAAA;AACjC,MAAA,MAAA,CAAO,YAAY,WAAW,CAAA;AAAA,IAChC;AACA,IAAA,SAAA,CAAU,YAAY,MAAM,CAAA;AAAA,EAC9B;AAGA,EAAA,IAAI,CAAC,YAAY,YAAA,EAAc;AAC7B,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,CAAA,iBAAA,EAAoB,MAAA,CAAO,MAAM,CAAA,0DAAA,CAAA;AAGtD,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,IAAA,SAAA,CAAU,MAAM,OAAA,GAAU,CAAA,oEAAA,CAAA;AAC1B,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,SAAA,EAAW,SAAS,CAAA;AAC3C,IAAA,MAAA,CAAO,MAAM,YAAA,GAAe,KAAA;AAC5B,IAAA,MAAA,CAAO,MAAM,UAAA,GAAa,GAAA;AAC1B,IAAA,MAAA,CAAO,MAAM,YAAA,GAAe,GAAA;AAC5B,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,EAAQ,UAAU,CAAA;AACvC,IAAA,IAAA,CAAK,MAAM,YAAA,GAAe,GAAA;AAC1B,IAAA,SAAA,CAAU,YAAY,MAAM,CAAA;AAC5B,IAAA,SAAA,CAAU,YAAY,IAAI,CAAA;AAC1B,IAAA,IAAA,CAAK,YAAY,SAAS,CAAA;AAG1B,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,EAAO,UAAU,CAAA;AACvC,IAAA,KAAA,CAAM,MAAM,YAAA,GAAe,UAAA;AAC3B,IAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAGtB,IAAA,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,KAAA,EAAO,SAAS,CAAC,CAAA;AAC1C,IAAA,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,KAAA,EAAO,SAAS,CAAC,CAAA;AAC1C,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,EAAO,SAAS,CAAA;AAC7C,IAAA,YAAA,CAAa,MAAM,YAAA,GAAe,GAAA;AAClC,IAAA,IAAA,CAAK,YAAY,YAAY,CAAA;AAE7B,IAAA,SAAA,CAAU,YAAY,IAAI,CAAA;AAAA,EAC5B;AAGA,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,CAAA,qCAAA,CAAA;AACxB,EAAA,OAAA,CAAQ,WAAA,CAAY,OAAA,CAAQ,KAAA,EAAO,SAAS,CAAC,CAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,EAAO,SAAS,CAAA;AACzC,EAAA,QAAA,CAAS,MAAM,YAAA,GAAe,SAAA;AAC9B,EAAA,OAAA,CAAQ,YAAY,QAAQ,CAAA;AAC5B,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,QAAA,EAAU,QAAQ,CAAA;AACvC,EAAA,IAAA,CAAK,MAAM,YAAA,GAAe,GAAA;AAC1B,EAAA,OAAA,CAAQ,YAAY,IAAI,CAAA;AACxB,EAAA,SAAA,CAAU,YAAY,OAAO,CAAA;AAG7B,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,EAAA,SAAA,CAAU,MAAM,OAAA,GAAU;AAAA;AAAA,sBAAA,EAEJ,OAAO,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AASnC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,QAAA,EAAU,SAAS,CAAA;AAC9C,EAAA,UAAA,CAAW,MAAM,YAAA,GAAe,QAAA;AAChC,EAAA,UAAA,CAAW,MAAM,YAAA,GAAe,GAAA;AAChC,EAAA,SAAA,CAAU,YAAY,UAAU,CAAA;AAChC,EAAA,SAAA,CAAU,YAAY,SAAS,CAAA;AAO/B,EAAA,OAAO,SAAA;AACT;;;ACvMA,IAAI,cAAA,GAAiB,KAAA;AAErB,IAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAepB,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAeZ,SAAS,YAAA,GAAqB;AACnC,EAAA,IAAI,CAAC,QAAO,EAAG;AACf,EAAA,IAAI,cAAA,EAAgB;AACpB,EAAA,cAAA,GAAiB,IAAA;AAEjB,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,EAAA,GAAK,0BAAA;AACX,EAAA,KAAA,CAAM,WAAA,GAAc;AAAA;AAAA;AAAA,MAAA,EAGd,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,MAAA,EAWX,UAAU;AAAA;;AAAA;AAAA;AAAA;AAAA,QAAA,EAMR,UAAU;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AA0WlB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AACjC;AAEO,IAAM,QAAA,GAAW,CAAA;AAAA;AAAA,MAAA,CAAA;AAIjB,IAAM,aAAA,GAAgB,CAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAQtB,IAAM,UAAA,GAAa,CAAA;AAAA;AAAA,MAAA,CAAA;;;AC3a1B,IAAM,eAAA,GAAkB,2BAAA;AAGxB,IAAM,OAAA,GAAU;AAAA,EACd,UAAA,EAAY,oBAAA;AAAA,EACZ,QAAA,EAAU;AAAA,IACR;AAAA,MACE,OAAA,EAAS,qBAAA;AAAA,MACT,KAAA,EAAO,GAAG,eAAe,CAAA,QAAA,CAAA;AAAA,MACzB,IAAA,EAAM,gBAAA;AAAA,MACN,WAAA,EACE,8LAAA;AAAA,MACF,GAAA,EAAK,eAAA;AAAA,MACL,mBAAA,EAAqB,qBAAA;AAAA,MACrB,eAAA,EAAiB,WAAA;AAAA,MACjB,QAAA,EAAU,EAAE,KAAA,EAAO,CAAA,EAAG,eAAe,CAAA,cAAA,CAAA,EAAiB;AAAA,MACtD,eAAA,EAAiB;AAAA,QACf,OAAA,EAAS,iBAAA;AAAA,QACT,WAAA,EAAa,GAAA;AAAA,QACb,UAAA,EAAY,GAAA;AAAA,QACZ,WAAA,EAAa,GAAA;AAAA,QACb,WAAA,EAAa,CAAA;AAAA,QACb,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA;AAAA,MACE,OAAA,EAAS,cAAA;AAAA,MACT,KAAA,EAAO,GAAG,eAAe,CAAA,cAAA,CAAA;AAAA,MACzB,IAAA,EAAM,gBAAA;AAAA,MACN,GAAA,EAAK;AAAA;AACP;AAEJ,CAAA;AAOO,SAAS,YAAA,GAAqB;AACnC,EAAA,IAAI,CAAC,QAAO,EAAG;AACf,EAAA,IAAI,QAAA,CAAS,aAAA,CAAc,iCAAiC,CAAA,EAAG;AAE/D,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,IAAA,GAAO,qBAAA;AACd,EAAA,MAAA,CAAO,YAAA,CAAa,2BAA2B,EAAE,CAAA;AACjD,EAAA,MAAA,CAAO,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAC3C,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAClC;AAgBO,SAAS,oBAAA,GAA6B;AAC3C,EAAA,IAAI,CAAC,QAAO,EAAG;AACf,EAAA,IAAI,OAAO,aAAA,EAAe;AAE1B,EAAA,MAAA,CAAO,aAAA,GAAgB,OAAO,MAAA,CAAO;AAAA,IACnC,OAAA,EAAS,WAAA;AAAA,IACT,QAAA,EAAU,gBAAA;AAAA,IACV,GAAA,EAAK;AAAA,GACN,CAAA;AACH;AASO,SAAS,eAAA,CACd,EAAA,EACA,IAAA,EACA,OAAA,EACM;AACN,EAAA,IAAI,CAAC,QAAO,EAAG;AAEf,EAAA,EAAA,CAAG,YAAA,CAAa,4BAA4B,WAAW,CAAA;AACvD,EAAA,EAAA,CAAG,YAAA,CAAa,yBAAyB,IAAI,CAAA;AAE7C,EAAA,IAAI,GAAG,UAAA,EAAY;AACjB,IAAA,EAAA,CAAG,UAAA,CAAW,YAAA;AAAA,MACZ,QAAA,CAAS,aAAA;AAAA,QACP,qCAAqC,eAAe,CAAA,CAAA;AAAA,OACtD;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,SAAS,wBAAA,EAA0B;AACtC,IAAA,YAAA,EAAa;AAAA,EACf;AACA,EAAA,oBAAA,EAAqB;AACvB;;;AChGA,IAAM,eAAA,uBAAsB,OAAA,EAA4C;AAExE,SAAS,gBAAA,CAAiB,YAAoB,IAAA,EAA6B;AACzE,EAAA,OAAO;AAAA,IACL,SAAS,MAAM;AAAA,IAAC,CAAA;AAAA,IAChB,QAAQ,MAAM;AAAA,IAAC,CAAA;AAAA,IACf,SAAS,MAAM;AAAA,IAAC,CAAA;AAAA,IAChB,UAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA,EAAQ,IAAA;AAAA,IACR,SAAA,EAAW;AAAA,GACb;AACF;AAEA,SAAS,0BAAA,CACP,WACA,UAAA,EACa;AACb,EAAA,MAAM,kBAAkB,SAAA,CAAU,aAAA;AAAA,IAChC;AAAA,GACF;AACA,EAAA,MAAM,iBAAiB,SAAA,CAAU,aAAA;AAAA,IAC/B;AAAA,GACF;AAEA,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,SAAA,GAAY,IAAA;AAEZ,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,GAAA,CAAI,cAAc,CAAA;AACpD,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,SAAA,CAAU,OAAA,EAAQ;AAClB,QAAA,SAAA,CAAU,UAAA,EAAW;AACrB,QAAA,eAAA,CAAgB,OAAO,cAAc,CAAA;AAAA,MACvC;AAAA,IACF;AACA,IAAA,eAAA,EAAiB,MAAA,EAAO;AAAA,EAC1B,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,QAAQ,MAAM;AAAA,IAAC,CAAA;AAAA,IACf,OAAA,EAAS,OAAA;AAAA,IACT,UAAA;AAAA,IACA,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,cAAA;AAAA,IACR;AAAA,GACF;AACF;AAEO,SAAS,YAAA,CACd,WACA,MAAA,EACa;AACb,EAAA,MAAM,EAAE,YAAW,GAAI,MAAA;AAGvB,EAAA,IAAI,CAAC,MAAA,EAAO,IAAK,CAAC,SAAA,EAAW;AAC3B,IAAA,OAAO,gBAAA,CAAiB,YAAY,QAAQ,CAAA;AAAA,EAC9C;AAGA,EAAA,IAAI,SAAA,CAAU,aAAA,CAAc,0BAA0B,CAAA,EAAG;AACvD,IAAA,OAAO,0BAAA,CAA2B,WAAW,UAAU,CAAA;AAAA,EACzD;AAEA,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AAEhC,EAAA,YAAA,EAAa;AACb,EAAA,qBAAA,EAAsB;AAGtB,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,YAAY,EAAA,CAAG,wBAAA,EAA0B,aAAA,CAAc,MAAA,CAAO,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAA,CAAQ,MAAM,OAAA,GACZ,4DAAA;AAGF,EAAA,MAAM,UAAU,sBAAA,CAAuB;AAAA,IACrC,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,UAAA,EAAY,MAAA,CAAO,UAAA,EAAY,aAAA,EAAe;AAAA,GAC/C,CAAA;AACD,EAAA,OAAA,CAAQ,YAAY,OAAO,CAAA;AAG3B,EAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,MAAA,CAAO,UAAA,EAAY,aAAa,CAAA;AACrE,EAAA,MAAM,MAAA,GAAS,YAAA;AAAA,IACb,UAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA,CAAO,MAAA;AAAA,IACP,MAAA,CAAO,KAAA;AAAA,IACP,MAAA,CAAO,KAAA;AAAA,IACP;AAAA,GACF;AACA,EAAA,MAAA,CAAO,MAAM,KAAA,GAAQ,MAAA;AACrB,EAAA,MAAA,CAAO,MAAM,MAAA,GAAS,MAAA;AACtB,EAAA,MAAA,CAAO,MAAM,SAAA,GAAY,OAAA;AACzB,EAAA,MAAA,CAAO,MAAM,OAAA,GAAU,GAAA;AACvB,EAAA,MAAA,CAAO,MAAM,UAAA,GAAa,mBAAA;AAE1B,EAAA,OAAA,CAAQ,YAAY,MAAM,CAAA;AAC1B,EAAA,SAAA,CAAU,YAAY,OAAO,CAAA;AAC7B,EAAA,eAAA,CAAgB,OAAA,EAAS,UAAU,MAAM,CAAA;AAGzC,EAAA,IAAI,aAAA,GAAgB,EAAE,GAAG,MAAA,EAAO;AAGhC,EAAA,MAAM,OAAA,GAAU,oBAAA;AAAA,IACd,UAAA;AAAA,IACA;AAAA,MACE,IAAI,OAAA,GAAU;AACZ,QAAA,OAAO,MAAM;AAEX,UAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,GAAA;AACxB,UAAA,MAAA,CAAO,MAAM,OAAA,GAAU,GAAA;AACvB,UAAA,UAAA,CAAW,MAAM,OAAA,CAAQ,MAAA,EAAO,EAAG,GAAG,CAAA;AACtC,UAAA,aAAA,CAAc,OAAA,IAAU;AAAA,QAC1B,CAAA;AAAA,MACF,CAAA;AAAA,MACA,IAAI,QAAA,GAAW;AACb,QAAA,OAAO,aAAA,CAAc,QAAA;AAAA,MACvB,CAAA;AAAA,MACA,IAAI,UAAA,GAAa;AACf,QAAA,OAAO,aAAA,CAAc,UAAA;AAAA,MACvB,CAAA;AAAA,MACA,IAAI,OAAA,GAAU;AACZ,QAAA,OAAO,aAAA,CAAc,OAAA;AAAA,MACvB,CAAA;AAAA,MACA,IAAI,OAAA,GAAU;AACZ,QAAA,OAAO,aAAA,CAAc,OAAA;AAAA,MACvB;AAAA,KACF;AAAA,IACA,MAAA;AAAA,IACA,IAAA;AAAA,IACA,EAAE,YAAY,IAAA;AAAK,GACrB;AAGA,EAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,MAAA,EAAQ,IAAI,CAAA;AAEpD,EAAA,eAAA,CAAgB,IAAI,MAAA,EAAQ;AAAA,IAC1B,OAAA;AAAA,IACA,UAAA,EAAY,gBAAA;AAAA,IACZ;AAAA,GACD,CAAA;AAED,EAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,SAAA,GAAY,IAAA;AAEZ,IAAA,OAAA,EAAQ;AACR,IAAA,gBAAA,EAAiB;AACjB,IAAA,eAAA,CAAgB,OAAO,MAAM,CAAA;AAC7B,IAAA,OAAA,CAAQ,MAAA,EAAO;AAAA,EACjB,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,MAAA,EAAQ,CAAC,OAAA,KAAY;AACnB,MAAA,aAAA,GAAgB,EAAE,GAAG,aAAA,EAAe,GAAG,OAAA,EAAQ;AAAA,IACjD,CAAA;AAAA,IACA,OAAA,EAAS,OAAA;AAAA,IACT,UAAA;AAAA,IACA,IAAA,EAAM,QAAA;AAAA,IACN,MAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACxLA,SAAS,wBAAA,CAAyB;AAAA,EAChC,UAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,EAAkC;AAChC,EAAA,OAAO,CAAA,EAAG,YAAA,CAAa,UAAU,CAAA,CAAA,EAAI,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA;AAC1E;AAEO,SAAS,sBACd,GAAA,EACgB;AAChB,EAAA,IAAI,CAAC,QAAO,EAAG;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,cAAA,CAAe,OAAA,CAAQ,wBAAA,CAAyB,GAAG,CAAC,CAAA;AAChE,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,OAAO,OAAO,MAAA,CAAO,IAAA,KAAS,SAAA,GAAY,OAAO,IAAA,GAAO,IAAA;AAAA,EAC1D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,sBACd,GAAA,EACM;AACN,EAAA,IAAI,CAAC,QAAO,EAAG;AACb,IAAA;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,QAA4B,EAAE,CAAA,EAAG,CAAA,EAAG,IAAA,EAAM,IAAI,IAAA,EAAK;AACzD,IAAA,cAAA,CAAe,OAAA;AAAA,MACb,yBAAyB,GAAG,CAAA;AAAA,MAC5B,IAAA,CAAK,UAAU,KAAK;AAAA,KACtB;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;;;ACxCA,SAASA,kBAAiB,UAAA,EAAiC;AACzD,EAAA,OAAO;AAAA,IACL,SAAS,MAAM;AAAA,IAAC,CAAA;AAAA,IAChB,QAAQ,MAAM;AAAA,IAAC,CAAA;AAAA,IACf,SAAS,MAAM;AAAA,IAAC,CAAA;AAAA,IAChB,UAAA;AAAA,IACA,IAAA,EAAM,OAAA;AAAA,IACN,MAAA,EAAQ,IAAA;AAAA,IACR,SAAA,EAAW;AAAA,GACb;AACF;AAEO,SAAS,UAAU,MAAA,EAA0C;AAClE,EAAA,MAAM,EAAE,YAAW,GAAI,MAAA;AAGvB,EAAA,IAAI,CAAC,QAAO,EAAG;AACb,IAAA,OAAOA,kBAAiB,UAAU,CAAA;AAAA,EACpC;AACA,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AAEhC,EAAA,YAAA,EAAa;AACb,EAAA,qBAAA,EAAsB;AAGtB,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,SAAA,GAAY,EAAA;AAAA,IAClB,4CAAA;AAAA,IACA,aAAA,CAAc,OAAO,KAAK;AAAA,GAC5B;AAGA,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,EAAA,KAAA,CAAM,SAAA,GAAY,mBAAA;AAGlB,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAChD,EAAA,QAAA,CAAS,SAAA,GAAY,mBAAA;AACrB,EAAA,QAAA,CAAS,SAAA,GAAY,UAAA;AACrB,EAAA,QAAA,CAAS,YAAA,CAAa,cAAc,OAAO,CAAA;AAC3C,EAAA,IAAI,OAAO,YAAA,EAAc;AACvB,IAAA,QAAA,CAAS,MAAM,OAAA,GAAU,MAAA;AAAA,EAC3B;AAGA,EAAA,MAAM,UAAU,sBAAA,CAAuB;AAAA,IACrC,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,UAAA,EAAY,MAAA,CAAO,UAAA,EAAY,aAAA,EAAe;AAAA,GAC/C,CAAA;AACD,EAAA,OAAA,CAAQ,MAAM,YAAA,GAAe,MAAA;AAG7B,EAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,MAAA,CAAO,UAAA,EAAY,aAAa,CAAA;AACrE,EAAA,MAAM,MAAA,GAAS,YAAA;AAAA,IACb,UAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA,CAAO,MAAA;AAAA,IACP,MAAA,CAAO,KAAA;AAAA,IACP,MAAA,CAAO,KAAA;AAAA,IACP;AAAA,GACF;AACA,EAAA,MAAA,CAAO,MAAM,OAAA,GAAU,GAAA;AACvB,EAAA,MAAA,CAAO,MAAM,UAAA,GAAa,mBAAA;AAE1B,EAAA,KAAA,CAAM,YAAY,QAAQ,CAAA;AAC1B,EAAA,KAAA,CAAM,YAAY,OAAO,CAAA;AACzB,EAAA,KAAA,CAAM,YAAY,MAAM,CAAA;AACxB,EAAA,OAAA,CAAQ,YAAY,KAAK,CAAA;AACzB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,OAAO,CAAA;AACjC,EAAA,eAAA,CAAgB,OAAA,EAAS,SAAS,MAAM,CAAA;AAGxC,EAAA,IAAI,aAAA,GAAgB,EAAE,GAAG,MAAA,EAAO;AAChC,EAAA,IAAI,MAAA,GAAS,IAAA;AACb,EAAA,IAAI,cAAA,GAAsC,IAAA;AAC1C,EAAA,MAAM,gBAAA,GAAmB,CAAC,IAAA,KAAkB;AAC1C,IAAA,qBAAA,CAAsB;AAAA,MACpB,UAAA;AAAA,MACA,IAAA,EAAM,OAAA;AAAA,MACN,MAAM,MAAA,CAAO,IAAA;AAAA,MACb;AAAA,KACD,CAAA;AAAA,EACH,CAAA;AAGA,EAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,MAAA,EAAQ,IAAI,CAAA;AAEpD,EAAA,gBAAA,CAAiB,IAAI,CAAA;AAErB,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAA,GAAS,KAAA;AACT,IAAA,cAAA,IAAiB;AACjB,IAAA,gBAAA,EAAiB;AACjB,IAAA,OAAA,CAAQ,MAAA,EAAO;AACf,IAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,UAAU,CAAA;AAClD,IAAA,aAAA,CAAc,OAAA,IAAU;AAAA,EAC1B,CAAA;AAEA,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,IAAA,WAAA,EAAY;AAAA,EACd,CAAA;AAEA,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,WAAA,EAAY;AAAA,EACd,CAAA;AAGA,EAAA,cAAA,GAAiB,oBAAA;AAAA,IACf,UAAA;AAAA,IACA;AAAA,MACE,IAAI,OAAA,GAAU;AACZ,QAAA,OAAO,MAAM;AACX,UAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,GAAA;AACxB,UAAA,MAAA,CAAO,MAAM,OAAA,GAAU,GAAA;AACvB,UAAA,UAAA,CAAW,MAAM,OAAA,CAAQ,MAAA,EAAO,EAAG,GAAG,CAAA;AACtC,UAAA,aAAA,CAAc,OAAA,IAAU;AAAA,QAC1B,CAAA;AAAA,MACF,CAAA;AAAA,MACA,IAAI,QAAA,GAAW;AACb,QAAA,OAAO,aAAA,CAAc,QAAA;AAAA,MACvB,CAAA;AAAA,MACA,IAAI,UAAA,GAAa;AACf,QAAA,OAAO,aAAA,CAAc,UAAA;AAAA,MACvB,CAAA;AAAA,MACA,IAAI,OAAA,GAAU;AACZ,QAAA,OAAO,OAAA;AAAA,MACT,CAAA;AAAA,MACA,IAAI,OAAA,GAAU;AACZ,QAAA,OAAO,aAAA,CAAc,OAAA;AAAA,MACvB;AAAA,KACF;AAAA,IACA,MAAA;AAAA,IACA,IAAA;AAAA,IACA,EAAE,UAAA,EAAY,IAAA,EAAM,cAAA,EAAgB,CAAC,OAAO,YAAA;AAAa,GAC3D;AAGA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAqB;AACvC,IAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,CAAC,OAAO,YAAA,EAAc;AACxB,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,OAAO,CAAA;AAC1C,IAAA,OAAA,CAAQ,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACvC,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,OAAA,EAAS,OAAA,EAAQ;AAAA,IACpC,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,UAAU,CAAA;AAAA,EACjD;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,MAAA,EAAQ,CAAC,OAAA,KAAkD;AACzD,MAAA,aAAA,GAAgB,EAAE,GAAG,aAAA,EAAe,GAAG,OAAA,EAAQ;AAAA,IACjD,CAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA,EAAM,OAAA;AAAA,IACN,MAAA;AAAA,IACA,SAAA,EAAW;AAAA,GACb;AACF;;;ACtKA,SAASA,kBAAiB,UAAA,EAAiC;AACzD,EAAA,OAAO;AAAA,IACL,SAAS,MAAM;AAAA,IAAC,CAAA;AAAA,IAChB,QAAQ,MAAM;AAAA,IAAC,CAAA;AAAA,IACf,SAAS,MAAM;AAAA,IAAC,CAAA;AAAA,IAChB,UAAA;AAAA,IACA,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,IAAA;AAAA,IACR,SAAA,EAAW;AAAA,GACb;AACF;AAEO,SAAS,WAAW,MAAA,EAA0C;AACnE,EAAA,MAAM,EAAE,YAAW,GAAI,MAAA;AAGvB,EAAA,IAAI,CAAC,QAAO,EAAG;AACb,IAAA,OAAOA,kBAAiB,UAAU,CAAA;AAAA,EACpC;AACA,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AAEhC,EAAA,YAAA,EAAa;AACb,EAAA,qBAAA,EAAsB;AAGtB,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC7C,EAAA,QAAA,CAAS,SAAA,GAAY,EAAA;AAAA,IACnB,oDAAA;AAAA,IACA,aAAA,CAAc,OAAO,KAAK;AAAA,GAC5B;AAGA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,EAAA,MAAA,CAAO,SAAA,GAAY,EAAA;AAAA,IACjB,2CAAA;AAAA,IACA,aAAA,CAAc,OAAO,KAAK;AAAA,GAC5B;AAGA,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAChD,EAAA,QAAA,CAAS,SAAA,GAAY,mBAAA;AACrB,EAAA,QAAA,CAAS,SAAA,GAAY,UAAA;AACrB,EAAA,QAAA,CAAS,YAAA,CAAa,cAAc,OAAO,CAAA;AAC3C,EAAA,IAAI,OAAO,YAAA,EAAc;AACvB,IAAA,QAAA,CAAS,MAAM,OAAA,GAAU,MAAA;AAAA,EAC3B;AAGA,EAAA,MAAM,UAAU,sBAAA,CAAuB;AAAA,IACrC,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,UAAA,EAAY,MAAA,CAAO,UAAA,EAAY,aAAA,EAAe;AAAA,GAC/C,CAAA;AAGD,EAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,MAAA,CAAO,UAAA,EAAY,aAAa,CAAA;AACrE,EAAA,MAAM,MAAA,GAAS,YAAA;AAAA,IACb,UAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA,CAAO,MAAA;AAAA,IACP,MAAA,CAAO,KAAA;AAAA,IACP,MAAA,CAAO,KAAA;AAAA,IACP;AAAA,GACF;AACA,EAAA,MAAA,CAAO,MAAM,OAAA,GAAU,GAAA;AACvB,EAAA,MAAA,CAAO,MAAM,UAAA,GAAa,mBAAA;AAE1B,EAAA,MAAA,CAAO,YAAY,QAAQ,CAAA;AAC3B,EAAA,MAAA,CAAO,YAAY,OAAO,CAAA;AAC1B,EAAA,MAAA,CAAO,YAAY,MAAM,CAAA;AACzB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,QAAQ,CAAA;AAClC,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAChC,EAAA,eAAA,CAAgB,MAAA,EAAQ,UAAU,MAAM,CAAA;AAGxC,EAAA,IAAI,aAAA,GAAgB,EAAE,GAAG,MAAA,EAAO;AAChC,EAAA,IAAI,MAAA,GAAS,IAAA;AACb,EAAA,IAAI,cAAA,GAAsC,IAAA;AAC1C,EAAA,MAAM,gBAAA,GAAmB,CAAC,IAAA,KAAkB;AAC1C,IAAA,qBAAA,CAAsB;AAAA,MACpB,UAAA;AAAA,MACA,IAAA,EAAM,QAAA;AAAA,MACN,MAAM,MAAA,CAAO,IAAA;AAAA,MACb;AAAA,KACD,CAAA;AAAA,EACH,CAAA;AAGA,EAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,MAAA,EAAQ,IAAI,CAAA;AAEpD,EAAA,gBAAA,CAAiB,IAAI,CAAA;AAErB,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAA,GAAS,KAAA;AACT,IAAA,cAAA,IAAiB;AACjB,IAAA,gBAAA,EAAiB;AACjB,IAAA,MAAA,CAAO,MAAA,EAAO;AACd,IAAA,QAAA,CAAS,MAAA,EAAO;AAChB,IAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,UAAU,CAAA;AAClD,IAAA,aAAA,CAAc,OAAA,IAAU;AAAA,EAC1B,CAAA;AAEA,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,IAAA,YAAA,EAAa;AAAA,EACf,CAAA;AAEA,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,YAAA,EAAa;AAAA,EACf,CAAA;AAGA,EAAA,cAAA,GAAiB,oBAAA;AAAA,IACf,UAAA;AAAA,IACA;AAAA,MACE,IAAI,OAAA,GAAU;AACZ,QAAA,OAAO,MAAM;AACX,UAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,GAAA;AACxB,UAAA,MAAA,CAAO,MAAM,OAAA,GAAU,GAAA;AACvB,UAAA,UAAA,CAAW,MAAM,OAAA,CAAQ,MAAA,EAAO,EAAG,GAAG,CAAA;AACtC,UAAA,aAAA,CAAc,OAAA,IAAU;AAAA,QAC1B,CAAA;AAAA,MACF,CAAA;AAAA,MACA,IAAI,QAAA,GAAW;AACb,QAAA,OAAO,aAAA,CAAc,QAAA;AAAA,MACvB,CAAA;AAAA,MACA,IAAI,UAAA,GAAa;AACf,QAAA,OAAO,aAAA,CAAc,UAAA;AAAA,MACvB,CAAA;AAAA,MACA,IAAI,OAAA,GAAU;AACZ,QAAA,OAAO,OAAA;AAAA,MACT,CAAA;AAAA,MACA,IAAI,OAAA,GAAU;AACZ,QAAA,OAAO,aAAA,CAAc,OAAA;AAAA,MACvB;AAAA,KACF;AAAA,IACA,MAAA;AAAA,IACA,IAAA;AAAA,IACA,EAAE,UAAA,EAAY,IAAA,EAAM,cAAA,EAAgB,CAAC,OAAO,YAAA;AAAa,GAC3D;AAGA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAqB;AACvC,IAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,CAAC,OAAO,YAAA,EAAc;AACxB,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,OAAO,CAAA;AAC1C,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,OAAO,CAAA;AAC1C,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,UAAU,CAAA;AAAA,EACjD;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,MAAA,EAAQ,CAAC,OAAA,KAAkD;AACzD,MAAA,aAAA,GAAgB,EAAE,GAAG,aAAA,EAAe,GAAG,OAAA,EAAQ;AAAA,IACjD,CAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA,EAAM,QAAA;AAAA,IACN,MAAA;AAAA,IACA,SAAA,EAAW;AAAA,GACb;AACF;;;AChKA,SAAS,gBAAA,CACP,MACA,WAAA,EACqB;AACrB,EAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AACzB,EAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,QAAA,IAAY,EAAC;AAC3C,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,QAAA,EAAU;AAAA,MACR,GAAG,gBAAA;AAAA,MACH,GAAG,WAAA;AAAA,MACH,OAAO,EAAE,GAAG,iBAAiB,KAAA,EAAO,GAAG,YAAY,KAAA;AAAM;AAC3D,GACF;AACF;AAGA,IAAM,cAAA,GAAiB,GAAA;AACvB,IAAM,eAAA,GAAkB,GAAA;AACxB,IAAM,mBAAA,GAAsB,EAAA;AAC5B,IAAM,uBAAA,GAA0B,oCAAA;AAEhC,SAAS,eACP,OAAA,EACa;AACb,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,UAAU,OAAA,GAAU,CAAC,OAAO,CAAA,GAAI,EAAC;AAC1E,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA;AACzC,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA;AAEvC,EAAA,IAAI,QAAA,IAAY,SAAS,OAAO,MAAA;AAChC,EAAA,IAAI,SAAS,OAAO,MAAA;AACpB,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,eACP,MAAA,EACuD;AACvD,EAAA,OACE,OAAO,OAAA,IACP,MAAA,CAAO,YAAY,eAAA,IACnB,MAAA,CAAO,YAAY,OAAA,IACnB,MAAA;AAEJ;AAEA,SAAS,sBAAsB,MAAA,EAAqC;AAClE,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,cAAA,IAAkB,MAAA,CAAO,UAAA,EAAY,cAAA;AAC5D,EAAA,MAAM,UAAU,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,CAAQ,MAAK,GAAI,EAAA;AAC/D,EAAA,OAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,uBAAA;AACxC;AAEO,SAAS,mBAAmB,MAAA,EAAqC;AACtE,EAAA,OAAO,eAAe,cAAA,CAAe,MAAM,CAAC,CAAA,KAAM,SAC9C,aAAA,GACA,QAAA;AACN;AAEO,SAAS,aAAA,CACd,KACA,YAAA,EACkB;AAClB,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,EAAA,GAAA,CAAI,GAAA,GAAM,GAAA;AACV,EAAA,GAAA,CAAI,GAAA,GAAM,EAAA;AACV,EAAA,GAAA,CAAI,MAAM,KAAA,GAAQ,MAAA;AAClB,EAAA,GAAA,CAAI,MAAM,MAAA,GAAS,MAAA;AACnB,EAAA,GAAA,CAAI,MAAM,SAAA,GAAY,OAAA;AACtB,EAAA,GAAA,CAAI,MAAM,YAAA,GAAe,SAAA;AACzB,EAAA,GAAA,CAAI,UAAU,MAAM;AAClB,IAAA,MAAM,SAAS,GAAA,CAAI,aAAA;AACnB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,MAAA,CAAO,SAAA,GAAY,YAAA;AAAA,IACrB;AAAA,EACF,CAAA;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,eAAA,CACP,QACA,MAAA,EACM;AACN,EAAA,MAAM,IAAA,GAAqB,MAAA,CAAO,QAAA,EAAU,IAAA,IAAQ,SAAA;AACpD,EAAA,MAAM,YAAA,GAAe,mBAAmB,MAAM,CAAA;AAE9C,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,MAAA,CAAO,SAAA,GAAY,YAAA;AACnB,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,MAAM,SAAA,GAAY,OAAO,UAAA,EAAY,SAAA;AACrC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAA,CAAO,SAAA,GAAY,EAAA;AACnB,MAAA,MAAA,CAAO,WAAA,CAAY,aAAA,CAAc,SAAA,EAAW,YAAY,CAAC,CAAA;AAAA,IAC3D,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,SAAA,GAAY,YAAA;AAAA,IACrB;AACA,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,EAAM;AAC7C,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,MAAA,CAAO,SAAA,GAAY,EAAA;AACnB,MAAA,MAAA,CAAO,WAAA,CAAY,aAAA,CAAc,IAAA,CAAK,GAAA,EAAK,YAAY,CAAC,CAAA;AACxD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,MAAA,CAAO,YAAY,IAAA,CAAK,GAAA;AACxB,MAAA;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAA,CAAO,SAAA,GAAY,YAAA;AACrB;AAEA,SAAS,iBAAiB,QAAA,EAA8B;AACtD,EAAA,MAAM,IAAI,QAAA,CAAS,WAAA;AAEnB,EAAA,MAAM,GAAA,GAAM,SAAS,gBAAA,EAAiB;AACtC,EAAA,MAAM,IAAA,GAAO,SAAS,UAAA,EAAW;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,MAAA;AACX,EAAA,GAAA,CAAI,SAAA,CAAU,cAAA,CAAe,GAAA,EAAK,CAAC,CAAA;AACnC,EAAA,GAAA,CAAI,SAAA,CAAU,cAAA,CAAe,IAAA,EAAM,CAAA,GAAI,GAAG,CAAA;AAC1C,EAAA,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,CAAC,CAAA;AAChC,EAAA,IAAA,CAAK,IAAA,CAAK,uBAAA,CAAwB,IAAA,EAAM,CAAA,GAAI,GAAG,CAAA;AAC/C,EAAA,IAAA,CAAK,IAAA,CAAK,4BAAA,CAA6B,IAAA,EAAO,CAAA,GAAI,GAAG,CAAA;AACrD,EAAA,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,CAAE,OAAA,CAAQ,SAAS,WAAW,CAAA;AAC9C,EAAA,GAAA,CAAI,MAAM,CAAC,CAAA;AACX,EAAA,GAAA,CAAI,IAAA,CAAK,IAAI,IAAI,CAAA;AAEjB,EAAA,MAAM,IAAA,GAAO,SAAS,gBAAA,EAAiB;AACvC,EAAA,MAAM,KAAA,GAAQ,SAAS,UAAA,EAAW;AAClC,EAAA,IAAA,CAAK,IAAA,GAAO,MAAA;AACZ,EAAA,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,IAAA,EAAM,CAAA,GAAI,IAAI,CAAA;AAC5C,EAAA,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,IAAA,EAAM,CAAA,GAAI,IAAI,CAAA;AAC5C,EAAA,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,CAAA,EAAG,CAAC,CAAA;AAC9B,EAAA,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,CAAA,GAAI,IAAI,CAAA;AACxC,EAAA,KAAA,CAAM,IAAA,CAAK,4BAAA,CAA6B,IAAA,EAAO,CAAA,GAAI,IAAI,CAAA;AACvD,EAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA,CAAE,OAAA,CAAQ,SAAS,WAAW,CAAA;AAChD,EAAA,IAAA,CAAK,KAAA,CAAM,IAAI,IAAI,CAAA;AACnB,EAAA,IAAA,CAAK,IAAA,CAAK,IAAI,GAAG,CAAA;AACnB;AAEA,SAASA,kBAAiB,UAAA,EAAiC;AACzD,EAAA,OAAO;AAAA,IACL,SAAS,MAAM;AAAA,IAAC,CAAA;AAAA,IAChB,QAAQ,MAAM;AAAA,IAAC,CAAA;AAAA,IACf,SAAS,MAAM;AAAA,IAAC,CAAA;AAAA,IAChB,MAAM,MAAM;AAAA,IAAC,CAAA;AAAA,IACb,OAAO,MAAM;AAAA,IAAC,CAAA;AAAA,IACd,QAAQ,MAAM;AAAA,IAAC,CAAA;AAAA,IACf,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA;AAAA,IACA,IAAA,EAAM,OAAA;AAAA,IACN,MAAA,EAAQ,IAAA;AAAA,IACR,SAAA,EAAW;AAAA,GACb;AACF;AAEO,SAAS,kBAAkB,MAAA,EAA0C;AAC1E,EAAA,MAAM,EAAE,UAAA,EAAY,UAAA,EAAY,KAAA,EAAO,OAAM,GAAI,MAAA;AAGjD,EAAA,IAAI,CAAC,QAAO,EAAG;AACb,IAAA,OAAOA,kBAAiB,UAAU,CAAA;AAAA,EACpC;AACA,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AAEhC,EAAA,YAAA,EAAa;AACb,EAAA,qBAAA,EAAsB;AAGtB,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,SAAA,GAAY,EAAA;AAAA,IACjB,iDAAA;AAAA,IACA,aAAA,CAAc,OAAO,KAAK;AAAA,GAC5B;AACA,EAAA,eAAA,CAAgB,QAAQ,MAAM,CAAA;AAC9B,EAAA,MAAA,CAAO,YAAA,CAAa,cAAc,WAAW,CAAA;AAC7C,EAAA,MAAA,CAAO,YAAA,CAAa,oBAAoB,cAAc,CAAA;AAGtD,EAAA,IAAI,cAAc,KAAA,EAAO;AACvB,IAAA,MAAM,MAAA,GAAS,cAAc,KAAK,CAAA;AAClC,IAAA,MAAM,EAAA,GAAK,MAAA,GACN,KAAA,EAAO,IAAA,EAAM,OAAA,IAAW,UAAA,EAAY,gBAAA,IAAoB,SAAA,GACxD,KAAA,EAAO,KAAA,EAAO,OAAA,IAAW,UAAA,EAAY,YAAA,IAAgB,SAAA;AAC1D,IAAA,MAAA,CAAO,KAAA,CAAM,WAAA,CAAY,wBAAA,EAA0B,EAAE,CAAA;AACrD,IAAA,MAAA,CAAO,KAAA,CAAM,WAAA;AAAA,MACX,4BAAA;AAAA,MACA,cAAc,EAAE,CAAA,EAAA;AAAA,KAClB;AACA,IAAA,MAAA,CAAO,KAAA,CAAM,WAAA;AAAA,MACX,kCAAA;AAAA,MACA,cAAc,EAAE,CAAA,EAAA;AAAA,KAClB;AACA,IAAA,MAAA,CAAO,MAAM,eAAA,GAAkB,EAAA;AAC/B,IAAA,MAAA,CAAO,KAAA,CAAM,SAAA,GAAY,CAAA,WAAA,EAAc,EAAE,CAAA,EAAA,CAAA;AAAA,EAC3C;AAGA,EAAA,IAAI,YAAA,GAAe,gBAAA;AAAA,IACjB,MAAA;AAAA,IACA,YAAY,aAAA,EAAe;AAAA,GAC7B;AACA,EAAA,IAAI,iBAAiB,MAAA,EAAQ;AAC3B,IAAA,eAAA,CAAgB,QAAQ,YAAY,CAAA;AAAA,EACtC;AAGA,EAAA,IAAI,YAAA,CAAa,UAAU,KAAA,EAAO;AAChC,IAAA,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO,YAAA,CAAa,SAAS,KAAK,CAAA;AAAA,EACzD;AAGA,EAAA,IAAI,YAAA,CAAa,UAAU,SAAA,EAAW;AACpC,IAAA,KAAA,MAAW,GAAA,IAAO,aAAa,QAAA,CAAS,SAAA,CACrC,MAAM,KAAK,CAAA,CACX,MAAA,CAAO,OAAO,CAAA,EAAG;AAClB,MAAA,MAAA,CAAO,SAAA,CAAU,IAAI,GAAG,CAAA;AAAA,IAC1B;AAAA,EACF;AAEA,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAChC,EAAA,eAAA,CAAgB,MAAA,EAAQ,SAAS,MAAM,CAAA;AAIvC,EAAA,IAAI,OAAO,QAAA,EAAU,IAAA,KAAS,QAAA,IAAY,CAAC,YAAY,SAAA,EAAW;AAChE,IAAA,KAAA,CAAM,GAAG,IAAI,CAAA,qBAAA,EAAwB,UAAU,CAAA,CAAE,CAAA,CAC9C,KAAK,CAAC,GAAA,KAAS,GAAA,CAAI,EAAA,GAAK,IAAI,IAAA,EAAK,GAAI,IAAK,CAAA,CAC1C,IAAA,CAAK,CAAC,aAAA,KAAkB;AACvB,MAAA,IAAI,eAAe,SAAA,EAAW;AAC5B,QAAA,aAAA,GAAgB;AAAA,UACd,GAAG,aAAA;AAAA,UACH,YAAY,EAAE,GAAG,aAAA,CAAc,UAAA,EAAY,GAAG,aAAA;AAAc,SAC9D;AACA,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,eAAA,CAAgB,QAAQ,aAAa,CAAA;AAAA,QACvC;AAAA,MACF;AAAA,IACF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,IAEb,CAAC,CAAA;AAAA,EACL;AAEA,EAAA,IAAI,WAAA,GAAkC,IAAA;AACtC,EAAA,IAAI,MAAA,GAAmC,IAAA;AACvC,EAAA,IAAI,OAAA,GAA+B,IAAA;AACnC,EAAA,IAAI,gBAAA,GAAwC,IAAA;AAC5C,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,IAAI,MAAA,GAA6B,IAAA;AACjC,EAAA,IAAI,gBAAA,GAAkC,IAAA;AACtC,EAAA,IAAI,eAAA,GAAsC,IAAA;AAC1C,EAAA,IAAI,QAAA,GAAgC,IAAA;AACpC,EAAA,IAAI,sBAAA,GAAyB,KAAA;AAC7B,EAAA,IAAI,gBAAA,GAAmB,KAAA;AACvB,EAAA,IAAI,gBAA0B,EAAC;AAC/B,EAAA,MAAM,gBAAA,GAAmB,CAAC,IAAA,KAAkB;AAC1C,IAAA,qBAAA,CAAsB;AAAA,MACpB,UAAA;AAAA,MACA,IAAA,EAAM,OAAA;AAAA,MACN,MAAM,MAAA,CAAO,IAAA;AAAA,MACb;AAAA,KACD,CAAA;AAAA,EACH,CAAA;AACA,EAAA,MAAM,oBACJ,qBAAA,CAAsB;AAAA,IACpB,UAAA;AAAA,IACA,IAAA,EAAM,OAAA;AAAA,IACN,MAAM,MAAA,CAAO;AAAA,GACd,CAAA,KAAM,IAAA;AAGT,EAAA,IAAI,aAAA,GAAgB,EAAE,GAAG,YAAA,EAAa;AAEtC,EAAA,MAAM,uBAAuB,MAAM;AACjC,IAAA,eAAA,CAAgB,QAAQ,aAAa,CAAA;AACrC,IAAA,MAAA,CAAO,YAAA,CAAa,cAAc,WAAW,CAAA;AAC7C,IAAA,MAAA,CAAO,SAAA,CAAU,OAAO,+BAA+B,CAAA;AAAA,EACzD,CAAA;AAEA,EAAA,MAAM,qBAAqB,MAAM;AAC/B,IAAA,MAAA,CAAO,SAAA,GAAY,UAAA;AACnB,IAAA,MAAA,CAAO,YAAA,CAAa,cAAc,YAAY,CAAA;AAC9C,IAAA,MAAA,CAAO,SAAA,CAAU,IAAI,+BAA+B,CAAA;AAAA,EACtD,CAAA;AAEA,EAAA,MAAM,qBAAqB,MAAM;AAC/B,IAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AACjC,MAAA,MAAA,CAAO,aAAa,KAAK,CAAA;AAAA,IAC3B;AACA,IAAA,aAAA,GAAgB,EAAC;AAEjB,IAAA,IAAI,qBAAqB,IAAA,EAAM;AAC7B,MAAA,MAAA,CAAO,cAAc,gBAAgB,CAAA;AACrC,MAAA,gBAAA,GAAmB,IAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,wBAAwB,MAAM;AAClC,IAAA,eAAA,EAAiB,MAAA,EAAO;AACxB,IAAA,eAAA,GAAkB,IAAA;AAAA,EACpB,CAAA;AAEA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAI,qBAAqB,IAAA,EAAM;AAC7B,MAAA,MAAA,CAAO,cAAc,gBAAgB,CAAA;AACrC,MAAA,gBAAA,GAAmB,IAAA;AAAA,IACrB;AACA,IAAA,MAAA,EAAQ,MAAA,EAAO;AACf,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,qBAAA,EAAsB;AAAA,EACxB,CAAA;AAEA,EAAA,MAAM,sBAAsB,MAAM;AAChC,IAAA,IAAI,mBAAmB,MAAA,EAAQ;AAC/B,IAAA,eAAA,GAAkB,QAAA,CAAS,cAAc,MAAM,CAAA;AAC/C,IAAA,eAAA,CAAgB,SAAA,GAAY,oCAAA;AAC5B,IAAA,MAAA,CAAO,YAAY,eAAe,CAAA;AAAA,EACpC,CAAA;AAEA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,gBAAA,GACJ,MAAA,CAAO,YAAA,IAEL,MAAA,CAGA,kBAAA;AAEJ,MAAA,IAAI,CAAC,gBAAA,EAAkB;AAEvB,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,QAAA,GAAW,IAAI,gBAAA,EAAiB;AAAA,MAClC;AAEA,MAAA,IAAI,QAAA,CAAS,UAAU,WAAA,EAAa;AAClC,QAAA,KAAK,SAAS,MAAA,EAAO;AAAA,MACvB;AACA,MAAA,gBAAA,CAAiB,QAAQ,CAAA;AAAA,IAC3B,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,OAAA,KAAoB;AACxC,IAAA,YAAA,EAAa;AACb,IAAA,IAAI,MAAA,EAAQ;AAEZ,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC7C,IAAA,QAAA,CAAS,SAAA,GAAY,EAAA;AAAA,MACnB,iDAAA;AAAA,MACA,aAAA,CAAc,cAAc,KAAK;AAAA,KACnC;AAEA,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,IAAA,SAAA,CAAU,SAAA,GAAY,kCAAA;AACtB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC5C,IAAA,SAAA,CAAU,YAAY,MAAM,CAAA;AAE5B,IAAA,QAAA,CAAS,YAAY,SAAS,CAAA;AAC9B,IAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,MAAM,SAAA,EAAW,CAAA;AAEpD,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,QAAQ,CAAA;AAClC,IAAA,MAAA,GAAS,QAAA;AACT,IAAA,mBAAA,EAAoB;AAEpB,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,gBAAA,GAAmB,MAAA,CAAO,YAAY,MAAM;AAC1C,MAAA,SAAA,IAAa,CAAA;AACb,MAAA,MAAA,CAAO,WAAA,GAAc,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA;AAE/C,MAAA,IAAI,SAAA,IAAa,QAAQ,MAAA,EAAQ;AAC/B,QAAA,IAAI,qBAAqB,IAAA,EAAM;AAC7B,UAAA,MAAA,CAAO,cAAc,gBAAgB,CAAA;AACrC,UAAA,gBAAA,GAAmB,IAAA;AAAA,QACrB;AAAA,MACF;AAAA,IACF,GAAG,mBAAmB,CAAA;AAAA,EACxB,CAAA;AAEA,EAAA,MAAM,4BAA4B,MAAM;AACtC,IAAA,IAAI,sBAAA,IAA0B,oBAAoB,MAAA,EAAQ;AAE1D,IAAA,sBAAA,GAAyB,IAAA;AAEzB,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,UAAA,CAAW,MAAM;AACzC,MAAA,IAAI,UAAU,gBAAA,EAAkB;AAChC,MAAA,SAAA,EAAU;AAAA,IACZ,GAAG,cAAc,CAAA;AAEjB,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,UAAA,CAAW,MAAM;AAC1C,MAAA,IAAI,UAAU,gBAAA,EAAkB;AAChC,MAAA,YAAA,CAAa,qBAAA,CAAsB,aAAa,CAAC,CAAA;AAAA,IACnD,GAAG,eAAe,CAAA;AAElB,IAAA,aAAA,CAAc,IAAA,CAAK,YAAY,WAAW,CAAA;AAAA,EAC5C,CAAA;AAEA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,IAAI,MAAA,EAAQ;AACZ,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,IAAA,kBAAA,EAAmB;AACnB,IAAA,YAAA,EAAa;AAGb,IAAA,WAAA,GAAc,QAAA,CAAS,cAAc,KAAK,CAAA;AAC1C,IAAA,WAAA,CAAY,SAAA,GAAY,EAAA;AAAA,MACtB,iDAAA;AAAA,MACA,aAAA,CAAc,cAAc,KAAK;AAAA,KACnC;AAGA,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAChD,IAAA,QAAA,CAAS,SAAA,GAAY,mBAAA;AACrB,IAAA,QAAA,CAAS,SAAA,GAAY,UAAA;AACrB,IAAA,QAAA,CAAS,YAAA,CAAa,cAAc,YAAY,CAAA;AAChD,IAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,MAAM,UAAA,EAAY,CAAA;AAGrD,IAAA,MAAM,UAAU,sBAAA,CAAuB;AAAA,MACrC,OAAO,aAAA,CAAc,KAAA;AAAA,MACrB,OAAO,aAAA,CAAc,KAAA;AAAA,MACrB,UAAA,EAAY,aAAA,CAAc,UAAA,EAAY,aAAA,EAAe;AAAA,KACtD,CAAA;AACD,IAAA,OAAA,CAAQ,MAAM,YAAA,GAAe,MAAA;AAG7B,IAAA,MAAM,SAAA,GAAY,kBAAA;AAAA,MAChB,cAAc,UAAA,EAAY;AAAA,KAC5B;AACA,IAAA,MAAA,GAAS,YAAA;AAAA,MACP,UAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA;AAAA,MACA,aAAA,CAAc,MAAA;AAAA,MACd,aAAA,CAAc,KAAA;AAAA,MACd,aAAA,CAAc,KAAA;AAAA,MACd;AAAA,KACF;AACA,IAAA,MAAA,CAAO,MAAM,OAAA,GAAU,GAAA;AACvB,IAAA,MAAA,CAAO,MAAM,UAAA,GAAa,mBAAA;AAE1B,IAAA,WAAA,CAAY,YAAY,QAAQ,CAAA;AAChC,IAAA,WAAA,CAAY,YAAY,OAAO,CAAA;AAC/B,IAAA,WAAA,CAAY,YAAY,MAAM,CAAA;AAC9B,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,WAAW,CAAA;AAGrC,IAAA,OAAA,GAAU,oBAAA;AAAA,MACR,UAAA;AAAA,MACA;AAAA,QACE,IAAI,OAAA,GAAU;AACZ,UAAA,OAAO,MAAM;AACX,YAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,GAAA;AACxB,YAAA,MAAA,CAAQ,MAAM,OAAA,GAAU,GAAA;AACxB,YAAA,UAAA,CAAW,MAAM,OAAA,CAAQ,MAAA,EAAO,EAAG,GAAG,CAAA;AACtC,YAAA,aAAA,CAAc,OAAA,IAAU;AAAA,UAC1B,CAAA;AAAA,QACF,CAAA;AAAA,QACA,IAAI,QAAA,GAAW;AACb,UAAA,OAAO,aAAA,CAAc,QAAA;AAAA,QACvB,CAAA;AAAA,QACA,IAAI,UAAA,GAAa;AACf,UAAA,OAAO,aAAA,CAAc,UAAA;AAAA,QACvB,CAAA;AAAA,QACA,IAAI,OAAA,GAAU;AACZ,UAAA,OAAO,UAAA;AAAA,QACT,CAAA;AAAA,QACA,IAAI,OAAA,GAAU;AACZ,UAAA,OAAO,aAAA,CAAc,OAAA;AAAA,QACvB;AAAA,OACF;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA,MACA,EAAE,UAAA,EAAY,IAAA,EAAM,cAAA,EAAgB,IAAA;AAAK,KAC3C;AAGA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,gBAAA,GAAmB,cAAA,CAAe,QAAQ,IAAI,CAAA;AAAA,IAChD;AAGA,IAAA,kBAAA,EAAmB;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,OAAA,KAAyC;AAC3D,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,IAAI,OAAA,EAAS,iBAAiB,KAAA,EAAO;AACnC,MAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,IACxB;AACA,IAAA,MAAA,GAAS,KAAA;AAET,IAAA,OAAA,IAAU;AACV,IAAA,gBAAA,IAAmB;AACnB,IAAA,WAAA,EAAa,MAAA,EAAO;AACpB,IAAA,WAAA,GAAc,IAAA;AACd,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,gBAAA,GAAmB,IAAA;AAGnB,IAAA,oBAAA,EAAqB;AAErB,IAAA,aAAA,CAAc,OAAA,IAAU;AAAA,EAC1B,CAAA;AAGA,EAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,MAAM;AACrC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,UAAA,EAAW;AAAA,IACb,CAAA,MAAO;AACL,MAAA,SAAA,EAAU;AAAA,IACZ;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,kBAAA,EAAmB;AACnB,IAAA,YAAA,EAAa;AACb,IAAA,UAAA,CAAW,EAAE,YAAA,EAAc,KAAA,EAAO,CAAA;AAClC,IAAA,MAAA,CAAO,MAAA,EAAO;AACd,IAAA,KAAK,UAAU,KAAA,EAAM;AACrB,IAAA,QAAA,GAAW,IAAA;AAAA,EACb,CAAA;AAEA,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA;AAEA,EAAA,IAAI,iBAAA,EAAmB;AACrB,IAAA,sBAAA,GAAyB,IAAA;AACzB,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA,MAAO;AACL,IAAA,yBAAA,EAA0B;AAAA,EAC5B;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,MAAA,EAAQ,CACN,OAAA,KAGG;AACH,MAAA,aAAA,GAAgB,EAAE,GAAG,aAAA,EAAe,GAAG,OAAA,EAAQ;AAG/C,MAAA,MAAM,SAAS,aAAA,CAAc,UAAA;AAC7B,MAAA,IAAI,MAAA,IAAU,cAAc,KAAA,EAAO;AACjC,QAAA,MAAM,MAAA,GAAS,aAAA,CAAc,aAAA,CAAc,KAAK,CAAA;AAChD,QAAA,MAAM,EAAA,GAAK,MAAA,GACN,aAAA,CAAc,KAAA,EAAO,MAAM,OAAA,IAC5B,MAAA,EAAQ,gBAAA,IACR,SAAA,GACC,aAAA,CAAc,KAAA,EAAO,KAAA,EAAO,OAAA,IAC7B,QAAQ,YAAA,IACR,SAAA;AAEJ,QAAA,IAAI,CAAC,aAAA,CAAc,QAAA,EAAU,KAAA,EAAO,eAAA,EAAiB;AACnD,UAAA,MAAA,CAAO,KAAA,CAAM,WAAA,CAAY,wBAAA,EAA0B,EAAE,CAAA;AACrD,UAAA,MAAA,CAAO,KAAA,CAAM,WAAA;AAAA,YACX,4BAAA;AAAA,YACA,cAAc,EAAE,CAAA,EAAA;AAAA,WAClB;AACA,UAAA,MAAA,CAAO,KAAA,CAAM,WAAA;AAAA,YACX,kCAAA;AAAA,YACA,cAAc,EAAE,CAAA,EAAA;AAAA,WAClB;AACA,UAAA,MAAA,CAAO,MAAM,eAAA,GAAkB,EAAA;AAC/B,UAAA,MAAA,CAAO,KAAA,CAAM,SAAA,GAAY,CAAA,WAAA,EAAc,EAAE,CAAA,EAAA,CAAA;AAAA,QAC3C;AAAA,MACF;AAGA,MAAA,aAAA,GAAgB,gBAAA;AAAA,QACd,aAAA;AAAA,QACA,aAAA,CAAc,YAAY,aAAA,EAAe;AAAA,OAC3C;AAGA,MAAA,eAAA,CAAgB,QAAQ,aAAa,CAAA;AAGrC,MAAA,IAAI,aAAA,CAAc,UAAU,KAAA,EAAO;AACjC,QAAA,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO,aAAA,CAAc,SAAS,KAAK,CAAA;AAAA,MAC1D;AAEA,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,oBAAA,EAAqB;AAAA,MACvB;AAEA,MAAA,yBAAA,EAA0B;AAAA,IAC5B,CAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,UAAA;AAAA,IACP,QAAQ,MAAM;AACZ,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,UAAA,EAAW;AAAA,MACb,CAAA,MAAO;AACL,QAAA,SAAA,EAAU;AAAA,MACZ;AAAA,IACF,CAAA;AAAA,IACA,IAAI,MAAA,GAAS;AACX,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA,EAAM,OAAA;AAAA,IACN,IAAI,MAAA,GAAS;AACX,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IACA,SAAA,EAAW;AAAA,GACb;AACF;AAGO,IAAM,gBAAA,GAAmB;;;ACxnBhC,SAASA,kBAAiB,UAAA,EAAiC;AACzD,EAAA,OAAO;AAAA,IACL,SAAS,MAAM;AAAA,IAAC,CAAA;AAAA,IAChB,QAAQ,MAAM;AAAA,IAAC,CAAA;AAAA,IACf,SAAS,MAAM;AAAA,IAAC,CAAA;AAAA,IAChB,UAAA;AAAA,IACA,IAAA,EAAM,UAAA;AAAA,IACN,MAAA,EAAQ,IAAA;AAAA,IACR,SAAA,EAAW;AAAA,GACb;AACF;AAEO,SAAS,eAAe,MAAA,EAA0C;AACvE,EAAA,MAAM,EAAE,YAAW,GAAI,MAAA;AAGvB,EAAA,IAAI,CAAC,QAAO,EAAG;AACb,IAAA,OAAOA,kBAAiB,UAAU,CAAA;AAAA,EACpC;AACA,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AAEhC,EAAA,YAAA,EAAa;AACb,EAAA,qBAAA,EAAsB;AAGtB,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,EAAA,SAAA,CAAU,SAAA,GAAY,EAAA;AAAA,IACpB,6CAAA;AAAA,IACA,aAAA,CAAc,OAAO,KAAK;AAAA,GAC5B;AAGA,EAAA,MAAM,UAAU,sBAAA,CAAuB;AAAA,IACrC,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,UAAA,EAAY,MAAA,CAAO,UAAA,EAAY,aAAA,EAAe;AAAA,GAC/C,CAAA;AACD,EAAA,SAAA,CAAU,YAAY,OAAO,CAAA;AAG7B,EAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,MAAA,CAAO,UAAA,EAAY,aAAa,CAAA;AACrE,EAAA,MAAM,MAAA,GAAS,YAAA;AAAA,IACb,UAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA,CAAO,MAAA;AAAA,IACP,MAAA,CAAO,KAAA;AAAA,IACP,MAAA,CAAO,KAAA;AAAA,IACP;AAAA,GACF;AACA,EAAA,MAAA,CAAO,MAAM,OAAA,GAAU,GAAA;AACvB,EAAA,MAAA,CAAO,MAAM,UAAA,GAAa,mBAAA;AAE1B,EAAA,SAAA,CAAU,YAAY,MAAM,CAAA;AAC5B,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,SAAS,CAAA;AACnC,EAAA,eAAA,CAAgB,SAAA,EAAW,YAAY,MAAM,CAAA;AAG7C,EAAA,IAAI,aAAA,GAAgB,EAAE,GAAG,MAAA,EAAO;AAChC,EAAA,IAAI,cAAA,GAAsC,IAAA;AAG1C,EAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,MAAA,EAAQ,IAAI,CAAA;AAEpD,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,cAAA,IAAiB;AACjB,IAAA,gBAAA,EAAiB;AACjB,IAAA,SAAA,CAAU,MAAA,EAAO;AACjB,IAAA,aAAA,CAAc,OAAA,IAAU;AAAA,EAC1B,CAAA;AAGA,EAAA,cAAA,GAAiB,oBAAA;AAAA,IACf,UAAA;AAAA,IACA;AAAA,MACE,IAAI,OAAA,GAAU;AACZ,QAAA,OAAO,MAAM;AACX,UAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,GAAA;AACxB,UAAA,MAAA,CAAO,MAAM,OAAA,GAAU,GAAA;AACvB,UAAA,UAAA,CAAW,MAAM,OAAA,CAAQ,MAAA,EAAO,EAAG,GAAG,CAAA;AACtC,UAAA,aAAA,CAAc,OAAA,IAAU;AAAA,QAC1B,CAAA;AAAA,MACF,CAAA;AAAA,MACA,IAAI,QAAA,GAAW;AACb,QAAA,OAAO,aAAA,CAAc,QAAA;AAAA,MACvB,CAAA;AAAA,MACA,IAAI,UAAA,GAAa;AACf,QAAA,OAAO,aAAA,CAAc,UAAA;AAAA,MACvB,CAAA;AAAA,MACA,IAAI,OAAA,GAAU;AACZ,QAAA,OAAO,OAAA;AAAA,MACT,CAAA;AAAA,MACA,IAAI,OAAA,GAAU;AACZ,QAAA,OAAO,aAAA,CAAc,OAAA;AAAA,MACvB;AAAA,KACF;AAAA,IACA,MAAA;AAAA,IACA,IAAA;AAAA,IACA,EAAE,YAAY,IAAA;AAAK,GACrB;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,MAAA,EAAQ,CAAC,OAAA,KAAY;AACnB,MAAA,aAAA,GAAgB,EAAE,GAAG,aAAA,EAAe,GAAG,OAAA,EAAQ;AAAA,IACjD,CAAA;AAAA,IACA,OAAA,EAAS,OAAA;AAAA,IACT,UAAA;AAAA,IACA,IAAA,EAAM,UAAA;AAAA,IACN,MAAA;AAAA,IACA;AAAA,GACF;AACF;;;AC5GO,SAAS,iBAAiB,KAAA,EAA8B;AAC7D,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAE3B,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,UAAU,CAAA,EAAG;AAClC,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA,CAAQ,MAAM,UAAA,CAAW,MAAM,GAAG,EAAE,CAAA;AAC3D,IAAA,IAAI,KAAA,CAAM,KAAK,CAAA,IAAK,KAAA,GAAQ,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IACrD;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAM;AAAA,EAClC;AAEA,EAAA,IAAI,YAAY,SAAA,EAAW;AACzB,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,GAAA,EAAK;AAAA,EACxC;AAEA,EAAA,IAAI,YAAY,aAAA,EAAe;AAC7B,IAAA,OAAO,EAAE,MAAM,aAAA,EAAc;AAAA,EAC/B;AAEA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,0BAA0B,KAAK,CAAA,4CAAA;AAAA,GACjC;AACF;AAMO,SAAS,YAAA,CACd,QACA,QAAA,EACY;AACZ,EAAA,IAAI,MAAA,CAAO,SAAS,SAAA,EAAW;AAC7B,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,QAAA,EAAU,MAAA,CAAO,KAAK,CAAA;AAC/C,IAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,EACjC;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,aAAA,EAAe;AACjC,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAkB;AACjC,MAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AAClB,QAAA,QAAA,EAAS;AACT,QAAA,QAAA,CAAS,mBAAA,CAAoB,cAAc,OAAO,CAAA;AAAA,MACpD;AAAA,IACF,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,cAAc,OAAO,CAAA;AAC/C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,YAAA,EAAc,OAAO,CAAA;AAAA,EACjE;AAGA,EAAA,MAAM,WAAA,GAAqB,MAAA;AAC3B,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,CAAA,sBAAA,EAA0B,YAA8B,IAAI,CAAA;AAAA,GAC9D;AACF;AAEA,SAAS,WAAW,UAAA,EAA4B;AAC9C,EAAA,OAAO,CAAA,EAAG,YAAA,CAAa,YAAY,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA;AACnD;AAWO,SAAS,kBAAkB,KAAA,EAAgC;AAChE,EAAA,IAAI,CAAC,OAAO,OAAO,SAAA;AACnB,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,IAAI,OAAA,KAAY,WAAW,OAAO,SAAA;AAClC,EAAA,IAAI,OAAA,KAAY,SAAS,OAAO,KAAA;AAChC,EAAA,OAAO,SAAA;AACT;AAKO,SAAS,UAAA,CAAW,YAAoB,QAAA,EAA6B;AAC1E,EAAA,IAAI,QAAA,KAAa,OAAO,OAAO,IAAA;AAE/B,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,QAAA,KAAa,SAAA,GAAY,YAAA,GAAe,cAAA;AACxD,IAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,UAAA,CAAW,UAAU,CAAC,CAAA,KAAM,IAAA;AAAA,EACrD,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKO,SAAS,SAAA,CAAU,YAAoB,QAAA,EAA0B;AACtE,EAAA,IAAI,aAAa,KAAA,EAAO;AAExB,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,QAAA,KAAa,SAAA,GAAY,YAAA,GAAe,cAAA;AACxD,IAAA,OAAA,CAAQ,OAAA,CAAQ,UAAA,CAAW,UAAU,CAAA,EAAG,GAAG,CAAA;AAAA,EAC7C,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;;;ACpHO,IAAM,aAAA,GAA6B;AAAA,EACxC,YAAA,EAAc,SAAA;AAAA,EACd,SAAA,EAAW,SAAA;AAAA,EACX,gBAAA,EAAkB,SAAA;AAAA,EAClB,aAAA,EAAe;AACjB,CAAA;AAGA,IAAM,iBAAA,GAAoB,GAAA;AAE1B,IAAM,WAAA,uBAA+C,GAAA,EAAI;AACzD,IAAM,cAAA,uBAA2D,GAAA,EAAI;AAErE,SAAS,QAAA,CAAS,YAAoB,IAAA,EAAuB;AAC3D,EAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAC,KAAK,UAAU,CAAA,CAAA;AACxC;AAMA,eAAsB,gBAAA,CACpB,YACA,IAAA,EACyB;AACzB,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,UAAA,EAAY,IAAI,CAAA;AAErC,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AACxB,IAAA,OAAO,WAAA,CAAY,IAAI,GAAG,CAAA;AAAA,EAC5B;AAEA,EAAA,IAAI,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA,EAAG;AAC3B,IAAA,OAAO,cAAA,CAAe,IAAI,GAAG,CAAA;AAAA,EAC/B;AAEA,EAAA,MAAM,WAAW,YAAY;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,QAAQ,IAAI,CAAA;AACjC,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,MAAA,MAAM,UAAU,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,iBAAiB,CAAA;AACtE,MAAA,MAAM,MAAM,MAAM,KAAA;AAAA,QAChB,CAAA,EAAG,YAAY,CAAA,qBAAA,EAAwB,UAAU,CAAA,CAAA;AAAA,QACjD,EAAE,MAAA,EAAQ,UAAA,CAAW,MAAA;AAAO,OAC9B;AACA,MAAA,YAAA,CAAa,OAAO,CAAA;AACpB,MAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,aAAA;AACpB,MAAA,MAAM,MAAA,GAAU,MAAM,GAAA,CAAI,IAAA,EAAK;AAC/B,MAAA,WAAA,CAAY,GAAA,CAAI,KAAK,MAAM,CAAA;AAC3B,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,aAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,cAAA,CAAe,OAAO,GAAG,CAAA;AAAA,IAC3B;AAAA,EACF,CAAA,GAAG;AAEH,EAAA,cAAA,CAAe,GAAA,CAAI,KAAK,OAAO,CAAA;AAC/B,EAAA,OAAO,OAAA;AACT","file":"index.cjs","sourcesContent":["/**\n * Embed SDK configuration\n * SSR-safe - DOM access is guarded and lazy\n */\n\nimport type { SDKConfig } from \"./types\";\n\n/** Default production host */\nconst DEFAULT_HOST = \"https://getperspective.ai\";\n\n/** Global SDK configuration - can be set before creating embeds */\nlet globalConfig: SDKConfig = {};\n\n/**\n * Configure the SDK globally\n * Call this before creating any embeds if you need to override defaults\n */\nexport function configure(config: SDKConfig): void {\n globalConfig = { ...globalConfig, ...config };\n}\n\n/**\n * Get the current SDK configuration\n */\nexport function getConfig(): SDKConfig {\n return { ...globalConfig };\n}\n\n/**\n * Check if DOM is available (SSR safety)\n */\nexport function hasDom(): boolean {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n}\n\nfunction normalizeToOrigin(host: string): string {\n try {\n return new URL(host).origin;\n } catch {\n return host;\n }\n}\n\nexport function getHost(instanceHost?: string): string {\n // Instance-level override\n if (instanceHost) {\n return normalizeToOrigin(instanceHost);\n }\n\n // Global config override\n if (globalConfig.host) {\n return normalizeToOrigin(globalConfig.host);\n }\n\n // Try to infer from script src (only in browser, only at load time)\n if (hasDom()) {\n const scriptHost = getScriptHost();\n if (scriptHost) {\n return scriptHost;\n }\n }\n\n return DEFAULT_HOST;\n}\n\n// Capture script src at load time - document.currentScript only available during initial execution\nlet capturedScriptHost: string | null = null;\n\nfunction getScriptHost(): string | null {\n if (capturedScriptHost !== null) {\n return capturedScriptHost;\n }\n\n if (!hasDom()) {\n return null;\n }\n\n const currentScript = document.currentScript as HTMLScriptElement | null;\n if (currentScript?.src) {\n try {\n capturedScriptHost = new URL(currentScript.src).origin;\n return capturedScriptHost;\n } catch {\n // Invalid URL, ignore\n }\n }\n\n capturedScriptHost = \"\"; // Mark as attempted\n return null;\n}\n\n// Capture script host immediately when module loads (in browser)\nif (hasDom()) {\n getScriptHost();\n}\n","/**\n * Shared constants for Perspective Embed SDK\n * This file is SSR-safe - no DOM access at import time\n * Used by both SDK bundle and the main Perspective app\n */\n\n// ============================================================================\n// SDK Version & Features\n// ============================================================================\n\n/** SDK version for handshake protocol — replaced at build time by tsup define */\ndeclare const PKG_VERSION: string;\nexport const SDK_VERSION = PKG_VERSION;\n\n/** Feature flags as bitset for version negotiation */\nexport const FEATURES = {\n RESIZE: 1 << 0, // 0b0001\n THEME_SYNC: 1 << 1, // 0b0010\n ANON_ID: 1 << 2, // 0b0100\n SCROLLBAR_STYLES: 1 << 3, // 0b1000\n EMBED_AUTH: 1 << 4, // 0b10000\n} as const;\n\n/** Current SDK feature set */\nexport const CURRENT_FEATURES =\n FEATURES.RESIZE |\n FEATURES.THEME_SYNC |\n FEATURES.ANON_ID |\n FEATURES.SCROLLBAR_STYLES |\n FEATURES.EMBED_AUTH;\n\n// ============================================================================\n// URL Parameter Keys\n// ============================================================================\n\n// Embed parameters\nexport const PARAM_KEYS = {\n embed: \"embed\",\n embedType: \"embed_type\",\n theme: \"theme\",\n} as const;\n\nexport type ParamKey = (typeof PARAM_KEYS)[keyof typeof PARAM_KEYS];\n\n// ============================================================================\n// Brand Color Keys\n// ============================================================================\n\nexport const BRAND_KEYS = {\n // Light mode\n primary: \"brand.primary\",\n secondary: \"brand.secondary\",\n bg: \"brand.bg\",\n text: \"brand.text\",\n\n // Dark mode\n darkPrimary: \"brand.dark.primary\",\n darkSecondary: \"brand.dark.secondary\",\n darkBg: \"brand.dark.bg\",\n darkText: \"brand.dark.text\",\n} as const;\n\nexport type BrandKey = (typeof BRAND_KEYS)[keyof typeof BRAND_KEYS];\n\n// ============================================================================\n// Reserved Parameters (cannot be overridden via custom params or parent URL)\n// ============================================================================\n\nexport const RESERVED_PARAMS: Set<string> = new Set([\n ...Object.values(PARAM_KEYS),\n ...Object.values(BRAND_KEYS),\n]);\n\n// ============================================================================\n// Data Attributes (HTML declarative initialization)\n// ============================================================================\n\nexport const DATA_ATTRS = {\n widget: \"data-perspective-widget\",\n popup: \"data-perspective-popup\",\n slider: \"data-perspective-slider\",\n float: \"data-perspective-float\", // Primary name\n chat: \"data-perspective-chat\", // Legacy alias\n fullpage: \"data-perspective-fullpage\",\n params: \"data-perspective-params\",\n brand: \"data-perspective-brand\",\n brandDark: \"data-perspective-brand-dark\",\n theme: \"data-perspective-theme\",\n noStyle: \"data-perspective-no-style\",\n autoOpen: \"data-perspective-auto-open\",\n showOnce: \"data-perspective-show-once\",\n disableClose: \"data-perspective-disable-close\",\n launcherIcon: \"data-perspective-launcher-icon\",\n launcherStyle: \"data-perspective-launcher-style\",\n launcherClass: \"data-perspective-launcher-class\",\n disableJsonLdAttribution: \"data-perspective-disable-jsonld-attribution\",\n} as const;\n\nexport type DataAttr = (typeof DATA_ATTRS)[keyof typeof DATA_ATTRS];\n\n// ============================================================================\n// PostMessage Event Types\n// ============================================================================\n\nexport const MESSAGE_TYPES = {\n // SDK -> Iframe (initialization)\n init: \"perspective:init\",\n\n // Iframe -> SDK\n ready: \"perspective:ready\",\n resize: \"perspective:resize\",\n submit: \"perspective:submit\",\n close: \"perspective:close\",\n error: \"perspective:error\",\n redirect: \"perspective:redirect\",\n\n // SDK -> Iframe (internal)\n anonId: \"perspective:anon-id\",\n injectStyles: \"perspective:inject-styles\",\n themeChange: \"perspective:theme-change\",\n\n // Iframe -> SDK (auth)\n authRequest: \"perspective:auth-request\",\n authSignout: \"perspective:auth-signout\",\n\n // SDK -> Iframe (auth)\n authComplete: \"perspective:auth-complete\",\n authCancelled: \"perspective:auth-cancelled\",\n\n // Popup -> SDK (auth callback from popup/tab opened by SDK)\n popupAuthComplete: \"perspective:popup-auth-complete\",\n\n // Iframe -> SDK (internal)\n requestScrollbarStyles: \"perspective:request-scrollbar-styles\",\n} as const;\n\nexport type MessageType = (typeof MESSAGE_TYPES)[keyof typeof MESSAGE_TYPES];\n\n// ============================================================================\n// Error Codes\n// ============================================================================\n\nexport const ERROR_CODES = {\n SDK_OUTDATED: \"SDK_OUTDATED\",\n INVALID_RESEARCH: \"INVALID_RESEARCH\",\n UNKNOWN: \"UNKNOWN\",\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\n// ============================================================================\n// Param Values (for boolean-like string params)\n// ============================================================================\n\nexport const PARAM_VALUES = {\n true: \"true\",\n false: \"false\",\n} as const;\n\n// ============================================================================\n// Theme Values\n// ============================================================================\n\nexport const THEME_VALUES = {\n dark: \"dark\",\n light: \"light\",\n system: \"system\",\n} as const;\n\nexport type ThemeValue = (typeof THEME_VALUES)[keyof typeof THEME_VALUES];\n\n// ============================================================================\n// Interview Mode Values (for mode param)\n// ============================================================================\n\nexport const MODE_VALUES = {\n preview: \"preview\",\n restart: \"restart\",\n normal: \"normal\",\n simulated: \"simulated\",\n} as const;\n\nexport type ModeValue = (typeof MODE_VALUES)[keyof typeof MODE_VALUES];\n\n// ============================================================================\n// localStorage Keys\n// ============================================================================\n\nexport const STORAGE_KEYS = {\n anonId: \"perspective-anon-id\",\n triggerShown: \"perspective-trigger-shown\",\n embedAuthToken: \"perspective-embed-auth-token\",\n embedState: \"perspective-embed-state\",\n} as const;\n","/**\n * Shared utilities for the Perspective Embed SDK\n * SSR-safe - DOM access is guarded\n */\n\nimport { THEME_VALUES, type ThemeValue } from \"./constants\";\nimport { hasDom } from \"./config\";\n\n/**\n * Join class names, filtering out falsy values\n */\nexport function cn(...classes: (string | false | null | undefined)[]): string {\n return classes\n .map((c) => (c || \"\").split(\" \"))\n .flat()\n .filter(Boolean)\n .join(\" \");\n}\n\n/**\n * Get the perspective theme class based on the theme value\n * Returns \"perspective-{theme}-theme\" when theme is available, undefined otherwise\n */\nexport function getThemeClass(theme: string | undefined): string | undefined {\n return theme && theme !== THEME_VALUES.system\n ? `perspective-${theme}-theme`\n : undefined;\n}\n\n/**\n * Resolve whether dark mode should be used.\n * Priority: 1) explicit theme override, 2) system preference\n * SSR-safe: defaults to light theme on server\n */\nexport function resolveIsDark(theme?: ThemeValue | string): boolean {\n if (theme === THEME_VALUES.dark) return true;\n if (theme === THEME_VALUES.light) return false;\n // system or undefined → use system preference (or light on server)\n if (!hasDom()) return false;\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n}\n\n/**\n * Resolve effective theme based on override and system preference\n * Returns the theme string ('light' or 'dark')\n */\nexport function resolveTheme(themeOverride?: ThemeValue): \"light\" | \"dark\" {\n return resolveIsDark(themeOverride) ? \"dark\" : \"light\";\n}\n\n/**\n * Normalize and validate hex color. Returns undefined for invalid colors.\n */\nexport function normalizeHex(color: string): string | undefined {\n const trimmed = color.trim();\n if (!trimmed) return undefined;\n\n const normalized = trimmed.startsWith(\"#\") ? trimmed : `#${trimmed}`;\n\n // Validate hex format (#RGB, #RRGGBB, or #RRGGBBAA)\n if (/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/.test(normalized)) {\n return normalized;\n }\n\n // Try to extract valid hex chars\n const hexChars = normalized.slice(1).replace(/[^0-9a-fA-F]/g, \"\");\n if (hexChars.length >= 6) return `#${hexChars.slice(0, 6)}`;\n if (hexChars.length >= 3) return `#${hexChars.slice(0, 3)}`;\n\n return undefined;\n}\n\n/**\n * Convert hex to rgba for spinner track\n */\nexport function hexToRgba(hex: string, alpha: number): string {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result || !result[1] || !result[2] || !result[3]) {\n return `rgba(118, 41, 200, ${alpha})`;\n }\n\n const r = parseInt(result[1], 16);\n const g = parseInt(result[2], 16);\n const b = parseInt(result[3], 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n","/**\n * iframe creation and postMessage communication\n * SSR-safe - all DOM access is guarded\n */\n\nimport type {\n BrandColors,\n EmbedConfig,\n EmbedMessage,\n EmbedType,\n ThemeConfig,\n} from \"./types\";\nimport { hasDom } from \"./config\";\nimport {\n RESERVED_PARAMS,\n PARAM_KEYS,\n BRAND_KEYS,\n MESSAGE_TYPES,\n THEME_VALUES,\n PARAM_VALUES,\n STORAGE_KEYS,\n SDK_VERSION,\n CURRENT_FEATURES,\n ERROR_CODES,\n} from \"./constants\";\nimport { normalizeHex } from \"./utils\";\n\n/** Validate redirect URL - allow https, http localhost, and relative URLs */\nfunction isAllowedRedirectUrl(url: string): boolean {\n if (!url || typeof url !== \"string\") return false;\n // Relative URLs (path, query, hash) are always safe — same origin by definition\n // Exclude protocol-relative URLs (// prefix) which resolve to an external origin\n if (\n (url.startsWith(\"/\") && !url.startsWith(\"//\")) ||\n url.startsWith(\"?\") ||\n url.startsWith(\"#\")\n )\n return true;\n try {\n const parsed = new URL(url, window.location.origin);\n const protocol = parsed.protocol.toLowerCase();\n const hostname = parsed.hostname.toLowerCase();\n\n if (protocol === \"https:\") return true;\n if (\n protocol === \"http:\" &&\n (hostname === \"localhost\" || hostname === \"127.0.0.1\")\n )\n return true;\n\n return false;\n } catch {\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Embed Auth Token Caching (Parent-side — Layer 2 of 2)\n//\n// Why two layers? Safari (and any browser following WebKit's Intelligent\n// Tracking Prevention) makes third-party iframe localStorage \"partitioned\n// and ephemeral\" — it works within a tab session but is wiped when the\n// user closes the tab or quits the browser.\n// Ref: https://webkit.org/tracking-prevention/#intelligenttrackingprevention\n// \"Third-party LocalStorage and IndexedDB are partitioned per\n// first-party website and also made ephemeral.\"\n//\n// Chrome and Firefox persist cross-origin iframe localStorage across\n// sessions, so Layer 1 alone would suffice there. Layer 2 exists\n// specifically for Safari and similar browsers.\n//\n// Layer 1 (iframe — useEmbedAuth.ts): Stores token in iframe's own\n// localStorage. Fast synchronous restore on re-render. Works across\n// sessions in Chrome/Firefox. Ephemeral on Safari (lost on tab close).\n//\n// Layer 2 (parent — this code): Caches token in the PARENT page's\n// first-party localStorage, which persists on all browsers. On iframe\n// load, relays any cached token via postMessage (perspective:auth-complete\n// in the perspective:ready handler). The iframe's storeToken() writes it\n// back to Layer 1, repopulating the ephemeral cache for this tab session.\n//\n// Direct iframe embeds (without SDK) only have Layer 1. On Safari, auth\n// won't survive tab close — inherent limitation without the SDK.\n// ---------------------------------------------------------------------------\n\n/** Decode JWT payload without verification (client-side — server verifies) */\nfunction decodeTokenExpiry(token: string): number | null {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3) return null;\n const base64 = parts[1]!.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const payload = JSON.parse(atob(base64));\n return payload.data?.expiresAt ?? null;\n } catch {\n return null;\n }\n}\n\nfunction authTokenKey(researchId: string): string {\n return `${STORAGE_KEYS.embedAuthToken}:${researchId}`;\n}\n\n/** Get cached embed auth token from parent's first-party localStorage (Layer 2).\n * Called on iframe ready to relay token back — critical for Safari where\n * iframe localStorage (Layer 1) is wiped on tab close. */\nfunction getCachedAuthToken(researchId: string): string | null {\n if (!hasDom()) return null;\n try {\n const key = authTokenKey(researchId);\n const token = localStorage.getItem(key);\n if (!token) return null;\n const expiresAt = decodeTokenExpiry(token);\n if (expiresAt && expiresAt > Date.now()) return token;\n // Expired — clean up\n localStorage.removeItem(key);\n return null;\n } catch {\n return null;\n }\n}\n\n/** Cache embed auth token in parent's first-party localStorage (Layer 2).\n * Survives tab close and browser restart on all browsers including Safari. */\nfunction cacheAuthToken(researchId: string, token: string): void {\n if (!hasDom()) return;\n try {\n localStorage.setItem(authTokenKey(researchId), token);\n } catch {\n // localStorage blocked\n }\n}\n\n/** Clear cached embed auth token for a research */\nfunction clearAuthToken(researchId: string): void {\n if (!hasDom()) return;\n try {\n localStorage.removeItem(authTokenKey(researchId));\n } catch {\n // localStorage blocked\n }\n}\n\n/** Get or create persistent anonymous ID */\nfunction getOrCreateAnonId(): string {\n if (!hasDom()) return \"\";\n\n try {\n let id = localStorage.getItem(STORAGE_KEYS.anonId);\n if (!id) {\n id = crypto.randomUUID();\n localStorage.setItem(STORAGE_KEYS.anonId, id);\n }\n return id;\n } catch {\n // localStorage might be blocked\n return crypto.randomUUID();\n }\n}\n\n/** Collect all search params from the parent page URL (excluding reserved SDK params) */\nfunction getParentSearchParams(): Record<string, string> {\n if (!hasDom()) return {};\n\n const params: Record<string, string> = {};\n const searchParams = new URLSearchParams(window.location.search);\n\n for (const [key, value] of searchParams.entries()) {\n if (!RESERVED_PARAMS.has(key)) {\n params[key] = value;\n }\n }\n\n return params;\n}\n\n/** Build iframe URL with all params */\nfunction buildIframeUrl(\n researchId: string,\n type: EmbedType,\n host: string,\n customParams?: Record<string, string>,\n brand?: { light?: BrandColors; dark?: BrandColors },\n themeOverride?: \"dark\" | \"light\" | \"system\"\n): string {\n const url = new URL(`${host}/interview/${researchId}`);\n\n // Base embed params\n url.searchParams.set(PARAM_KEYS.embed, PARAM_VALUES.true);\n url.searchParams.set(PARAM_KEYS.embedType, type === \"float\" ? \"chat\" : type);\n\n // Detect and pass system theme preference (can be overridden)\n if (hasDom()) {\n const isDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n if (themeOverride && themeOverride !== THEME_VALUES.system) {\n url.searchParams.set(PARAM_KEYS.theme, themeOverride);\n } else {\n url.searchParams.set(\n PARAM_KEYS.theme,\n isDark ? THEME_VALUES.dark : THEME_VALUES.light\n );\n }\n } else {\n // SSR fallback\n url.searchParams.set(PARAM_KEYS.theme, themeOverride || THEME_VALUES.light);\n }\n\n // Auto-forward all parent page search params (e.g. ?ref=pricing-enterprise)\n // These are added first so that explicit customParams can override them\n const parentParams = getParentSearchParams();\n for (const [key, value] of Object.entries(parentParams)) {\n url.searchParams.set(key, value);\n }\n\n // Helper to set param only if color is valid\n const setColor = (key: string, color: string | undefined) => {\n if (!color) return;\n const normalized = normalizeHex(color);\n if (normalized) url.searchParams.set(key, normalized);\n };\n\n // Add brand colors using short keys\n if (brand?.light) {\n setColor(BRAND_KEYS.primary, brand.light.primary);\n setColor(BRAND_KEYS.secondary, brand.light.secondary);\n setColor(BRAND_KEYS.bg, brand.light.bg);\n setColor(BRAND_KEYS.text, brand.light.text);\n }\n\n // Add dark mode brand colors\n if (brand?.dark) {\n setColor(BRAND_KEYS.darkPrimary, brand.dark.primary);\n setColor(BRAND_KEYS.darkSecondary, brand.dark.secondary);\n setColor(BRAND_KEYS.darkBg, brand.dark.bg);\n setColor(BRAND_KEYS.darkText, brand.dark.text);\n }\n\n // Add custom params, filtering out reserved keys\n if (customParams) {\n for (const [key, value] of Object.entries(customParams)) {\n if (!RESERVED_PARAMS.has(key)) {\n url.searchParams.set(key, value);\n }\n }\n }\n\n return url.toString();\n}\n\n/** Known appearance param keys — only these are allowed as overrides */\nconst APPEARANCE_KEYS = new Set([\n \"hideProgress\",\n \"hideGreeting\",\n \"hideBranding\",\n \"enableFullScreen\",\n]);\n\n/** Convert embedSettings.appearance to URL query params. Emits both true/false so API can override embed code in either direction. */\nexport function appearanceToParams(\n embedSettings?: ThemeConfig[\"embedSettings\"]\n): Record<string, string> | undefined {\n const a = embedSettings?.appearance;\n if (!a) return undefined;\n const params: Record<string, string> = {};\n if (a.hideProgress !== undefined)\n params.hideProgress = a.hideProgress ? \"true\" : \"false\";\n if (a.hideGreeting !== undefined)\n params.hideGreeting = a.hideGreeting ? \"true\" : \"false\";\n if (a.hideBranding !== undefined)\n params.hideBranding = a.hideBranding ? \"true\" : \"false\";\n if (a.enableFullScreen !== undefined)\n params.enableFullScreen = a.enableFullScreen ? \"true\" : \"false\";\n return Object.keys(params).length > 0 ? params : undefined;\n}\n\nexport function createIframe(\n researchId: string,\n type: EmbedType,\n host: string,\n params?: Record<string, string>,\n brand?: { light?: BrandColors; dark?: BrandColors },\n themeOverride?: \"dark\" | \"light\" | \"system\",\n appearanceOverrides?: Record<string, string>\n): HTMLIFrameElement {\n if (!hasDom()) {\n // Return a stub for SSR\n return {} as HTMLIFrameElement;\n }\n\n const iframe = document.createElement(\"iframe\");\n iframe.src = buildIframeUrl(\n researchId,\n type,\n host,\n params,\n brand,\n themeOverride\n );\n\n // Apply appearance overrides from API config (API wins over embed code)\n // Restricted to APPEARANCE_KEYS to prevent overwriting reserved params\n if (appearanceOverrides && Object.keys(appearanceOverrides).length > 0) {\n const url = new URL(iframe.src);\n for (const [key, value] of Object.entries(appearanceOverrides)) {\n if (APPEARANCE_KEYS.has(key)) {\n url.searchParams.set(key, value);\n }\n }\n iframe.src = url.toString();\n }\n\n iframe.setAttribute(\"allow\", \"microphone; camera\");\n iframe.setAttribute(\"allowfullscreen\", \"true\");\n iframe.setAttribute(\n \"sandbox\",\n \"allow-scripts allow-same-origin allow-forms allow-popups allow-modals allow-top-navigation\"\n );\n iframe.setAttribute(\"data-perspective\", \"true\");\n iframe.setAttribute(\"title\", \"Powered by Perspective AI concierge\");\n iframe.style.cssText = \"border:none;\";\n\n return iframe;\n}\n\nexport function setupMessageListener(\n researchId: string,\n config: Partial<EmbedConfig>,\n iframe: HTMLIFrameElement,\n host: string,\n options?: { skipResize?: boolean; hasCloseButton?: boolean }\n): () => void {\n if (!hasDom()) {\n return () => {};\n }\n\n // Track active auth flow cleanup for concurrent request prevention and embed teardown\n let activeAuthCleanup: (() => void) | null = null;\n\n const handler = (event: MessageEvent<EmbedMessage>) => {\n // Security: Only accept messages from our embed host and from the expected iframe\n if (event.origin !== host) return;\n if (event.source !== iframe.contentWindow) return;\n\n // Only process messages from our embed\n if (typeof event.data?.type !== \"string\") return;\n if (!event.data.type.startsWith(\"perspective:\")) return;\n if (event.data.researchId !== researchId) {\n return;\n }\n\n switch (event.data.type) {\n case MESSAGE_TYPES.ready: {\n // Send scrollbar styles when iframe is ready\n sendScrollbarStyles(iframe, host);\n // Send anon_id for anonymous auth\n sendMessage(iframe, host, {\n type: MESSAGE_TYPES.anonId,\n anonId: getOrCreateAnonId(),\n });\n // Send init message with version/features for handshake\n sendMessage(iframe, host, {\n type: MESSAGE_TYPES.init,\n version: SDK_VERSION,\n features: CURRENT_FEATURES,\n researchId,\n hasCloseButton: options?.hasCloseButton ?? false,\n });\n // Layer 2 → Layer 1 relay: on iframe load, send any cached token from\n // parent's first-party localStorage back to the iframe. On Safari this\n // is the only restore path — iframe localStorage (Layer 1) was wiped\n // on tab close. The iframe's storeToken() writes it back to Layer 1\n // for fast sync access during this tab session.\n const cachedToken = getCachedAuthToken(researchId);\n if (cachedToken) {\n sendMessage(iframe, host, {\n type: MESSAGE_TYPES.authComplete,\n token: cachedToken,\n researchId,\n });\n config.onAuth?.({ researchId, token: cachedToken });\n }\n config.onReady?.();\n break;\n }\n\n case MESSAGE_TYPES.resize:\n // Auto-resize iframe height (skip for fixed-container embeds)\n if (!options?.skipResize) {\n iframe.style.height = `${event.data.height}px`;\n }\n break;\n\n case MESSAGE_TYPES.submit:\n config.onSubmit?.({ researchId });\n break;\n\n case MESSAGE_TYPES.close:\n config.onClose?.();\n break;\n\n case MESSAGE_TYPES.error: {\n const error = new Error(\n event.data.error\n ) as import(\"./types\").EmbedError;\n error.code =\n (event.data.code as import(\"./types\").ErrorCode) || \"UNKNOWN\";\n\n // Always log critical errors to console\n if (error.code === ERROR_CODES.SDK_OUTDATED) {\n console.error(\n \"[Perspective] SDK version outdated. Please update @perspective-ai/sdk to the latest version.\",\n error.message\n );\n } else {\n console.error(\"[Perspective] Embed error:\", error.message);\n }\n\n config.onError?.(error);\n break;\n }\n\n case MESSAGE_TYPES.redirect: {\n const redirectUrl = event.data.url;\n // Security: Only allow http(s) and localhost URLs\n if (!isAllowedRedirectUrl(redirectUrl)) {\n console.warn(\n \"[Perspective] Blocked unsafe redirect URL:\",\n redirectUrl\n );\n return;\n }\n if (config.onNavigate) {\n config.onNavigate(redirectUrl);\n } else {\n // Fallback: auto-navigate parent page\n window.location.href = redirectUrl;\n }\n break;\n }\n\n case MESSAGE_TYPES.authRequest: {\n // The iframe can't do OAuth itself (cross-origin context, third-party\n // cookie blocking). So the iframe asks the SDK to open auth in a\n // first-party popup where cookies work normally. After auth, the\n // callback page sends the token back via window.opener.postMessage.\n const { authUrl } = event.data;\n if (!authUrl || typeof authUrl !== \"string\") return;\n\n const expectedOrigin = new URL(host).origin;\n\n // Security: ensure authUrl points to the expected host origin\n try {\n const parsedAuthUrl = new URL(authUrl);\n if (parsedAuthUrl.origin !== expectedOrigin) {\n console.warn(\n \"[Perspective] Blocked auth URL with unexpected origin:\",\n authUrl\n );\n return;\n }\n } catch {\n console.warn(\"[Perspective] Blocked malformed auth URL:\", authUrl);\n return;\n }\n\n // Clean up any previous auth flow before starting a new one\n activeAuthCleanup?.();\n\n // Open auth popup — user completes OAuth on perspective.ai (first-party)\n const fullAuthUrl = `${authUrl}&return_url=${encodeURIComponent(window.location.href)}`;\n const width = 500;\n const height = 700;\n const left =\n (window.screen.width - width) / 2 +\n (window.screenLeft ?? window.screenX ?? 0);\n const top =\n (window.screen.height - height) / 2 +\n (window.screenTop ?? window.screenY ?? 0);\n const popupFeatures = `width=${width},height=${height},top=${top},left=${left},menubar=no,toolbar=no,location=no,status=no,scrollbars=yes`;\n const authWindow =\n window.open(fullAuthUrl, \"perspective-auth\", popupFeatures) ??\n window.open(fullAuthUrl, \"_blank\"); // Popup blocked — fall back to new tab\n\n // Token handling: cache in Layer 2 (parent localStorage for persistence),\n // relay to iframe (which stores in Layer 1), and notify host app\n const relayToken = (token: string) => {\n cacheAuthToken(researchId, token);\n sendMessage(iframe, host, {\n type: MESSAGE_TYPES.authComplete,\n token,\n researchId,\n });\n config.onAuth?.({ researchId, token });\n };\n\n // Ensures only one auth flow is active at a time\n const cleanupAuthListeners = () => {\n clearInterval(pollPopupClosed);\n window.removeEventListener(\"message\", onPopupMessage);\n activeAuthCleanup = null;\n };\n\n // Listen for postMessage from popup with the auth token\n const onPopupMessage = (popupEvent: MessageEvent) => {\n if (\n popupEvent.source !== authWindow ||\n popupEvent.data?.type !== MESSAGE_TYPES.popupAuthComplete ||\n popupEvent.origin !== expectedOrigin\n )\n return;\n const token = popupEvent.data?.token;\n if (token) {\n relayToken(token);\n }\n cleanupAuthListeners();\n };\n window.addEventListener(\"message\", onPopupMessage);\n\n // Poll for popup close — if user closes without completing auth,\n // notify the iframe so it can reset loading state\n const pollPopupClosed = authWindow\n ? setInterval(() => {\n if (authWindow.closed) {\n cleanupAuthListeners();\n sendMessage(iframe, host, {\n type: MESSAGE_TYPES.authCancelled,\n researchId,\n });\n }\n }, 500)\n : undefined;\n\n activeAuthCleanup = cleanupAuthListeners;\n break;\n }\n\n case MESSAGE_TYPES.authSignout: {\n // User signed out in iframe — clear cached token so the next visit\n // requires re-authentication (no stale session)\n clearAuthToken(researchId);\n\n // Open a hidden popup to clear the NextAuth session on the first-party\n // domain. The iframe can't clear first-party cookies (third-party cookie\n // blocking), so the SDK opens this from the parent context.\n try {\n const signoutOrigin = new URL(host).origin;\n const signoutPopup = window.open(\n `${signoutOrigin}/embed-auth/signout`,\n \"perspective-signout\",\n \"width=1,height=1,top=0,left=0\"\n );\n if (signoutPopup) {\n setTimeout(() => {\n try {\n signoutPopup.close();\n } catch {\n /* cross-origin */\n }\n }, 3000);\n }\n } catch {\n /* invalid host URL — skip signout popup */\n }\n break;\n }\n }\n };\n\n window.addEventListener(\"message\", handler);\n return () => {\n window.removeEventListener(\"message\", handler);\n activeAuthCleanup?.();\n };\n}\n\n/** Send a message to the embed iframe */\nexport function sendMessage(\n iframe: HTMLIFrameElement,\n host: string,\n message: { type: string; [key: string]: unknown }\n): void {\n if (!hasDom()) return;\n iframe.contentWindow?.postMessage(message, host);\n}\n\n/** Track all active iframes for theme change notifications */\nconst activeIframes = new Map<HTMLIFrameElement, string>();\n\nexport function registerIframe(\n iframe: HTMLIFrameElement,\n host: string\n): () => void {\n activeIframes.set(iframe, host);\n return () => {\n activeIframes.delete(iframe);\n if (activeIframes.size === 0) {\n teardownGlobalListeners();\n }\n };\n}\n\n/** Get scrollbar CSS styles */\nfunction getScrollbarStyles(): string {\n if (!hasDom()) return \"\";\n\n const isDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n const borderColor = isDark ? \"hsl(217 33% 17%)\" : \"hsl(240 6% 90%)\";\n\n return `\n * {\n scrollbar-width: thin;\n scrollbar-color: ${borderColor} transparent;\n }\n *::-webkit-scrollbar {\n width: 10px;\n height: 10px;\n }\n *::-webkit-scrollbar-track {\n background: transparent;\n }\n *::-webkit-scrollbar-thumb {\n background-color: ${borderColor};\n border-radius: 9999px;\n border: 2px solid transparent;\n background-clip: padding-box;\n }\n *::-webkit-scrollbar-thumb:hover {\n background-color: color-mix(in srgb, ${borderColor} 80%, currentColor);\n }\n `;\n}\n\n/** Send scrollbar styles to an iframe */\nexport function sendScrollbarStyles(\n iframe: HTMLIFrameElement,\n host: string\n): void {\n const styles = getScrollbarStyles();\n sendMessage(iframe, host, {\n type: MESSAGE_TYPES.injectStyles,\n styles,\n });\n}\n\n/** Notify all active iframes of theme change */\nexport function notifyThemeChange(): void {\n if (!hasDom()) return;\n\n const isDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n\n activeIframes.forEach((host, iframe) => {\n const message = {\n type: MESSAGE_TYPES.themeChange,\n theme: isDark ? THEME_VALUES.dark : THEME_VALUES.light,\n };\n sendMessage(iframe, host, message);\n sendScrollbarStyles(iframe, host);\n });\n}\n\nlet themeListener: ((e: MediaQueryListEvent) => void) | null = null;\nlet themeMediaQuery: MediaQueryList | null = null;\nlet globalMessageHandler: ((event: MessageEvent) => void) | null = null;\nlet globalListenersInitialized = false;\n\nfunction setupThemeListener(): void {\n if (themeListener || !hasDom()) return;\n\n themeMediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n themeListener = () => notifyThemeChange();\n themeMediaQuery.addEventListener(\"change\", themeListener);\n}\n\nfunction teardownThemeListener(): void {\n if (themeListener && themeMediaQuery) {\n themeMediaQuery.removeEventListener(\"change\", themeListener);\n themeListener = null;\n themeMediaQuery = null;\n }\n}\n\nfunction setupGlobalListeners(): void {\n if (!hasDom() || globalMessageHandler) return;\n\n setupThemeListener();\n\n globalMessageHandler = (event: MessageEvent) => {\n if (!event.data?.type?.startsWith(\"perspective:\")) return;\n if (event.data.type === MESSAGE_TYPES.requestScrollbarStyles) {\n const iframes = Array.from(\n document.querySelectorAll(\"iframe[data-perspective]\")\n );\n const sourceIframe = iframes.find(\n (iframe) => (iframe as HTMLIFrameElement).contentWindow === event.source\n ) as HTMLIFrameElement | undefined;\n if (sourceIframe) {\n const host = activeIframes.get(sourceIframe);\n if (host && event.origin === host) {\n sendScrollbarStyles(sourceIframe, host);\n }\n }\n }\n };\n\n window.addEventListener(\"message\", globalMessageHandler);\n}\n\nfunction teardownGlobalListeners(): void {\n if (globalMessageHandler) {\n window.removeEventListener(\"message\", globalMessageHandler);\n globalMessageHandler = null;\n }\n teardownThemeListener();\n globalListenersInitialized = false;\n}\n\nexport function ensureGlobalListeners(): void {\n if (globalListenersInitialized) return;\n globalListenersInitialized = true;\n setupGlobalListeners();\n}\n","/**\n * Loading skeleton for embed iframes\n *\n * Shows a skeleton that matches the conversation UI layout (welcome card +\n * input area) instead of a generic spinner. This makes the loading feel\n * faster because it sets visual expectations.\n *\n * SSR-safe - returns no-op on server\n */\n\nimport type { BrandColors, ThemeValue } from \"./types\";\nimport { hasDom } from \"./config\";\nimport { resolveTheme } from \"./utils\";\n\n/** Default background + semi-transparent shimmer that works on any bg */\nconst DEFAULT_COLORS = {\n light: {\n bg: \"#ffffff\",\n shimmer: \"rgba(0, 0, 0, 0.06)\",\n shimmerHighlight: \"rgba(0, 0, 0, 0.10)\",\n border: \"rgba(0, 0, 0, 0.08)\",\n },\n dark: {\n bg: \"#02040a\",\n shimmer: \"rgba(255, 255, 255, 0.08)\",\n shimmerHighlight: \"rgba(255, 255, 255, 0.13)\",\n border: \"rgba(255, 255, 255, 0.08)\",\n },\n};\n\nexport interface LoadingOptions {\n /** Theme override: 'dark', 'light', or 'system' (uses system preference) */\n theme?: ThemeValue;\n /** Brand colors */\n brand?: {\n light?: BrandColors;\n dark?: BrandColors;\n };\n /** Appearance overrides from API config */\n appearance?: {\n hideBranding?: boolean;\n hideProgress?: boolean;\n hideGreeting?: boolean;\n };\n}\n\n/** Get colors for loading skeleton based on theme and brand */\nfunction getLoadingColors(options?: LoadingOptions): {\n bg: string;\n shimmer: string;\n shimmerHighlight: string;\n border: string;\n} {\n const theme = resolveTheme(options?.theme);\n const isDark = theme === \"dark\";\n const brandColors = isDark ? options?.brand?.dark : options?.brand?.light;\n const defaults = isDark ? DEFAULT_COLORS.dark : DEFAULT_COLORS.light;\n\n return {\n bg: brandColors?.bg || defaults.bg,\n shimmer: defaults.shimmer,\n shimmerHighlight: defaults.shimmerHighlight,\n border: defaults.border,\n };\n}\n\n/** Inject shimmer keyframes once globally (shared across all embed instances) */\nlet shimmerInjected = false;\nfunction injectShimmerKeyframes(): void {\n if (shimmerInjected || !hasDom()) return;\n shimmerInjected = true;\n\n const styleEl = document.createElement(\"style\");\n styleEl.id = \"perspective-shimmer-keyframes\";\n styleEl.textContent = `\n @keyframes perspective-shimmer {\n 0% { background-position: -400px 0; }\n 100% { background-position: 400px 0; }\n }\n `;\n document.head.appendChild(styleEl);\n}\n\nexport function createLoadingIndicator(options?: LoadingOptions): HTMLElement {\n // SSR safety - return empty div on server\n if (!hasDom()) {\n return { remove: () => {}, style: {} } as unknown as HTMLElement;\n }\n\n injectShimmerKeyframes();\n\n const colors = getLoadingColors(options);\n const appearance = options?.appearance;\n\n const container = document.createElement(\"div\");\n container.className = \"perspective-loading\";\n container.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n flex-direction: column;\n background: ${colors.bg};\n transition: opacity 0.15s ease;\n z-index: 1;\n overflow: hidden;\n padding: 1.5rem;\n box-sizing: border-box;\n `;\n\n const shimmerBg = `linear-gradient(90deg, ${colors.shimmer} 25%, ${colors.shimmerHighlight} 50%, ${colors.shimmer} 75%)`;\n const shimmer = (width: string, height: string): HTMLElement => {\n const el = document.createElement(\"div\");\n el.style.cssText = `background:${shimmerBg};background-size:800px 100%;animation:perspective-shimmer 1.5s infinite linear;border-radius:8px;height:${height};width:${width};margin-bottom:0.5rem;`;\n return el;\n };\n\n // -- Header: logo placeholder + progress bar --\n if (!appearance?.hideBranding || !appearance?.hideProgress) {\n const header = document.createElement(\"div\");\n header.style.cssText = `display:flex;flex-direction:column;align-items:center;gap:0.5rem;margin-bottom:1rem;`;\n if (!appearance?.hideBranding) {\n const logo = shimmer(\"7rem\", \"1.25rem\");\n logo.style.margin = \"0 auto\";\n header.appendChild(logo);\n }\n if (!appearance?.hideProgress) {\n const progressBar = shimmer(\"100%\", \"0.25rem\");\n progressBar.style.borderRadius = \"9999px\";\n header.appendChild(progressBar);\n }\n container.appendChild(header);\n }\n\n // -- Welcome card: avatar + name, title, body lines --\n if (!appearance?.hideGreeting) {\n const card = document.createElement(\"div\");\n card.style.cssText = `border:1px solid ${colors.border};border-radius:16px;padding:1.25rem;margin-bottom:1.25rem;`;\n\n // Avatar row: circle + name\n const avatarRow = document.createElement(\"div\");\n avatarRow.style.cssText = `display:flex;align-items:center;gap:0.625rem;margin-bottom:0.875rem;`;\n const avatar = shimmer(\"2.25rem\", \"2.25rem\");\n avatar.style.borderRadius = \"50%\";\n avatar.style.flexShrink = \"0\";\n avatar.style.marginBottom = \"0\";\n const name = shimmer(\"6rem\", \"0.875rem\");\n name.style.marginBottom = \"0\";\n avatarRow.appendChild(avatar);\n avatarRow.appendChild(name);\n card.appendChild(avatarRow);\n\n // Title line\n const title = shimmer(\"60%\", \"1.125rem\");\n title.style.marginBottom = \"0.875rem\";\n card.appendChild(title);\n\n // Body lines (3 lines — welcome message paragraph)\n card.appendChild(shimmer(\"95%\", \"0.75rem\"));\n card.appendChild(shimmer(\"90%\", \"0.75rem\"));\n const lastBodyLine = shimmer(\"75%\", \"0.75rem\");\n lastBodyLine.style.marginBottom = \"0\";\n card.appendChild(lastBodyLine);\n\n container.appendChild(card);\n }\n\n // -- Chat message: greeting text + small icon --\n const message = document.createElement(\"div\");\n message.style.cssText = `padding:0 0.25rem;margin-bottom:auto;`;\n message.appendChild(shimmer(\"92%\", \"0.75rem\"));\n const msgLine2 = shimmer(\"50%\", \"0.75rem\");\n msgLine2.style.marginBottom = \"0.75rem\";\n message.appendChild(msgLine2);\n const icon = shimmer(\"1.5rem\", \"1.5rem\");\n icon.style.marginBottom = \"0\";\n message.appendChild(icon);\n container.appendChild(message);\n\n // -- Input area: reply field + talk button pill --\n const inputArea = document.createElement(\"div\");\n inputArea.style.cssText = `\n margin-top: 1rem;\n border: 1px solid ${colors.border};\n border-radius: 28px;\n height: 3rem;\n padding: 0.375rem 0.375rem 0.375rem 1rem;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n box-sizing: border-box;\n `;\n const buttonPill = shimmer(\"4.5rem\", \"2.25rem\");\n buttonPill.style.borderRadius = \"9999px\";\n buttonPill.style.marginBottom = \"0\";\n inputArea.appendChild(buttonPill);\n container.appendChild(inputArea);\n\n // -- Footer: centered hint text --\n // const footer = shimmer(\"14rem\", \"0.75rem\");\n // footer.style.margin = \"0.75rem auto 0\";\n // container.appendChild(footer);\n\n return container;\n}\n","/**\n * CSS styles injected by the embed script\n * SSR-safe - DOM access is guarded\n */\n\nimport { hasDom } from \"./config\";\n\nlet stylesInjected = false;\n\nconst LIGHT_THEME = `\n --perspective-overlay-bg: rgba(0, 0, 0, 0.5);\n --perspective-modal-bg: #ffffff;\n --perspective-modal-text: #151B23;\n --perspective-close-bg: rgba(0, 0, 0, 0.1);\n --perspective-close-text: #666666;\n --perspective-close-hover-bg: rgba(0, 0, 0, 0.2);\n --perspective-close-hover-text: #333333;\n --perspective-border: hsl(240 6% 90%);\n --perspective-teaser-bg: #fff;\n --perspective-teaser-text: #1a1a18;\n --perspective-teaser-border: #f0eef2;\n --perspective-teaser-shadow: 0 4px 24px rgba(0, 0, 0, 0.1);\n`;\n\nconst DARK_THEME = `\n --perspective-overlay-bg: rgba(0, 0, 0, 0.7);\n --perspective-modal-bg: #02040a;\n --perspective-modal-text: #ffffff;\n --perspective-close-bg: rgba(255, 255, 255, 0.1);\n --perspective-close-text: #a0a0a0;\n --perspective-close-hover-bg: rgba(255, 255, 255, 0.2);\n --perspective-close-hover-text: #ffffff;\n --perspective-border: hsl(217 33% 17%);\n --perspective-teaser-bg: #1e1e2e;\n --perspective-teaser-text: #e4e4e7;\n --perspective-teaser-border: #2e2e3e;\n --perspective-teaser-shadow: 0 4px 24px rgba(0, 0, 0, 0.3);\n`;\n\nexport function injectStyles(): void {\n if (!hasDom()) return;\n if (stylesInjected) return;\n stylesInjected = true;\n\n const style = document.createElement(\"style\");\n style.id = \"perspective-embed-styles\";\n style.textContent = `\n /* Theme-aware color variables */\n .perspective-embed-root, .perspective-light-theme {\n ${LIGHT_THEME}\n --perspective-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n --perspective-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n --perspective-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n --perspective-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n --perspective-radius: 1.2rem;\n --perspective-radius-sm: calc(var(--perspective-radius) - 4px);\n }\n\n /* Dark theme */\n .perspective-dark-theme {\n ${DARK_THEME}\n }\n\n /* System dark mode support */\n @media (prefers-color-scheme: dark) {\n .perspective-embed-root:not(.perspective-light-theme) {\n ${DARK_THEME}\n }\n }\n\n /* Scrollbar styling */\n .perspective-modal,\n .perspective-slider,\n .perspective-float-window,\n .perspective-chat-window {\n scrollbar-width: thin;\n scrollbar-color: var(--perspective-border) transparent;\n }\n\n .perspective-modal::-webkit-scrollbar,\n .perspective-slider::-webkit-scrollbar,\n .perspective-float-window::-webkit-scrollbar,\n .perspective-chat-window::-webkit-scrollbar {\n width: 10px;\n height: 10px;\n }\n\n .perspective-modal::-webkit-scrollbar-track,\n .perspective-slider::-webkit-scrollbar-track,\n .perspective-float-window::-webkit-scrollbar-track,\n .perspective-chat-window::-webkit-scrollbar-track {\n background: transparent;\n }\n\n .perspective-modal::-webkit-scrollbar-thumb,\n .perspective-slider::-webkit-scrollbar-thumb,\n .perspective-float-window::-webkit-scrollbar-thumb,\n .perspective-chat-window::-webkit-scrollbar-thumb {\n background-color: var(--perspective-border);\n border-radius: 9999px;\n border: 2px solid transparent;\n background-clip: padding-box;\n }\n\n .perspective-modal::-webkit-scrollbar-thumb:hover,\n .perspective-slider::-webkit-scrollbar-thumb:hover,\n .perspective-float-window::-webkit-scrollbar-thumb:hover,\n .perspective-chat-window::-webkit-scrollbar-thumb:hover {\n background-color: color-mix(in srgb, var(--perspective-border) 80%, currentColor);\n }\n\n /* Overlay for popup/modal */\n .perspective-overlay {\n position: fixed;\n inset: 0;\n background: var(--perspective-overlay-bg);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 9999;\n animation: perspective-fade-in 0.2s ease-out;\n }\n\n @keyframes perspective-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n /* Modal container */\n .perspective-modal {\n position: relative;\n width: 90%;\n max-width: 600px;\n height: 80vh;\n max-height: 700px;\n background: var(--perspective-modal-bg);\n color: var(--perspective-modal-text);\n border-radius: var(--perspective-radius);\n overflow: hidden;\n box-shadow: var(--perspective-shadow-xl);\n animation: perspective-slide-up 0.3s ease-out;\n }\n\n @keyframes perspective-slide-up {\n from {\n opacity: 0;\n transform: translateY(20px) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n }\n\n .perspective-modal iframe {\n width: 100%;\n height: 100%;\n border: none;\n }\n\n /* Close button */\n .perspective-close {\n position: absolute;\n top: 1rem;\n right: 1.5rem;\n width: 2rem;\n height: 2rem;\n border: none;\n background: var(--perspective-close-bg);\n color: var(--perspective-close-text);\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1rem;\n z-index: 10;\n transition: background-color 0.2s ease, color 0.2s ease;\n }\n\n .perspective-close:hover {\n background: var(--perspective-close-hover-bg);\n color: var(--perspective-close-hover-text);\n }\n\n .perspective-close:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: 2px;\n }\n\n .perspective-close svg {\n width: 1rem;\n height: 1rem;\n stroke-width: 2;\n }\n\n /* Slider drawer */\n .perspective-slider {\n position: fixed;\n top: 0;\n right: 0;\n width: 100%;\n max-width: 450px;\n height: 100%;\n background: var(--perspective-modal-bg);\n color: var(--perspective-modal-text);\n box-shadow: var(--perspective-shadow-xl);\n z-index: 9999;\n animation: perspective-slide-in 0.3s ease-out;\n }\n\n @keyframes perspective-slide-in {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n }\n\n .perspective-slider iframe {\n width: 100%;\n height: 100%;\n border: none;\n }\n\n .perspective-slider .perspective-close {\n top: 1rem;\n right: 2rem;\n }\n\n /* Slider backdrop */\n .perspective-slider-backdrop {\n position: fixed;\n inset: 0;\n background: var(--perspective-overlay-bg);\n z-index: 9998;\n animation: perspective-fade-in 0.2s ease-out;\n }\n\n /* Float bubble (and legacy chat-bubble alias) */\n .perspective-float-bubble,\n .perspective-chat-bubble {\n position: fixed;\n bottom: 20px;\n right: 20px;\n width: 58px;\n height: 58px;\n padding: 0;\n border-radius: 50%;\n background: var(--perspective-float-bg, var(--perspective-chat-bg, #7629C8));\n color: white;\n border: none;\n cursor: pointer;\n box-shadow: var(--perspective-float-shadow, var(--perspective-chat-shadow, 0 4px 12px rgba(118, 41, 200, 0.4)));\n z-index: 9996;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: box-shadow 0.2s ease;\n --animate-click-draw: click-draw 3s ease-in-out infinite;\n animation: var(--animate-click-draw);\n }\n\n .perspective-float-bubble:hover,\n .perspective-chat-bubble:hover {\n box-shadow: var(--perspective-float-shadow-hover, var(--perspective-chat-shadow-hover, 0 6px 16px rgba(118, 41, 200, 0.5)));\n }\n\n .perspective-float-bubble.perspective-float-bubble-open,\n .perspective-chat-bubble.perspective-float-bubble-open {\n animation: none;\n }\n\n .perspective-float-bubble:focus-visible,\n .perspective-chat-bubble:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: 2px;\n }\n\n .perspective-float-bubble svg,\n .perspective-chat-bubble svg {\n width: 1.75rem;\n height: 1.75rem;\n stroke-width: 2;\n }\n\n @keyframes click-draw {\n 0%,\n 35%,\n 65%,\n 100% {\n transform: scale(1);\n }\n 50% {\n transform: scale(1.1);\n }\n }\n\n .perspective-float-notification-dot {\n position: absolute;\n top: -1px;\n right: -1px;\n width: 13px;\n height: 13px;\n border-radius: 50%;\n background: #ff5252;\n border: 2px solid #fff;\n pointer-events: none;\n animation: perspective-slide-up 0.25s ease-out;\n }\n\n .perspective-float-teaser {\n position: fixed;\n right: 20px;\n bottom: 88px;\n z-index: 9996;\n background: var(--perspective-teaser-bg);\n color: var(--perspective-teaser-text);\n border-radius: 14px 14px 4px 14px;\n border: 1px solid var(--perspective-teaser-border);\n box-shadow: var(--perspective-teaser-shadow);\n max-width: 230px;\n padding: 11px 15px 9px;\n line-height: 1.45;\n cursor: pointer;\n animation: perspective-teaser-in 0.35s ease-out;\n user-select: none;\n }\n\n .perspective-float-teaser-message {\n font-size: 14px;\n font-weight: 500;\n }\n\n @keyframes perspective-teaser-in {\n from {\n opacity: 0;\n transform: translateY(10px) scale(0.96);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n }\n\n /* Float window (and legacy chat-window alias) */\n .perspective-float-window,\n .perspective-chat-window {\n position: fixed;\n bottom: 6.25rem;\n right: 1.5rem;\n width: 380px;\n height: calc(100vh - 8.75rem);\n max-height: 600px;\n background: var(--perspective-modal-bg);\n color: var(--perspective-modal-text);\n border-radius: var(--perspective-radius);\n overflow: hidden;\n box-shadow: var(--perspective-shadow-xl);\n z-index: 9997;\n animation: perspective-float-open 0.3s ease-out;\n }\n\n @keyframes perspective-float-open {\n from {\n opacity: 0;\n transform: translateY(20px) scale(0.9);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n }\n\n .perspective-float-window iframe,\n .perspective-chat-window iframe {\n width: 100%;\n height: 100%;\n border: none;\n }\n\n .perspective-float-window .perspective-close,\n .perspective-chat-window .perspective-close {\n top: 1rem;\n right: 1.5rem;\n }\n\n /* Fullpage */\n .perspective-fullpage {\n position: fixed;\n inset: 0;\n z-index: 9999;\n background: var(--perspective-modal-bg);\n }\n\n .perspective-fullpage iframe {\n width: 100%;\n height: 100%;\n border: none;\n }\n\n /* Responsive */\n @media (max-width: 640px) {\n .perspective-modal {\n width: 100%;\n height: 100%;\n max-width: none;\n max-height: none;\n border-radius: 0;\n }\n\n .perspective-slider {\n max-width: 100%;\n }\n\n .perspective-float-window,\n .perspective-chat-window {\n inset: 0;\n width: 100%;\n height: 100%;\n max-height: none;\n border-radius: 0;\n }\n\n .perspective-float-bubble.perspective-float-bubble-open,\n .perspective-chat-bubble.perspective-float-bubble-open {\n display: none;\n }\n }\n `;\n\n document.head.appendChild(style);\n}\n\nexport const MIC_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 18.75a6 6 0 006-6v-1.5m-6 7.5a6 6 0 01-6-6v-1.5m6 7.5v3.75m-3.75 0h7.5M12 15.75a3 3 0 01-3-3V4.5a3 3 0 116 0v8.25a3 3 0 01-3 3z\" />\n</svg>`;\n\nexport const MESSAGES_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-messages-square-icon lucide-messages-square\">\n <path d=\"M16 10a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 14.286V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z\"/>\n <path d=\"M20 9a2 2 0 0 1 2 2v10.286a.71.71 0 0 1-1.212.502l-2.202-2.202A2 2 0 0 0 17.172 19H10a2 2 0 0 1-2-2v-1\"/>\n</svg>`;\n\n/** @deprecated Use MIC_ICON instead */\nexport const CHAT_ICON = MIC_ICON;\n\nexport const CLOSE_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"lucide-x\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n</svg>`;\n","/**\n * AEO (Answer Engine Optimization) attribution signals.\n *\n * Injects machine-readable metadata into the parent page DOM so that\n * AI crawlers, tech detection tools, and search engines can identify\n * Perspective AI on customer sites — even though the widget content\n * is sandboxed inside a cross-origin iframe.\n *\n * All functions are SSR-safe (guarded by hasDom()).\n */\n\nimport type { EmbedType } from \"./types\";\nimport { hasDom } from \"./config\";\nimport { SDK_VERSION } from \"./constants\";\n\n/** Canonical brand URL — always used regardless of configured host */\nconst PERSPECTIVE_URL = \"https://getperspective.ai\";\n\n/** JSON-LD structured data for the widget */\nconst JSON_LD = {\n \"@context\": \"https://schema.org\",\n \"@graph\": [\n {\n \"@type\": \"SoftwareApplication\",\n \"@id\": `${PERSPECTIVE_URL}/#widget`,\n name: \"Perspective AI\",\n description:\n \"Rigid forms cause drop-off, weaken qualification, and strip away context. Perspective uses adaptive AI to turn forms into conversations that capture structured data and trigger automation.\",\n url: PERSPECTIVE_URL,\n applicationCategory: \"BusinessApplication\",\n softwareVersion: SDK_VERSION,\n provider: { \"@id\": `${PERSPECTIVE_URL}/#organization` },\n aggregateRating: {\n \"@type\": \"AggregateRating\",\n ratingValue: \"5\",\n bestRating: \"5\",\n worstRating: \"1\",\n ratingCount: 7,\n reviewCount: 7,\n },\n },\n {\n \"@type\": \"Organization\",\n \"@id\": `${PERSPECTIVE_URL}/#organization`,\n name: \"Perspective AI\",\n url: PERSPECTIVE_URL,\n },\n ],\n};\n\n/**\n * Inject JSON-LD structured data into the page.\n * Idempotent — skips if a `[data-perspective-jsonld]` element already exists\n * (e.g. from SSR via DiscoveryMetadata or a previous call).\n */\nexport function injectJsonLd(): void {\n if (!hasDom()) return;\n if (document.querySelector(\"script[data-perspective-jsonld]\")) return;\n\n const script = document.createElement(\"script\");\n script.type = \"application/ld+json\";\n script.setAttribute(\"data-perspective-jsonld\", \"\");\n script.textContent = JSON.stringify(JSON_LD);\n document.body.appendChild(script);\n}\n\ndeclare global {\n interface Window {\n PerspectiveAI?: {\n readonly version: string;\n readonly provider: string;\n readonly url: string;\n };\n }\n}\n\n/**\n * Set the `window.PerspectiveAI` frozen global for tech detectors.\n * Idempotent — skips if the global already exists.\n */\nexport function injectGlobalMetadata(): void {\n if (!hasDom()) return;\n if (window.PerspectiveAI) return;\n\n window.PerspectiveAI = Object.freeze({\n version: SDK_VERSION,\n provider: \"Perspective AI\",\n url: PERSPECTIVE_URL,\n });\n}\n\n/**\n * Enrich a container element with attribution data attributes,\n * insert an HTML comment, and trigger global signal injection.\n *\n * Called from each embed creation function (widget, popup, slider,\n * float, fullpage) to cover all SDK entry points (CDN, npm, React).\n */\nexport function enrichContainer(\n el: HTMLElement,\n type: EmbedType,\n options?: { disableJsonLdAttribution?: boolean }\n): void {\n if (!hasDom()) return;\n\n el.setAttribute(\"data-perspective-version\", SDK_VERSION);\n el.setAttribute(\"data-perspective-type\", type);\n\n if (el.parentNode) {\n el.parentNode.insertBefore(\n document.createComment(\n ` Powered by Perspective AI \\u2014 ${PERSPECTIVE_URL} `\n ),\n el\n );\n }\n\n if (!options?.disableJsonLdAttribution) {\n injectJsonLd();\n }\n injectGlobalMetadata();\n}\n","/**\n * Inline widget embed - renders directly in a container element\n * SSR-safe - returns no-op handle on server\n */\n\nimport type { EmbedHandle, InternalEmbedConfig } from \"./types\";\nimport { hasDom, getHost } from \"./config\";\nimport {\n createIframe,\n appearanceToParams,\n setupMessageListener,\n registerIframe,\n ensureGlobalListeners,\n} from \"./iframe\";\nimport { createLoadingIndicator } from \"./loading\";\nimport { injectStyles } from \"./styles\";\nimport { cn, getThemeClass } from \"./utils\";\nimport { enrichContainer } from \"./attribution\";\n\ntype WidgetResources = {\n cleanup: () => void;\n unregister: () => void;\n wrapper: HTMLElement;\n};\n\nconst widgetResources = new WeakMap<HTMLIFrameElement, WidgetResources>();\n\nfunction createNoOpHandle(researchId: string, type: \"widget\"): EmbedHandle {\n return {\n unmount: () => {},\n update: () => {},\n destroy: () => {},\n researchId,\n type,\n iframe: null,\n container: null,\n };\n}\n\nfunction createExistingWidgetHandle(\n container: HTMLElement,\n researchId: string\n): EmbedHandle {\n const existingWrapper = container.querySelector<HTMLElement>(\n \".perspective-embed-root\"\n );\n const existingIframe = container.querySelector<HTMLIFrameElement>(\n \"iframe[data-perspective]\"\n );\n\n let destroyed = false;\n\n const unmount = () => {\n if (destroyed) return;\n destroyed = true;\n\n if (existingIframe) {\n const resources = widgetResources.get(existingIframe);\n if (resources) {\n resources.cleanup();\n resources.unregister();\n widgetResources.delete(existingIframe);\n }\n }\n existingWrapper?.remove();\n };\n\n return {\n unmount,\n update: () => {},\n destroy: unmount,\n researchId,\n type: \"widget\" as const,\n iframe: existingIframe,\n container,\n };\n}\n\nexport function createWidget(\n container: HTMLElement | null,\n config: InternalEmbedConfig\n): EmbedHandle {\n const { researchId } = config;\n\n // SSR safety: return no-op handle\n if (!hasDom() || !container) {\n return createNoOpHandle(researchId, \"widget\");\n }\n\n // Idempotency check for React Strict Mode\n if (container.querySelector(\"iframe[data-perspective]\")) {\n return createExistingWidgetHandle(container, researchId);\n }\n\n const host = getHost(config.host);\n\n injectStyles();\n ensureGlobalListeners();\n\n // Create wrapper for positioning\n const wrapper = document.createElement(\"div\");\n wrapper.className = cn(\"perspective-embed-root\", getThemeClass(config.theme));\n wrapper.style.cssText =\n \"position:relative;width:100%;height:100%;min-height:500px;\";\n\n // Create loading indicator with theme and brand colors\n const loading = createLoadingIndicator({\n theme: config.theme,\n brand: config.brand,\n appearance: config._apiConfig?.embedSettings?.appearance,\n });\n wrapper.appendChild(loading);\n\n // Create iframe (hidden initially)\n const overrides = appearanceToParams(config._apiConfig?.embedSettings);\n const iframe = createIframe(\n researchId,\n \"widget\",\n host,\n config.params,\n config.brand,\n config.theme,\n overrides\n );\n iframe.style.width = \"100%\";\n iframe.style.height = \"100%\";\n iframe.style.minHeight = \"500px\";\n iframe.style.opacity = \"0\";\n iframe.style.transition = \"opacity 0.3s ease\";\n\n wrapper.appendChild(iframe);\n container.appendChild(wrapper);\n enrichContainer(wrapper, \"widget\", config);\n\n // Mutable config reference for updates\n let currentConfig = { ...config };\n\n // Set up message listener with loading state handling\n const cleanup = setupMessageListener(\n researchId,\n {\n get onReady() {\n return () => {\n // Hide loading, show iframe\n loading.style.opacity = \"0\";\n iframe.style.opacity = \"1\";\n setTimeout(() => loading.remove(), 300);\n currentConfig.onReady?.();\n };\n },\n get onSubmit() {\n return currentConfig.onSubmit;\n },\n get onNavigate() {\n return currentConfig.onNavigate;\n },\n get onClose() {\n return currentConfig.onClose;\n },\n get onError() {\n return currentConfig.onError;\n },\n },\n iframe,\n host,\n { skipResize: true }\n );\n\n // Register iframe for theme change notifications\n const unregisterIframe = registerIframe(iframe, host);\n\n widgetResources.set(iframe, {\n cleanup,\n unregister: unregisterIframe,\n wrapper,\n });\n\n let destroyed = false;\n\n const unmount = () => {\n if (destroyed) return;\n destroyed = true;\n\n cleanup();\n unregisterIframe();\n widgetResources.delete(iframe);\n wrapper.remove();\n };\n\n return {\n unmount,\n update: (options) => {\n currentConfig = { ...currentConfig, ...options };\n },\n destroy: unmount,\n researchId,\n type: \"widget\" as const,\n iframe,\n container,\n };\n}\n","import { STORAGE_KEYS } from \"./constants\";\nimport { getHost, hasDom } from \"./config\";\n\nexport type PersistedOpenStateType = \"popup\" | \"slider\" | \"float\";\n\ntype PersistedOpenState = {\n v: 1;\n open: boolean;\n};\n\ntype PersistedOpenStateKey = {\n researchId: string;\n type: PersistedOpenStateType;\n host?: string;\n};\n\nfunction getPersistedOpenStateKey({\n researchId,\n type,\n host,\n}: PersistedOpenStateKey): string {\n return `${STORAGE_KEYS.embedState}:${getHost(host)}:${type}:${researchId}`;\n}\n\nexport function getPersistedOpenState(\n key: PersistedOpenStateKey\n): boolean | null {\n if (!hasDom()) {\n return null;\n }\n\n try {\n const raw = sessionStorage.getItem(getPersistedOpenStateKey(key));\n if (!raw) {\n return null;\n }\n\n const parsed = JSON.parse(raw) as Partial<PersistedOpenState>;\n return typeof parsed.open === \"boolean\" ? parsed.open : null;\n } catch {\n return null;\n }\n}\n\nexport function setPersistedOpenState(\n key: PersistedOpenStateKey & { open: boolean }\n): void {\n if (!hasDom()) {\n return;\n }\n\n try {\n const value: PersistedOpenState = { v: 1, open: key.open };\n sessionStorage.setItem(\n getPersistedOpenStateKey(key),\n JSON.stringify(value)\n );\n } catch {\n // Storage can be unavailable in some browser/privacy modes.\n }\n}\n","/**\n * Popup/modal embed - opens in a centered modal overlay\n * SSR-safe - returns no-op handle on server\n */\n\nimport type { EmbedHandle, InternalEmbedConfig } from \"./types\";\nimport { hasDom, getHost } from \"./config\";\nimport {\n createIframe,\n appearanceToParams,\n setupMessageListener,\n registerIframe,\n ensureGlobalListeners,\n} from \"./iframe\";\nimport { createLoadingIndicator } from \"./loading\";\nimport { injectStyles, CLOSE_ICON } from \"./styles\";\nimport { setPersistedOpenState } from \"./state\";\nimport { cn, getThemeClass } from \"./utils\";\nimport { enrichContainer } from \"./attribution\";\n\nfunction createNoOpHandle(researchId: string): EmbedHandle {\n return {\n unmount: () => {},\n update: () => {},\n destroy: () => {},\n researchId,\n type: \"popup\",\n iframe: null,\n container: null,\n };\n}\n\nexport function openPopup(config: InternalEmbedConfig): EmbedHandle {\n const { researchId } = config;\n\n // SSR safety: return no-op handle\n if (!hasDom()) {\n return createNoOpHandle(researchId);\n }\n const host = getHost(config.host);\n\n injectStyles();\n ensureGlobalListeners();\n\n // Create overlay\n const overlay = document.createElement(\"div\");\n overlay.className = cn(\n \"perspective-overlay perspective-embed-root\",\n getThemeClass(config.theme)\n );\n\n // Create modal container\n const modal = document.createElement(\"div\");\n modal.className = \"perspective-modal\";\n\n // Create close button (hidden when disableClose is enabled)\n const closeBtn = document.createElement(\"button\");\n closeBtn.className = \"perspective-close\";\n closeBtn.innerHTML = CLOSE_ICON;\n closeBtn.setAttribute(\"aria-label\", \"Close\");\n if (config.disableClose) {\n closeBtn.style.display = \"none\";\n }\n\n // Create loading indicator with theme and brand colors\n const loading = createLoadingIndicator({\n theme: config.theme,\n brand: config.brand,\n appearance: config._apiConfig?.embedSettings?.appearance,\n });\n loading.style.borderRadius = \"16px\";\n\n // Create iframe (hidden initially)\n const overrides = appearanceToParams(config._apiConfig?.embedSettings);\n const iframe = createIframe(\n researchId,\n \"popup\",\n host,\n config.params,\n config.brand,\n config.theme,\n overrides\n );\n iframe.style.opacity = \"0\";\n iframe.style.transition = \"opacity 0.3s ease\";\n\n modal.appendChild(closeBtn);\n modal.appendChild(loading);\n modal.appendChild(iframe);\n overlay.appendChild(modal);\n document.body.appendChild(overlay);\n enrichContainer(overlay, \"popup\", config);\n\n // Mutable config reference for updates\n let currentConfig = { ...config };\n let isOpen = true;\n let messageCleanup: (() => void) | null = null;\n const persistOpenState = (open: boolean) => {\n setPersistedOpenState({\n researchId,\n type: \"popup\",\n host: config.host,\n open,\n });\n };\n\n // Register iframe for theme change notifications\n const unregisterIframe = registerIframe(iframe, host);\n\n persistOpenState(true);\n\n const removePopup = () => {\n if (!isOpen) return;\n isOpen = false;\n messageCleanup?.();\n unregisterIframe();\n overlay.remove();\n document.removeEventListener(\"keydown\", escHandler);\n currentConfig.onClose?.();\n };\n\n const destroy = () => {\n persistOpenState(false);\n removePopup();\n };\n\n const unmount = () => {\n removePopup();\n };\n\n // Set up message listener with loading state handling\n messageCleanup = setupMessageListener(\n researchId,\n {\n get onReady() {\n return () => {\n loading.style.opacity = \"0\";\n iframe.style.opacity = \"1\";\n setTimeout(() => loading.remove(), 300);\n currentConfig.onReady?.();\n };\n },\n get onSubmit() {\n return currentConfig.onSubmit;\n },\n get onNavigate() {\n return currentConfig.onNavigate;\n },\n get onClose() {\n return destroy;\n },\n get onError() {\n return currentConfig.onError;\n },\n },\n iframe,\n host,\n { skipResize: true, hasCloseButton: !config.disableClose }\n );\n\n // Close handlers (disabled when disableClose is enabled)\n const escHandler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n destroy();\n }\n };\n\n if (!config.disableClose) {\n closeBtn.addEventListener(\"click\", destroy);\n overlay.addEventListener(\"click\", (e) => {\n if (e.target === overlay) destroy();\n });\n document.addEventListener(\"keydown\", escHandler);\n }\n\n return {\n unmount,\n update: (options: Parameters<EmbedHandle[\"update\"]>[0]) => {\n currentConfig = { ...currentConfig, ...options };\n },\n destroy,\n researchId,\n type: \"popup\" as const,\n iframe,\n container: overlay,\n };\n}\n","/**\n * Slider/drawer embed - slides in from the right\n * SSR-safe - returns no-op handle on server\n */\n\nimport type { EmbedHandle, InternalEmbedConfig } from \"./types\";\nimport { hasDom, getHost } from \"./config\";\nimport {\n createIframe,\n appearanceToParams,\n setupMessageListener,\n registerIframe,\n ensureGlobalListeners,\n} from \"./iframe\";\nimport { createLoadingIndicator } from \"./loading\";\nimport { injectStyles, CLOSE_ICON } from \"./styles\";\nimport { setPersistedOpenState } from \"./state\";\nimport { cn, getThemeClass } from \"./utils\";\nimport { enrichContainer } from \"./attribution\";\n\nfunction createNoOpHandle(researchId: string): EmbedHandle {\n return {\n unmount: () => {},\n update: () => {},\n destroy: () => {},\n researchId,\n type: \"slider\",\n iframe: null,\n container: null,\n };\n}\n\nexport function openSlider(config: InternalEmbedConfig): EmbedHandle {\n const { researchId } = config;\n\n // SSR safety: return no-op handle\n if (!hasDom()) {\n return createNoOpHandle(researchId);\n }\n const host = getHost(config.host);\n\n injectStyles();\n ensureGlobalListeners();\n\n // Create backdrop\n const backdrop = document.createElement(\"div\");\n backdrop.className = cn(\n \"perspective-slider-backdrop perspective-embed-root\",\n getThemeClass(config.theme)\n );\n\n // Create slider container\n const slider = document.createElement(\"div\");\n slider.className = cn(\n \"perspective-slider perspective-embed-root\",\n getThemeClass(config.theme)\n );\n\n // Create close button (hidden when disableClose is enabled)\n const closeBtn = document.createElement(\"button\");\n closeBtn.className = \"perspective-close\";\n closeBtn.innerHTML = CLOSE_ICON;\n closeBtn.setAttribute(\"aria-label\", \"Close\");\n if (config.disableClose) {\n closeBtn.style.display = \"none\";\n }\n\n // Create loading indicator with theme and brand colors\n const loading = createLoadingIndicator({\n theme: config.theme,\n brand: config.brand,\n appearance: config._apiConfig?.embedSettings?.appearance,\n });\n\n // Create iframe (hidden initially)\n const overrides = appearanceToParams(config._apiConfig?.embedSettings);\n const iframe = createIframe(\n researchId,\n \"slider\",\n host,\n config.params,\n config.brand,\n config.theme,\n overrides\n );\n iframe.style.opacity = \"0\";\n iframe.style.transition = \"opacity 0.3s ease\";\n\n slider.appendChild(closeBtn);\n slider.appendChild(loading);\n slider.appendChild(iframe);\n document.body.appendChild(backdrop);\n document.body.appendChild(slider);\n enrichContainer(slider, \"slider\", config);\n\n // Mutable config reference for updates\n let currentConfig = { ...config };\n let isOpen = true;\n let messageCleanup: (() => void) | null = null;\n const persistOpenState = (open: boolean) => {\n setPersistedOpenState({\n researchId,\n type: \"slider\",\n host: config.host,\n open,\n });\n };\n\n // Register iframe for theme change notifications\n const unregisterIframe = registerIframe(iframe, host);\n\n persistOpenState(true);\n\n const removeSlider = () => {\n if (!isOpen) return;\n isOpen = false;\n messageCleanup?.();\n unregisterIframe();\n slider.remove();\n backdrop.remove();\n document.removeEventListener(\"keydown\", escHandler);\n currentConfig.onClose?.();\n };\n\n const destroy = () => {\n persistOpenState(false);\n removeSlider();\n };\n\n const unmount = () => {\n removeSlider();\n };\n\n // Set up message listener with loading state handling\n messageCleanup = setupMessageListener(\n researchId,\n {\n get onReady() {\n return () => {\n loading.style.opacity = \"0\";\n iframe.style.opacity = \"1\";\n setTimeout(() => loading.remove(), 300);\n currentConfig.onReady?.();\n };\n },\n get onSubmit() {\n return currentConfig.onSubmit;\n },\n get onNavigate() {\n return currentConfig.onNavigate;\n },\n get onClose() {\n return destroy;\n },\n get onError() {\n return currentConfig.onError;\n },\n },\n iframe,\n host,\n { skipResize: true, hasCloseButton: !config.disableClose }\n );\n\n // Close handlers (disabled when disableClose is enabled)\n const escHandler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n destroy();\n }\n };\n\n if (!config.disableClose) {\n closeBtn.addEventListener(\"click\", destroy);\n backdrop.addEventListener(\"click\", destroy);\n document.addEventListener(\"keydown\", escHandler);\n }\n\n return {\n unmount,\n update: (options: Parameters<EmbedHandle[\"update\"]>[0]) => {\n currentConfig = { ...currentConfig, ...options };\n },\n destroy,\n researchId,\n type: \"slider\" as const,\n iframe,\n container: slider,\n };\n}\n","/**\n * Floating bubble embed - floating button that opens a chat window\n * SSR-safe - returns no-op handle on server\n */\n\nimport type {\n AIAssistantChannel,\n FloatHandle,\n InternalEmbedConfig,\n LauncherIcon,\n ThemeConfig,\n} from \"./types\";\nimport { hasDom, getHost } from \"./config\";\nimport {\n createIframe,\n appearanceToParams,\n setupMessageListener,\n registerIframe,\n ensureGlobalListeners,\n} from \"./iframe\";\nimport { createLoadingIndicator } from \"./loading\";\nimport { injectStyles, MIC_ICON, MESSAGES_ICON, CLOSE_ICON } from \"./styles\";\nimport { getPersistedOpenState, setPersistedOpenState } from \"./state\";\nimport { cn, getThemeClass, resolveIsDark } from \"./utils\";\nimport { enrichContainer } from \"./attribution\";\n\n/** Merge API launcher config over a base launcher (API is source of truth) */\nfunction mergeApiLauncher(\n base: InternalEmbedConfig,\n apiLauncher: NonNullable<ThemeConfig[\"embedSettings\"]>[\"launcher\"]\n): InternalEmbedConfig {\n if (!apiLauncher) return base;\n const customerLauncher = base.launcher ?? {};\n return {\n ...base,\n launcher: {\n ...customerLauncher,\n ...apiLauncher,\n style: { ...customerLauncher.style, ...apiLauncher.style },\n },\n };\n}\ntype ChannelMode = \"voice\" | \"text\" | \"both\";\n\nconst SOUND_DELAY_MS = 2000;\nconst TEASER_DELAY_MS = 3000;\nconst TYPEWRITER_SPEED_MS = 40;\nconst DEFAULT_WELCOME_MESSAGE = \"Have a question? I'm here to help.\";\n\nfunction getChannelMode(\n channel?: AIAssistantChannel | AIAssistantChannel[] | null\n): ChannelMode {\n const entries = Array.isArray(channel) ? channel : channel ? [channel] : [];\n const hasVoice = entries.includes(\"VOICE\");\n const hasText = entries.includes(\"TEXT\");\n\n if (hasVoice && hasText) return \"both\";\n if (hasText) return \"text\";\n return \"voice\";\n}\n\nfunction resolveChannel(\n config: InternalEmbedConfig\n): AIAssistantChannel | AIAssistantChannel[] | undefined {\n return (\n config.channel ??\n config._apiConfig?.allowedChannels ??\n config._apiConfig?.channel ??\n undefined\n );\n}\n\nfunction resolveWelcomeMessage(config: InternalEmbedConfig): string {\n const message = config.welcomeMessage ?? config._apiConfig?.welcomeMessage;\n const trimmed = typeof message === \"string\" ? message.trim() : \"\";\n return trimmed.length > 0 ? trimmed : DEFAULT_WELCOME_MESSAGE;\n}\n\nexport function getDefaultIconHtml(config: InternalEmbedConfig): string {\n return getChannelMode(resolveChannel(config)) === \"text\"\n ? MESSAGES_ICON\n : MIC_ICON;\n}\n\nexport function createIconImg(\n src: string,\n fallbackHtml: string\n): HTMLImageElement {\n const img = document.createElement(\"img\");\n img.src = src;\n img.alt = \"\";\n img.style.width = \"100%\";\n img.style.height = \"100%\";\n img.style.objectFit = \"cover\";\n img.style.borderRadius = \"inherit\";\n img.onerror = () => {\n const parent = img.parentElement;\n if (parent) {\n img.remove();\n parent.innerHTML = fallbackHtml;\n }\n };\n return img;\n}\n\nfunction applyBubbleIcon(\n bubble: HTMLButtonElement,\n config: InternalEmbedConfig\n): void {\n const icon: LauncherIcon = config.launcher?.icon ?? \"default\";\n const fallbackHtml = getDefaultIconHtml(config);\n\n if (icon === \"default\") {\n bubble.innerHTML = fallbackHtml;\n return;\n }\n\n if (icon === \"avatar\") {\n const avatarUrl = config._apiConfig?.avatarUrl;\n if (avatarUrl) {\n bubble.innerHTML = \"\";\n bubble.appendChild(createIconImg(avatarUrl, fallbackHtml));\n } else {\n bubble.innerHTML = fallbackHtml;\n }\n return;\n }\n\n if (typeof icon === \"object\" && icon !== null) {\n if (\"url\" in icon) {\n bubble.innerHTML = \"\";\n bubble.appendChild(createIconImg(icon.url, fallbackHtml));\n return;\n }\n\n if (\"svg\" in icon) {\n bubble.innerHTML = icon.svg;\n return;\n }\n }\n\n // Exhaustive — should never reach here\n bubble.innerHTML = fallbackHtml;\n}\n\nfunction createChimeSound(audioCtx: AudioContext): void {\n const t = audioCtx.currentTime;\n\n const osc = audioCtx.createOscillator();\n const gain = audioCtx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(880, t);\n osc.frequency.setValueAtTime(1175, t + 0.1);\n gain.gain.setValueAtTime(0.15, t);\n gain.gain.linearRampToValueAtTime(0.18, t + 0.1);\n gain.gain.exponentialRampToValueAtTime(0.001, t + 0.6);\n osc.connect(gain).connect(audioCtx.destination);\n osc.start(t);\n osc.stop(t + 0.65);\n\n const osc2 = audioCtx.createOscillator();\n const gain2 = audioCtx.createGain();\n osc2.type = \"sine\";\n osc2.frequency.setValueAtTime(1175, t + 0.15);\n osc2.frequency.setValueAtTime(1400, t + 0.25);\n gain2.gain.setValueAtTime(0, t);\n gain2.gain.setValueAtTime(0.12, t + 0.15);\n gain2.gain.exponentialRampToValueAtTime(0.001, t + 0.55);\n osc2.connect(gain2).connect(audioCtx.destination);\n osc2.start(t + 0.15);\n osc2.stop(t + 0.6);\n}\n\nfunction createNoOpHandle(researchId: string): FloatHandle {\n return {\n unmount: () => {},\n update: () => {},\n destroy: () => {},\n open: () => {},\n close: () => {},\n toggle: () => {},\n isOpen: false,\n researchId,\n type: \"float\",\n iframe: null,\n container: null,\n };\n}\n\nexport function createFloatBubble(config: InternalEmbedConfig): FloatHandle {\n const { researchId, _apiConfig, theme, brand } = config;\n\n // SSR safety: return no-op handle\n if (!hasDom()) {\n return createNoOpHandle(researchId);\n }\n const host = getHost(config.host);\n\n injectStyles();\n ensureGlobalListeners();\n\n // Create bubble button\n const bubble = document.createElement(\"button\");\n bubble.className = cn(\n \"perspective-float-bubble perspective-embed-root\",\n getThemeClass(config.theme)\n );\n applyBubbleIcon(bubble, config);\n bubble.setAttribute(\"aria-label\", \"Open chat\");\n bubble.setAttribute(\"data-perspective\", \"float-bubble\");\n\n // Apply theme color if available\n if (_apiConfig || brand) {\n const isDark = resolveIsDark(theme);\n const bg = isDark\n ? (brand?.dark?.primary ?? _apiConfig?.darkPrimaryColor ?? \"#a78bfa\")\n : (brand?.light?.primary ?? _apiConfig?.primaryColor ?? \"#7c3aed\");\n bubble.style.setProperty(\"--perspective-float-bg\", bg);\n bubble.style.setProperty(\n \"--perspective-float-shadow\",\n `0 4px 12px ${bg}66`\n );\n bubble.style.setProperty(\n \"--perspective-float-shadow-hover\",\n `0 6px 16px ${bg}80`\n );\n bubble.style.backgroundColor = bg;\n bubble.style.boxShadow = `0 4px 12px ${bg}66`;\n }\n\n // Merge API launcher config over customer config (API is source of truth)\n let mergedConfig = mergeApiLauncher(\n config,\n _apiConfig?.embedSettings?.launcher\n );\n if (mergedConfig !== config) {\n applyBubbleIcon(bubble, mergedConfig);\n }\n\n // Apply launcher style overrides (highest precedence)\n if (mergedConfig.launcher?.style) {\n Object.assign(bubble.style, mergedConfig.launcher.style);\n }\n\n // Apply launcher className (additive)\n if (mergedConfig.launcher?.className) {\n for (const cls of mergedConfig.launcher.className\n .split(/\\s+/)\n .filter(Boolean)) {\n bubble.classList.add(cls);\n }\n }\n\n document.body.appendChild(bubble);\n enrichContainer(bubble, \"float\", config);\n\n // Auto-fetch config when avatar icon is requested but no _apiConfig provided\n // (programmatic API — browser.ts auto-init handles this separately)\n if (config.launcher?.icon === \"avatar\" && !_apiConfig?.avatarUrl) {\n fetch(`${host}/api/v1/embed/config/${researchId}`)\n .then((res) => (res.ok ? res.json() : null))\n .then((fetchedConfig) => {\n if (fetchedConfig?.avatarUrl) {\n currentConfig = {\n ...currentConfig,\n _apiConfig: { ...currentConfig._apiConfig, ...fetchedConfig },\n };\n if (!isOpen) {\n applyBubbleIcon(bubble, currentConfig);\n }\n }\n })\n .catch(() => {\n // Silently fall back to default icon\n });\n }\n\n let floatWindow: HTMLElement | null = null;\n let iframe: HTMLIFrameElement | null = null;\n let cleanup: (() => void) | null = null;\n let unregisterIframe: (() => void) | null = null;\n let isOpen = false;\n let teaser: HTMLElement | null = null;\n let teaserTypewriter: number | null = null;\n let notificationDot: HTMLElement | null = null;\n let audioCtx: AudioContext | null = null;\n let welcomeSequenceStarted = false;\n let welcomeDismissed = false;\n let welcomeTimers: number[] = [];\n const persistOpenState = (open: boolean) => {\n setPersistedOpenState({\n researchId,\n type: \"float\",\n host: config.host,\n open,\n });\n };\n const shouldRestoreOpen =\n getPersistedOpenState({\n researchId,\n type: \"float\",\n host: config.host,\n }) === true;\n\n // Mutable config reference for updates\n let currentConfig = { ...mergedConfig };\n\n const setBubbleClosedState = () => {\n applyBubbleIcon(bubble, currentConfig);\n bubble.setAttribute(\"aria-label\", \"Open chat\");\n bubble.classList.remove(\"perspective-float-bubble-open\");\n };\n\n const setBubbleOpenState = () => {\n bubble.innerHTML = CLOSE_ICON;\n bubble.setAttribute(\"aria-label\", \"Close chat\");\n bubble.classList.add(\"perspective-float-bubble-open\");\n };\n\n const clearWelcomeTimers = () => {\n for (const timer of welcomeTimers) {\n window.clearTimeout(timer);\n }\n welcomeTimers = [];\n\n if (teaserTypewriter !== null) {\n window.clearInterval(teaserTypewriter);\n teaserTypewriter = null;\n }\n };\n\n const removeNotificationDot = () => {\n notificationDot?.remove();\n notificationDot = null;\n };\n\n const removeTeaser = () => {\n if (teaserTypewriter !== null) {\n window.clearInterval(teaserTypewriter);\n teaserTypewriter = null;\n }\n teaser?.remove();\n teaser = null;\n removeNotificationDot();\n };\n\n const showNotificationDot = () => {\n if (notificationDot || isOpen) return;\n notificationDot = document.createElement(\"span\");\n notificationDot.className = \"perspective-float-notification-dot\";\n bubble.appendChild(notificationDot);\n };\n\n const playChime = () => {\n try {\n const AudioContextCtor =\n window.AudioContext ||\n (\n window as Window & {\n webkitAudioContext?: typeof AudioContext;\n }\n ).webkitAudioContext;\n\n if (!AudioContextCtor) return;\n\n if (!audioCtx) {\n audioCtx = new AudioContextCtor();\n }\n\n if (audioCtx.state === \"suspended\") {\n void audioCtx.resume();\n }\n createChimeSound(audioCtx);\n } catch {\n // Browser may block autoplayed audio until user gesture.\n }\n };\n\n const renderTeaser = (message: string) => {\n removeTeaser();\n if (isOpen) return;\n\n const teaserEl = document.createElement(\"div\");\n teaserEl.className = cn(\n \"perspective-float-teaser perspective-embed-root\",\n getThemeClass(currentConfig.theme)\n );\n\n const messageEl = document.createElement(\"div\");\n messageEl.className = \"perspective-float-teaser-message\";\n const textEl = document.createElement(\"span\");\n messageEl.appendChild(textEl);\n\n teaserEl.appendChild(messageEl);\n teaserEl.addEventListener(\"click\", () => openFloat());\n\n document.body.appendChild(teaserEl);\n teaser = teaserEl;\n showNotificationDot();\n\n let charIndex = 0;\n teaserTypewriter = window.setInterval(() => {\n charIndex += 1;\n textEl.textContent = message.slice(0, charIndex);\n\n if (charIndex >= message.length) {\n if (teaserTypewriter !== null) {\n window.clearInterval(teaserTypewriter);\n teaserTypewriter = null;\n }\n }\n }, TYPEWRITER_SPEED_MS);\n };\n\n const maybeStartWelcomeSequence = () => {\n if (welcomeSequenceStarted || welcomeDismissed || isOpen) return;\n\n welcomeSequenceStarted = true;\n\n const soundTimer = window.setTimeout(() => {\n if (isOpen || welcomeDismissed) return;\n playChime();\n }, SOUND_DELAY_MS);\n\n const teaserTimer = window.setTimeout(() => {\n if (isOpen || welcomeDismissed) return;\n renderTeaser(resolveWelcomeMessage(currentConfig));\n }, TEASER_DELAY_MS);\n\n welcomeTimers.push(soundTimer, teaserTimer);\n };\n\n const openFloat = () => {\n if (isOpen) return;\n isOpen = true;\n persistOpenState(true);\n clearWelcomeTimers();\n removeTeaser();\n\n // Create float window\n floatWindow = document.createElement(\"div\");\n floatWindow.className = cn(\n \"perspective-float-window perspective-embed-root\",\n getThemeClass(currentConfig.theme)\n );\n\n // Create close button\n const closeBtn = document.createElement(\"button\");\n closeBtn.className = \"perspective-close\";\n closeBtn.innerHTML = CLOSE_ICON;\n closeBtn.setAttribute(\"aria-label\", \"Close chat\");\n closeBtn.addEventListener(\"click\", () => closeFloat());\n\n // Create loading indicator with theme and brand colors\n const loading = createLoadingIndicator({\n theme: currentConfig.theme,\n brand: currentConfig.brand,\n appearance: currentConfig._apiConfig?.embedSettings?.appearance,\n });\n loading.style.borderRadius = \"16px\";\n\n // Create iframe (hidden initially)\n const overrides = appearanceToParams(\n currentConfig._apiConfig?.embedSettings\n );\n iframe = createIframe(\n researchId,\n \"float\",\n host,\n currentConfig.params,\n currentConfig.brand,\n currentConfig.theme,\n overrides\n );\n iframe.style.opacity = \"0\";\n iframe.style.transition = \"opacity 0.3s ease\";\n\n floatWindow.appendChild(closeBtn);\n floatWindow.appendChild(loading);\n floatWindow.appendChild(iframe);\n document.body.appendChild(floatWindow);\n\n // Set up message listener with loading state handling\n cleanup = setupMessageListener(\n researchId,\n {\n get onReady() {\n return () => {\n loading.style.opacity = \"0\";\n iframe!.style.opacity = \"1\";\n setTimeout(() => loading.remove(), 300);\n currentConfig.onReady?.();\n };\n },\n get onSubmit() {\n return currentConfig.onSubmit;\n },\n get onNavigate() {\n return currentConfig.onNavigate;\n },\n get onClose() {\n return closeFloat;\n },\n get onError() {\n return currentConfig.onError;\n },\n },\n iframe,\n host,\n { skipResize: true, hasCloseButton: true }\n );\n\n // Register iframe for theme change notifications\n if (iframe) {\n unregisterIframe = registerIframe(iframe, host);\n }\n\n // Update bubble icon to close\n setBubbleOpenState();\n };\n\n const closeFloat = (options?: { persistState?: boolean }) => {\n if (!isOpen) return;\n if (options?.persistState !== false) {\n persistOpenState(false);\n }\n isOpen = false;\n\n cleanup?.();\n unregisterIframe?.();\n floatWindow?.remove();\n floatWindow = null;\n iframe = null;\n cleanup = null;\n unregisterIframe = null;\n\n // Restore bubble icon\n setBubbleClosedState();\n\n currentConfig.onClose?.();\n };\n\n // Toggle on bubble click\n bubble.addEventListener(\"click\", () => {\n if (isOpen) {\n closeFloat();\n } else {\n openFloat();\n }\n });\n\n const unmount = () => {\n clearWelcomeTimers();\n removeTeaser();\n closeFloat({ persistState: false });\n bubble.remove();\n void audioCtx?.close();\n audioCtx = null;\n };\n\n const destroy = () => {\n persistOpenState(false);\n unmount();\n };\n\n if (shouldRestoreOpen) {\n welcomeSequenceStarted = true;\n openFloat();\n } else {\n maybeStartWelcomeSequence();\n }\n\n return {\n unmount,\n update: (\n options: Parameters<FloatHandle[\"update\"]>[0] & {\n _apiConfig?: ThemeConfig;\n }\n ) => {\n currentConfig = { ...currentConfig, ...options };\n\n // Recompute bubble color from updated API config or brand\n const apiCfg = currentConfig._apiConfig;\n if (apiCfg || currentConfig.brand) {\n const isDark = resolveIsDark(currentConfig.theme);\n const bg = isDark\n ? (currentConfig.brand?.dark?.primary ??\n apiCfg?.darkPrimaryColor ??\n \"#a78bfa\")\n : (currentConfig.brand?.light?.primary ??\n apiCfg?.primaryColor ??\n \"#7c3aed\");\n // Only update if launcher.style didn't override backgroundColor\n if (!currentConfig.launcher?.style?.backgroundColor) {\n bubble.style.setProperty(\"--perspective-float-bg\", bg);\n bubble.style.setProperty(\n \"--perspective-float-shadow\",\n `0 4px 12px ${bg}66`\n );\n bubble.style.setProperty(\n \"--perspective-float-shadow-hover\",\n `0 6px 16px ${bg}80`\n );\n bubble.style.backgroundColor = bg;\n bubble.style.boxShadow = `0 4px 12px ${bg}66`;\n }\n }\n\n // Apply API launcher config when _apiConfig is updated (e.g. from async config fetch)\n currentConfig = mergeApiLauncher(\n currentConfig,\n currentConfig._apiConfig?.embedSettings?.launcher\n );\n\n // Re-apply bubble icon from merged launcher config\n applyBubbleIcon(bubble, currentConfig);\n\n // Re-apply launcher style to bubble DOM (e.g. borderRadius from API)\n if (currentConfig.launcher?.style) {\n Object.assign(bubble.style, currentConfig.launcher.style);\n }\n\n if (!isOpen) {\n setBubbleClosedState();\n }\n\n maybeStartWelcomeSequence();\n },\n destroy,\n open: openFloat,\n close: closeFloat,\n toggle: () => {\n if (isOpen) {\n closeFloat();\n } else {\n openFloat();\n }\n },\n get isOpen() {\n return isOpen;\n },\n researchId,\n type: \"float\" as const,\n get iframe() {\n return iframe;\n },\n container: bubble,\n };\n}\n\n/** @deprecated Use createFloatBubble instead */\nexport const createChatBubble = createFloatBubble;\n","/**\n * Fullpage embed - takes over entire viewport\n * SSR-safe - returns no-op handle on server\n */\n\nimport type { EmbedHandle, InternalEmbedConfig } from \"./types\";\nimport { hasDom, getHost } from \"./config\";\nimport {\n createIframe,\n appearanceToParams,\n setupMessageListener,\n registerIframe,\n ensureGlobalListeners,\n} from \"./iframe\";\nimport { createLoadingIndicator } from \"./loading\";\nimport { injectStyles } from \"./styles\";\nimport { cn, getThemeClass } from \"./utils\";\nimport { enrichContainer } from \"./attribution\";\n\nfunction createNoOpHandle(researchId: string): EmbedHandle {\n return {\n unmount: () => {},\n update: () => {},\n destroy: () => {},\n researchId,\n type: \"fullpage\" as const,\n iframe: null,\n container: null,\n };\n}\n\nexport function createFullpage(config: InternalEmbedConfig): EmbedHandle {\n const { researchId } = config;\n\n // SSR safety: return no-op handle\n if (!hasDom()) {\n return createNoOpHandle(researchId);\n }\n const host = getHost(config.host);\n\n injectStyles();\n ensureGlobalListeners();\n\n // Create fullpage container\n const container = document.createElement(\"div\");\n container.className = cn(\n \"perspective-embed-root perspective-fullpage\",\n getThemeClass(config.theme)\n );\n\n // Create loading indicator with theme and brand colors\n const loading = createLoadingIndicator({\n theme: config.theme,\n brand: config.brand,\n appearance: config._apiConfig?.embedSettings?.appearance,\n });\n container.appendChild(loading);\n\n // Create iframe (hidden initially)\n const overrides = appearanceToParams(config._apiConfig?.embedSettings);\n const iframe = createIframe(\n researchId,\n \"fullpage\",\n host,\n config.params,\n config.brand,\n config.theme,\n overrides\n );\n iframe.style.opacity = \"0\";\n iframe.style.transition = \"opacity 0.3s ease\";\n\n container.appendChild(iframe);\n document.body.appendChild(container);\n enrichContainer(container, \"fullpage\", config);\n\n // Mutable config reference for updates\n let currentConfig = { ...config };\n let messageCleanup: (() => void) | null = null;\n\n // Register iframe for theme change notifications\n const unregisterIframe = registerIframe(iframe, host);\n\n const unmount = () => {\n messageCleanup?.();\n unregisterIframe();\n container.remove();\n currentConfig.onClose?.();\n };\n\n // Set up message listener\n messageCleanup = setupMessageListener(\n researchId,\n {\n get onReady() {\n return () => {\n loading.style.opacity = \"0\";\n iframe.style.opacity = \"1\";\n setTimeout(() => loading.remove(), 300);\n currentConfig.onReady?.();\n };\n },\n get onSubmit() {\n return currentConfig.onSubmit;\n },\n get onNavigate() {\n return currentConfig.onNavigate;\n },\n get onClose() {\n return unmount;\n },\n get onError() {\n return currentConfig.onError;\n },\n },\n iframe,\n host,\n { skipResize: true }\n );\n\n return {\n unmount,\n update: (options) => {\n currentConfig = { ...currentConfig, ...options };\n },\n destroy: unmount,\n researchId,\n type: \"fullpage\" as const,\n iframe,\n container,\n };\n}\n","/**\n * Auto-open trigger system for popup embeds.\n *\n * Supports:\n * - Timeout: Open after a delay (ms)\n * - Exit intent: Open when user moves cursor above viewport\n *\n * Show-once dedup:\n * - \"session\" -> sessionStorage\n * - \"visitor\" -> localStorage\n * - false -> always show\n */\n\nimport { STORAGE_KEYS } from \"./constants\";\nimport type { TriggerConfig, ShowOnce } from \"./types\";\n\n/**\n * Parse a trigger attribute value into a TriggerConfig.\n *\n * Formats:\n * - \"timeout:5000\" -> { type: \"timeout\", delay: 5000 }\n * - \"exit-intent\" -> { type: \"exit-intent\" }\n */\nexport function parseTriggerAttr(value: string): TriggerConfig {\n const trimmed = value.trim();\n\n if (trimmed.startsWith(\"timeout:\")) {\n const delay = parseInt(trimmed.slice(\"timeout:\".length), 10);\n if (isNaN(delay) || delay < 0) {\n throw new Error(`Invalid timeout delay: \"${value}\"`);\n }\n return { type: \"timeout\", delay };\n }\n\n if (trimmed === \"timeout\") {\n return { type: \"timeout\", delay: 5000 };\n }\n\n if (trimmed === \"exit-intent\") {\n return { type: \"exit-intent\" };\n }\n\n throw new Error(\n `Unknown trigger type: \"${value}\". Expected \"timeout:<ms>\" or \"exit-intent\".`\n );\n}\n\n/**\n * Set up a trigger that calls `callback` when fired.\n * Returns a cleanup function to teardown the trigger.\n */\nexport function setupTrigger(\n config: TriggerConfig,\n callback: () => void\n): () => void {\n if (config.type === \"timeout\") {\n const timer = setTimeout(callback, config.delay);\n return () => clearTimeout(timer);\n }\n\n if (config.type === \"exit-intent\") {\n const handler = (e: MouseEvent) => {\n if (e.clientY <= 0) {\n callback();\n document.removeEventListener(\"mouseleave\", handler);\n }\n };\n document.addEventListener(\"mouseleave\", handler);\n return () => document.removeEventListener(\"mouseleave\", handler);\n }\n\n // Exhaustive check\n const _exhaustive: never = config;\n throw new Error(\n `Unknown trigger type: ${(_exhaustive as TriggerConfig).type}`\n );\n}\n\nfunction storageKey(researchId: string): string {\n return `${STORAGE_KEYS.triggerShown}:${researchId}`;\n}\n\n/**\n * Parse a show-once attribute value into a ShowOnce.\n *\n * Formats:\n * - \"session\" -> \"session\"\n * - \"visitor\" -> \"visitor\"\n * - \"false\" -> false\n * - anything else -> defaults to \"session\"\n */\nexport function parseShowOnceAttr(value: string | null): ShowOnce {\n if (!value) return \"session\";\n const trimmed = value.trim();\n if (trimmed === \"visitor\") return \"visitor\";\n if (trimmed === \"false\") return false;\n return \"session\";\n}\n\n/**\n * Check if the popup should be shown based on show-once dedup.\n */\nexport function shouldShow(researchId: string, showOnce: ShowOnce): boolean {\n if (showOnce === false) return true;\n\n try {\n const storage = showOnce === \"visitor\" ? localStorage : sessionStorage;\n return storage.getItem(storageKey(researchId)) === null;\n } catch {\n // Storage unavailable (private browsing, etc.) — show anyway\n return true;\n }\n}\n\n/**\n * Mark the popup as shown for dedup purposes.\n */\nexport function markShown(researchId: string, showOnce: ShowOnce): void {\n if (showOnce === false) return;\n\n try {\n const storage = showOnce === \"visitor\" ? localStorage : sessionStorage;\n storage.setItem(storageKey(researchId), \"1\");\n } catch {\n // Storage unavailable — ignore\n }\n}\n","/**\n * Embed config API — fetch theme/appearance/launcher config from the API\n * Shared between CDN (browser.ts) and NPM (React hooks) entry points\n */\n\nimport type { ThemeConfig } from \"./types\";\nimport { getHost } from \"./config\";\n\nexport type EmbedApiConfig = ThemeConfig;\n\nexport const DEFAULT_THEME: ThemeConfig = {\n primaryColor: \"#7c3aed\",\n textColor: \"#ffffff\",\n darkPrimaryColor: \"#a78bfa\",\n darkTextColor: \"#ffffff\",\n};\n\n/** Timeout before falling back to defaults (ms) */\nconst CONFIG_TIMEOUT_MS = 3000;\n\nconst configCache: Map<string, EmbedApiConfig> = new Map();\nconst configInflight: Map<string, Promise<EmbedApiConfig>> = new Map();\n\nfunction cacheKey(researchId: string, host?: string): string {\n return `${getHost(host)}::${researchId}`;\n}\n\n/**\n * Fetch embed config from API (cached, deduplicates in-flight requests).\n * Falls back to DEFAULT_THEME on timeout, network error, or non-200 response.\n */\nexport async function fetchEmbedConfig(\n researchId: string,\n host?: string\n): Promise<EmbedApiConfig> {\n const key = cacheKey(researchId, host);\n\n if (configCache.has(key)) {\n return configCache.get(key)!;\n }\n\n if (configInflight.has(key)) {\n return configInflight.get(key)!;\n }\n\n const promise = (async () => {\n try {\n const resolvedHost = getHost(host);\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), CONFIG_TIMEOUT_MS);\n const res = await fetch(\n `${resolvedHost}/api/v1/embed/config/${researchId}`,\n { signal: controller.signal }\n );\n clearTimeout(timeout);\n if (!res.ok) return DEFAULT_THEME;\n const config = (await res.json()) as EmbedApiConfig;\n configCache.set(key, config);\n return config;\n } catch {\n return DEFAULT_THEME;\n } finally {\n configInflight.delete(key);\n }\n })();\n\n configInflight.set(key, promise);\n return promise;\n}\n"]}