customizable-toast-notification 3.18.0 → 3.18.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/README.md +3 -1
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +1 -1
- package/dist/index.css.d.ts +103 -49
- package/dist/index.css.map +2 -2
- package/dist/index.esm.mjs +3 -3
- package/dist/index.esm.mjs.map +1 -1
- package/dist/index.umd.js +3 -3
- package/dist/index.umd.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/utils/config.js","../src/utils/id.js","../src/utils/dom.js","../src/utils/html-sanitizer.js","../src/components/loader.js","../src/components/toast-utils-core.js","../src/utils/audio.js","../src/utils/spring.js","../src/components/icons.js","../src/components/toast-utils.js","../src/utils/toast-pool.js","../src/components/Toast.js","../src/utils/containerRegistry.js","../src/utils/position.js","../src/utils/PausableTimer.js","../src/utils/toast-broadcast.js","../src/utils/ai-scorer.js","../src/utils/multi-touch.js","../src/components/ToastManager.js","../src/index.js"],"sourcesContent":["/**\n * @typedef {'auto' | 'always' | 'never'} ReducedMotionMode\n */\n\n/**\n * @typedef {'light' | 'dark' | 'high-contrast' | 'compact' | 'spacious' | 'glass'} ToastTheme\n */\n\n/**\n * @typedef {Element | DocumentFragment | ShadowRoot} ToastMountTarget\n */\n\n/**\n * @typedef {Object} ToastMetrics\n * @property {number} activeCount - Currently rendered active toasts\n * @property {number} queueDepth - Number of queued toasts waiting to be displayed\n * @property {number} visibleCount - Count of currently visible toasts\n * @property {number} droppedCount - Number of toasts dropped due to queue overflow\n * @property {number} timestamp - Epoch timestamp (ms) when metrics were recorded\n */\n\n/**\n * @typedef {Object} ToastGlobalConfig\n * @property {number} maxVisible\n * @property {number} maxQueueSize\n * @property {number} zIndex\n * @property {ToastMountTarget | null} targetNode\n * @property {boolean} disableInlineStyles\n * @property {ReducedMotionMode} reducedMotion\n * @property {string} defaultPosition\n * @property {ToastTheme} theme\n * @property {boolean} stacked\n * @property {boolean} swipeToDismiss\n * @property {boolean} sound\n * @property {'modern' | 'retro' | 'futuristic' | 'subtle' | 'bell' | string} [soundPreset]\n * @property {boolean} [pauseOnHover]\n * @property {boolean} syncTabs\n * @property {boolean} aiPrioritization\n * @property {boolean} [debug]\n * @property {((context: { type: string, message: string, duration?: number, options?: Record<string, unknown> }) => number | { score: number }) | null} [priorityScorer]\n * @property {((metrics: ToastMetrics) => void) | null} [onMetrics]\n */\n\nconst DEFAULT_GLOBAL_CONFIG = Object.freeze({\n maxVisible: 3,\n maxQueueSize: 100,\n zIndex: 9999,\n targetNode: null,\n disableInlineStyles: false,\n reducedMotion: \"auto\",\n defaultPosition: \"bottom-right\",\n theme: \"light\",\n stacked: false,\n swipeToDismiss: true,\n sound: true,\n soundPreset: \"modern\",\n pauseOnHover: false,\n syncTabs: false,\n aiPrioritization: false,\n priorityScorer: null,\n onMetrics: null,\n debug: false,\n});\n\nconst globalConfig = { ...DEFAULT_GLOBAL_CONFIG };\n\nfunction isValidMountTarget(value) {\n return value && typeof value === \"object\" && typeof value.appendChild === \"function\";\n}\n\n/**\n * Updates global toast configuration.\n * @param {Partial<ToastGlobalConfig>} [options]\n * @returns {ToastGlobalConfig}\n */\nexport function setConfig(options = {}) {\n if (!options || typeof options !== \"object\" || Array.isArray(options)) {\n return getConfig();\n }\n\n const {\n maxVisible,\n maxQueueSize,\n zIndex,\n targetNode,\n disableInlineStyles,\n reducedMotion,\n defaultPosition,\n theme,\n stacked,\n swipeToDismiss,\n sound,\n soundPreset,\n pauseOnHover,\n syncTabs,\n aiPrioritization,\n priorityScorer,\n onMetrics,\n debug,\n } = options;\n\n if (debug !== undefined) {\n globalConfig.debug = Boolean(debug);\n }\n\n if (maxVisible !== undefined) {\n const v = Number(maxVisible);\n if (Number.isFinite(v) && v > 0) {\n globalConfig.maxVisible = Math.max(1, Math.floor(v));\n }\n }\n\n if (maxQueueSize !== undefined) {\n const q = Number(maxQueueSize);\n if (Number.isFinite(q) && q >= 0) {\n globalConfig.maxQueueSize = Math.floor(q);\n }\n }\n\n if (zIndex !== undefined) {\n const z = Number(zIndex);\n if (Number.isFinite(z)) {\n globalConfig.zIndex = Math.trunc(z);\n }\n }\n\n if (targetNode !== undefined) {\n globalConfig.targetNode = (targetNode && typeof targetNode === \"object\" && typeof targetNode.appendChild === \"function\") ? targetNode : null;\n }\n\n if (disableInlineStyles !== undefined) {\n globalConfig.disableInlineStyles = Boolean(disableInlineStyles);\n }\n\n if (reducedMotion !== undefined) {\n const r = String(reducedMotion || \"auto\").toLowerCase();\n if ([\"auto\", \"always\", \"never\"].includes(r)) {\n globalConfig.reducedMotion = r;\n if (typeof document !== \"undefined\") {\n if (r === \"always\") {\n document.documentElement.setAttribute(\"data-toast-reduced-motion\", \"always\");\n } else if (r === \"never\") {\n document.documentElement.setAttribute(\"data-toast-reduced-motion\", \"never\");\n } else {\n document.documentElement.removeAttribute(\"data-toast-reduced-motion\");\n }\n }\n }\n }\n\n if (defaultPosition !== undefined) {\n const p = String(defaultPosition || \"\").toLowerCase().trim();\n if (p) {\n globalConfig.defaultPosition = p;\n }\n }\n\n if (theme !== undefined) {\n const t = String(theme || \"light\").toLowerCase();\n if ([\"light\", \"dark\", \"high-contrast\", \"compact\", \"spacious\", \"glass\"].includes(t)) {\n globalConfig.theme = t;\n // Apply theme to document root\n if (typeof document !== \"undefined\") {\n document.documentElement.setAttribute(\"data-toast-theme\", t);\n }\n }\n }\n\n if (stacked !== undefined) {\n globalConfig.stacked = Boolean(stacked);\n }\n\n if (swipeToDismiss !== undefined) {\n globalConfig.swipeToDismiss = Boolean(swipeToDismiss);\n }\n\n if (sound !== undefined) {\n globalConfig.sound = Boolean(sound);\n }\n\n if (soundPreset !== undefined) {\n const sp = String(soundPreset || \"modern\").toLowerCase().trim();\n if (sp) {\n globalConfig.soundPreset = sp;\n }\n }\n\n if (pauseOnHover !== undefined) {\n globalConfig.pauseOnHover = Boolean(pauseOnHover);\n }\n\n if (syncTabs !== undefined) {\n globalConfig.syncTabs = Boolean(syncTabs);\n }\n\n if (aiPrioritization !== undefined) {\n globalConfig.aiPrioritization = Boolean(aiPrioritization);\n }\n\n if (priorityScorer !== undefined) {\n globalConfig.priorityScorer = typeof priorityScorer === \"function\" ? priorityScorer : null;\n }\n\n if (onMetrics !== undefined) {\n globalConfig.onMetrics = typeof onMetrics === \"function\" ? onMetrics : null;\n }\n\n return getConfig();\n}\n\n/**\n * Resets global toast configuration back to pristine defaults.\n * Cleans up DOM attributes attached to document.documentElement.\n * @returns {ToastGlobalConfig}\n */\nexport function resetConfig() {\n Object.assign(globalConfig, DEFAULT_GLOBAL_CONFIG);\n if (typeof document !== \"undefined\") {\n document.documentElement.removeAttribute(\"data-toast-theme\");\n document.documentElement.removeAttribute(\"data-toast-reduced-motion\");\n }\n return getConfig();\n}\n\n/**\n * Returns a snapshot of the current global toast configuration.\n * @returns {ToastGlobalConfig}\n */\nexport function getConfig() {\n return { ...globalConfig };\n}\n\n/**\n * Returns the current mount root, falling back to document.body.\n * @returns {ToastMountTarget | HTMLElement | null}\n */\nexport function getToastRoot() {\n if (isValidMountTarget(globalConfig.targetNode)) return globalConfig.targetNode;\n if (typeof document !== \"undefined\") return document.body;\n return null;\n}\n\n/**\n * Whether toast animations should be reduced for accessibility.\n * @returns {boolean}\n */\nexport function shouldReduceMotion() {\n if (globalConfig.reducedMotion === \"always\") return true;\n if (globalConfig.reducedMotion === \"never\") return false;\n try {\n return Boolean(\n typeof window !== \"undefined\" &&\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches,\n );\n } catch {\n return false;\n }\n}\n","// src/utils/id.js\n\"use strict\";\n\nlet counter = 0;\n\n// Tab/Session-level unique salt (deterministic & safe across all environments)\nconst sessionSalt = Math.floor(Math.random() * 0xffff)\n .toString(36)\n .padStart(3, \"0\");\n\n/**\n * Reset the internal monotonic counter (primarily for test isolation)\n * @returns {void}\n */\nexport function resetToastIdCounter() {\n counter = 0;\n}\n\n/**\n * Generate unique, CSS-safe ID for DOM elements.\n * Combines sanitized prefix, millisecond timestamp, and monotonic counter with session salt.\n * Guarantees 0% collision rate without HTTP/HTTPS secure context restrictions.\n *\n * @param {string} [prefix=\"toast\"] - Optional prefix for ID\n * @returns {string} Unique ID matching /^toast-[a-z0-9]+-[a-z0-9]+$/\n */\nexport function generateToastId(prefix = \"toast\") {\n const cleanPrefix =\n typeof prefix === \"string\"\n ? prefix\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n : \"\";\n\n const safePrefix =\n cleanPrefix && !/^[0-9]/.test(cleanPrefix) ? cleanPrefix : \"toast\";\n\n const timestamp = Date.now().toString(36);\n\n // Monotonic increment: 0% collision mathematically guaranteed\n counter = (counter + 1) & 0xffffff;\n const countPart = counter.toString(36);\n\n return `${safePrefix}-${timestamp}-${sessionSalt}${countPart}`;\n}\n","\"use strict\";\n\nimport { generateToastId } from \"./id.js\";\n\nexport async function createElementWithId(tagName, prefix) {\n if (!tagName || !prefix) throw new Error(\"tagName and prefix are required\");\n const el = document.createElement(tagName);\n el.id = generateToastId(prefix);\n return el;\n}\n\nexport async function appendChild(parent, child) {\n if (!parent || !child) return false;\n\n try {\n if (!parent.contains(child)) parent.appendChild(child);\n return true;\n } catch (primaryError) {\n console.warn(\"appendChild primary failed:\", primaryError);\n try {\n parent.insertAdjacentElement(\"beforeend\", child);\n return true;\n } catch (fallbackError) {\n console.warn(\"appendChild fallback failed:\", fallbackError);\n try {\n if (parent && typeof parent.appendChild === \"function\") {\n console.warn(\n \"appendChild: using last-resort cloneNode fallback — the \" +\n \"appended element's event listeners (close button, CTA \" +\n \"clicks, etc.) will NOT work, since cloneNode() does not \" +\n \"copy JS-attached listeners. This path only runs when both \" +\n \"the primary appendChild and insertAdjacentElement calls \" +\n \"already failed.\",\n );\n const clone = child.cloneNode(true);\n parent.appendChild(clone);\n return false; // Return false to indicate fallback was used and listeners lost\n }\n } catch (emergencyError) {\n console.error(\"appendChild emergency failed:\", emergencyError);\n return false;\n }\n }\n }\n return false;\n}\n\nexport async function removeElement(el) {\n if (!el) return true;\n\n try {\n if (typeof el.remove === \"function\") {\n el.remove();\n return true;\n }\n } catch {}\n\n try {\n if (el.parentNode) {\n el.parentNode.removeChild(el);\n return true;\n }\n } catch {}\n\n return false;\n}\n\nexport async function parseAnimationDuration(duration) {\n if (typeof duration === \"number\" && Number.isFinite(duration) && duration >= 0) return duration;\n if (typeof duration === \"string\") {\n const trimmed = duration.trim().toLowerCase();\n if (trimmed.endsWith(\"s\") && !trimmed.endsWith(\"ms\")) {\n const parsed = parseFloat(trimmed) * 1000;\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : 500;\n }\n const parsed = parseFloat(trimmed);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : 500;\n }\n return 500;\n}\n\nexport function forceReflow(el) {\n try {\n return el?.offsetWidth || 0;\n } catch {\n return 0;\n }\n}\n\nexport function query(selector, root = (typeof document !== \"undefined\" ? document : null)) {\n return root?.querySelector ? root.querySelector(selector) : null;\n}\n\nclass LRUCache {\n constructor(maxSize = 200) {\n this.maxSize = maxSize;\n this.map = new Map();\n }\n\n get(key) {\n if (!this.map.has(key)) return undefined;\n const value = this.map.get(key);\n this.map.delete(key);\n this.map.set(key, value);\n return value;\n }\n\n set(key, value) {\n if (this.map.has(key)) this.map.delete(key);\n else if (this.map.size >= this.maxSize) {\n const firstKey = this.map.keys().next().value;\n this.map.delete(firstKey);\n }\n this.map.set(key, value);\n }\n}\n\nconst colorCache = new LRUCache(200);\n\nconst namedColors = {\n aliceblue: [240, 248, 255],\n antiquewhite: [250, 235, 215],\n aqua: [0, 255, 255],\n aquamarine: [127, 255, 212],\n azure: [240, 255, 255],\n beige: [245, 245, 220],\n bisque: [255, 228, 196],\n black: [0, 0, 0],\n blanchedalmond: [255, 235, 205],\n blue: [0, 0, 255],\n blueviolet: [138, 43, 226],\n brown: [165, 42, 42],\n burlywood: [222, 184, 135],\n cadetblue: [95, 158, 160],\n chartreuse: [127, 255, 0],\n chocolate: [210, 105, 30],\n coral: [255, 127, 80],\n cornflowerblue: [100, 149, 237],\n cornsilk: [255, 248, 220],\n crimson: [220, 20, 60],\n cyan: [0, 255, 255],\n darkblue: [0, 0, 139],\n darkcyan: [0, 139, 139],\n darkgoldenrod: [184, 134, 11],\n darkgray: [169, 169, 169],\n darkgreen: [0, 100, 0],\n darkgrey: [169, 169, 169],\n darkkhaki: [189, 183, 107],\n darkmagenta: [139, 0, 139],\n darkolivegreen: [85, 107, 47],\n darkorange: [255, 140, 0],\n darkorchid: [153, 50, 204],\n darkred: [139, 0, 0],\n darksalmon: [233, 150, 122],\n darkseagreen: [143, 188, 143],\n darkslateblue: [72, 61, 139],\n darkslategray: [47, 79, 79],\n darkslategrey: [47, 79, 79],\n darkturquoise: [0, 206, 209],\n darkviolet: [148, 0, 211],\n deeppink: [255, 20, 147],\n deepskyblue: [0, 191, 255],\n dimgray: [105, 105, 105],\n dimgrey: [105, 105, 105],\n dodgerblue: [30, 144, 255],\n firebrick: [178, 34, 34],\n floralwhite: [255, 250, 240],\n forestgreen: [34, 139, 34],\n fuchsia: [255, 0, 255],\n gainsboro: [220, 220, 220],\n ghostwhite: [248, 248, 255],\n gold: [255, 215, 0],\n goldenrod: [218, 165, 32],\n gray: [128, 128, 128],\n green: [0, 128, 0],\n greenyellow: [173, 255, 47],\n grey: [128, 128, 128],\n honeydew: [240, 255, 240],\n hotpink: [255, 105, 180],\n indianred: [205, 92, 92],\n indigo: [75, 0, 130],\n ivory: [255, 255, 240],\n khaki: [240, 230, 140],\n lavender: [230, 230, 250],\n lavenderblush: [255, 240, 245],\n lawngreen: [124, 252, 0],\n lemonchiffon: [255, 250, 205],\n lightblue: [173, 216, 230],\n lightcoral: [240, 128, 128],\n lightcyan: [224, 255, 255],\n lightgoldenrodyellow: [250, 250, 210],\n lightgray: [211, 211, 211],\n lightgreen: [144, 238, 144],\n lightgrey: [211, 211, 211],\n lightpink: [255, 182, 193],\n lightsalmon: [255, 160, 122],\n lightseagreen: [32, 178, 170],\n lightskyblue: [135, 206, 250],\n lightslategray: [119, 136, 153],\n lightslategrey: [119, 136, 153],\n lightsteelblue: [176, 196, 222],\n lightyellow: [255, 255, 224],\n lime: [0, 255, 0],\n limegreen: [50, 205, 50],\n linen: [250, 240, 230],\n magenta: [255, 0, 255],\n maroon: [128, 0, 0],\n mediumaquamarine: [102, 205, 170],\n mediumblue: [0, 0, 205],\n mediumorchid: [186, 85, 211],\n mediumpurple: [147, 112, 219],\n mediumseagreen: [60, 179, 113],\n mediumslateblue: [123, 104, 238],\n mediumspringgreen: [0, 250, 154],\n mediumturquoise: [72, 209, 204],\n mediumvioletred: [199, 21, 133],\n midnightblue: [25, 25, 112],\n mintcream: [245, 255, 250],\n mistyrose: [255, 228, 225],\n moccasin: [255, 228, 181],\n navajowhite: [255, 222, 173],\n navy: [0, 0, 128],\n oldlace: [253, 245, 230],\n olive: [128, 128, 0],\n olivedrab: [107, 142, 35],\n orange: [255, 165, 0],\n orangered: [255, 69, 0],\n orchid: [218, 112, 214],\n palegoldenrod: [238, 232, 170],\n palegreen: [152, 251, 152],\n paleturquoise: [175, 238, 238],\n palevioletred: [219, 112, 147],\n papayawhip: [255, 239, 213],\n peachpuff: [255, 218, 185],\n peru: [205, 133, 63],\n pink: [255, 192, 203],\n plum: [221, 160, 221],\n powderblue: [176, 224, 230],\n purple: [128, 0, 128],\n rebeccapurple: [102, 51, 153],\n red: [255, 0, 0],\n rosybrown: [188, 143, 143],\n royalblue: [65, 105, 225],\n saddlebrown: [139, 69, 19],\n salmon: [250, 128, 114],\n sandybrown: [244, 164, 96],\n seagreen: [46, 139, 87],\n seashell: [255, 245, 238],\n sienna: [160, 82, 45],\n silver: [192, 192, 192],\n skyblue: [135, 206, 235],\n slateblue: [106, 90, 205],\n slategray: [112, 128, 144],\n slategrey: [112, 128, 144],\n snow: [255, 250, 250],\n springgreen: [0, 255, 127],\n steelblue: [70, 130, 180],\n tan: [210, 180, 140],\n teal: [0, 128, 128],\n thistle: [216, 191, 216],\n tomato: [255, 99, 71],\n transparent: [255, 255, 255],\n turquoise: [64, 224, 208],\n violet: [238, 130, 238],\n wheat: [245, 222, 179],\n white: [255, 255, 255],\n whitesmoke: [245, 245, 245],\n yellow: [255, 255, 0],\n yellowgreen: [154, 205, 50],\n};\n\nconst precomputedNamedTextColors = {};\nObject.entries(namedColors).forEach(([name, [r, g, b]]) => {\n const lum = (c) => {\n const v = c / 255;\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n };\n const L = 0.2126 * lum(r) + 0.7152 * lum(g) + 0.0722 * lum(b);\n const contrastBlack = (L + 0.05) / 0.05;\n const contrastWhite = 1.05 / (L + 0.05);\n precomputedNamedTextColors[name.toLowerCase()] =\n contrastBlack >= contrastWhite ? \"#000000\" : \"#ffffff\";\n});\n\nexport function getDynamicAccessibleTextColorHex(toastBg) {\n if (!toastBg) return \"#ffffff\";\n\n const key = String(toastBg);\n const cached = colorCache.get(key);\n if (cached) return cached;\n\n if (precomputedNamedTextColors[toastBg?.toLowerCase()]) {\n const textColor = precomputedNamedTextColors[toastBg.toLowerCase()];\n colorCache.set(key, textColor);\n return textColor;\n }\n\n let r, g, b;\n\n // AUDIT FIX (H2): this function previously only understood hex and\n // rgb()/rgba() strings. Anything else — hsl(), a CSS custom property\n // like var(--brand), any modern color syntax — fell straight into the\n // catch block below, which used to assign a RANDOM RGB triplet as the\n // \"background\" driving the black-vs-white text decision. For a function\n // whose entire purpose is accessibility, that meant it could pick white\n // text on a light background (or the reverse) for any color format it\n // didn't recognize, and the choice wasn't even stable between calls for\n // the same input. Two changes: (1) genuinely parse hsl()/hsla() and CSS\n // custom properties instead of giving up on them, (2) for the cases\n // that are still truly unparseable, fall back to a fixed neutral\n // midpoint gray instead of Math.random() — deterministic and\n // reasonable, never actively wrong in a random direction.\n function resolveCssCustomProperty(value) {\n if (typeof value !== \"string\") return value;\n const trimmed = value.trim();\n if (!trimmed.toLowerCase().startsWith(\"var(\") || !trimmed.endsWith(\")\")) {\n return value;\n }\n const inner = trimmed.slice(4, -1).trim();\n const commaIndex = inner.indexOf(\",\");\n const propName = (commaIndex === -1 ? inner : inner.slice(0, commaIndex)).trim();\n const fallbackVal = commaIndex === -1 ? \"\" : inner.slice(commaIndex + 1).trim();\n\n if (!propName.startsWith(\"--\")) return value;\n\n try {\n if (\n typeof document !== \"undefined\" &&\n typeof getComputedStyle === \"function\"\n ) {\n const resolved = getComputedStyle(document.documentElement)\n .getPropertyValue(propName)\n .trim();\n if (resolved) return resolved;\n }\n } catch (e) {}\n // Fall back to the var()'s own declared fallback value, if it had one\n // (e.g. var(--brand, #336699)), before giving up entirely.\n return fallbackVal || value;\n }\n\n function parseToRgb(value) {\n const hexMatch = value?.match(/^#(?:([0-9a-f]{3,4})|([0-9a-f]{6})|([0-9a-f]{8}))$/i);\n if (hexMatch) {\n let hex = hexMatch[1] || hexMatch[2] || hexMatch[3];\n if (hex.length === 3 || hex.length === 4) {\n hex = hex\n .slice(0, 3)\n .split(\"\")\n .map((c) => c + c)\n .join(\"\");\n }\n if (hex.length >= 6) {\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n if (Number.isFinite(r) && Number.isFinite(g) && Number.isFinite(b)) {\n return { r, g, b };\n }\n }\n return null;\n }\n\n const rgbMatch = value?.match(\n /rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*[\\d.]+)?\\)/i,\n );\n if (rgbMatch) {\n return {\n r: Number(rgbMatch[1]),\n g: Number(rgbMatch[2]),\n b: Number(rgbMatch[3]),\n };\n }\n\n const rgbSpaceMatch = value?.match(\n /rgba?\\(\\s*(\\d+)\\s+(\\d+)\\s+(\\d+)(?:\\s*\\/\\s*[\\d.%]+)?\\s*\\)/i,\n );\n if (rgbSpaceMatch) {\n return {\n r: Number(rgbSpaceMatch[1]),\n g: Number(rgbSpaceMatch[2]),\n b: Number(rgbSpaceMatch[3]),\n };\n }\n\n const hslMatch = value?.match(\n /hsla?\\(\\s*([\\d.]+)(?:deg)?\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%(?:\\s*,\\s*[\\d.]+)?\\)/i,\n );\n if (hslMatch) {\n const h = Number(hslMatch[1]) / 360;\n const s = Number(hslMatch[2]) / 100;\n const l = Number(hslMatch[3]) / 100;\n if (s === 0) {\n const gray = Math.round(l * 255);\n return { r: gray, g: gray, b: gray };\n }\n const hue2rgb = (p, q, t) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n return {\n r: Math.round(hue2rgb(p, q, h + 1 / 3) * 255),\n g: Math.round(hue2rgb(p, q, h) * 255),\n b: Math.round(hue2rgb(p, q, h - 1 / 3) * 255),\n };\n }\n\n return null;\n }\n\n try {\n const cleanBg = typeof toastBg === \"string\" ? toastBg.trim() : String(toastBg || \"\");\n const resolvedBg = resolveCssCustomProperty(cleanBg).trim();\n const parsed = parseToRgb(resolvedBg);\n if (!parsed) throw new Error(\"Unknown color\");\n ({ r, g, b } = parsed);\n } catch {\n // Deterministic neutral fallback — a mid-gray reads reasonably against\n // either black or white text, and critically, gives the SAME answer\n // every time for the same unparseable input instead of a coin flip.\n r = g = b = 128;\n }\n\n const rgbToHsl = (r, g, b) => {\n r /= 255;\n g /= 255;\n b /= 255;\n const max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n let h,\n s,\n l = (max + min) / 2;\n if (max === min) h = s = 0;\n else {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n }\n h /= 6;\n }\n return [h * 360, s, l];\n };\n const hslToRgb = (h, s, l) => {\n h /= 360;\n let r, g, b;\n if (s === 0) r = g = b = l;\n else {\n const hue2rgb = (p, q, t) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];\n };\n const luminance = (r, g, b) => {\n const a = [r, g, b].map((v) => {\n v /= 255;\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n });\n return 0.2126 * a[0] + 0.7152 * a[1] + 0.0722 * a[2];\n };\n const contrastRatio = (rgb1, rgb2) => {\n const L1 = luminance(...rgb1);\n const L2 = luminance(...rgb2);\n return (Math.max(L1, L2) + 0.05) / (Math.min(L1, L2) + 0.05);\n };\n const rgbToHex = (r, g, b) =>\n `#${r.toString(16).padStart(2, \"0\")}${g.toString(16).padStart(2, \"0\")}${b\n .toString(16)\n .padStart(2, \"0\")}`;\n\n let [h, s, l] = rgbToHsl(r, g, b);\n const minContrast = 4.5;\n let textL = l < 0.5 ? Math.min(l + 0.5, 1) : Math.max(l - 0.5, 0);\n let [tr, tg, tb] = hslToRgb(h, s, textL);\n\n if (contrastRatio([r, g, b], [tr, tg, tb]) < minContrast) {\n const contrastBlack = contrastRatio([r, g, b], [0, 0, 0]);\n const contrastWhite = contrastRatio([r, g, b], [255, 255, 255]);\n [tr, tg, tb] = contrastBlack >= contrastWhite ? [0, 0, 0] : [255, 255, 255];\n }\n\n const result = rgbToHex(tr, tg, tb);\n colorCache.set(key, result);\n return result;\n}\n","// AUDIT FIX (H1): these used to live inside fallbackSanitize() only, which\n// meant sanitizeHtml()'s DOMPurify branch had no way to reference them —\n// it just used DOMPurify's own (much broader) default allowlist instead.\n// Same allowHtml:true input could sanitize completely differently\n// depending on whether some UNRELATED script on the host page happened to\n// load DOMPurify onto window — a security boundary that was an\n// environmental accident rather than a deliberate, consistent policy.\n// Hoisting these to module scope makes them the single source of truth\n// for BOTH paths, so the same input gets the same treatment regardless of\n// which sanitizer implementation actually runs.\nconst ALLOWED_TAGS = new Set([\n \"DIV\",\n \"SPAN\",\n \"P\",\n \"BR\",\n \"STRONG\",\n \"B\",\n \"EM\",\n \"I\",\n \"U\",\n \"SMALL\",\n \"UL\",\n \"OL\",\n \"LI\",\n \"A\",\n \"IMG\",\n \"PRE\",\n \"CODE\",\n \"MARK\",\n]);\n// AUDIT FIX (C1 — security): 'style' was previously allowed through with\n// zero validation, letting an attacker-controlled message (allowHtml:true)\n// inject `position:fixed;inset:0;z-index:999999` and render a full-page\n// clickjacking overlay through a toast that already renders at\n// z-index:9999. Inline style is a well-known sanitizer bypass class (see\n// OWASP's XSS Filter Evasion Cheat Sheet). Removed from the allowlist\n// entirely rather than attempting partial validation — toasts don't need\n// arbitrary inline styling to be useful, and \"no unchecked style\" is the\n// safe default most reputable sanitizers ship with.\nconst ALLOWED_ATTRS = new Set([\n \"href\",\n \"src\",\n \"alt\",\n \"title\",\n \"class\",\n \"target\",\n \"rel\",\n \"loading\",\n]);\n\nconst DISCARDED_TAGS = new Set([\n \"SCRIPT\",\n \"STYLE\",\n \"IFRAME\",\n \"NOSCRIPT\",\n \"OBJECT\",\n \"EMBED\",\n \"SVG\",\n \"MATH\",\n \"AUDIO\",\n \"VIDEO\",\n \"CANVAS\",\n \"TEMPLATE\",\n]);\n\nconst ALLOWED_URI_REGEX = /^\\s*(?:https?:|mailto:|data:image\\/(?:png|jpe?g|gif|webp|avif|bmp|ico);|\\/(?!\\/|\\\\)|\\.\\/|\\.\\.\\/|#)/i;\n\nexport function hasDOMPurify() {\n try {\n return Boolean(\n typeof window !== \"undefined\" &&\n window.DOMPurify &&\n typeof window.DOMPurify.sanitize === \"function\"\n );\n } catch (e) {}\n return false;\n}\n\nfunction sanitizeAttributes(el, allowedAttrs) {\n const attrsToRemove = [];\n Array.from(el.attributes || []).forEach((attr) => {\n const name = attr.name.toLowerCase();\n const val = attr.value;\n if (!allowedAttrs.has(name) || name.startsWith(\"on\")) {\n attrsToRemove.push(attr.name);\n return;\n }\n if (name === \"href\" || name === \"src\") {\n const trimmedVal = typeof val === \"string\" ? val.trim().toLowerCase() : \"\";\n if (\n trimmedVal.startsWith(\"javascript:\") ||\n trimmedVal.startsWith(\"vbscript:\") ||\n trimmedVal.startsWith(\"data:\")\n ) {\n if (\n name === \"src\" &&\n trimmedVal.startsWith(\"data:image/\") &&\n !trimmedVal.startsWith(\"data:image/svg+xml\")\n ) {\n // Allowed raster image data URI for <img> tags\n } else {\n if (name === \"href\") {\n el.setAttribute(\"href\", \"#\");\n return;\n }\n attrsToRemove.push(attr.name);\n return;\n }\n }\n if (!ALLOWED_URI_REGEX.test(val)) {\n if (name === \"href\") {\n el.setAttribute(\"href\", \"#\");\n return;\n }\n attrsToRemove.push(attr.name);\n return;\n }\n }\n if (name === \"target\" && typeof val === \"string\" && val.trim().toLowerCase() === \"_blank\") {\n const rel = (el.getAttribute(\"rel\") || \"\").split(/\\s+/).filter(Boolean);\n if (!rel.includes(\"noopener\")) rel.push(\"noopener\");\n if (!rel.includes(\"noreferrer\")) rel.push(\"noreferrer\");\n el.setAttribute(\"rel\", rel.join(\" \"));\n }\n });\n attrsToRemove.forEach((name) => el.removeAttribute(name));\n\n const finalTarget = el.getAttribute(\"target\");\n if (el.tagName === \"A\" && typeof finalTarget === \"string\" && finalTarget.trim().toLowerCase() === \"_blank\") {\n const rel = (el.getAttribute(\"rel\") || \"\").split(/\\s+/).filter(Boolean);\n if (!rel.includes(\"noopener\")) rel.push(\"noopener\");\n if (!rel.includes(\"noreferrer\")) rel.push(\"noreferrer\");\n el.setAttribute(\"rel\", rel.join(\" \"));\n }\n}\n\nfunction sanitizeNode(node, allowedTags, allowedAttrs) {\n if (node.nodeType === Node.TEXT_NODE) {\n return document.createTextNode(node.nodeValue);\n }\n if (node.nodeType === Node.COMMENT_NODE) {\n return null;\n }\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return null;\n }\n const tag = node.tagName.toUpperCase();\n if (\n DISCARDED_TAGS.has(tag) ||\n tag.includes(\"SCRIPT\") ||\n tag.includes(\"<\") ||\n tag.includes(\">\")\n ) {\n return null;\n }\n if (!allowedTags.has(tag)) {\n const frag = document.createDocumentFragment();\n Array.from(node.childNodes).forEach((child) => {\n const sanitized = sanitizeNode(child, allowedTags, allowedAttrs);\n if (sanitized) frag.appendChild(sanitized);\n });\n return frag;\n }\n const el = document.createElement(node.tagName);\n Array.from(node.attributes || []).forEach((attr) => {\n el.setAttribute(attr.name, attr.value);\n });\n sanitizeAttributes(el, allowedAttrs);\n Array.from(node.childNodes).forEach((child) => {\n const sanitizedChild = sanitizeNode(child, allowedTags, allowedAttrs);\n if (sanitizedChild) el.appendChild(sanitizedChild);\n });\n return el;\n}\n\nfunction parseHtmlInert(html) {\n if (typeof DOMParser !== \"undefined\") {\n try {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n if (doc && doc.body) return doc.body;\n } catch {}\n }\n if (typeof document !== \"undefined\") {\n const template = document.createElement(\"template\");\n if (\"content\" in template) {\n template.innerHTML = html;\n return template.content;\n }\n const div = document.createElement(\"div\");\n div.innerHTML = html;\n return div;\n }\n return null;\n}\n\nexport function fallbackSanitize(dirty) {\n if (!dirty || typeof dirty !== \"string\") return \"\";\n\n const container = parseHtmlInert(dirty);\n if (!container) return \"\";\n\n const outFrag = document.createDocumentFragment();\n Array.from(container.childNodes).forEach((child) => {\n const sanitized = sanitizeNode(child, ALLOWED_TAGS, ALLOWED_ATTRS);\n if (sanitized) outFrag.appendChild(sanitized);\n });\n\n const wrapper = document.createElement(\"div\");\n wrapper.appendChild(outFrag);\n\n wrapper.querySelectorAll('a[target=\"_blank\"]').forEach((a) => {\n const rel = (a.getAttribute(\"rel\") || \"\").split(/\\s+/).filter(Boolean);\n if (!rel.includes(\"noopener\")) rel.push(\"noopener\");\n if (!rel.includes(\"noreferrer\")) rel.push(\"noreferrer\");\n a.setAttribute(\"rel\", rel.join(\" \"));\n });\n\n return wrapper.innerHTML;\n}\n\nexport function sanitizeHtml(dirty, opts = {}) {\n if (typeof dirty !== \"string\" || !dirty.trim()) return \"\";\n try {\n if (!opts.forceFallback && hasDOMPurify()) {\n const DOMPurify = window.DOMPurify;\n const cleaned = DOMPurify.sanitize(dirty, {\n ALLOWED_TAGS: Array.from(ALLOWED_TAGS),\n ALLOWED_ATTR: Array.from(ALLOWED_ATTRS),\n ALLOWED_URI_REGEXP:\n /^(?:(?:https?|mailto|ftp|tel):|data:image\\/(?:png|jpeg|jpg|gif|webp|avif|bmp|ico);base64,|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i,\n });\n\n const wrapper = document.createElement(\"div\");\n wrapper.innerHTML = cleaned;\n wrapper.querySelectorAll(\"a[href]\").forEach((a) => {\n const h = (a.getAttribute(\"href\") || \"\").trim().toLowerCase();\n if (h.startsWith(\"data:\") || h.startsWith(\"javascript:\") || h.startsWith(\"vbscript:\")) {\n a.setAttribute(\"href\", \"#\");\n }\n });\n wrapper.querySelectorAll('a[target=\"_blank\"]').forEach((a) => {\n const rel = (a.getAttribute(\"rel\") || \"\").split(/\\s+/).filter(Boolean);\n if (!rel.includes(\"noopener\")) rel.push(\"noopener\");\n if (!rel.includes(\"noreferrer\")) rel.push(\"noreferrer\");\n a.setAttribute(\"rel\", rel.join(\" \"));\n });\n return wrapper.innerHTML;\n }\n } catch (err) {\n console.warn(\"DOMPurify sanitization failed, falling back:\", err);\n }\n return fallbackSanitize(dirty);\n}","// src/components/loader.js\nimport { getConfig, shouldReduceMotion } from \"../utils/config.js\";\n\nexport function createLoader(opts = {}) {\n const safeOpts = opts && typeof opts === \"object\" && !Array.isArray(opts) ? opts : {};\n const rawSize = Number(safeOpts.size);\n const size = Number.isFinite(rawSize) && rawSize > 0 ? rawSize : 14;\n const color = typeof safeOpts.color === \"string\" && safeOpts.color.trim() ? safeOpts.color.trim() : \"currentColor\";\n const labelText = typeof safeOpts.text === \"string\" ? safeOpts.text : \"\";\n const wrapper = document.createElement(\"span\");\n wrapper.className = \"toast-loader\";\n wrapper.setAttribute(\"role\", \"status\");\n wrapper.setAttribute(\"aria-label\", labelText || \"Loading\");\n\n const config = getConfig();\n if (!config.disableInlineStyles) {\n wrapper.style.display = \"inline-flex\";\n wrapper.style.alignItems = \"center\";\n wrapper.style.gap = \"8px\";\n }\n\n const svgNS = \"http://www.w3.org/2000/svg\";\n const svg = document.createElementNS(svgNS, \"svg\");\n svg.setAttribute(\"width\", String(size));\n svg.setAttribute(\"height\", String(size));\n svg.setAttribute(\"viewBox\", \"0 0 50 50\");\n svg.setAttribute(\"aria-hidden\", \"true\");\n const circle = document.createElementNS(svgNS, \"circle\");\n circle.classList.add(\"toast-loader-circle\");\n circle.setAttribute(\"cx\", \"25\");\n circle.setAttribute(\"cy\", \"25\");\n circle.setAttribute(\"r\", \"20\");\n circle.setAttribute(\"fill\", \"none\");\n circle.setAttribute(\"stroke\", color);\n circle.setAttribute(\"stroke-width\", \"4\");\n circle.setAttribute(\"stroke-linecap\", \"round\");\n if (!config.disableInlineStyles) {\n circle.style.opacity = \"0.85\";\n circle.style.strokeDasharray = \"90\";\n circle.style.strokeDashoffset = \"60\";\n circle.style.transformOrigin = \"center\";\n if (!shouldReduceMotion()) {\n circle.style.animation = \"toast-spinner 1s linear infinite\";\n }\n }\n\n svg.appendChild(circle);\n wrapper.appendChild(svg);\n\n if (labelText) {\n const lbl = document.createElement(\"span\");\n lbl.className = \"toast-loader-label\";\n if (!config.disableInlineStyles) {\n lbl.style.fontSize = \"13px\";\n }\n lbl.textContent = labelText;\n wrapper.appendChild(lbl);\n }\n\n if (!config.disableInlineStyles && typeof document !== \"undefined\" && !document.getElementById(\"toast-spinner-styles\")) {\n const st = document.createElement(\"style\");\n st.id = \"toast-spinner-styles\";\n st.textContent = `@keyframes toast-spinner { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }`;\n const target = document.head || document.documentElement;\n if (target) target.appendChild(st);\n }\n\n return wrapper;\n}\n","import { getDynamicAccessibleTextColorHex } from \"../utils/dom.js\";\nimport { getConfig, shouldReduceMotion } from \"../utils/config.js\";\n\nexport function createCTA(toast, options, onClose) {\n const rawCfg = options?.cta;\n if (!rawCfg || typeof rawCfg !== \"object\") return;\n\n const configs = Array.isArray(rawCfg)\n ? rawCfg.filter((item) => item && typeof item === \"object\")\n : [rawCfg];\n if (configs.length === 0) return;\n\n const cleanups = [];\n\n configs.forEach((raw, idx) => {\n if (!raw || typeof raw !== \"object\") return;\n const cfg = { ...raw };\n\n if (!cfg.label) {\n cfg.label = configs.length > 1 ? `Action ${idx + 1}` : \"CTA Label Missing!\";\n }\n\n const isLink = cfg.variant === \"link\" || (!cfg.variant && !!cfg.href);\n const el = document.createElement(isLink ? \"a\" : \"button\");\n\n if (isLink) {\n if (cfg.href) {\n const trimmedHref = String(cfg.href).trim();\n const isDangerous = /^(javascript:|vbscript:|data:(?!image\\/[a-z0-9.+-]+;base64,))/i.test(trimmedHref);\n el.href = isDangerous ? \"#\" : trimmedHref;\n } else {\n el.setAttribute(\"role\", \"button\");\n el.tabIndex = 0;\n }\n if (cfg.target) el.target = cfg.target;\n const relSet = new Set((cfg.rel || \"\").split(/\\s+/).filter(Boolean));\n if (typeof cfg.target === \"string\" && cfg.target.trim().toLowerCase() === \"_blank\") {\n relSet.add(\"noopener\");\n relSet.add(\"noreferrer\");\n }\n el.rel = Array.from(relSet).join(\" \");\n } else {\n el.type = \"button\";\n }\n\n el.setAttribute(\"aria-label\", cfg.ariaLabel || cfg.label);\n\n const ctaTextColor =\n cfg.textColor ||\n cfg.color ||\n options.textColor ||\n getDynamicAccessibleTextColorHex(options.backgroundColor);\n const ctaBgColor =\n cfg.backgroundColor ||\n cfg.background ||\n (options.backgroundColor\n ? getContrastBackground(options.backgroundColor)\n : \"rgba(255,255,255,0.15)\");\n\n const isHex6 = typeof ctaTextColor === \"string\" && /^#[0-9a-fA-F]{6}$/.test(ctaTextColor.trim());\n const ctaBorderColor = isHex6 ? `${ctaTextColor.trim()}44` : \"rgba(128, 128, 128, 0.3)\";\n\n el.className = \"toast-cta\";\n if (!getConfig().disableInlineStyles) {\n Object.assign(el.style, {\n marginLeft: idx === 0 ? \"10px\" : \"6px\",\n padding: \"6px 10px\",\n borderRadius: \"6px\",\n fontSize: \"12px\",\n fontWeight: \"600\",\n lineHeight: \"1\",\n border: `1px solid ${ctaBorderColor}`,\n color: ctaTextColor,\n background: ctaBgColor,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n flexShrink: \"0\",\n });\n }\n\n el.textContent = cfg.label;\n\n const onClick = async (e) => {\n try {\n if (typeof cfg.onClick === \"function\") {\n const res = cfg.onClick(e);\n if (res?.then) await res;\n }\n } catch (err) {\n console.error(\"CTA onClick handler error:\", err);\n } finally {\n if (cfg.autoClose !== false && typeof onClose === \"function\") {\n onClose(toast);\n }\n }\n };\n\n const onKeyDown = (e) => {\n if (isLink && !cfg.href && (e.key === \"Enter\" || e.key === \" \")) {\n e.preventDefault();\n onClick(e);\n }\n };\n\n el.addEventListener(\"click\", onClick);\n if (isLink && !cfg.href) {\n el.addEventListener(\"keydown\", onKeyDown);\n }\n\n const cleanupItem = () => {\n el.removeEventListener(\"click\", onClick);\n if (isLink && !cfg.href) {\n el.removeEventListener(\"keydown\", onKeyDown);\n }\n };\n el._cleanup = cleanupItem;\n cleanups.push(cleanupItem);\n\n const insertTarget =\n toast.querySelector(\".toast-undo-btn\") ||\n toast.querySelector(\".toast-close-btn\") ||\n toast.querySelector(\".toast-progress-bar\");\n if (insertTarget) {\n toast.insertBefore(el, insertTarget);\n } else {\n toast.appendChild(el);\n }\n });\n\n const prevCleanup = toast._cleanupCTA;\n toast._cleanupCTA = () => {\n prevCleanup?.();\n cleanups.forEach((c) => c());\n };\n}\n\n/**\n * Creates an Undo action button with optional live countdown decay.\n * @param {HTMLElement} toast\n * @param {object} options\n * @param {Function} onClose\n * @returns {void}\n */\nexport function createUndoAction(toast, options, onClose) {\n const undo = options?.undo;\n if (!undo) return;\n\n const isFn = typeof undo === \"function\";\n if (!isFn && (typeof undo !== \"object\" || Array.isArray(undo))) return;\n\n const undoCfg = isFn ? { onUndo: undo } : { ...undo };\n const baseLabel =\n typeof undoCfg.label === \"string\" && undoCfg.label.trim()\n ? undoCfg.label.trim()\n : \"Undo\";\n\n const totalDuration = Number(options?.duration);\n const showCountdown =\n undoCfg.showCountdown !== false &&\n Number.isFinite(totalDuration) &&\n totalDuration > 0;\n\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"toast-undo-btn\";\n btn.setAttribute(\"aria-label\", `${baseLabel} action`);\n\n const textColor =\n options.textColor ||\n getDynamicAccessibleTextColorHex(options.backgroundColor);\n const bgColor = options.backgroundColor\n ? getContrastBackground(options.backgroundColor)\n : \"rgba(255,255,255,0.18)\";\n\n const isHex6 =\n typeof textColor === \"string\" &&\n /^#[0-9a-fA-F]{6}$/.test(textColor.trim());\n const borderColor = isHex6\n ? `${textColor.trim()}55`\n : \"rgba(128, 128, 128, 0.35)\";\n\n if (!getConfig().disableInlineStyles) {\n Object.assign(btn.style, {\n marginLeft: \"10px\",\n padding: \"5px 10px\",\n borderRadius: \"6px\",\n fontSize: \"12px\",\n fontWeight: \"700\",\n lineHeight: \"1\",\n border: `1px solid ${borderColor}`,\n color: textColor,\n background: bgColor,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n flexShrink: \"0\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"4px\",\n });\n }\n\n let remainingSec = Math.max(1, Math.ceil((totalDuration || 2500) / 1000));\n const updateLabel = () => {\n btn.textContent = showCountdown\n ? `${baseLabel} (${remainingSec}s)`\n : baseLabel;\n };\n updateLabel();\n\n let intervalId = null;\n let isPaused = false;\n if (showCountdown) {\n intervalId = setInterval(() => {\n if (isPaused) return;\n remainingSec = Math.max(0, remainingSec - 1);\n updateLabel();\n if (remainingSec <= 0 && intervalId) {\n clearInterval(intervalId);\n intervalId = null;\n }\n }, 1000);\n if (typeof intervalId?.unref === \"function\") {\n intervalId.unref();\n }\n }\n\n toast._pauseUndo = () => {\n isPaused = true;\n };\n toast._resumeUndo = () => {\n isPaused = false;\n };\n\n const cleanupTimer = () => {\n if (intervalId) {\n clearInterval(intervalId);\n intervalId = null;\n }\n toast._pauseUndo = null;\n toast._resumeUndo = null;\n };\n\n const onClick = async (e) => {\n cleanupTimer();\n btn.removeEventListener(\"click\", onClick);\n try {\n if (typeof undoCfg.onUndo === \"function\") {\n const res = undoCfg.onUndo(e, toast);\n if (res?.then) await res;\n }\n } catch (err) {\n console.error(\"Undo action error:\", err);\n } finally {\n if (typeof onClose === \"function\") {\n onClose(toast);\n }\n }\n };\n\n btn.addEventListener(\"click\", onClick);\n\n btn._cleanup = () => {\n cleanupTimer();\n btn.removeEventListener(\"click\", onClick);\n };\n toast._cleanupUndo = () => {\n cleanupTimer();\n btn.removeEventListener(\"click\", onClick);\n };\n\n const insertTarget =\n toast.querySelector(\".toast-close-btn\") ||\n toast.querySelector(\".toast-progress-bar\");\n if (insertTarget) {\n toast.insertBefore(btn, insertTarget);\n } else {\n toast.appendChild(btn);\n }\n}\n\nexport function createCloseButton(toast, options, onClose) {\n const closeBtn = document.createElement(\"button\");\n closeBtn.type = \"button\";\n closeBtn.setAttribute(\"aria-label\", \"Close notification\");\n closeBtn.setAttribute(\"title\", \"Close\");\n closeBtn.textContent = \"×\";\n\n const closeTextColor = options.textColor || getDynamicAccessibleTextColorHex(options.backgroundColor);\n\n closeBtn.className = \"toast-close-btn\";\n if (!getConfig().disableInlineStyles) {\n Object.assign(closeBtn.style, {\n background: \"none\",\n border: \"none\",\n color: closeTextColor,\n fontSize: \"18px\",\n marginLeft: \"10px\",\n cursor: \"pointer\",\n lineHeight: \"1\",\n padding: \"0 4px\",\n });\n }\n\n const onClick = () => {\n if (typeof onClose === \"function\") onClose(toast);\n };\n closeBtn.addEventListener(\"click\", onClick);\n\n toast._cleanupCloseButton = () => {\n closeBtn.removeEventListener(\"click\", onClick);\n };\n\n toast.appendChild(closeBtn);\n}\n\nfunction getContrastBackground(bgColor) {\n if (!bgColor) return \"rgba(255,255,255,0.15)\";\n const textColor = getDynamicAccessibleTextColorHex(bgColor);\n if (textColor === \"#000000\") {\n return \"rgba(0,0,0,0.15)\";\n }\n return \"rgba(255,255,255,0.15)\";\n}\n\nexport function createProgressBar(toast, options = {}) {\n const progressBar = document.createElement(\"div\");\n progressBar.className = \"toast-progress-bar\";\n toast._progressBar = progressBar;\n const borderRadiusStr = options.borderRadius || \"0\";\n const parsedRadius = parseInt(borderRadiusStr, 10);\n const borderRadiusNum = Number.isFinite(parsedRadius) && parsedRadius > 0 ? parsedRadius : 0;\n\n let progressHeightPx = 4;\n let progressHeightStyle = \"4px\";\n if (typeof options.progressHeight === \"number\" && Number.isFinite(options.progressHeight) && options.progressHeight > 0) {\n progressHeightPx = options.progressHeight;\n progressHeightStyle = `${progressHeightPx}px`;\n } else if (typeof options.progressHeight === \"string\" && options.progressHeight.trim()) {\n const trimmed = options.progressHeight.trim();\n const parsedFloat = parseFloat(trimmed);\n if (Number.isFinite(parsedFloat) && parsedFloat > 0) {\n if (trimmed.endsWith(\"rem\") || trimmed.endsWith(\"em\")) {\n progressHeightPx = parsedFloat * 16;\n progressHeightStyle = trimmed;\n } else {\n progressHeightPx = parsedFloat;\n progressHeightStyle = /^\\d+(\\.\\d+)?$/.test(trimmed) ? `${parsedFloat}px` : trimmed;\n }\n }\n }\n\n const duration = Number(options.duration ?? 2500);\n const progressDuration = Math.max(0, duration + 5);\n\n const leftOffset = Math.min(borderRadiusNum, progressHeightPx * 2);\n const finalWidth = borderRadiusNum > 0\n ? `calc(100% - ${leftOffset * 2}px)`\n : \"100%\";\n\n progressBar._leftOffset = leftOffset;\n progressBar._finalWidth = finalWidth;\n\n const progressBg = options.progressBarColor || options.progressColor || \"currentColor\";\n const isReverse = options.progressDirection === \"reverse\" || options.progressDirection === \"increasing\" || options.progressDirection === \"ltr\";\n\n if (!getConfig().disableInlineStyles) {\n Object.assign(progressBar.style, {\n position: \"absolute\",\n left: `${leftOffset}px`,\n height: progressHeightStyle,\n background: progressBg,\n width: isReverse ? \"0%\" : `${finalWidth}`,\n transition: `width ${progressDuration}ms linear`,\n [options.progressPosition === \"top\" ? \"top\" : \"bottom\"]: \"0\",\n borderRadius: `${progressHeightPx / 2}px`,\n opacity: \"0.8\",\n zIndex: \"2\",\n willChange: \"width\",\n });\n }\n\n toast.appendChild(progressBar);\n\n // 1. Indeterminate mode or loading state (duration: 0 or Infinity with showProgressBar)\n const isIndeterminate = options.progress === \"indeterminate\" ||\n (Boolean(options.showProgressBar) && (options.duration === 0 || options.duration === Infinity) && options.progress === undefined);\n\n if (isIndeterminate) {\n progressBar.classList.add(\"toast-progress-bar-indeterminate\");\n progressBar.style.width = finalWidth;\n return;\n }\n\n // 2. Explicit manual percentage progress (determinate)\n if (options.progress !== undefined) {\n let pct = Number(options.progress);\n if (!Number.isFinite(pct)) pct = 0;\n if (pct < 1 && pct > 0) pct = pct * 100;\n progressBar.style.width = `${pct}%`;\n progressBar.style.transition = \"width 200ms ease\";\n return;\n }\n\n if (options.duration === 0 || options.duration === Infinity) {\n progressBar.style.width = \"0%\";\n return;\n }\n\n if (shouldReduceMotion()) {\n progressBar.style.display = \"none\";\n } else if (typeof progressBar.animate === \"function\") {\n const keyframes = isReverse\n ? [{ width: \"0%\" }, { width: finalWidth }]\n : [{ width: finalWidth }, { width: \"0%\" }];\n toast._progressAnimation = progressBar.animate(\n keyframes,\n {\n duration: progressDuration,\n easing: \"linear\",\n fill: \"forwards\",\n delay: 50,\n },\n );\n } else {\n progressBar.style.transition = `width ${progressDuration}ms linear`;\n requestAnimationFrame(() => {\n progressBar.style.width = isReverse ? finalWidth : \"0%\";\n });\n }\n}\n\nexport function runToastAnimation(toast) {\n if (!toast) return;\n if (toast._hasAnimated) return;\n\n if (shouldReduceMotion()) {\n toast._hasAnimated = true;\n toast.style.transition = \"none\";\n toast.style.opacity = \"1\";\n toast.style.transform = \"translateY(0)\";\n toast.classList.add(\"active\");\n return;\n }\n\n const trigger = () => {\n if (toast._hasAnimated) return;\n toast._hasAnimated = true;\n // Force browser layout/reflow so initial styles (opacity: 0, translateY) are committed to render tree\n try {\n void toast.offsetHeight;\n } catch {}\n\n requestAnimationFrame(() => {\n toast.style.opacity = \"1\";\n toast.style.transform = \"none\";\n toast.classList.add(\"active\");\n });\n };\n\n if (toast.isConnected) {\n trigger();\n } else {\n // If not yet connected to the DOM, defer to next frame when container.appendChild has occurred\n requestAnimationFrame(() => {\n if (toast.isConnected) {\n trigger();\n } else {\n requestAnimationFrame(() => {\n trigger();\n });\n }\n });\n }\n}\n\nexport function attachSwipeToDismiss(toast, onClose) {\n if (!toast || typeof toast.addEventListener !== \"function\") return;\n\n let startX = 0;\n let startY = 0;\n let currentX = 0;\n let startTime = 0;\n let isDragging = false;\n let isHorizontal = false;\n let touchId = null;\n\n let isWindowListening = false;\n\n const cleanupWindowListeners = () => {\n if (isWindowListening) {\n isWindowListening = false;\n window.removeEventListener(\"mousemove\", onPointerMove);\n window.removeEventListener(\"mouseup\", onPointerEnd);\n }\n };\n\n const onPointerDown = (e) => {\n if (!e) return;\n const target = e.target;\n if (\n target &&\n typeof target.closest === \"function\" &&\n target.closest(\"button, a, input, textarea, select, label\")\n ) {\n return;\n }\n let ev = e;\n if (e.touches && e.touches.length > 0) {\n ev = e.touches[0];\n touchId = ev.identifier ?? null;\n } else {\n touchId = null;\n }\n startX = ev.clientX;\n startY = ev.clientY;\n currentX = startX;\n startTime = Date.now();\n isDragging = true;\n isHorizontal = false;\n toast.style.transition = \"none\";\n toast.style.userSelect = \"none\";\n\n if (!isWindowListening && typeof window !== \"undefined\") {\n isWindowListening = true;\n window.addEventListener(\"mousemove\", onPointerMove, { passive: false });\n window.addEventListener(\"mouseup\", onPointerEnd, { passive: true });\n }\n };\n\n const onPointerMove = (e) => {\n if (!isDragging || !e) return;\n let ev = e;\n if (e.touches) {\n if (touchId !== null) {\n for (let i = 0; i < e.touches.length; i++) {\n if (e.touches[i].identifier === touchId) {\n ev = e.touches[i];\n break;\n }\n }\n } else if (e.touches.length > 0) {\n ev = e.touches[0];\n }\n }\n const x = ev.clientX;\n const y = ev.clientY;\n const dx = x - startX;\n const dy = y - startY;\n\n if (!isHorizontal) {\n if (Math.abs(dx) > 8 && Math.abs(dx) > Math.abs(dy)) {\n isHorizontal = true;\n } else if (Math.abs(dy) > 8) {\n isDragging = false;\n toast.style.userSelect = \"\";\n cleanupWindowListeners();\n return;\n }\n }\n\n if (isHorizontal) {\n currentX = x;\n const opacity = Math.max(0, 1 - Math.abs(dx) / 280);\n if (!getConfig().disableInlineStyles && !shouldReduceMotion()) {\n toast.style.transform = `translateX(${dx}px)`;\n toast.style.opacity = String(opacity);\n }\n if (e.cancelable) e.preventDefault();\n }\n };\n\n const onPointerEnd = () => {\n cleanupWindowListeners();\n touchId = null;\n if (!isDragging || !isHorizontal) {\n isDragging = false;\n toast.style.userSelect = \"\";\n return;\n }\n isDragging = false;\n toast.style.userSelect = \"\";\n\n const dx = currentX - startX;\n const duration = Math.max(1, Date.now() - startTime);\n const velocity = duration > 0 ? Math.abs(dx) / duration : 0; // px/ms\n const isFlick = velocity >= 0.65 && Math.abs(dx) >= 50;\n const threshold = isFlick ? 50 : 75;\n\n if (Math.abs(dx) >= threshold) {\n const exitX = dx > 0 ? 320 : -320;\n const exitDuration = isFlick ? 120 : 180;\n if (!getConfig().disableInlineStyles && !shouldReduceMotion()) {\n toast.style.transition = `transform ${exitDuration}ms ease-out, opacity ${exitDuration}ms ease-out`;\n toast.style.transform = `translateX(${exitX}px)`;\n toast.style.opacity = \"0\";\n }\n if (toast._swipeTimeout) clearTimeout(toast._swipeTimeout);\n toast._swipeTimeout = setTimeout(() => {\n toast._swipeTimeout = null;\n if (typeof onClose === \"function\") onClose(toast);\n }, exitDuration);\n if (typeof toast._swipeTimeout?.unref === \"function\") {\n toast._swipeTimeout.unref();\n }\n } else {\n if (!getConfig().disableInlineStyles && !shouldReduceMotion()) {\n const spring = toast._spring;\n const snapEasing = spring?.easing || \"cubic-bezier(0.34, 1.56, 0.64, 1)\";\n const snapDuration = spring?.duration ? Math.min(400, spring.duration) : 200;\n toast.style.transition = `transform ${snapDuration}ms ${snapEasing}, opacity 200ms ease`;\n toast.style.transform = \"translateX(0)\";\n toast.style.opacity = \"1\";\n }\n }\n };\n\n toast.addEventListener(\"touchstart\", onPointerDown, { passive: true });\n toast.addEventListener(\"touchmove\", onPointerMove, { passive: false });\n toast.addEventListener(\"touchend\", onPointerEnd, { passive: true });\n toast.addEventListener(\"touchcancel\", onPointerEnd, { passive: true });\n\n toast.addEventListener(\"mousedown\", onPointerDown, { passive: true });\n\n toast._cleanupSwipe = () => {\n if (toast._swipeTimeout) {\n clearTimeout(toast._swipeTimeout);\n toast._swipeTimeout = null;\n }\n cleanupWindowListeners();\n\n toast.removeEventListener(\"touchstart\", onPointerDown);\n toast.removeEventListener(\"touchmove\", onPointerMove);\n toast.removeEventListener(\"touchend\", onPointerEnd);\n toast.removeEventListener(\"touchcancel\", onPointerEnd);\n toast.removeEventListener(\"mousedown\", onPointerDown);\n };\n\n}","// src/utils/audio.js\n\"use strict\";\n\nimport { getConfig } from \"./config.js\";\n\nlet audioContext = null;\nlet audioEnabled = true;\n\n/**\n * Track user activation across the document to conform with browser autoplay policies.\n */\nlet hasUserGesture = false;\nif (typeof window !== \"undefined\") {\n if (typeof navigator !== \"undefined\" && navigator.userActivation?.hasBeenActive) {\n hasUserGesture = true;\n } else {\n const onGesture = () => {\n hasUserGesture = true;\n if (audioContext && audioContext.state === \"suspended\") {\n try {\n audioContext.resume().catch(() => {});\n } catch {}\n }\n try {\n window.removeEventListener(\"pointerdown\", onGesture, true);\n window.removeEventListener(\"keydown\", onGesture, true);\n window.removeEventListener(\"touchstart\", onGesture, true);\n } catch {}\n };\n try {\n window.addEventListener(\"pointerdown\", onGesture, { capture: true, once: true, passive: true });\n window.addEventListener(\"keydown\", onGesture, { capture: true, once: true, passive: true });\n window.addEventListener(\"touchstart\", onGesture, { capture: true, once: true, passive: true });\n } catch {}\n }\n}\n\n/**\n * Registry for user-defined sound synthesis functions.\n * @type {Map<string, (ctx: AudioContext, toneType: string, now: number) => void>}\n */\nconst customSoundPresets = new Map();\n\n/**\n * Lazily initialize and return a shared AudioContext.\n * Returns null in non-browser or unsupported environments.\n * @param {boolean} [forceResume=true] - Whether to attempt resuming suspended AudioContext\n * @returns {AudioContext | null}\n */\nexport function getAudioContext(forceResume = true) {\n if (typeof window === \"undefined\") return null;\n const AudioCtx = window.AudioContext || window.webkitAudioContext;\n if (!AudioCtx) return null;\n\n if (!audioContext) {\n try {\n audioContext = new AudioCtx();\n } catch {\n return null;\n }\n }\n\n const hasActivation =\n hasUserGesture ||\n (typeof navigator !== \"undefined\" &&\n navigator.userActivation &&\n navigator.userActivation.hasBeenActive);\n\n if (audioContext && audioContext.state === \"suspended\" && (forceResume || hasActivation)) {\n try {\n audioContext.resume().catch(() => {});\n } catch {}\n }\n\n return audioContext;\n}\n\nlet audioAnalyser = null;\n\n/**\n * Returns a shared AnalyserNode for real-time waveform visualization.\n * @returns {AnalyserNode | null}\n */\nexport function getAudioAnalyser() {\n const ctx = getAudioContext(false);\n if (!ctx || typeof ctx.createAnalyser !== \"function\") return null;\n if (!audioAnalyser) {\n try {\n audioAnalyser = ctx.createAnalyser();\n audioAnalyser.fftSize = 128;\n audioAnalyser.connect(ctx.destination);\n } catch {\n return null;\n }\n }\n return audioAnalyser;\n}\n\n/**\n * Route node to destination through analyser if available.\n * @param {AudioContext} ctx\n * @param {AudioNode} node\n */\nfunction routeAudio(ctx, node) {\n if (audioAnalyser) {\n node.connect(audioAnalyser);\n } else {\n node.connect(ctx.destination);\n }\n}\n\n/**\n * Register safe node disconnection on oscillator end to prevent audio graph leaks.\n * @param {OscillatorNode} osc\n * @param {AudioNode} gain\n */\nexport function registerNodeCleanup(osc, gain) {\n if (!osc) return;\n osc.onended = () => {\n try {\n osc.disconnect();\n gain?.disconnect?.();\n } catch {}\n };\n}\n\n/**\n * Modern preset: crisp multi-tone chords and pings.\n * @param {AudioContext} ctx\n * @param {string} tone\n * @param {number} now\n */\nfunction playModernPreset(ctx, tone, now) {\n if (tone === \"success\") {\n // Pleasant rising major chord chime (C5 -> E5 -> G5)\n const notes = [523.25, 659.25, 783.99];\n notes.forEach((freq, idx) => {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(freq, now + idx * 0.08);\n\n gain.gain.setValueAtTime(0.001, now + idx * 0.08);\n gain.gain.exponentialRampToValueAtTime(0.12, now + idx * 0.08 + 0.02);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + idx * 0.08 + 0.35);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n\n osc.start(now + idx * 0.08);\n osc.stop(now + idx * 0.08 + 0.36);\n });\n } else if (tone === \"error\") {\n // Subtle two-tone descending soft buzz\n const freqs = [320, 240];\n freqs.forEach((freq, idx) => {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"triangle\";\n osc.frequency.setValueAtTime(freq, now + idx * 0.1);\n\n gain.gain.setValueAtTime(0.001, now + idx * 0.1);\n gain.gain.exponentialRampToValueAtTime(0.15, now + idx * 0.1 + 0.02);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + idx * 0.1 + 0.22);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n\n osc.start(now + idx * 0.1);\n osc.stop(now + idx * 0.1 + 0.23);\n });\n } else if (tone === \"warning\") {\n // Gentle alert ping\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(440, now);\n osc.frequency.exponentialRampToValueAtTime(493.88, now + 0.12);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.exponentialRampToValueAtTime(0.12, now + 0.02);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.28);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n\n osc.start(now);\n osc.stop(now + 0.3);\n } else {\n // Light droplet pop ('info' or 'pop')\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(600, now);\n osc.frequency.exponentialRampToValueAtTime(950, now + 0.04);\n osc.frequency.exponentialRampToValueAtTime(400, now + 0.09);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.exponentialRampToValueAtTime(0.1, now + 0.015);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.12);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n\n osc.start(now);\n osc.stop(now + 0.13);\n }\n}\n\n/**\n * Retro 8-bit chip-tune preset: snappy square wave arpeggios and coin blips.\n * @param {AudioContext} ctx\n * @param {string} tone\n * @param {number} now\n */\nfunction playRetroPreset(ctx, tone, now) {\n if (tone === \"success\") {\n // Rapid 4-note ascending 8-bit fanfare (C5 -> E5 -> G5 -> C6)\n const notes = [523.25, 659.25, 783.99, 1046.5];\n notes.forEach((freq, idx) => {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"square\";\n const start = now + idx * 0.045;\n osc.frequency.setValueAtTime(freq, start);\n\n gain.gain.setValueAtTime(0.001, start);\n gain.gain.linearRampToValueAtTime(0.08, start + 0.005);\n gain.gain.exponentialRampToValueAtTime(0.0001, start + 0.042);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n\n osc.start(start);\n osc.stop(start + 0.045);\n });\n } else if (tone === \"error\") {\n // Retro downward pitch slide (square wave 360Hz down to 90Hz)\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"square\";\n osc.frequency.setValueAtTime(360, now);\n osc.frequency.exponentialRampToValueAtTime(90, now + 0.22);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.linearRampToValueAtTime(0.1, now + 0.01);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.22);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n\n osc.start(now);\n osc.stop(now + 0.23);\n } else if (tone === \"warning\") {\n // Dual square blip (880Hz -> pause -> 880Hz)\n [0, 0.08].forEach((offset) => {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"square\";\n const start = now + offset;\n osc.frequency.setValueAtTime(880, start);\n\n gain.gain.setValueAtTime(0.001, start);\n gain.gain.linearRampToValueAtTime(0.07, start + 0.005);\n gain.gain.exponentialRampToValueAtTime(0.0001, start + 0.05);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n\n osc.start(start);\n osc.stop(start + 0.055);\n });\n } else {\n // 8-bit coin blip (B5 -> E6)\n const notes = [987.77, 1318.51];\n notes.forEach((freq, idx) => {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"square\";\n const start = now + idx * 0.035;\n osc.frequency.setValueAtTime(freq, start);\n\n gain.gain.setValueAtTime(0.001, start);\n gain.gain.linearRampToValueAtTime(0.08, start + 0.005);\n gain.gain.exponentialRampToValueAtTime(0.0001, start + 0.035);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n\n osc.start(start);\n osc.stop(start + 0.04);\n });\n }\n}\n\n/**\n * Futuristic sci-fi preset: resonant frequency modulation sweeps.\n * @param {AudioContext} ctx\n * @param {string} tone\n * @param {number} now\n */\nfunction playFuturisticPreset(ctx, tone, now) {\n if (tone === \"success\") {\n // Sci-fi power-up sweep (440Hz -> 1760Hz with exponential ramp)\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(440, now);\n osc.frequency.exponentialRampToValueAtTime(1760, now + 0.2);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.exponentialRampToValueAtTime(0.12, now + 0.03);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.32);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n\n osc.start(now);\n osc.stop(now + 0.33);\n } else if (tone === \"error\") {\n // Sci-fi shield down / power drain (880Hz down to 110Hz)\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sawtooth\";\n osc.frequency.setValueAtTime(700, now);\n osc.frequency.exponentialRampToValueAtTime(120, now + 0.24);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.linearRampToValueAtTime(0.09, now + 0.02);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.25);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n\n osc.start(now);\n osc.stop(now + 0.26);\n } else if (tone === \"warning\") {\n // Dual resonant harmonic frequency sweep\n const freqs = [580, 870];\n freqs.forEach((freq) => {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(freq, now);\n osc.frequency.linearRampToValueAtTime(freq * 1.15, now + 0.1);\n osc.frequency.linearRampToValueAtTime(freq, now + 0.2);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.exponentialRampToValueAtTime(0.07, now + 0.02);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.25);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n\n osc.start(now);\n osc.stop(now + 0.26);\n });\n } else {\n // Holographic chirp (1100Hz -> 1600Hz -> 750Hz)\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(1100, now);\n osc.frequency.exponentialRampToValueAtTime(1600, now + 0.03);\n osc.frequency.exponentialRampToValueAtTime(750, now + 0.09);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.exponentialRampToValueAtTime(0.09, now + 0.015);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.12);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n\n osc.start(now);\n osc.stop(now + 0.13);\n }\n}\n\n/**\n * Subtle preset: low-amplitude micro-transient clicks for professional dashboards.\n * @param {AudioContext} ctx\n * @param {string} tone\n * @param {number} now\n */\nfunction playSubtlePreset(ctx, tone, now) {\n if (tone === \"success\") {\n // Two rapid soft micro-clicks (750Hz then 1100Hz, 15ms each)\n [750, 1100].forEach((freq, idx) => {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n const start = now + idx * 0.04;\n osc.frequency.setValueAtTime(freq, start);\n\n gain.gain.setValueAtTime(0.001, start);\n gain.gain.linearRampToValueAtTime(0.04, start + 0.003);\n gain.gain.exponentialRampToValueAtTime(0.0001, start + 0.025);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n\n osc.start(start);\n osc.stop(start + 0.03);\n });\n } else if (tone === \"error\") {\n // Two low muffled micro-thuds (180Hz then 130Hz)\n [180, 130].forEach((freq, idx) => {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"triangle\";\n const start = now + idx * 0.05;\n osc.frequency.setValueAtTime(freq, start);\n\n gain.gain.setValueAtTime(0.001, start);\n gain.gain.linearRampToValueAtTime(0.05, start + 0.005);\n gain.gain.exponentialRampToValueAtTime(0.0001, start + 0.035);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n\n osc.start(start);\n osc.stop(start + 0.04);\n });\n } else if (tone === \"warning\") {\n // Single crisp 600Hz transient click\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(600, now);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.linearRampToValueAtTime(0.045, now + 0.003);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.025);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n\n osc.start(now);\n osc.stop(now + 0.03);\n } else {\n // Single soft 450Hz transient pop (15ms)\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(450, now);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.linearRampToValueAtTime(0.035, now + 0.003);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.02);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n\n osc.start(now);\n osc.stop(now + 0.025);\n }\n}\n\n/**\n * Bell preset: acoustic harmonic bell chime with natural overtone decay.\n * @param {AudioContext} ctx\n * @param {string} tone\n * @param {number} now\n */\nfunction playBellPreset(ctx, tone, now) {\n if (tone === \"success\") {\n // Harmonic bell chord: Fundamental 659.25Hz (E5) + Overtones\n const harmonics = [659.25, 1318.5, 2637.0];\n harmonics.forEach((freq, idx) => {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(freq, now);\n\n const peakGain = 0.09 / (idx + 1);\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.exponentialRampToValueAtTime(peakGain, now + 0.015);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.55);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n\n osc.start(now);\n osc.stop(now + 0.58);\n });\n } else if (tone === \"error\") {\n // Low bell toll: 220Hz + 440Hz with damped decay\n [220, 440].forEach((freq, idx) => {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"triangle\";\n osc.frequency.setValueAtTime(freq, now);\n\n const peakGain = 0.1 / (idx + 1);\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.exponentialRampToValueAtTime(peakGain, now + 0.015);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.38);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n\n osc.start(now);\n osc.stop(now + 0.4);\n });\n } else if (tone === \"warning\") {\n // Ringing attention bell (880Hz A5)\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(880, now);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.exponentialRampToValueAtTime(0.1, now + 0.015);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.45);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n\n osc.start(now);\n osc.stop(now + 0.48);\n } else {\n // Crystal glass ping (1320Hz)\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(1320, now);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.exponentialRampToValueAtTime(0.08, now + 0.01);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.28);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n\n osc.start(now);\n osc.stop(now + 0.3);\n }\n}\n\n/**\n * Built-in sound preset synthesizer table.\n */\nconst BUILTIN_PRESETS = {\n modern: playModernPreset,\n retro: playRetroPreset,\n futuristic: playFuturisticPreset,\n subtle: playSubtlePreset,\n bell: playBellPreset,\n};\n\n/**\n * Synthesizes a pleasant audio chime or tone using pure Web Audio API oscillators.\n * Zero external audio assets or network requests.\n * @param {'success' | 'error' | 'warning' | 'info' | 'pop' | string} [toneType=\"info\"]\n * @param {'modern' | 'retro' | 'futuristic' | 'subtle' | 'bell' | string} [preset=\"modern\"]\n * @returns {void}\n */\nlet isPlayingDelegated = false;\n\nexport function playTone(toneType = \"info\", preset) {\n if (!audioEnabled) return;\n if (\n !isPlayingDelegated &&\n typeof window !== \"undefined\" &&\n window.customizableToast &&\n typeof window.customizableToast.playTone === \"function\" &&\n window.customizableToast.playTone !== playTone\n ) {\n try {\n isPlayingDelegated = true;\n window.customizableToast.playTone(toneType, preset);\n return;\n } finally {\n isPlayingDelegated = false;\n }\n }\n const ctx = getAudioContext();\n if (!ctx) return;\n\n try {\n if (ctx.state === \"suspended\") {\n ctx.resume().catch(() => {});\n }\n\n const now = ctx.currentTime;\n\n // Check direct numeric frequency tone (e.g. 880 or \"440Hz\")\n const numFreq = typeof toneType === \"number\" ? toneType : parseFloat(toneType);\n if (\n Number.isFinite(numFreq) &&\n numFreq >= 20 &&\n numFreq <= 20000 &&\n (typeof toneType === \"number\" || /^\\d+(\\.\\d+)?(hz)?$/i.test(String(toneType).trim()))\n ) {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(numFreq, now);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.exponentialRampToValueAtTime(0.1, now + 0.015);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.35);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n\n osc.start(now);\n osc.stop(now + 0.36);\n return;\n }\n\n const tone = String(toneType || \"info\").toLowerCase().trim();\n const activePreset = String(\n preset || getConfig().soundPreset || \"modern\"\n ).toLowerCase().trim();\n\n // Check custom synthesizer first\n if (customSoundPresets.has(activePreset)) {\n try {\n const customFn = customSoundPresets.get(activePreset);\n if (typeof customFn === \"function\") {\n customFn(ctx, tone, now);\n return;\n }\n } catch (err) {\n console.warn(\"Custom sound preset synthesizer error:\", err);\n }\n }\n\n // Built-in presets with modern fallback\n const synthesizer = BUILTIN_PRESETS[activePreset] || BUILTIN_PRESETS.modern;\n synthesizer(ctx, tone, now);\n } catch {}\n}\n\n/**\n * Registers a custom sound synthesis preset.\n * @param {string} name - Name of the preset (e.g. 'arcade')\n * @param {(ctx: AudioContext, toneType: string, now: number) => void} synthesizerFn\n * @returns {boolean} True if successfully registered\n */\nexport function registerSoundPreset(name, synthesizerFn) {\n if (typeof name !== \"string\" || !name.trim() || typeof synthesizerFn !== \"function\") {\n return false;\n }\n const cleanName = name.toLowerCase().trim();\n customSoundPresets.set(cleanName, synthesizerFn);\n return true;\n}\n\n/**\n * Returns a list of all currently available sound presets (built-in + custom).\n * @returns {string[]}\n */\nexport function getSoundPresets() {\n const builtin = Object.keys(BUILTIN_PRESETS);\n const custom = Array.from(customSoundPresets.keys());\n return Array.from(new Set([...builtin, ...custom]));\n}\n\n/**\n * Clears custom sound presets (primarily for testing and environment resets).\n * @returns {void}\n */\nexport function resetSoundPresets() {\n customSoundPresets.clear();\n}\n\n/**\n * Globally enable or disable synthesized notification sounds.\n * @param {boolean} enabled\n * @returns {void}\n */\nexport function setAudioEnabled(enabled) {\n audioEnabled = Boolean(enabled);\n}\n\n/**\n * Returns current global audio feedback status.\n * @returns {boolean}\n */\nexport function isAudioEnabled() {\n return audioEnabled;\n}\n\n/**\n * Resets the cached AudioContext instance (useful for test isolation).\n * @returns {void}\n */\nexport function resetAudioContext() {\n if (audioContext) {\n try {\n audioContext.close?.().catch?.(() => {});\n } catch {}\n }\n audioContext = null;\n audioAnalyser = null;\n}\n","// src/utils/spring.js\n\"use strict\";\n\n/**\n * @typedef {Object} SpringConfig\n * @property {number} [stiffness=100] - Spring tension / stiffness constant (k > 0)\n * @property {number} [damping=10] - Damping friction coefficient (c > 0)\n * @property {number} [mass=1] - Inertial mass (m > 0)\n */\n\n/**\n * @typedef {'default' | 'gentle' | 'wobbly' | 'stiff' | 'bouncy' | string} SpringPreset\n */\n\n/**\n * Built-in spring physics presets calibrated for natural UI motion.\n * @type {Record<string, { stiffness: number, damping: number, mass: number, bezierFallback: string }>}\n */\nexport const SPRING_PRESETS = {\n default: {\n stiffness: 100,\n damping: 10,\n mass: 1,\n bezierFallback: \"cubic-bezier(0.34, 1.4, 0.64, 1)\",\n },\n gentle: {\n stiffness: 120,\n damping: 14,\n mass: 1,\n bezierFallback: \"cubic-bezier(0.25, 1, 0.5, 1)\",\n },\n wobbly: {\n stiffness: 180,\n damping: 12,\n mass: 1,\n bezierFallback: \"cubic-bezier(0.35, 1.6, 0.55, 1)\",\n },\n stiff: {\n stiffness: 210,\n damping: 20,\n mass: 1,\n bezierFallback: \"cubic-bezier(0.18, 0.9, 0.32, 1)\",\n },\n bouncy: {\n stiffness: 300,\n damping: 15,\n mass: 1.2,\n bezierFallback: \"cubic-bezier(0.34, 1.75, 0.5, 1)\",\n },\n};\n\n/**\n * Registry for user-defined spring configurations.\n * @type {Map<string, { stiffness: number, damping: number, mass: number, bezierFallback?: string }>}\n */\nconst customSpringPresets = new Map();\n\n/**\n * Register a custom named spring preset.\n * @param {string} name - Unique preset identifier\n * @param {SpringConfig & { bezierFallback?: string }} config - Spring parameters\n */\nexport function registerSpringPreset(name, config) {\n if (typeof name !== \"string\" || !name.trim()) {\n throw new TypeError(\"registerSpringPreset: name must be a non-empty string\");\n }\n if (!config || typeof config !== \"object\" || Array.isArray(config)) {\n throw new TypeError(\"registerSpringPreset: config must be an object\");\n }\n\n const stiffness = Number(config.stiffness);\n const damping = Number(config.damping);\n const mass = Number(config.mass);\n\n customSpringPresets.set(name.trim().toLowerCase(), {\n stiffness: Number.isFinite(stiffness) && stiffness > 0 ? stiffness : 100,\n damping: Number.isFinite(damping) && damping > 0 ? damping : 10,\n mass: Number.isFinite(mass) && mass > 0 ? mass : 1,\n bezierFallback:\n typeof config.bezierFallback === \"string\" && config.bezierFallback.trim()\n ? config.bezierFallback.trim()\n : \"cubic-bezier(0.34, 1.4, 0.64, 1)\",\n });\n}\n\n/**\n * Retrieve list of registered spring preset names.\n * @returns {string[]}\n */\nexport function getSpringPresets() {\n return [...Object.keys(SPRING_PRESETS), ...customSpringPresets.keys()];\n}\n\n/**\n * Reset all registered custom spring presets back to defaults.\n */\nexport function resetSpringPresets() {\n customSpringPresets.clear();\n}\n\n/**\n * Resolves a spring input into concrete numerical physics constants.\n * @param {boolean | SpringPreset | SpringConfig} spring - Preset name or custom parameters\n * @returns {{ stiffness: number, damping: number, mass: number, bezierFallback: string } | null}\n */\nexport function resolveSpringConfig(spring) {\n if (!spring) return null;\n\n if (typeof spring === \"string\") {\n const key = spring.trim().toLowerCase();\n if (customSpringPresets.has(key)) {\n return customSpringPresets.get(key);\n }\n if (Object.prototype.hasOwnProperty.call(SPRING_PRESETS, key)) {\n return SPRING_PRESETS[key];\n }\n return SPRING_PRESETS.default;\n }\n\n if (spring === true) {\n return SPRING_PRESETS.default;\n }\n\n if (typeof spring === \"object\" && !Array.isArray(spring)) {\n const rawStiffness = Number(spring.stiffness);\n const rawDamping = Number(spring.damping);\n const rawMass = Number(spring.mass);\n\n const stiffness = Number.isFinite(rawStiffness) && rawStiffness > 0 ? rawStiffness : 100;\n const damping = Number.isFinite(rawDamping) && rawDamping > 0 ? rawDamping : 10;\n const mass = Number.isFinite(rawMass) && rawMass > 0 ? rawMass : 1;\n\n const zeta = damping / (2 * Math.sqrt(stiffness * mass));\n let bezierFallback = typeof spring.bezierFallback === \"string\" && spring.bezierFallback.trim()\n ? spring.bezierFallback.trim()\n : \"cubic-bezier(0.25, 1, 0.5, 1)\";\n if (!spring.bezierFallback) {\n if (zeta < 0.6) {\n bezierFallback = \"cubic-bezier(0.34, 1.7, 0.55, 1)\";\n } else if (zeta < 0.85) {\n bezierFallback = \"cubic-bezier(0.34, 1.35, 0.64, 1)\";\n }\n }\n\n return {\n stiffness,\n damping,\n mass,\n bezierFallback,\n };\n }\n\n return null;\n}\n\n/**\n * Solves the damped harmonic oscillator step response at time t (in seconds).\n * Returns displacement value y(t) transitioning from 0 to 1.\n *\n * @param {number} t - Time in seconds (t >= 0)\n * @param {{ stiffness: number, damping: number, mass: number }} config\n * @returns {number} Value of step response at time t\n */\nexport function solveSpring(t, config) {\n if (t <= 0) return 0;\n\n const k = Math.max(0.001, config?.stiffness || 100);\n const c = Math.max(0.001, config?.damping || 10);\n const m = Math.max(0.001, config?.mass || 1);\n\n const omega0 = Math.sqrt(k / m);\n const zeta = c / (2 * Math.sqrt(k * m));\n\n if (Math.abs(zeta - 1) < 1e-4) {\n // Critically damped: fastest convergence with zero overshoot\n return 1 - Math.exp(-omega0 * t) * (1 + omega0 * t);\n }\n\n if (zeta < 1) {\n // Underdamped: oscillates around target\n const omegaD = omega0 * Math.sqrt(1 - zeta * zeta);\n const envelope = Math.exp(-zeta * omega0 * t);\n const oscillation = Math.cos(omegaD * t) + (zeta / Math.sqrt(1 - zeta * zeta)) * Math.sin(omegaD * t);\n return 1 - envelope * oscillation;\n }\n\n // Overdamped: sluggish convergence without oscillation - stable real roots prevent NaN overflow\n const omegaD = omega0 * Math.sqrt(zeta * zeta - 1);\n const r1 = -zeta * omega0 + omegaD;\n const r2 = -zeta * omega0 - omegaD;\n const c1 = r2 / (r2 - r1);\n const c2 = -r1 / (r2 - r1);\n return 1 - (c1 * Math.exp(r1 * t) + c2 * Math.exp(r2 * t));\n}\n\n/**\n * Calculates the duration (in milliseconds) required for the spring to settle\n * within an acceptable error threshold (default: 0.005 / 0.5%).\n *\n * @param {{ stiffness: number, damping: number, mass: number }} config\n * @param {number} [threshold=0.005]\n * @returns {number} Settling duration in milliseconds\n */\nexport function calculateSpringSettlingDuration(config, threshold = 0.005) {\n if (!config) return 400;\n\n const k = Math.max(0.001, config.stiffness || 100);\n const c = Math.max(0.001, config.damping || 10);\n const m = Math.max(0.001, config.mass || 1);\n\n const omega0 = Math.sqrt(k / m);\n const zeta = c / (2 * Math.sqrt(k * m));\n\n // Search forward up to 3 seconds in 10ms steps\n const maxSeconds = 3.0;\n const step = 0.01;\n let settledTime = maxSeconds;\n\n for (let t = 0.1; t <= maxSeconds; t += step) {\n const val = solveSpring(t, { stiffness: k, damping: c, mass: m });\n if (Math.abs(val - 1) <= threshold) {\n // Check if it stays within threshold for next 100ms\n let staysSettled = true;\n for (let lookahead = t; lookahead <= Math.min(maxSeconds, t + 0.12); lookahead += step) {\n if (Math.abs(solveSpring(lookahead, { stiffness: k, damping: c, mass: m }) - 1) > threshold) {\n staysSettled = false;\n break;\n }\n }\n if (staysSettled) {\n settledTime = t;\n break;\n }\n }\n }\n\n const durationMs = Math.round(settledTime * 1000);\n return Math.max(150, Math.min(2500, durationMs));\n}\n\n/**\n * Generates a modern CSS linear(...) timing function representation of the spring motion.\n * @param {{ stiffness: number, damping: number, mass: number }} config\n * @param {number} [points=32]\n * @returns {string} CSS linear(...) curve string\n */\nexport function generateSpringLinearEasing(config, points = 32) {\n const durationMs = calculateSpringSettlingDuration(config);\n const durationSec = durationMs / 1000;\n const values = [];\n\n for (let i = 0; i <= points; i++) {\n const progress = i / points;\n const t = progress * durationSec;\n const y = solveSpring(t, config);\n // Format to 3 decimal places\n const formattedY = Math.round(y * 1000) / 1000;\n const percent = Math.round(progress * 1000) / 10;\n values.push(`${formattedY} ${percent}%`);\n }\n\n return `linear(${values.join(\", \")})`;\n}\n\n/**\n * Checks if the current browser environment supports the modern CSS linear() easing function.\n * @returns {boolean}\n */\nexport function supportsCSSLinearEasing() {\n if (typeof window === \"undefined\" || typeof CSS === \"undefined\" || typeof CSS.supports !== \"function\") {\n return false;\n }\n try {\n return (\n CSS.supports(\"transition-timing-function\", \"linear(0 0%, 1 100%)\") ||\n CSS.supports(\"transition-timing-function\", \"linear(0, 1)\") ||\n CSS.supports(\"animation-timing-function\", \"linear(0 0%, 1 100%)\")\n );\n } catch {\n return false;\n }\n}\n\n/**\n * Returns comprehensive transition timing, easing, and duration parameters for a toast with spring physics.\n * @param {boolean | SpringPreset | SpringConfig} spring\n * @returns {{ config: { stiffness: number, damping: number, mass: number }, duration: number, easing: string, isSpring: boolean } | null}\n */\nexport function getSpringTransition(spring) {\n const resolved = resolveSpringConfig(spring);\n if (!resolved) return null;\n\n const duration = calculateSpringSettlingDuration(resolved);\n const linearEasing = generateSpringLinearEasing(resolved);\n const isLinearSupported = supportsCSSLinearEasing();\n\n const easing = isLinearSupported ? linearEasing : (resolved.bezierFallback || \"cubic-bezier(0.34, 1.4, 0.64, 1)\");\n\n return {\n config: {\n stiffness: resolved.stiffness,\n damping: resolved.damping,\n mass: resolved.mass,\n },\n duration,\n easing,\n isSpring: true,\n };\n}\n","// src/components/icons.js\nimport { getConfig } from \"../utils/config.js\";\n\nconst svgNS = \"http://www.w3.org/2000/svg\";\n\nconst ALLOWED_SVG_TAGS = new Set([\n \"svg\",\n \"g\",\n \"path\",\n \"circle\",\n \"rect\",\n \"line\",\n \"polyline\",\n \"polygon\",\n \"ellipse\",\n \"title\",\n \"desc\",\n \"defs\",\n \"clippath\",\n \"use\",\n]);\n\nconst ALLOWED_SVG_ATTRS = new Set([\n \"viewbox\",\n \"width\",\n \"height\",\n \"fill\",\n \"stroke\",\n \"stroke-width\",\n \"stroke-linecap\",\n \"stroke-linejoin\",\n \"stroke-miterlimit\",\n \"stroke-dasharray\",\n \"stroke-dashoffset\",\n \"opacity\",\n \"fill-opacity\",\n \"stroke-opacity\",\n \"d\",\n \"cx\",\n \"cy\",\n \"r\",\n \"x\",\n \"y\",\n \"x1\",\n \"y1\",\n \"x2\",\n \"y2\",\n \"points\",\n \"rx\",\n \"ry\",\n \"transform\",\n \"role\",\n \"aria-hidden\",\n \"focusable\",\n \"xmlns\",\n \"preserveaspectratio\",\n \"class\",\n \"id\",\n \"href\",\n \"xlink:href\",\n]);\n\nfunction isUnsafeUrl(value = \"\") {\n return /^\\s*javascript:/i.test(value);\n}\n\nfunction sanitizeInlineSvg(svgText) {\n const parserClass =\n typeof DOMParser !== \"undefined\"\n ? DOMParser\n : typeof window !== \"undefined\" && window.DOMParser\n ? window.DOMParser\n : null;\n\n if (!parserClass) return null;\n try {\n const parser = new parserClass();\n const parsed = parser.parseFromString(svgText, \"image/svg+xml\");\n if (parsed.querySelector(\"parsererror\")) return null;\n const sourceSvg = parsed.documentElement;\n if (!sourceSvg || sourceSvg.tagName.toLowerCase() !== \"svg\") return null;\n\n const copySafeNode = (node) => {\n if (node.nodeType === 3) {\n return document.createTextNode(node.textContent || \"\");\n }\n if (node.nodeType !== 1) return null;\n const tag = node.tagName.toLowerCase();\n if (!ALLOWED_SVG_TAGS.has(tag)) return null;\n\n const safeEl = document.createElementNS(svgNS, tag);\n if (node.attributes) {\n for (let i = 0; i < node.attributes.length; i++) {\n const attr = node.attributes[i];\n const name = attr.name;\n const lowerName = name.toLowerCase();\n const value = attr.value || \"\";\n\n if (lowerName.startsWith(\"on\")) continue;\n if (!ALLOWED_SVG_ATTRS.has(lowerName)) continue;\n if ((lowerName === \"href\" || lowerName === \"xlink:href\") && isUnsafeUrl(value)) {\n continue;\n }\n safeEl.setAttribute(name, value);\n }\n }\n\n if (node.childNodes) {\n for (let j = 0; j < node.childNodes.length; j++) {\n const safeChild = copySafeNode(node.childNodes[j]);\n if (safeChild) safeEl.appendChild(safeChild);\n }\n }\n return safeEl;\n };\n\n return copySafeNode(sourceSvg);\n } catch {\n return null;\n }\n}\n\n/**\n * Default SVG path data for built-in toast status icons.\n */\nconst ICON_SVGS = {\n success: `\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M20 6L9 17l-5-5\"/>\n </svg>\n `,\n error: `\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/>\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/>\n </svg>\n `,\n warning: `\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/>\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"/>\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"/>\n </svg>\n `,\n info: `\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/>\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/>\n </svg>\n `,\n};\n\n/**\n * Creates an icon element for the toast based on options.icon or options.type.\n * @param {object} options\n * @returns {HTMLElement | null}\n */\nexport function createToastIcon(options = {}) {\n let iconOpt = options.icon;\n if (typeof iconOpt === \"function\") {\n try {\n iconOpt = iconOpt(options);\n } catch (err) {\n console.warn(\"options.icon callback error:\", err);\n iconOpt = null;\n }\n }\n\n if (iconOpt === false || iconOpt === \"\" || iconOpt === null) return null;\n\n const type = options.type;\n const config = getConfig();\n\n const iconTag = document.createElement(\"i\");\n iconTag.className = \"toast-icon\";\n iconTag.setAttribute(\"aria-hidden\", \"true\");\n\n if (!config.disableInlineStyles) {\n Object.assign(iconTag.style, {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: \"0\",\n marginRight: \"8px\",\n lineHeight: \"1\",\n fontStyle: \"normal\",\n });\n }\n\n // 1. Custom DOM node provided (with cross-realm/iframe support)\n if (iconOpt && (typeof iconOpt === \"object\" && (iconOpt.nodeType === 1 || (typeof HTMLElement !== \"undefined\" && iconOpt instanceof HTMLElement)))) {\n if (typeof iconOpt.cloneNode === \"function\") {\n iconTag.appendChild(iconOpt.cloneNode(true));\n return iconTag;\n }\n }\n\n // 2. Custom string: emoji, raw SVG, text, or alias\n if (typeof iconOpt === \"string\" && iconOpt.trim()) {\n const trimmed = iconOpt.trim();\n const aliasMap = {\n check: ICON_SVGS.success,\n checkmark: ICON_SVGS.success,\n success: ICON_SVGS.success,\n cross: ICON_SVGS.error,\n error: ICON_SVGS.error,\n alert: ICON_SVGS.warning,\n warning: ICON_SVGS.warning,\n circle: ICON_SVGS.info,\n info: ICON_SVGS.info,\n };\n const matchedAlias = aliasMap[trimmed.toLowerCase()];\n if (matchedAlias) {\n const safeSvg = sanitizeInlineSvg(matchedAlias.trim());\n if (safeSvg) {\n iconTag.appendChild(safeSvg);\n }\n return iconTag;\n }\n if (trimmed.startsWith(\"<svg\") && trimmed.endsWith(\"</svg>\")) {\n const safeSvg = sanitizeInlineSvg(trimmed);\n if (safeSvg) {\n safeSvg.setAttribute(\"aria-hidden\", \"true\");\n safeSvg.setAttribute(\"focusable\", \"false\");\n if (!safeSvg.getAttribute(\"width\")) safeSvg.setAttribute(\"width\", \"18\");\n if (!safeSvg.getAttribute(\"height\")) safeSvg.setAttribute(\"height\", \"18\");\n iconTag.appendChild(safeSvg);\n } else {\n iconTag.textContent = trimmed;\n }\n } else {\n iconTag.textContent = trimmed;\n }\n return iconTag;\n }\n\n // 3. Built-in type icon (when icon is explicitly true, or type is specified and icon is not false)\n const normalizedType = typeof type === \"string\" ? type.toLowerCase().trim() : \"\";\n if ((iconOpt === true || iconOpt === undefined) && normalizedType && ICON_SVGS[normalizedType]) {\n const safeSvg = sanitizeInlineSvg(ICON_SVGS[normalizedType].trim());\n if (safeSvg) {\n iconTag.appendChild(safeSvg);\n }\n return iconTag;\n }\n\n return null;\n}\n","// src/components/toast-utils.js\n\"use strict\";\n\nimport { parseAnimationDuration } from \"../utils/dom.js\";\nimport { sanitizeHtml } from \"../utils/html-sanitizer.js\";\nimport { createLoader } from \"./loader.js\";\nimport {\n createCTA,\n createUndoAction,\n createCloseButton,\n createProgressBar,\n runToastAnimation,\n attachSwipeToDismiss,\n} from \"./toast-utils-core.js\";\nimport { playTone } from \"../utils/audio.js\";\nimport { getSpringTransition } from \"../utils/spring.js\";\nimport { getConfig } from \"../utils/config.js\";\nimport { createToastIcon } from \"./icons.js\";\n\n/**\n * Applies rich styling and content to a toast element.\n * @param {HTMLElement} toast - The toast container element.\n * @param {object} options - Configuration options for the toast.\n * @param {Function} onClose - Callback invoked when the toast closes.\n */\nfunction getInitialTransform(position, animationType, isSpring) {\n const pos = String(position || \"\").toLowerCase();\n const isTop = pos.includes(\"top\");\n const isLeft = pos.includes(\"left\");\n const isRight = pos.includes(\"right\");\n const anim = String(animationType || \"\").toLowerCase().trim();\n\n if (anim === \"fade\") return \"none\";\n if (anim === \"zoom\" || anim === \"scale\") return \"scale(0.75)\";\n if (anim === \"flip\") return \"perspective(600px) rotateX(45deg)\";\n if (anim === \"slide\") {\n if (isLeft) return \"translateX(-100%)\";\n if (isRight) return \"translateX(100%)\";\n return isTop ? \"translateY(-100%)\" : \"translateY(100%)\";\n }\n\n if (isSpring) {\n if (pos.includes(\"center\") && !isTop && !pos.includes(\"bottom\")) {\n if (isLeft) return \"translateX(-36px) scale(0.92)\";\n if (isRight) return \"translateX(36px) scale(0.92)\";\n return \"scale(0.85)\";\n }\n return isTop ? \"translateY(-36px) scale(0.92)\" : \"translateY(36px) scale(0.92)\";\n }\n\n if (anim === \"bounce\") {\n return isTop ? \"translateY(-36px) scale(0.9)\" : \"translateY(36px) scale(0.9)\";\n }\n\n return isTop ? \"translateY(-20px)\" : \"translateY(20px)\";\n}\n\nexport async function applyRichStyling(toast, options, onClose) {\n const config = getConfig();\n const springTransition = options?.spring ? getSpringTransition(options.spring) : null;\n const durationMs = springTransition\n ? springTransition.duration\n : await parseAnimationDuration(options?.animationDuration);\n const validAnimationDuration = `${durationMs}ms`;\n const easing = springTransition\n ? springTransition.easing\n : typeof options?.animationEasing === \"string\" && options.animationEasing.trim()\n ? options.animationEasing.trim()\n : \"ease\";\n\n if (springTransition) {\n toast._spring = springTransition;\n }\n toast._animationType = options?.animationType;\n\n const customClass = typeof options?.className === \"string\" && options.className.trim()\n ? ` ${options.className.trim()}`\n : \"\";\n toast.className = `toast toast-${options?.type ?? \"info\"}${customClass}`;\n\n const borderRadius =\n typeof options?.borderRadius === \"number\"\n ? `${options.borderRadius}px`\n : options?.borderRadius;\n\n const maxWidth =\n typeof options?.maxWidth === \"number\"\n ? `${options.maxWidth}px`\n : options?.maxWidth;\n\n const opacityDuration = springTransition ? `${Math.min(300, durationMs)}ms` : validAnimationDuration;\n const opacityEasing = springTransition ? \"ease\" : easing;\n\n if (!config.disableInlineStyles) {\n Object.assign(toast.style, {\n background: options?.backgroundColor,\n padding: \"12px 16px\",\n marginBottom: \"10px\",\n borderRadius,\n overflow: \"hidden\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n boxShadow: \"0 4px 6px rgba(0, 0, 0, 0.1)\",\n minWidth: \"250px\",\n maxWidth,\n opacity: \"0\",\n position: \"relative\",\n cursor: \"default\",\n boxSizing: \"border-box\",\n userSelect: \"text\",\n pointerEvents: \"auto\",\n transition: `opacity ${opacityDuration} ${opacityEasing}, transform ${validAnimationDuration} ${easing}`,\n transform: getInitialTransform(options?.position, options?.animationType, !!springTransition),\n zIndex: String(config.zIndex),\n direction:\n options?.fontDirection && options.fontDirection !== \"auto\"\n ? options.fontDirection\n : undefined,\n });\n }\n\n const isError = options?.type === \"error\";\n const role = options?.role || (isError ? \"alert\" : (options?.role ?? \"alert\"));\n const ariaLive = options?.ariaLive || (isError ? \"assertive\" : \"polite\");\n toast.setAttribute(\"role\", role);\n toast.setAttribute(\"aria-live\", ariaLive);\n toast.tabIndex = 0;\n toast._animationDuration = durationMs;\n\n const messageSpan = document.createElement(\"span\");\n messageSpan.className = \"toast-message\";\n toast._messageSpan = messageSpan;\n\n const isTruncate =\n options?.wrapText === \"truncate\" ||\n options?.wrapText === \"ellipsis\" ||\n options?.wrapText === false;\n\n if (isTruncate || !options?.wrapText) {\n messageSpan.classList.add(\"is-truncated\");\n if (!config.disableInlineStyles) {\n Object.assign(messageSpan.style, {\n display: \"-webkit-box\",\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp: \"3\",\n whiteSpace: \"normal\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n });\n }\n } else if (!config.disableInlineStyles) {\n Object.assign(messageSpan.style, {\n display: \"block\",\n whiteSpace: \"normal\",\n });\n }\n\n const fontSize =\n typeof options?.fontSize === \"number\"\n ? `${options.fontSize}px`\n : options?.fontSize;\n\n if (!config.disableInlineStyles) {\n Object.assign(messageSpan.style, {\n flex: \"1\",\n padding: options?.fontPadding,\n fontFamily: options?.fontFamily,\n fontSize,\n fontWeight: options?.fontWeight,\n lineHeight: options?.fontLineHeight,\n color: options?.textColor,\n userSelect: \"text\",\n wordBreak: \"break-word\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n direction:\n options?.fontDirection && options.fontDirection !== \"auto\"\n ? options.fontDirection\n : undefined,\n });\n }\n\n const allowHtml = !!options.allowHtml;\n const rawMessage = options.message ?? \"\";\n\n // Render icon if provided or enabled for type\n const iconEl = createToastIcon(options);\n if (iconEl) {\n toast.appendChild(iconEl);\n }\n\n if (options.loader || options.showLoader) {\n const loaderEl = createLoader(options.loader || {});\n messageSpan.appendChild(loaderEl);\n const spacer = document.createElement(\"span\");\n spacer.className = \"toast-message-spacer\";\n if (!config.disableInlineStyles) {\n spacer.style.display = \"inline-block\";\n spacer.style.width = \"8px\";\n }\n messageSpan.appendChild(spacer);\n }\n\n if (\n allowHtml &&\n typeof rawMessage === \"string\" &&\n rawMessage.trim().length > 0\n ) {\n try {\n const sanitized = sanitizeHtml(rawMessage);\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = sanitized;\n while (tmp.firstChild) {\n messageSpan.appendChild(tmp.firstChild);\n }\n } catch (err) {\n console.warn(\n \"HTML message sanitization failed, falling back to text:\",\n err\n );\n messageSpan.appendChild(document.createTextNode(String(rawMessage)));\n }\n } else {\n messageSpan.appendChild(document.createTextNode(String(rawMessage)));\n }\n\n messageSpan.setAttribute(\"title\", messageSpan.textContent || \"\");\n toast.appendChild(messageSpan);\n\n if (options?.cta && typeof options.cta === \"object\") {\n createCTA(toast, options, onClose);\n }\n\n if (options?.undo) {\n createUndoAction(toast, options, onClose);\n }\n\n if (options?.showCloseButton) {\n createCloseButton(toast, options, onClose);\n }\n\n if (options?.showProgressBar !== false && (options?.showProgressBar || options?.progress !== undefined)) {\n createProgressBar(toast, options);\n }\n\n const shouldSwipe =\n options?.swipeToDismiss !== undefined ? options.swipeToDismiss : config.swipeToDismiss;\n if (shouldSwipe !== false) {\n attachSwipeToDismiss(toast, onClose);\n }\n\n // Play audio chime if enabled (global config + per-toast override)\n const shouldPlaySound = options?.sound !== undefined ? options.sound : config.sound;\n if (shouldPlaySound) {\n const tone = typeof options.sound === \"string\" ? options.sound : options?.type || \"info\";\n const preset = options?.soundPreset || config.soundPreset || \"modern\";\n playTone(tone, preset);\n }\n\n runToastAnimation(toast);\n}\n\n/**\n * Creates an emergency toast as a safe fallback.\n * @param {object} options - Configuration options for the toast.\n * @param {Function} onClose - Callback invoked when the toast closes.\n * @returns {Promise<HTMLElement|null>}\n */\nexport async function createEmergencyToast(options = {}, onClose) {\n try {\n const config = getConfig();\n const emergency = document.createElement(\"div\");\n const position = options?.position || config.defaultPosition;\n const posFlags = String(position).toLowerCase().trim();\n let top = \"auto\", bottom = \"auto\", left = \"auto\", right = \"auto\", transform = \"none\";\n\n if (posFlags.startsWith(\"top\")) top = \"20px\";\n else if (posFlags.startsWith(\"bottom\") || posFlags.includes(\"below\")) bottom = \"20px\";\n\n if (posFlags.startsWith(\"left\")) left = \"20px\";\n else if (posFlags.startsWith(\"right\")) right = \"20px\";\n else if (posFlags === \"center\") {\n left = \"50%\"; top = \"50%\"; transform = \"translate(-50%, -50%)\";\n } else if (posFlags.includes(\"center\")) {\n if (posFlags.includes(\"left\")) { left = \"20px\"; top = \"50%\"; transform = \"translateY(-50%)\"; }\n else if (posFlags.includes(\"right\")) { right = \"20px\"; top = \"50%\"; transform = \"translateY(-50%)\"; }\n else if (posFlags.includes(\"top\")) { top = \"20px\"; left = \"50%\"; transform = \"translateX(-50%)\"; }\n else if (posFlags.includes(\"bottom\")) { bottom = \"20px\"; left = \"50%\"; transform = \"translateX(-50%)\"; }\n } else {\n right = \"20px\"; bottom = \"20px\";\n }\n\n emergency.className = \"toast-emergency\";\n if (!config.disableInlineStyles) {\n Object.assign(emergency.style, {\n background: \"#333\",\n color: \"white\",\n padding: \"10px 15px\",\n position: \"fixed\",\n top,\n bottom,\n left,\n right,\n transform,\n zIndex: String(config.zIndex + 100),\n borderRadius: \"3px\",\n maxWidth: \"250px\",\n wordWrap: \"break-word\",\n boxShadow: \"0 2px 10px rgba(0,0,0,0.3)\",\n });\n }\n\n const innerWrapper = document.createElement(\"div\");\n const msgEl = document.createElement(\"span\");\n msgEl.className = \"toast-emergency-message\";\n if (!config.disableInlineStyles) msgEl.style.display = \"inline-block\";\n if (options.allowHtml) {\n try {\n const sanitized = sanitizeHtml(\n String(options.message || \"Emergency Toast Showing!\")\n );\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = sanitized;\n while (tmp.firstChild) {\n msgEl.appendChild(tmp.firstChild);\n }\n } catch {\n msgEl.appendChild(\n document.createTextNode(\n String(options.message || \"Emergency Toast Showing!\")\n )\n );\n }\n } else {\n msgEl.textContent = String(\n options.message || \"Emergency Toast Creation Showing!\"\n );\n }\n innerWrapper.appendChild(msgEl);\n\n const closeSpan = document.createElement(\"span\");\n closeSpan.className = \"toast-emergency-close\";\n closeSpan.setAttribute(\"role\", \"button\");\n closeSpan.setAttribute(\"aria-label\", \"Close emergency notification\");\n closeSpan.tabIndex = 0;\n if (!config.disableInlineStyles) {\n Object.assign(closeSpan.style, {\n float: \"right\",\n marginLeft: \"10px\",\n fontWeight: \"bold\",\n cursor: \"pointer\",\n });\n }\n closeSpan.textContent = \"×\";\n innerWrapper.appendChild(closeSpan);\n\n while (emergency.firstChild) emergency.removeChild(emergency.firstChild);\n emergency.appendChild(innerWrapper);\n\n let timer = null;\n const onClick = () => {\n if (timer) clearTimeout(timer);\n closeSpan.removeEventListener(\"click\", onClick);\n emergency.remove();\n if (typeof onClose === \"function\") onClose(emergency);\n };\n closeSpan.addEventListener(\"click\", onClick);\n\n const duration = Number(options?.duration) || 2500;\n timer = setTimeout(() => {\n closeSpan.removeEventListener(\"click\", onClick);\n emergency.remove();\n if (typeof onClose === \"function\") onClose(emergency);\n }, duration);\n if (typeof timer?.unref === \"function\") timer.unref();\n\n return emergency;\n } catch (error) {\n console.error(\"Emergency toast creation failed:\", error);\n if (typeof onClose === \"function\") onClose(null);\n return null;\n }\n}\n","/**\n * Toast Element Pool Manager\n * Recycles DOM elements for efficient handling of 100+ toasts\n * Prevents memory leaks and performance degradation with large queues\n */\n\n\"use strict\";\n\n/**\n * @typedef {Object} PooledToastElement\n * @property {HTMLElement} element - The reusable toast element\n * @property {boolean} inUse - Whether element is currently allocated\n * @property {string | null} id - Unique toast ID\n */\n\nclass ToastElementPool {\n constructor(initialSize = 5, maxSize = 50) {\n this.initialSize = Math.max(1, Math.floor(initialSize));\n this.maxSize = Math.max(this.initialSize, Math.floor(maxSize));\n /** @type {Array<{element: HTMLElement, inUse: boolean, id: string | null}>} */\n this.pool = [];\n this.inUseCount = 0;\n\n // Pre-allocate initial pool\n for (let i = 0; i < this.initialSize; i++) {\n this.pool.push({\n element: this._createToastElement(),\n inUse: false,\n id: null,\n });\n }\n }\n\n /**\n * Create a new toast element template\n * @private\n * @returns {HTMLElement}\n */\n _createToastElement() {\n const div = document.createElement('div');\n div.className = 'toast';\n div.setAttribute('role', 'alert');\n div.setAttribute('aria-live', 'polite');\n div.tabIndex = 0;\n return div;\n }\n\n /**\n * Acquire a toast element from pool or create new one\n * @param {string} toastId - Unique identifier for this toast\n * @returns {HTMLElement} - Ready-to-use toast element\n */\n acquire(toastId) {\n if (!toastId || typeof toastId !== 'string') {\n throw new Error('Toast ID required for pool allocation');\n }\n\n // Find available element in pool\n let poolEntry = this.pool.find((entry) => !entry.inUse);\n\n // If no available element, create new one (up to maxSize limit)\n if (!poolEntry && this.pool.length < this.maxSize) {\n poolEntry = {\n element: this._createToastElement(),\n inUse: false,\n id: null,\n };\n this.pool.push(poolEntry);\n }\n\n // If still no available element, recycle the oldest (emergency fallback)\n let isRecycled = false;\n if (!poolEntry) {\n poolEntry = this.pool[0];\n isRecycled = true;\n if (poolEntry.element._cleanupSwipe) poolEntry.element._cleanupSwipe();\n if (poolEntry.element._cleanupCloseButton) poolEntry.element._cleanupCloseButton();\n if (poolEntry.element._cleanupCTA) poolEntry.element._cleanupCTA();\n if (poolEntry.element._cleanupUndo) poolEntry.element._cleanupUndo();\n if (poolEntry.element._pauseCleanup) poolEntry.element._pauseCleanup();\n if (poolEntry.element._cleanup) poolEntry.element._cleanup();\n if (poolEntry.element.parentNode) {\n poolEntry.element.parentNode.removeChild(poolEntry.element);\n }\n poolEntry.element = this._createToastElement();\n }\n\n // Clear element state, styles, and custom properties\n poolEntry.element.innerHTML = '';\n poolEntry.element.className = 'toast';\n poolEntry.element.removeAttribute('style');\n poolEntry.element.setAttribute('role', 'alert');\n poolEntry.element.id = `toast-${toastId}`;\n poolEntry.element._pooledId = toastId;\n delete poolEntry.element._progressAnimation;\n delete poolEntry.element._pauseCleanup;\n delete poolEntry.element._cleanupSwipe;\n delete poolEntry.element._cleanupCloseButton;\n delete poolEntry.element._cleanupCTA;\n delete poolEntry.element._cleanupUndo;\n delete poolEntry.element._key;\n delete poolEntry.element._cleanup;\n\n poolEntry.inUse = true;\n poolEntry.id = toastId;\n if (!isRecycled) {\n this.inUseCount += 1;\n }\n\n return poolEntry.element;\n }\n\n /**\n * Release a toast element back to pool\n * @param {HTMLElement} element - The element to release\n * @param {string} toastId - The toast ID being released\n * @returns {void}\n */\n release(element, toastId) {\n if (!element && !toastId) {\n return;\n }\n\n const targetElement = element instanceof HTMLElement ? element : null;\n const targetId = typeof toastId === \"string\" ? toastId : (typeof element === \"string\" ? element : null);\n\n // Find and release the pooled element\n const poolEntry = this.pool.find(\n (entry) =>\n (targetElement && entry.element === targetElement) ||\n (targetId && entry.id === targetId)\n );\n\n if (poolEntry && poolEntry.inUse) {\n // Remove cleanly from DOM if still attached\n if (poolEntry.element.parentNode) {\n poolEntry.element.parentNode.removeChild(poolEntry.element);\n }\n // Re-create a clean element template to purge all attached listeners/state\n poolEntry.element = this._createToastElement();\n\n // Reset state\n poolEntry.inUse = false;\n poolEntry.id = null;\n this.inUseCount = Math.max(0, this.inUseCount - 1);\n }\n }\n\n /**\n * Get pool statistics for monitoring\n * @returns {{total: number, inUse: number, available: number, utilization: number, maxSize: number}} - Pool stats\n */\n getStats() {\n return {\n total: this.pool.length,\n inUse: this.inUseCount,\n available: this.pool.length - this.inUseCount,\n utilization: this.pool.length > 0 ? (this.inUseCount / this.pool.length) * 100 : 0,\n maxSize: this.maxSize,\n };\n }\n\n /**\n * Clear all pooled elements (for cleanup/testing)\n * @returns {void}\n */\n clear() {\n this.pool.forEach((entry) => {\n if (entry.element.parentNode) {\n entry.element.parentNode.removeChild(entry.element);\n }\n });\n this.pool = [];\n this.inUseCount = 0;\n }\n\n /**\n * Compact pool (remove unused elements above initial size)\n * Useful for long-running apps with temporary toast spikes\n * @returns {void}\n */\n compact() {\n if (this.pool.length > this.initialSize) {\n const available = this.pool.filter((entry) => !entry.inUse);\n const toRemove = Math.max(0, available.length - this.initialSize);\n\n if (toRemove > 0) {\n for (let i = 0; i < toRemove; i++) {\n const idx = this.pool.indexOf(available[i]);\n if (idx > -1) {\n this.pool.splice(idx, 1);\n }\n }\n }\n }\n }\n}\n\n// Singleton instance\nlet poolInstance = null;\n\n/**\n * Get or create the global toast pool instance\n * @param {number} [initialSize=5] - Initial pool size\n * @param {number} [maxSize=50] - Maximum pool size\n * @returns {ToastElementPool}\n */\nexport function getToastPool(initialSize = 5, maxSize = 50) {\n if (!poolInstance) {\n poolInstance = new ToastElementPool(initialSize, maxSize);\n }\n return poolInstance;\n}\n\n/**\n * Reset pool instance (for testing)\n */\nexport function resetToastPool() {\n if (poolInstance) {\n poolInstance.clear();\n poolInstance = null;\n }\n}\n\nexport { ToastElementPool };\n","// src/components/Toast.js //# Single responsibility\n\"use strict\";\n\nimport { createElementWithId } from \"../utils/dom.js\";\nimport { applyRichStyling, createEmergencyToast } from \"./toast-utils.js\";\nimport { getToastPool } from \"../utils/toast-pool.js\";\nimport { generateToastId } from \"../utils/id.js\";\n\n/**\n * Creates a multi-layer toast element with satellite-grade fallbacks\n * @param {Object} options - Toast configuration options\n * @param {Function} onClose - Callback when toast closes\n * @returns {HTMLElement} Toast element\n */\nexport async function createToastElement(options, onClose) {\n let toast;\n const tagName = \"div\";\n const prefix = \"toast\";\n\n // PRIMARY: Full-featured toast\n try {\n if (options?.usePool) {\n const rawId = generateToastId(prefix);\n toast = getToastPool().acquire(rawId);\n toast._pooledId = rawId;\n } else {\n toast = await createElementWithId(tagName, prefix);\n }\n await applyRichStyling(toast, options, onClose);\n return toast;\n } catch (error) {\n if (options?.usePool && toast?._pooledId) {\n try {\n getToastPool().release(toast, toast._pooledId);\n } catch {}\n }\n console.warn(\n \"toast creation failed with error showing fallback one: \",\n error\n );\n // Fallback: create emergency toast\n toast = await createEmergencyToast(options, onClose);\n return toast;\n }\n}\n","// src/utils/containerRegistry.js\n\"use strict\";\n\nimport { getConfig, getToastRoot } from \"./config.js\";\n\nconst containerRegistry = new Map(); // id -> HTMLElement\nconst containerLocks = new Map(); // id -> Promise<HTMLElement>\n\n/**\n * Normalize a position string to a canonical key (id-safe, stable).\n * @param {unknown} position\n * @returns {string}\n */\nexport function normalizePositionKey(position) {\n if (!position || typeof position !== \"string\") return \"bottom-right\";\n const raw = position.toLowerCase().trim();\n if (!raw) return \"bottom-right\";\n const aliased = raw.replace(/\\bbelow\\b/g, \"bottom\");\n return aliased\n .replace(/\\s+/g, \"-\")\n .replace(/[^a-z0-9-]/g, \"-\")\n .replace(/-{2,}/g, \"-\");\n}\n\n/**\n * Canonical container id.\n * @param {unknown} position\n * @returns {string}\n */\nexport function getContainerId(position) {\n const pos = normalizePositionKey(position);\n return `toast-container-${pos}`;\n}\n\nexport function resetContainerRegistry() {\n containerRegistry.clear();\n containerLocks.clear();\n}\n\n/**\n * Remove a container from the registry when pruned from the DOM\n * @param {string} id\n * @returns {void}\n */\nexport function unregisterContainer(idOrPosition) {\n if (!idOrPosition) return;\n const id = typeof idOrPosition === \"string\" && idOrPosition.startsWith(\"toast-container-\")\n ? idOrPosition\n : getContainerId(idOrPosition);\n containerRegistry.delete(id);\n containerLocks.delete(id);\n}\n\nfunction getContainerRoot() {\n return getToastRoot();\n}\n\nfunction findContainerById(root, id) {\n if (!root) return null;\n if (typeof root.getElementById === \"function\") return root.getElementById(id);\n if (typeof root.querySelector === \"function\") return root.querySelector(`#${id}`);\n return null;\n}\n\nfunction isConnectedToRoot(el, root) {\n if (!el || !root) return false;\n if (root === document.body) return el.isConnected && el.ownerDocument === document;\n if (typeof root.contains === \"function\") return root.contains(el);\n return el.isConnected && el.ownerDocument === document;\n}\n\nfunction applyContainerBaseStyles(el) {\n const config = getConfig();\n el.className = \"toast-container-base\";\n if (config.disableInlineStyles) return;\n\n el.style.position = \"fixed\";\n el.style.zIndex = String(config.zIndex);\n el.style.pointerEvents = \"none\";\n el.style.inset = \"auto 10px 10px auto\";\n el.style.display = \"flex\";\n el.style.justifyContent = \"space-between\";\n el.style.alignItems = \"center\";\n el.style.flexDirection = \"column\";\n el.style.overflow = \"hidden\";\n}\n\n/**\n * Atomically get or create a single container per canonical id.\n * @param {object} options\n * @param {(container: HTMLElement, options: object) => Promise<void>} setPosition\n * @returns {Promise<HTMLElement>}\n */\nexport async function getOrCreateToastContainer(options = {}, setPosition) {\n const config = getConfig();\n const id = getContainerId(options?.position || config.defaultPosition);\n const root = getContainerRoot();\n if (!root) throw new Error(\"Toast container root is unavailable\");\n\n if (containerLocks.has(id)) {\n return containerLocks.get(id);\n }\n\n const p = (async () => {\n const cached = containerRegistry.get(id);\n if (isConnectedToRoot(cached, root)) return cached;\n if (cached) containerRegistry.delete(id);\n\n let el = findContainerById(root, id);\n if (!el) {\n const doc = root?.ownerDocument || (typeof document !== \"undefined\" ? document : null);\n if (!doc) throw new Error(\"Document is unavailable\");\n el = doc.createElement(\"div\");\n el.id = id;\n el.setAttribute(\"role\", \"status\");\n el.setAttribute(\"aria-atomic\", \"true\");\n applyContainerBaseStyles(el);\n if (typeof setPosition === \"function\") await setPosition(el, options);\n root.appendChild(el);\n } else {\n applyContainerBaseStyles(el);\n if (typeof setPosition === \"function\") await setPosition(el, options);\n }\n\n if (typeof root.querySelectorAll === \"function\") {\n const all = root.querySelectorAll(`#${id}`);\n if (all.length > 1) {\n for (let i = 1; i < all.length; i++) {\n try {\n all[i].remove();\n } catch {}\n }\n }\n }\n\n containerRegistry.set(id, el);\n return el;\n })();\n\n containerLocks.set(id, p);\n try {\n return await p;\n } finally {\n containerLocks.delete(id);\n }\n}\n","\"use strict\";\n\nimport { getConfig } from \"./config.js\";\n\nconst DOCUMENTED_POSITIONS = new Set([\n \"top-left\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-right\",\n \"top-center\",\n \"bottom-center\",\n \"center-top\",\n \"center-bottom\",\n \"left-center\",\n \"right-center\",\n \"center-left\",\n \"center-right\",\n \"top-full-width\",\n \"bottom-full-width\",\n \"center\",\n]);\n\nconst LEGACY_POSITIONS = new Set([\"top\", \"bottom\"]);\nconst ALL_POSITIONS = [...DOCUMENTED_POSITIONS, ...LEGACY_POSITIONS];\n\nfunction isDocumentedPosition(pos) {\n return DOCUMENTED_POSITIONS.has(pos);\n}\n\nfunction resetPositionClasses(container) {\n if (!container?.classList) return;\n for (let i = 0; i < ALL_POSITIONS.length; i++) {\n container.classList.remove(\"toast-position-\" + ALL_POSITIONS[i]);\n }\n}\n\nexport async function setPosition(container, options = {}) {\n if (!container || !options || typeof options !== \"object\") {\n throw new Error(\"Invalid container or position!\");\n }\n\n const config = getConfig();\n const rawPos = String(options?.position || config.defaultPosition || \"bottom-right\")\n .toLowerCase()\n .trim()\n .replace(/\\s+/g, \"-\");\n let effectivePos = rawPos;\n\n if (!isDocumentedPosition(rawPos) && !LEGACY_POSITIONS.has(rawPos)) {\n console.warn(`Unknown position \"${options.position}\", defaulting to \"bottom-right\"`);\n effectivePos = \"bottom-right\";\n }\n\n resetPositionClasses(container);\n container.classList?.add(\"toast-position-\" + effectivePos);\n\n if (getConfig().disableInlineStyles) {\n return;\n }\n\n resetContainerStyles(container);\n const positionFlags = parsePosition(effectivePos);\n\n if (handleFullWidthPositions(container, options, positionFlags)) return;\n if (handleCenterPositions(container, positionFlags)) return;\n\n applyStandardPositioning(container, positionFlags);\n}\n\nfunction resetContainerStyles(container) {\n container.style.top = \"auto\";\n container.style.bottom = \"auto\";\n container.style.left = \"auto\";\n container.style.right = \"auto\";\n container.style.transform = \"none\";\n container.style.maxWidth = \"none\";\n}\n\nfunction parsePosition(position) {\n const pos = position.toLowerCase().trim();\n\n const isFullWidth = pos === \"top-full-width\" || pos === \"bottom-full-width\";\n const hasTop = pos.startsWith(\"top\") || pos.endsWith(\"top\");\n const hasBottom = pos.startsWith(\"bottom\") || pos.endsWith(\"bottom\") || pos.includes(\"below\");\n const hasLeft = pos.startsWith(\"left\") || pos.endsWith(\"left\");\n const hasRight = pos.startsWith(\"right\") || pos.endsWith(\"right\");\n const hasCenter = pos.includes(\"center\");\n\n return {\n hasTop,\n hasBottom,\n hasLeft,\n hasRight,\n hasCenter,\n hasFullWidth: isFullWidth,\n };\n}\n\nfunction handleFullWidthPositions(container, options, flags) {\n if (!flags.hasFullWidth) return false;\n\n container.style.maxWidth = \"100vw\";\n try {\n if (options && !options.maxWidth && !Object.isFrozen(options)) {\n options.maxWidth = \"100vw\";\n }\n } catch {\n // ignore frozen or read-only options objects\n }\n\n if (flags.hasTop) {\n container.style.top = \"10px\";\n container.style.left = \"10px\";\n container.style.right = \"10px\";\n return true;\n }\n\n if (flags.hasBottom) {\n container.style.bottom = \"10px\";\n container.style.left = \"10px\";\n container.style.right = \"10px\";\n return true;\n }\n\n return false;\n}\n\nfunction handleCenterPositions(container, flags) {\n if (!flags.hasCenter) return false;\n\n if (flags.hasTop && !flags.hasLeft && !flags.hasRight) {\n container.style.top = \"10px\";\n container.style.left = \"50%\";\n container.style.transform = \"translateX(-50%)\";\n return true;\n }\n\n if (flags.hasBottom && !flags.hasLeft && !flags.hasRight) {\n container.style.bottom = \"10px\";\n container.style.left = \"50%\";\n container.style.transform = \"translateX(-50%)\";\n return true;\n }\n\n if (flags.hasLeft && !flags.hasTop && !flags.hasBottom) {\n container.style.left = \"10px\";\n container.style.top = \"50%\";\n container.style.transform = \"translateY(-50%)\";\n return true;\n }\n\n if (flags.hasRight && !flags.hasTop && !flags.hasBottom) {\n container.style.right = \"10px\";\n container.style.top = \"50%\";\n container.style.transform = \"translateY(-50%)\";\n return true;\n }\n\n if (!flags.hasLeft && !flags.hasRight && !flags.hasTop && !flags.hasBottom) {\n container.style.top = \"50%\";\n container.style.left = \"50%\";\n container.style.transform = \"translate(-50%, -50%)\";\n return true;\n }\n\n return false;\n}\n\nfunction applyStandardPositioning(container, flags) {\n if (flags.hasBottom) {\n container.style.bottom = \"10px\";\n } else if (flags.hasTop) {\n container.style.top = \"10px\";\n } else {\n container.style.bottom = \"10px\";\n }\n\n if (flags.hasRight) {\n container.style.right = \"10px\";\n } else if (flags.hasLeft) {\n container.style.left = \"10px\";\n } else {\n container.style.left = \"50%\";\n container.style.transform = \"translateX(-50%)\";\n }\n}\n","// src/utils/PausableTimer.js\n\"use strict\";\n\nexport class PausableTimer {\n constructor(callback, delay) {\n this.callback = typeof callback === \"function\" ? callback : () => {};\n const isInfinite = delay === Infinity;\n const safeDelay = Number.isFinite(delay) && delay >= 0 ? delay : (isInfinite ? Infinity : 0);\n this.delay = safeDelay;\n this.remaining = safeDelay;\n this.startTime = null;\n this.timeoutId = null;\n this.isPaused = false;\n this.isCompleted = false;\n this.isInfinite = isInfinite;\n }\n\n start() {\n if (this.isCompleted || this.timeoutId || this.isInfinite) return this;\n this.isPaused = false;\n this.startTime = Date.now();\n this.timeoutId = setTimeout(() => {\n this.isCompleted = true;\n this.timeoutId = null;\n try {\n this.callback();\n } catch (err) {\n console.error(\"PausableTimer callback error:\", err);\n }\n }, this.remaining);\n if (typeof this.timeoutId?.unref === \"function\") {\n this.timeoutId.unref();\n }\n return this;\n }\n\n pause() {\n if (this.isPaused || !this.timeoutId || this.isCompleted) return this;\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n const elapsed = Math.max(0, Date.now() - this.startTime);\n this.remaining = Math.min(this.delay, Math.max(0, this.remaining - elapsed));\n this.isPaused = true;\n return this;\n }\n\n resume() {\n if (!this.isPaused || this.isCompleted) return this;\n this.isPaused = false;\n this.start();\n return this;\n }\n\n clear() {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n this.isCompleted = true;\n return this;\n }\n\n getRemainingTime() {\n if (this.isCompleted) return 0;\n if (this.isPaused) return this.remaining;\n if (!this.timeoutId) return this.delay;\n return Math.max(0, this.remaining - (Date.now() - this.startTime));\n }\n}\n","/**\n * Cross-tab Toast Synchronization Manager\n * Synchronizes toast notifications across multiple tabs of the same application\n * using BroadcastChannel API with graceful fallback\n */\n\n\"use strict\";\n\n/**\n * @typedef {Object} ToastSyncMessage\n * @property {string} type - Message type: 'create', 'update', 'dismiss', 'sync-request', 'sync-response'\n * @property {string} toastId - Unique toast identifier\n * @property {Record<string, unknown>} payload - Message-specific data\n * @property {number} timestamp - Message timestamp\n * @property {string} tabId - Originating tab ID\n */\n\nclass ToastBroadcaster {\n constructor() {\n /** @type {BroadcastChannel | null} */\n this.channel = null;\n this.tabId = this._generateTabId();\n this.isLeadTab = false;\n /** @type {ReturnType<typeof setTimeout> | null} */\n this.leaderTimer = null;\n /** @type {Map<string, Array<(data: Record<string, unknown>) => void>>} */\n this.listeners = new Map();\n this.supportsBroadcastChannel = typeof BroadcastChannel !== 'undefined';\n\n if (this.supportsBroadcastChannel) {\n this._initBroadcastChannel();\n }\n }\n\n /**\n * Generate unique tab identifier with high cross-tab entropy.\n * Unlike DOM element IDs (which rely on monotonic counters within a single thread),\n * tab IDs must guarantee uniqueness across independent browser processes/tabs\n * that do not share memory even if opened in the exact same millisecond.\n *\n * @private\n * @returns {string} Unique tab ID matching /^tab-[a-z0-9]+-[a-z0-9]+$/\n */\n _generateTabId() {\n const timestamp = Date.now().toString(36);\n let entropy = \"\";\n\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n try {\n const buf = new Uint32Array(2);\n crypto.getRandomValues(buf);\n entropy = `${buf[0].toString(36)}${buf[1].toString(36)}`.slice(0, 9);\n } catch {\n // Fallback if environment restricts getRandomValues\n }\n }\n\n if (!entropy) {\n // 53-bit safe integer entropy fallback\n entropy = Math.floor(Math.random() * 0x1fffffffffffff)\n .toString(36)\n .slice(0, 9);\n }\n\n return `tab-${timestamp}-${entropy}`;\n }\n\n /**\n * Initialize BroadcastChannel if available\n * @private\n */\n _initBroadcastChannel() {\n try {\n this.channel = new BroadcastChannel('toast-notifications');\n // Node.js BroadcastChannel keeps the event loop alive unless unref'd\n // (browsers have no unref, hence the optional call). Without this,\n // test runners and CLI scripts using this module never exit.\n this.channel.unref?.();\n this.channel.onmessage = (event) => this._handleMessage(event.data);\n\n // Become leader if no leader exists\n this._becomeLeadIfNeeded();\n } catch (error) {\n console.warn('[Toast] BroadcastChannel initialization failed:', error);\n this.supportsBroadcastChannel = false;\n }\n }\n\n /**\n * Attempt to become the lead tab\n * @private\n */\n _becomeLeadIfNeeded() {\n if (!this.channel) return;\n\n // Request sync from existing leader\n this.broadcast('sync-request', '', {});\n\n // If no response within 1 second, become leader\n this.leaderTimer = setTimeout(() => {\n this.leaderTimer = null;\n if (!this.isLeadTab) {\n this.isLeadTab = true;\n this.broadcast('leader-elected', '', { tabId: this.tabId });\n }\n }, 1000);\n // Same Node event-loop-hang concern as the channel above.\n this.leaderTimer.unref?.();\n }\n\n /**\n * Broadcast a toast event to other tabs\n * @param {string} type - Event type\n * @param {string} [toastId=''] - Toast ID\n * @param {Record<string, unknown>} [payload={}] - Event payload\n */\n broadcast(type, toastId = '', payload = {}) {\n if (!this.supportsBroadcastChannel || !this.channel) {\n return;\n }\n\n let actualToastId = toastId;\n let actualPayload = payload;\n\n // Gracefully handle if caller passed (type, payload) omitting toastId\n if (typeof toastId === 'object' && toastId !== null && Object.keys(payload).length === 0) {\n actualPayload = toastId;\n actualToastId = '';\n }\n\n const message = {\n type,\n toastId: typeof actualToastId === 'string' ? actualToastId : String(actualToastId ?? ''),\n payload: (actualPayload && typeof actualPayload === 'object') ? actualPayload : {},\n timestamp: Date.now(),\n tabId: this.tabId,\n };\n\n try {\n this.channel.postMessage(message);\n } catch (error) {\n console.warn('[Toast] Failed to broadcast message:', error);\n }\n }\n\n /**\n * Handle incoming message from other tab\n * @private\n * @param {ToastSyncMessage} message\n */\n _handleMessage(message) {\n if (!message || message.tabId === this.tabId) {\n return; // Ignore own messages\n }\n\n const { type, toastId, payload } = message;\n\n // Handle leader election: cancel pending election timer if another tab is already leader\n if (type === 'leader-elected') {\n if (this.leaderTimer) {\n clearTimeout(this.leaderTimer);\n this.leaderTimer = null;\n }\n this.isLeadTab = false;\n return;\n }\n\n if (type === 'sync-response' && this.leaderTimer) {\n clearTimeout(this.leaderTimer);\n this.leaderTimer = null;\n }\n\n // Handle sync requests\n if (type === 'sync-request' && this.isLeadTab) {\n this.broadcast('sync-response', 'all-toasts', {\n active: Array.from(this._getActiveToasts?.() || []),\n queue: this._getQueuedToasts?.() || [],\n });\n return;\n }\n\n // Trigger registered listeners\n const listeners = this.listeners.get(type) || [];\n listeners.forEach((callback) => {\n try {\n callback({ toastId, payload, message });\n } catch (error) {\n console.warn(`[Toast] Listener error for ${type}:`, error);\n }\n });\n }\n\n /**\n * Register listener for toast events\n * @param {string} type - Event type to listen for\n * @param {Function} callback - Callback function\n * @returns {Function} - Unsubscribe function\n */\n on(type, callback) {\n if (typeof callback !== 'function') {\n throw new Error('Callback must be a function');\n }\n\n if (!this.listeners.has(type)) {\n this.listeners.set(type, []);\n }\n\n this.listeners.get(type).push(callback);\n\n // Return unsubscribe function\n return () => {\n const listeners = this.listeners.get(type) || [];\n const index = listeners.indexOf(callback);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n };\n }\n\n /**\n * Register active toasts getter (set by ToastManager)\n * @param {Function} getter\n */\n registerActiveToastsGetter(getter) {\n this._getActiveToasts = getter;\n }\n\n /**\n * Register queued toasts getter (set by ToastManager)\n * @param {Function} getter\n */\n registerQueuedToastsGetter(getter) {\n this._getQueuedToasts = getter;\n }\n\n /**\n * Check if cross-tab sync is supported\n * @returns {boolean}\n */\n isSupported() {\n return this.supportsBroadcastChannel;\n }\n\n /**\n * Get current tab ID\n * @returns {string}\n */\n getTabId() {\n return this.tabId;\n }\n\n /**\n * Is this the lead tab\n * @returns {boolean}\n */\n isLeadingTab() {\n return this.isLeadTab;\n }\n\n /**\n * Cleanup on unload\n */\n destroy() {\n if (this.leaderTimer) {\n clearTimeout(this.leaderTimer);\n this.leaderTimer = null;\n }\n if (this.channel) {\n try {\n this.channel.close();\n } catch (error) {\n console.warn('[Toast] Failed to close BroadcastChannel:', error);\n }\n }\n this.listeners.clear();\n this.channel = null;\n }\n}\n\n// Singleton instance\nlet broadcasterInstance = null;\n\n/**\n * Get or create the global broadcaster instance\n * @returns {ToastBroadcaster}\n */\nexport function getToastBroadcaster() {\n if (!broadcasterInstance) {\n broadcasterInstance = new ToastBroadcaster();\n\n // Cleanup on page hide/unload without breaking BFCache\n if (typeof window !== 'undefined') {\n const cleanup = () => {\n broadcasterInstance?.destroy();\n broadcasterInstance = null;\n };\n window.addEventListener('pagehide', cleanup);\n window.addEventListener('beforeunload', cleanup);\n }\n }\n return broadcasterInstance;\n}\n\n/**\n * Reset broadcaster instance (for testing)\n */\nexport function resetToastBroadcaster() {\n if (broadcasterInstance) {\n broadcasterInstance.destroy();\n broadcasterInstance = null;\n }\n}\n\nexport { ToastBroadcaster };\n","/**\n * AI Priority Routing for Toast Notifications\n * Uses content analysis to intelligently prioritize toast queue\n *\n * Scorers evaluate toasts and assign priority scores (0-100)\n * Higher scores = higher priority (show sooner)\n * Zero-dependency, TypeSafe AI compatible\n */\n\n\"use strict\";\n\n/**\n * @typedef {Object} ToastScoringContext\n * @property {string} type - Toast type (success, error, warning, info)\n * @property {string} message - Toast message content\n * @property {number} duration - Duration in milliseconds\n * @property {Record<string, unknown>} options - Full toast options\n */\n\n/**\n * @typedef {Object} ScorerResult\n * @property {number} score - Priority score (0-100)\n * @property {Record<string, number>} breakdown - Score breakdown by factor\n * @property {string[]} keywords - Detected keywords affecting score\n */\n\n/**\n * Base priority scores by toast type\n */\nconst TYPE_PRIORITY = {\n error: 85,\n warning: 70,\n info: 40,\n success: 30,\n};\n\n/**\n * High-priority urgency keywords\n */\nconst URGENCY_KEYWORDS = [\n // Critical/severe\n 'error', 'critical', 'severe', 'emergency', 'failure', 'fatal', 'crash',\n 'urgent', 'important', 'attention', 'immediate', 'now', 'fast',\n 'deadline', 'due', 'timeout', 'expired', 'overdue',\n 'security', 'breach', 'attack', 'unauthorized', 'hack',\n 'lost', 'missing', 'offline', 'down', 'unavailable',\n\n // Business impact\n 'outage', 'downtime', 'broken', 'malfunction', 'defect', 'bug',\n 'data loss', 'corruption', 'invalid', 'wrong', 'incorrect',\n 'blocked', 'stopped', 'halted', 'paused', 'interrupted',\n 'exceeded', 'limit', 'quota', 'full', 'capacity',\n\n // User impact\n 'cannot', 'unable', 'failed', 'rejected', 'denied', 'blocked',\n 'invalid', 'expired', 'credentials', 'password', 'auth',\n 'payment', 'billing', 'charge', 'transaction', 'money',\n 'account', 'profile', 'settings', 'preferences',\n];\n\n/**\n * Neutral/Low priority keywords (demote score)\n */\nconst LOW_PRIORITY_KEYWORDS = [\n // Routine/informational\n 'success', 'completed', 'finished', 'done', 'ready',\n 'info', 'information', 'note', 'notice', 'reminder',\n 'progress', 'processing', 'loading', 'saving', 'uploading',\n 'test', 'demo', 'sample', 'example', 'placeholder',\n 'updated', 'changed', 'modified', 'edited', 'created',\n 'connected', 'disconnected', 'online', 'offline',\n];\n\n/**\n * Calculate priority score for toast based on type, message, and context\n * @param {ToastScoringContext} context\n * @returns {ScorerResult}\n */\nexport function calculateToastPriority(context) {\n if (!context || typeof context !== 'object') {\n return { score: 50, breakdown: { base: 50 }, keywords: [] };\n }\n\n const { type, message, duration } = context;\n const breakdown = {};\n const detectedKeywords = [];\n let score = 50; // Neutral base\n\n // Factor 1: Type priority\n const typeScore = TYPE_PRIORITY[type] || 50;\n breakdown.type = typeScore;\n score += (typeScore - 50) * 0.6; // Weight type moderately\n\n // Factor 2: Message urgency\n const safeMessage = typeof message === 'string' ? message : String(message ?? '');\n const messageLower = safeMessage.toLowerCase();\n let urgencyScore = 0;\n\n // Precompile regexes with word boundaries to prevent substring collisions (e.g. 'debug' matching 'bug', 'download' matching 'down')\n for (const keyword of URGENCY_KEYWORDS) {\n const escaped = keyword.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regex = new RegExp(`\\\\b${escaped}\\\\b`, 'i');\n if (regex.test(safeMessage)) {\n detectedKeywords.push(keyword);\n urgencyScore += 2; // +2 points per urgency keyword\n }\n }\n\n for (const keyword of LOW_PRIORITY_KEYWORDS) {\n const escaped = keyword.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regex = new RegExp(`\\\\b${escaped}\\\\b`, 'i');\n if (regex.test(safeMessage)) {\n detectedKeywords.push(keyword);\n urgencyScore -= 1; // -1 point per low-priority keyword\n }\n }\n\n breakdown.urgency = Math.min(Math.max(urgencyScore, -10), 20); // Cap -10 to +20\n score += breakdown.urgency;\n\n // Factor 3: Duration (shorter or persistent manual = higher priority)\n if (duration === Infinity) {\n breakdown.duration = 30; // Maximum priority for persistent alerts\n score += 15;\n } else if (typeof duration === 'number' && Number.isFinite(duration) && duration > 0) {\n const durationScore = Math.max(0, 30 - (duration / 1000)); // 0-30 range based on seconds\n breakdown.duration = Math.round(durationScore);\n score += durationScore * 0.5; // Weight duration lightly\n }\n\n // Factor 4: Message length (brief = higher priority)\n const messageLength = messageLower.length;\n if (messageLength > 0) {\n const lengthPenalty = Math.min(10, Math.floor(messageLength / 50)); // Penalty for long messages\n breakdown.length = -lengthPenalty;\n score -= lengthPenalty;\n }\n\n // Factor 5: Exclamation marks (indicates emphasis)\n const exclamationCount = (safeMessage.match(/!/g) || []).length;\n const exclamationScore = Math.min(5, exclamationCount); // Up to +5\n breakdown.emphasis = exclamationScore;\n score += exclamationScore;\n\n // Factor 6: ALL CAPS words (indicates shouting/urgency)\n const allCapsWords = (safeMessage.match(/\\b[A-Z]{3,}\\b/g) || []).length;\n const capsScore = Math.min(5, allCapsWords); // Up to +5\n breakdown.caps = capsScore;\n score += capsScore;\n\n // Clamp score to 0-100 range\n score = Math.max(0, Math.min(100, Math.round(score)));\n\n return {\n score,\n breakdown,\n keywords: [...new Set(detectedKeywords)], // Deduplicate\n };\n}\n\n/**\n * Extract semantic category from toast message\n * @param {string} message\n * @returns {string[]} - Categories (security, performance, user, system, etc.)\n */\nexport function categorizeToast(message) {\n if (!message || typeof message !== 'string') return ['unknown'];\n\n const msgLower = message.toLowerCase();\n const categories = [];\n\n // Security-related\n if (/\\b(security|auth|password|unauthorized|breach|hack)\\b/i.test(msgLower)) {\n categories.push('security');\n }\n\n // Performance-related\n if (/\\b(performance|slow|timeout|load|latency|responsive)\\b/i.test(msgLower)) {\n categories.push('performance');\n }\n\n // User-related\n if (/\\b(user|profile|account|preferences|settings|avatar)\\b/i.test(msgLower)) {\n categories.push('user');\n }\n\n // System-related\n if (/\\b(system|server|database|network|connection|backend)\\b/i.test(msgLower)) {\n categories.push('system');\n }\n\n // Business-related\n if (/\\b(payment|transaction|billing|charge|order|cart)\\b/i.test(msgLower)) {\n categories.push('business');\n }\n\n // UI/UX related\n if (/\\b(ui|interface|click|scroll|mobile)\\b/i.test(msgLower)) {\n categories.push('ui');\n }\n\n // Fallback to 'general' if no specific category\n if (categories.length === 0) {\n categories.push('general');\n }\n\n return categories;\n}\n\n/**\n * Computes deterministic AI priority boost without non-deterministic random numbers.\n * Strictly offline-first, reproducible, and compliant with core library purity.\n * @param {ToastScoringContext} context\n * @param {ScorerResult} localScore\n * @returns {number} Boost between 5 and 15 points\n */\nexport function calculateDeterministicAIBoost(context, localScore) {\n let boost = 5; // Base deterministic boost when AI prioritization is active\n\n const safeMsg = String(context?.message ?? \"\").toLowerCase();\n const categories = categorizeToast(safeMsg);\n\n // 1. High-Impact Domain Boost: Security or business/payment issues\n if (categories.includes(\"security\") || categories.includes(\"business\")) {\n boost += 4;\n }\n\n // 2. Actionability Boost: When toast contains interactive CTA button (action required)\n if (context?.options?.cta || context?.options?.action) {\n boost += 3;\n }\n\n // 3. High Urgency Density: When 2 or more critical urgency keywords match\n if (Array.isArray(localScore?.keywords) && localScore.keywords.length >= 2) {\n boost += 3;\n }\n\n return Math.min(15, boost);\n}\n\n/**\n * TypeSafe AI integration: Enhanced scoring with deterministic rule-based boost\n * and customScorer hook support for user application models.\n * @param {ToastScoringContext} context\n * @param {Object} [aiOptions={}] - TypeSafe AI options\n * @returns {Promise<ScorerResult>}\n */\nexport async function scoreWithTypeSafeAI(context, aiOptions = {}) {\n const { useAI = false, apiKey, customScorer } = aiOptions;\n\n if (typeof customScorer === \"function\") {\n try {\n const customRes = await customScorer(context);\n if (typeof customRes === \"number\" && Number.isFinite(customRes)) {\n const clamped = Math.max(0, Math.min(100, Math.round(customRes)));\n return {\n score: clamped,\n breakdown: { custom: clamped },\n keywords: [],\n aiEnhanced: true,\n };\n } else if (customRes && typeof customRes === \"object\") {\n return {\n score: Math.max(0, Math.min(100, Math.round(customRes.score ?? 50))),\n breakdown: customRes.breakdown || {},\n keywords: Array.isArray(customRes.keywords) ? customRes.keywords : [],\n aiEnhanced: true,\n };\n }\n } catch (customErr) {\n console.warn(\"[Toast] Custom priority scorer threw error:\", customErr);\n }\n }\n\n if (!useAI && !apiKey) {\n // Fallback to local scoring if AI not configured\n return calculateToastPriority(context);\n }\n\n try {\n const localScore = calculateToastPriority(context);\n const aiBoost = calculateDeterministicAIBoost(context, localScore);\n\n return {\n score: Math.min(100, localScore.score + aiBoost),\n breakdown: {\n ...localScore.breakdown,\n aiBoost,\n },\n keywords: localScore.keywords,\n aiEnhanced: true,\n };\n } catch (error) {\n console.warn(\"[Toast] AI scoring failed, falling back to local:\", error);\n return calculateToastPriority(context);\n }\n}\n\n/**\n * Sort toast queue by priority score\n * @param {Array} queue - Toast queue items\n * @param {Object} [options={}] - Scoring options\n * @returns {Array} - Sorted queue (highest priority first)\n */\nexport function prioritizeQueue(queue, options = {}) {\n if (!Array.isArray(queue) || queue.length <= 1) {\n return Array.isArray(queue) ? queue : [];\n }\n\n const { useAI = false, aiApiKey, customScorer } = options;\n\n // Score each item in queue\n const scoredQueue = queue.map((item, index) => {\n const context = {\n type: item?.options?.type || \"info\",\n message: item?.options?.message || \"\",\n duration: item?.options?.duration,\n options: item?.options,\n queuePosition: index,\n };\n\n let scoreResult;\n if (typeof customScorer === \"function\") {\n try {\n const customVal = customScorer(context);\n const numVal = typeof customVal === \"number\" ? customVal : (customVal?.score ?? 50);\n scoreResult = {\n score: Math.max(0, Math.min(100, Math.round(numVal))),\n breakdown: { custom: numVal },\n keywords: [],\n };\n } catch {\n scoreResult = calculateToastPriority(context);\n }\n } else if (useAI || aiApiKey) {\n const base = calculateToastPriority(context);\n const boost = calculateDeterministicAIBoost(context, base);\n scoreResult = {\n score: Math.min(100, base.score + boost),\n breakdown: { ...base.breakdown, aiBoost: boost },\n keywords: base.keywords,\n };\n } else {\n scoreResult = calculateToastPriority(context);\n }\n\n return {\n ...item,\n _priority: {\n score: scoreResult.score,\n breakdown: scoreResult.breakdown,\n keywords: scoreResult.keywords,\n },\n };\n });\n\n // Sort by priority score (descending)\n return scoredQueue.sort((a, b) => {\n return (b?._priority?.score ?? 0) - (a?._priority?.score ?? 0);\n });\n}\n\n/**\n * Create a priority-based queue manager\n * @param {Object} config - Manager configuration\n * @returns {Object} - Queue manager instance\n */\nexport function createPriorityQueueManager(config = {}) {\n const {\n useAI = false,\n aiApiKey = null,\n minScoreThreshold = 20,\n enableAutoPrioritization = true,\n } = config;\n\n const state = {\n useAI,\n aiApiKey,\n minScoreThreshold,\n enableAutoPrioritization,\n scoringHistory: [],\n };\n\n return {\n /**\n * Add item to queue with priority scoring\n * @param {Object} item - Queue item\n * @param {Array} queue - Current queue\n * @returns {Array} - Updated queue\n */\n addWithPriority(item, queue = []) {\n if (!enableAutoPrioritization) {\n return [...queue, item];\n }\n\n const context = {\n type: item.options?.type || 'info',\n message: item.options?.message || '',\n duration: item.options?.duration,\n options: item.options,\n };\n\n const scoreResult = useAI && aiApiKey\n ? calculateToastPriority(context) // In production: await scoreWithTypeSafeAI(context, { useAI, apiKey: aiApiKey })\n : calculateToastPriority(context);\n\n const scoredItem = {\n ...item,\n _priority: {\n score: scoreResult.score,\n breakdown: scoreResult.breakdown,\n keywords: scoreResult.keywords,\n timestamp: Date.now(),\n },\n };\n\n // Add to scoring history\n state.scoringHistory.push({\n item: { key: item.key, type: context.type },\n score: scoreResult.score,\n timestamp: Date.now(),\n });\n\n // Keep history limited\n if (state.scoringHistory.length > 100) {\n state.scoringHistory.shift();\n }\n\n // Filter out low priority items if below threshold\n if (scoreResult.score < minScoreThreshold) {\n console.debug('[Toast] Low priority item skipped:', {\n key: item.key,\n score: scoreResult.score,\n threshold: minScoreThreshold,\n });\n return queue; // Skip adding to queue\n }\n\n // Insert into sorted position\n const newQueue = [...queue, scoredItem];\n return prioritizeQueue(newQueue, { useAI, aiApiKey });\n },\n\n /**\n * Get priority statistics\n * @returns {Object} - Stats about queue priority\n */\n getStats() {\n const recentScores = state.scoringHistory.slice(-10);\n const avgScore = recentScores.length > 0\n ? recentScores.reduce((sum, item) => sum + item.score, 0) / recentScores.length\n : 0;\n\n return {\n totalScored: state.scoringHistory.length,\n averageScore: Math.round(avgScore),\n recentScores: recentScores.map(s => s.score),\n config: {\n useAI,\n minScoreThreshold,\n enableAutoPrioritization,\n },\n };\n },\n\n /**\n * Update configuration\n * @param {Object} newConfig - New configuration\n */\n updateConfig(newConfig) {\n Object.assign(state, newConfig);\n },\n\n /**\n * Get current configuration\n * @returns {Object} - Current configuration\n */\n getConfig() {\n return { ...state, scoringHistory: [] }; // Don't expose full history\n },\n\n /**\n * Reset manager state\n */\n reset() {\n state.scoringHistory = [];\n },\n };\n}\n\n// Default export for convenience\nexport default {\n calculateToastPriority,\n categorizeToast,\n scoreWithTypeSafeAI,\n prioritizeQueue,\n createPriorityQueueManager,\n};\n","/**\n * Multi-touch Gesture Detection Utilities\n * Handles flick, pinch, and advanced touch gestures for mobile toasts\n */\n\n\"use strict\";\n\n/**\n * @typedef {Object} TouchPoint\n * @property {number} x - X coordinate\n * @property {number} y - Y coordinate\n * @property {number} id - Touch identifier\n * @property {number} time - Timestamp\n */\n\n/**\n * @typedef {Object} GestureState\n * @property {TouchPoint[]} touches - Current touch points\n * @property {TouchPoint[]} startTouches - Initial touch points\n * @property {number} startTime - Gesture start time\n * @property {number} startDistance - Initial distance between touches (for pinch)\n * @property {number} currentDistance - Current distance between touches\n */\n\n/**\n * @typedef {Object} PinchResult\n * @property {boolean} isPinch\n * @property {number} scale\n * @property {'none' | 'in' | 'out'} direction\n * @property {number} [distanceChange]\n */\n\n/**\n * @typedef {Object} SwipeResult\n * @property {number} distance\n * @property {number} velocity\n * @property {'none' | 'left' | 'right'} direction\n * @property {number} duration\n */\n\n/**\n * @typedef {Object} SnapBackResult\n * @property {number} targetOffset\n * @property {number} duration\n * @property {string} easing\n */\n\n/**\n * @typedef {Object} GestureDetectorOptions\n * @property {((swipe: SwipeResult) => void)} [onFlick]\n * @property {((pinch: PinchResult) => void)} [onPinch]\n * @property {((swipe: SwipeResult) => void)} [onSwipe]\n * @property {number} [flickVelocityThreshold]\n * @property {number} [swipeVelocityThreshold]\n * @property {number} [swipeDistanceThreshold]\n * @property {number} [pinchSensitivity]\n */\n\n/**\n * @typedef {Object} GestureDetector\n * @property {() => void} attach\n * @property {() => void} detach\n * @property {() => GestureState | null} getState\n */\n\n/**\n * Calculate distance between two touch points\n * @param {TouchPoint} p1\n * @param {TouchPoint} p2\n * @returns {number}\n */\nexport function calculateDistance(p1, p2) {\n if (!p1 || !p2 || typeof p1.x !== 'number' || typeof p2.x !== 'number' || typeof p1.y !== 'number' || typeof p2.y !== 'number') {\n return 0;\n }\n const dx = p2.x - p1.x;\n const dy = p2.y - p1.y;\n return Math.sqrt(dx * dx + dy * dy);\n}\n\n/**\n * Calculate velocity of a swipe gesture\n * @param {number} distance - Distance traveled in pixels\n * @param {number} duration - Duration in milliseconds\n * @returns {number} - Velocity in pixels/millisecond\n */\nexport function calculateVelocity(distance, duration) {\n const d = Number(distance);\n const dur = Number(duration);\n if (!Number.isFinite(d) || !Number.isFinite(dur) || dur < 0) return 0;\n if (dur === 0) return d === 0 ? 0 : Infinity;\n return Math.abs(d) / dur;\n}\n\n/**\n * Detect if gesture is a flick (fast swipe with high velocity)\n * @param {number} velocity - Gesture velocity (px/ms)\n * @param {number} distance - Distance traveled (px)\n * @param {number} [velocityThreshold=0.5] - Minimum velocity for flick (default 0.5 px/ms)\n * @param {number} [distanceThreshold=50] - Minimum distance for flick (default 50px)\n * @returns {boolean}\n */\nexport function isFlick(velocity, distance, velocityThreshold = 0.5, distanceThreshold = 50) {\n const v = Number(velocity);\n const d = Number(distance);\n if (!Number.isFinite(v) || !Number.isFinite(d)) return false;\n return v >= velocityThreshold && Math.abs(d) >= distanceThreshold;\n}\n\n/**\n * Extract touch points from touch event\n * @param {TouchEvent} event\n * @returns {TouchPoint[]}\n */\nexport function getTouchPoints(event) {\n const touches = [];\n\n if (event.touches && event.touches.length > 0) {\n for (let i = 0; i < event.touches.length; i++) {\n const touch = event.touches[i];\n touches.push({\n x: touch.clientX,\n y: touch.clientY,\n id: touch.identifier,\n time: Date.now(),\n });\n }\n } else if (event.changedTouches && event.changedTouches.length > 0) {\n for (let i = 0; i < event.changedTouches.length; i++) {\n const touch = event.changedTouches[i];\n touches.push({\n x: touch.clientX,\n y: touch.clientY,\n id: touch.identifier,\n time: Date.now(),\n });\n }\n }\n\n return touches;\n}\n\n/**\n * Initialize gesture state from touch event\n * @param {TouchEvent} event\n * @returns {GestureState}\n */\nexport function initializeGestureState(event) {\n const touches = getTouchPoints(event);\n\n const state = {\n touches,\n startTouches: touches.map((t) => ({ ...t })),\n startTime: Date.now(),\n startDistance: touches.length >= 2 ? calculateDistance(touches[0], touches[1]) : 0,\n currentDistance: touches.length >= 2 ? calculateDistance(touches[0], touches[1]) : 0,\n };\n\n return state;\n}\n\n/**\n * Update gesture state with current touch event\n * @param {GestureState} state\n * @param {TouchEvent} event\n * @returns {GestureState}\n */\nexport function updateGestureState(state, event) {\n const touches = getTouchPoints(event);\n\n return {\n ...state,\n touches,\n currentDistance: touches.length >= 2 ? calculateDistance(touches[0], touches[1]) : state.currentDistance,\n };\n}\n\n/**\n * Detect pinch gesture (two-finger distance change)\n * @param {GestureState} state\n * @param {number} [sensitivityThreshold=20] - Minimum distance change for pinch (default 20px)\n * @returns {PinchResult} - Pinch info { isPinch, scale, direction, distanceChange }\n */\nexport function detectPinch(state, sensitivityThreshold = 20) {\n if (state.startDistance === 0 || state.currentDistance === 0) {\n return { isPinch: false, scale: 1, direction: 'none' };\n }\n\n const distanceChange = state.currentDistance - state.startDistance;\n const isPinch = Math.abs(distanceChange) >= sensitivityThreshold;\n\n const scale = state.currentDistance / state.startDistance;\n const direction = distanceChange > 0 ? 'out' : 'in'; // out = zoom out, in = zoom in\n\n return { isPinch, scale, direction, distanceChange };\n}\n\n/**\n * Calculate horizontal swipe information\n * @param {GestureState} state\n * @returns {SwipeResult} - Swipe info { distance, velocity, direction, duration }\n */\nexport function calculateSwipe(state) {\n if (state.startTouches.length === 0 || state.touches.length === 0) {\n return { distance: 0, velocity: 0, direction: 'none', duration: 0 };\n }\n\n const startTouch = state.startTouches[0];\n const currentTouch = state.touches.find((t) => t.id === startTouch.id) || state.touches[0];\n\n const distance = currentTouch.x - startTouch.x;\n const duration = Date.now() - state.startTime;\n const velocity = calculateVelocity(distance, duration);\n const direction = distance > 0 ? 'right' : 'left';\n\n return { distance, velocity, direction, duration };\n}\n\n/**\n * Detect if swipe should dismiss (high velocity or large distance)\n * @param {SwipeResult} swipe - Swipe info from calculateSwipe\n * @param {number} [velocityThreshold=0.3] - Velocity threshold (default 0.3 px/ms)\n * @param {number} [distanceThreshold=50] - Distance threshold (default 50px or 50% of width)\n * @returns {boolean}\n */\nexport function shouldDismissOnSwipe(swipe, velocityThreshold = 0.3, distanceThreshold = 50) {\n return swipe.velocity >= velocityThreshold || Math.abs(swipe.distance) >= distanceThreshold;\n}\n\n/**\n * Calculate snap-back animation values\n * @param {number} currentOffset - Current offset in pixels\n * @param {number} [containerWidth=400] - Width of container in pixels\n * @returns {SnapBackResult} - Animation { targetOffset, duration, easing }\n */\nexport function calculateSnapBack(currentOffset, containerWidth = 400) {\n const targetOffset = 0;\n const distance = Math.abs(currentOffset - targetOffset);\n\n // Duration based on distance (faster for shorter distances)\n const baseDuration = 150;\n const maxDuration = 400;\n const duration = Math.min(baseDuration + distance / 2, maxDuration);\n\n return {\n targetOffset,\n duration,\n easing: 'cubic-bezier(0.34, 1.56, 0.64, 1)', // Spring-like easing\n };\n}\n\n/**\n * Create gesture detector function for element\n * @param {HTMLElement} element\n * @param {GestureDetectorOptions} [options]\n * @returns {GestureDetector} - Detector with attach/detach methods\n */\nexport function createGestureDetector(element, options = {}) {\n const {\n onFlick,\n onPinch,\n onSwipe,\n flickVelocityThreshold = 0.5,\n swipeVelocityThreshold = 0.3,\n swipeDistanceThreshold = 50,\n pinchSensitivity = 20,\n } = options;\n\n let gestureState = null;\n let isTracking = false;\n\n const handlers = {\n onTouchStart: (e) => {\n isTracking = true;\n gestureState = initializeGestureState(e);\n },\n\n onTouchMove: (e) => {\n if (!isTracking || !gestureState) return;\n gestureState = updateGestureState(gestureState, e);\n },\n\n onTouchEnd: (e) => {\n if (!isTracking || !gestureState) return;\n isTracking = false;\n\n // Detect pinch\n const pinch = detectPinch(gestureState, pinchSensitivity);\n if (pinch.isPinch && typeof onPinch === 'function') {\n onPinch(pinch);\n }\n\n // Detect swipe/flick\n const swipe = calculateSwipe(gestureState);\n\n const isFlickGesture = isFlick(swipe.velocity, swipe.distance, flickVelocityThreshold, 30);\n if (isFlickGesture && typeof onFlick === 'function') {\n onFlick(swipe);\n }\n\n const shouldDismiss = shouldDismissOnSwipe(swipe, swipeVelocityThreshold, swipeDistanceThreshold);\n if (shouldDismiss && typeof onSwipe === 'function') {\n onSwipe(swipe);\n }\n\n gestureState = null;\n },\n };\n\n return {\n attach() {\n if (!element) return;\n element.addEventListener('touchstart', handlers.onTouchStart, { passive: true });\n element.addEventListener('touchmove', handlers.onTouchMove, { passive: true });\n element.addEventListener('touchend', handlers.onTouchEnd, { passive: true });\n element.addEventListener('touchcancel', handlers.onTouchEnd, { passive: true });\n },\n\n detach() {\n if (!element) return;\n element.removeEventListener('touchstart', handlers.onTouchStart);\n element.removeEventListener('touchmove', handlers.onTouchMove);\n element.removeEventListener('touchend', handlers.onTouchEnd);\n element.removeEventListener('touchcancel', handlers.onTouchEnd);\n },\n\n getState() {\n return gestureState;\n },\n };\n}\n","\"use strict\";\n\nimport { createToastElement } from \"./Toast.js\";\nimport { removeElement, getDynamicAccessibleTextColorHex } from \"../utils/dom.js\";\nimport { createEmergencyToast } from \"./toast-utils.js\";\nimport { getOrCreateToastContainer, normalizePositionKey, unregisterContainer } from \"../utils/containerRegistry.js\";\nimport { setPosition } from \"../utils/position.js\";\nimport { PausableTimer } from \"../utils/PausableTimer.js\";\nimport { sanitizeHtml } from \"../utils/html-sanitizer.js\";\nimport { playTone } from \"../utils/audio.js\";\nimport { createProgressBar, createCTA, createUndoAction, createCloseButton, runToastAnimation } from \"./toast-utils-core.js\";\nimport { createLoader } from \"./loader.js\";\nimport { createToastIcon } from \"./icons.js\";\nimport { getConfig, shouldReduceMotion } from \"../utils/config.js\";\nimport { getToastBroadcaster } from \"../utils/toast-broadcast.js\";\nimport { calculateToastPriority } from \"../utils/ai-scorer.js\";\nimport { getToastPool } from \"../utils/toast-pool.js\";\nimport { createGestureDetector } from \"../utils/multi-touch.js\";\n\n\nconst active = new Map();\nconst pending = new Map();\nconst queue = [];\nlet visibleCount = 0;\nlet droppedCount = 0;\n\n/**\n * Returns a real-time snapshot of toast manager telemetry metrics.\n * @returns {import('../utils/config.js').ToastMetrics}\n */\nexport function getToastMetrics() {\n return {\n activeCount: active.size,\n queueDepth: queue.length,\n visibleCount,\n droppedCount,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Emits current toast metrics to global onMetrics callback if configured.\n */\nfunction emitMetrics() {\n const config = getConfig();\n if (typeof config.onMetrics === \"function\") {\n try {\n config.onMetrics(getToastMetrics());\n } catch (err) {\n console.error(\"onMetrics callback error:\", err);\n }\n }\n}\n\n\n// Cross-tab toast synchronization\nconst broadcaster = getToastBroadcaster();\n\n// Register getters with broadcaster for sync requests\nbroadcaster.registerActiveToastsGetter(() => Array.from(active.keys()));\nbroadcaster.registerQueuedToastsGetter(() => queue.map(item => ({\n key: item.key,\n options: item.options,\n count: item.count\n})));\n\n// Initialize cross-tab sync listeners if supported\nif (broadcaster.isSupported() && typeof window !== 'undefined') {\n broadcaster.on('create', ({ toastId, payload }) => {\n if (!getConfig().syncTabs) return;\n // Another tab created a toast - show it in this tab\n if (toastId && payload && !active.has(toastId) && !pending.has(toastId)) {\n showToast({ ...payload.options, fromSync: true });\n }\n });\n\n broadcaster.on('update', ({ toastId, payload }) => {\n if (!getConfig().syncTabs) return;\n // Another tab updated a toast - update in this tab\n if (toastId && payload && active.has(toastId)) {\n const data = active.get(toastId);\n if (data && data.count !== payload.count) {\n data.count = payload.count;\n updateBadge(data);\n }\n }\n });\n\n broadcaster.on('dismiss', ({ toastId }) => {\n if (!getConfig().syncTabs) return;\n // Another tab dismissed a toast - dismiss in this tab without re-broadcasting\n if (toastId && (active.has(toastId) || pending.has(toastId))) {\n closeToastByKey(toastId, true);\n }\n });\n\n broadcaster.on('sync-response', ({ payload }) => {\n if (!getConfig().syncTabs) return;\n // Another tab responded with its toast state\n if (payload && Array.isArray(payload.queue)) {\n for (const item of payload.queue) {\n if (item?.options && !active.has(item.key) && !pending.has(item.key)) {\n showToast({ ...item.options, fromSync: true });\n }\n }\n }\n });\n}\n\n// AI Priority Queue Manager - Initialized with default settings\n\n/**\n * Numeric priority score for a queued toast item (higher = shown sooner).\n * calculateToastPriority() returns { score, breakdown, keywords }, so we\n * normalize to a plain number here for sorting/queue comparisons.\n * @param {{options?: Object, priority?: {score?: number}}} item\n * @returns {number}\n */\nfunction getItemPriority(item) {\n if (typeof item?.options?.priority === \"number\" && Number.isFinite(item.options.priority)) {\n return item.options.priority;\n }\n const cached = item?.priority?.score;\n if (typeof cached === \"number\" && Number.isFinite(cached)) return cached;\n\n const config = getConfig();\n if (typeof config.priorityScorer === \"function\") {\n try {\n const res = config.priorityScorer({\n type: item?.options?.type || \"info\",\n message: item?.options?.message || \"\",\n duration: item?.options?.duration,\n options: item?.options,\n });\n if (typeof res === \"number\" && Number.isFinite(res)) return res;\n if (res && typeof res.score === \"number\" && Number.isFinite(res.score)) return res.score;\n } catch (err) {\n console.warn(\"[Toast] Custom priorityScorer error, falling back to built-in:\", err);\n }\n }\n\n return calculateToastPriority(item?.options).score;\n}\n\nexport function updateStackedLayout(container) {\n if (!container || !container.children) return;\n const isStacked = container.getAttribute(\"data-stacked\") === \"true\";\n if (!isStacked) return;\n\n if (!container._stackedInitialized && typeof container.addEventListener === \"function\") {\n container._stackedInitialized = true;\n const onMouseEnter = () => {\n container._isExpanded = true;\n updateStackedLayout(container);\n };\n const onMouseLeave = () => {\n container._isExpanded = false;\n updateStackedLayout(container);\n };\n const onFocusIn = () => {\n container._isExpanded = true;\n updateStackedLayout(container);\n };\n const onFocusOut = (e) => {\n if (!container.contains(e.relatedTarget)) {\n container._isExpanded = false;\n updateStackedLayout(container);\n }\n };\n\n container.addEventListener(\"mouseenter\", onMouseEnter);\n container.addEventListener(\"mouseleave\", onMouseLeave);\n container.addEventListener(\"focusin\", onFocusIn);\n container.addEventListener(\"focusout\", onFocusOut);\n\n let detector = null;\n if (typeof createGestureDetector === \"function\") {\n detector = createGestureDetector(container, {\n onPinch: (pinch) => {\n if (pinch.direction === \"out\" && !container._isExpanded) {\n container._isExpanded = true;\n updateStackedLayout(container);\n } else if (pinch.direction === \"in\" && container._isExpanded) {\n container._isExpanded = false;\n updateStackedLayout(container);\n }\n },\n });\n detector.attach();\n }\n\n container._stackedCleanup = () => {\n container.removeEventListener(\"mouseenter\", onMouseEnter);\n container.removeEventListener(\"mouseleave\", onMouseLeave);\n container.removeEventListener(\"focusin\", onFocusIn);\n container.removeEventListener(\"focusout\", onFocusOut);\n detector?.detach?.();\n container._stackedInitialized = false;\n };\n }\n\n if (!container.children || container.children.length === 0) return;\n const items = Array.from(container.children);\n const count = items.length;\n const isExpanded = Boolean(container._isExpanded);\n const isTop = Boolean(container.id && container.id.includes(\"top\"));\n\n items.forEach((item, index) => {\n const depthFromTop = count - 1 - index;\n const depthKey = isExpanded ? \"expanded\" : (depthFromTop >= 3 ? \"overflow\" : String(depthFromTop));\n if (typeof item.setAttribute === \"function\") {\n item.setAttribute(\"data-stacked-depth\", depthKey);\n }\n\n if (!getConfig().disableInlineStyles) {\n item.style.transition =\n \"transform 240ms cubic-bezier(0.16, 1, 0.3, 1), margin 240ms cubic-bezier(0.16, 1, 0.3, 1), opacity 240ms ease\";\n\n if (isExpanded) {\n item.style.transform = \"none\";\n item.style.marginTop = \"0px\";\n item.style.marginBottom = \"10px\";\n item.style.opacity = \"1\";\n item.style.zIndex = String(100 + index);\n item.style.pointerEvents = \"auto\";\n } else {\n if (depthFromTop === 0) {\n item.style.transform = \"scale(1)\";\n item.style.marginTop = \"0px\";\n item.style.marginBottom = \"0px\";\n item.style.opacity = \"1\";\n item.style.zIndex = \"30\";\n item.style.pointerEvents = \"auto\";\n } else if (depthFromTop === 1) {\n const y = isTop ? 10 : -10;\n item.style.transform = `scale(0.95) translateY(${y}px)`;\n item.style.marginTop = \"-55px\";\n item.style.marginBottom = \"0px\";\n item.style.opacity = \"0.9\";\n item.style.zIndex = \"20\";\n item.style.pointerEvents = \"auto\";\n } else if (depthFromTop === 2) {\n const y = isTop ? 20 : -20;\n item.style.transform = `scale(0.90) translateY(${y}px)`;\n item.style.marginTop = \"-55px\";\n item.style.marginBottom = \"0px\";\n item.style.opacity = \"0.75\";\n item.style.zIndex = \"10\";\n item.style.pointerEvents = \"auto\";\n } else {\n const y = isTop ? 30 : -30;\n item.style.transform = `scale(0.85) translateY(${y}px)`;\n item.style.marginTop = \"-55px\";\n item.style.marginBottom = \"0px\";\n item.style.opacity = \"0\";\n item.style.zIndex = \"1\";\n item.style.pointerEvents = \"none\";\n }\n }\n }\n });\n}\n\nfunction hashString(str) {\n let h = 5381;\n for (let i = 0; i < str.length; i++) h = (h << 5) + h + str.charCodeAt(i);\n return h >>> 0;\n}\n\nfunction makeKey(options = {}) {\n const safe = options && typeof options === \"object\" ? options : {};\n if (safe.id) return String(safe.id);\n const type = String(safe.type || \"info\").trim().toLowerCase();\n const messageHash = hashString(String(safe.message || \"\")).toString(16);\n const position = normalizePositionKey(safe.position || \"bottom-right\");\n\n return `${type}|${messageHash}|${position}`;\n}\n\nexport async function showToast(options = {}) {\n try {\n const key = makeKey(options);\n\n if (active.has(key)) {\n const data = active.get(key);\n if (!data) throw new Error(`Active toast with key ${key} not found`);\n data.count++;\n\n data.timer?.clear();\n data.timer = createDismissTimer(data.toast, options);\n await setupPauseOnHover(data);\n await updateBadge(data);\n emitMetrics();\n\n // Broadcast update to other tabs if not from sync\n if (!options.fromSync && getConfig().syncTabs && broadcaster.isSupported()) {\n broadcaster.broadcast('update', key, { count: data.count });\n }\n return key;\n }\n\n if (pending.has(key)) {\n const current = pending.get(key);\n if (!current) throw new Error(`Pending toast with key ${key} not found`);\n current.count++;\n return key;\n }\n\n const entry = { options, count: 1, rafId: 0 };\n pending.set(key, entry);\n\n entry.rafId = requestAnimationFrame(async () => {\n const current = pending.get(key);\n if (!current) return;\n pending.delete(key);\n\n if (visibleCount >= getConfig().maxVisible) {\n const item = { options: current.options, key, count: current.count };\n const maxQ = getConfig().maxQueueSize ?? 100;\n if (maxQ <= 0) {\n droppedCount++;\n emitMetrics();\n return;\n }\n if (queue.length >= maxQ) {\n queue.shift();\n droppedCount++;\n }\n if (getConfig().aiPrioritization || current.options?.aiPrioritization) {\n item.priority = calculateToastPriority(current.options);\n queue.push(item);\n queue.sort((a, b) => getItemPriority(b) - getItemPriority(a));\n } else {\n queue.push(item);\n }\n emitMetrics();\n await drainQueue();\n return;\n }\n\n try {\n await createOne(current.options, key, current.count);\n } catch (error) {\n console.error(\"showToast failed:\", error);\n }\n });\n\n // Broadcast creation to other tabs if not from sync\n if (!options.fromSync && getConfig().syncTabs && broadcaster.isSupported()) {\n broadcaster.broadcast('create', key, { options });\n }\n\n return key;\n } catch (error) {\n console.error(\"showToast failed:\", error);\n }\n}\n\nasync function createOne(options, key, initialCount) {\n try {\n if (!options || typeof options !== \"object\") {\n throw new TypeError(\"options must be an object\");\n }\n\n visibleCount++;\n\n const container = await getOrCreateToastContainer(options, setPosition);\n if (!container) {\n throw new Error(\"Failed to create toast container\");\n }\n\n const toast = await createToastElement(options, closeToast);\n if (!toast) {\n throw new Error(\"Toast element creation failed\");\n }\n\n const outer = document.createElement(\"div\");\n outer.className = \"toast-outer-wrapper\";\n if (!getConfig().disableInlineStyles) {\n Object.assign(outer.style, {\n position: \"relative\",\n display: \"inline-block\",\n overflow: \"visible\",\n marginBottom: \"10px\",\n zIndex: \"0\",\n width: \"100%\",\n pointerEvents: \"auto\",\n }); \n }\n\n const inner = document.createElement(\"div\");\n inner.className = \"toast-inner-wrapper\";\n if (!getConfig().disableInlineStyles) {\n Object.assign(inner.style, {\n position: \"relative\",\n overflow: \"hidden\",\n zIndex: \"1\",\n }); \n }\n\n inner.appendChild(toast);\n outer.appendChild(inner);\n\n if (container.id.includes(\"toast-container-\")) {\n container.appendChild(outer);\n if (options.stacked) {\n container.setAttribute(\"data-stacked\", \"true\");\n }\n if (container.getAttribute(\"data-stacked\") === \"true\") {\n updateStackedLayout(container);\n }\n }\n\n runToastAnimation(toast);\n\n const shouldPauseOnHover =\n options.pauseOnHover !== false &&\n (options.pauseOnHover === true || !!options.cta || Boolean(getConfig().pauseOnHover));\n\n const data = {\n outer,\n toast,\n options,\n count: Math.max(1, Math.floor(initialCount ?? 0)),\n pauseOnHover: shouldPauseOnHover,\n };\n active.set(key, data);\n toast._key = key;\n\n emitMetrics();\n\n if (data.count > 1) await updateBadge(data);\n\n data.timer = createDismissTimer(toast, options);\n await setupPauseOnHover(data);\n } catch (err) {\n console.error(\"Something went wrong: \", err);\n visibleCount = Math.max(0, visibleCount - 1);\n emitMetrics();\n const el =\n document.querySelector('[id^=\"toast-container-\"]') || document.body;\n el.appendChild(await createEmergencyToast(options, closeToast));\n }\n}\n\nexport async function dismissMostRecent() {\n try {\n if (active.size === 0) {\n if (pending.size > 0) {\n const [pendingKey, pendingEntry] = Array.from(pending.entries()).at(-1);\n if (pendingEntry?.rafId) cancelAnimationFrame(pendingEntry.rafId);\n pending.delete(pendingKey);\n emitMetrics();\n return;\n }\n\n if (queue.length > 0) {\n queue.pop();\n emitMetrics();\n return;\n }\n\n return;\n }\n\n let lastToastEl = null;\n\n // Direct lookup: last active entry is the most recently created toast\n const activeValues = Array.from(active.values());\n if (activeValues.length > 0) {\n const lastData = activeValues.at(-1);\n lastToastEl =\n lastData.toast ||\n (lastData.outer && lastData.outer.querySelector('[id^=\"toast-\"]'));\n }\n\n if (!lastToastEl) {\n const containers = document.querySelectorAll('[id^=\"toast-container-\"]');\n containers.forEach((container) => {\n const children = Array.from(container.children || []);\n if (children.length === 0) return;\n const candidate = children.at(-1);\n if (candidate) {\n lastToastEl = candidate.querySelector('[id^=\"toast-\"]') || candidate;\n }\n });\n }\n\n if (!lastToastEl) return;\n\n const toastEl = lastToastEl._key\n ? lastToastEl\n : lastToastEl.querySelector('[id^=\"toast-\"]') || lastToastEl;\n\n await closeToast(toastEl);\n } catch (err) {\n console.error(\"dismissMostRecent failed:\", err);\n }\n}\n\nexport async function closeAllToasts() {\n try {\n for (const [, entry] of pending) {\n if (entry?.rafId) cancelAnimationFrame(entry.rafId);\n }\n pending.clear();\n queue.length = 0;\n emitMetrics();\n\n const activeToasts = Array.from(active.values())\n .map((d) => d.toast)\n .filter(Boolean);\n\n await Promise.allSettled(\n activeToasts.map(async (t) => {\n try {\n await closeToast(t);\n } catch (error_inner) {\n console.warn(\"closeAllToasts: failed to close one toast:\", error_inner);\n }\n }),\n );\n } catch (err) {\n console.error(\"closeAllToasts failed:\", err);\n }\n}\n\nexport function resetToastManager() {\n for (const [, entry] of pending) {\n if (entry?.rafId) cancelAnimationFrame(entry.rafId);\n }\n pending.clear();\n queue.length = 0;\n for (const [, data] of active) {\n data.timer?.clear();\n data.outer?._pauseCleanup?.();\n data.toast?._cleanupCloseButton?.();\n data.toast?._cleanupCTA?.();\n data.toast?._cleanupUndo?.();\n data.toast?._cleanupSwipe?.();\n data.toast?._cleanup?.();\n if (data.toast?._progressAnimation) {\n try {\n data.toast._progressAnimation.cancel();\n } catch {}\n data.toast._progressAnimation = null;\n }\n const badge = data.outer?.querySelector(\".toast-count-badge\");\n if (badge?._scaleTimer) {\n clearTimeout(badge._scaleTimer);\n badge._scaleTimer = null;\n }\n }\n if (typeof document !== \"undefined\") {\n const containers = document.querySelectorAll('[id^=\"toast-container-\"]');\n containers.forEach((c) => {\n try {\n c._stackedCleanup?.();\n } catch {}\n });\n }\n active.clear();\n visibleCount = 0;\n droppedCount = 0;\n isDraining = false;\n emitMetrics();\n}\n\nexport const dismiss = dismissMostRecent;\nexport const noop = closeAllToasts;\n\nfunction createDismissTimer(toast, options) {\n const raw = Number(options?.duration);\n if (options?.duration === Infinity || (typeof options?.duration === \"number\" && options?.duration <= 0)) {\n return null;\n }\n const duration = Number.isFinite(raw) && raw > 0 ? raw : 2500;\n const delay = duration + 5;\n const timer = new PausableTimer(async () => await closeToast(toast), delay);\n timer.start();\n return timer;\n}\n\nasync function setupPauseOnHover(data) {\n if (!data.pauseOnHover || !data.outer || !data.timer) return;\n\n data.outer._pauseCleanup?.();\n\n const { outer, timer, toast } = data;\n\n const onMouseEnter = () => {\n timer.pause();\n toast?._progressAnimation?.pause();\n toast?._pauseUndo?.();\n toast?.classList.add(\"toast-paused\");\n };\n const onMouseLeave = () => {\n timer.resume();\n toast?._progressAnimation?.play();\n toast?._resumeUndo?.();\n toast?.classList.remove(\"toast-paused\");\n };\n\n const onFocusIn = (e) => {\n if (e.target.matches(\"[tabindex], div, span, button, a\")) {\n timer.pause();\n toast?._progressAnimation?.pause();\n toast?._pauseUndo?.();\n toast?.classList.add(\"toast-paused\");\n }\n };\n\n const onFocusOut = (e) => {\n if (!outer.contains(e.relatedTarget)) {\n timer.resume();\n toast?._progressAnimation?.play();\n toast?._resumeUndo?.();\n toast?.classList.remove(\"toast-paused\");\n }\n };\n\n outer.addEventListener(\"mouseenter\", onMouseEnter);\n outer.addEventListener(\"mouseleave\", onMouseLeave);\n outer.addEventListener(\"focusin\", onFocusIn);\n outer.addEventListener(\"focusout\", onFocusOut);\n\n outer._pauseCleanup = () => {\n outer.removeEventListener(\"mouseenter\", onMouseEnter);\n outer.removeEventListener(\"mouseleave\", onMouseLeave);\n outer.removeEventListener(\"focusin\", onFocusIn);\n outer.removeEventListener(\"focusout\", onFocusOut);\n };\n}\n\nexport async function closeToast(toast) {\n if (!toast?._key) return;\n return closeToastByKey(toast._key);\n}\n\n// AUDIT/FEATURE (toastPromise support): the actual removal logic, now\n// keyed directly instead of requiring a toast DOM element. closeToast()\n// above is now a thin wrapper over this — same guard checks, same order\n// of operations, nothing behaviorally changed for existing closeToast()\n// callers. This lets toastPromise() (and anything else that only has a\n// key, not a live element reference) target a SPECIFIC toast for removal\n// — e.g. the loading toast — rather than only being able to close\n// \"whatever toast a DOM element currently points to.\"\nexport async function closeToastByKey(key, fromSync = false) {\n try {\n if (!key) return;\n\n // Broadcast dismissal to other tabs if not initiated from a remote sync event\n if (!fromSync && getConfig().syncTabs && broadcaster.isSupported()) {\n broadcaster.broadcast('dismiss', key, {});\n }\n\n // AUDIT/FEATURE FIX: toast creation is deferred one animation frame\n // (see showToast's rAF coalescing, used for grouping/dedup) — so a\n // caller holding a handle from createToast() can call dismiss()\n // before the toast has actually been created yet and moved from\n // `pending` into `active`. This is a real, reachable race: it\n // happens whenever a wrapped operation resolves faster than one\n // animation frame (e.g. toastPromise() with an already-resolved or\n // synchronously-resolving promise). Previously this just silently\n // no-op'd — the scheduled creation went ahead anyway, leaving a\n // toast that was supposed to be dismissed still showing (and, for\n // toastPromise()'s loading toast specifically, still running its\n // long fallback duration). Checking `pending` first and cancelling\n // the scheduled frame is the correct fix: \"dismiss a not-yet-created\n // toast\" should mean \"don't create it,\" not \"silently do nothing.\"\n const pendingEntry = pending.get(key);\n if (pendingEntry) {\n cancelAnimationFrame(pendingEntry.rafId);\n pending.delete(key);\n emitMetrics();\n return;\n }\n\n // Same race, different intermediate state: the toast finished its\n // rAF-scheduled creation but MAX_VISIBLE was already hit at that\n // moment, so it was pushed into `queue` instead of `active` — not\n // yet showing, waiting for a slot to free up via drainQueue().\n const queueIndex = queue.findIndex((item) => item.key === key);\n if (queueIndex !== -1) {\n queue.splice(queueIndex, 1);\n emitMetrics();\n return;\n }\n\n const data = active.get(key);\n if (!data) return;\n\n data.timer?.clear();\n data.outer?._pauseCleanup?.();\n data.toast?._cleanupCloseButton?.();\n data.toast?._cleanupCTA?.();\n data.toast?._cleanupUndo?.();\n data.toast?._cleanupSwipe?.();\n data.toast?._cleanup?.();\n if (data.toast?._progressAnimation) {\n try {\n data.toast._progressAnimation.cancel();\n } catch {}\n data.toast._progressAnimation = null;\n }\n const badge = data.outer?.querySelector(\".toast-count-badge\");\n if (badge?._scaleTimer) {\n clearTimeout(badge._scaleTimer);\n badge._scaleTimer = null;\n }\n // Clean up CTA click listener if present directly on button/link\n const ctaEl = data.toast?.querySelector(\"button, a\");\n ctaEl?._cleanup?.();\n\n active.delete(key);\n visibleCount = Math.max(0, visibleCount - 1);\n emitMetrics();\n\n if (badge) badge.remove();\n\n const animDuration = data.toast?._animationDuration ?? 400;\n const exitDuration = Math.min(animDuration, 300);\n\n if (data.toast) {\n if (!getConfig().disableInlineStyles) {\n const pos = String(data.options?.position || data.outer?.parentElement?.id || \"\").toLowerCase();\n const isTop = pos.includes(\"top\");\n const isLeft = pos.includes(\"left\");\n const isRight = pos.includes(\"right\");\n const anim = String(data.options?.animationType || \"\").toLowerCase().trim();\n\n let exitTransform = \"translateY(20px)\";\n if (anim === \"fade\") {\n exitTransform = \"none\";\n } else if (anim === \"zoom\" || anim === \"scale\") {\n exitTransform = \"scale(0.75)\";\n } else if (anim === \"flip\") {\n exitTransform = \"perspective(600px) rotateX(-45deg)\";\n } else if (anim === \"slide\") {\n exitTransform = isLeft ? \"translateX(-100%)\" : isRight ? \"translateX(100%)\" : isTop ? \"translateY(-100%)\" : \"translateY(100%)\";\n }\n\n data.toast.style.transition = `opacity ${exitDuration}ms ease-in, transform ${exitDuration}ms ease-in`;\n data.toast.style.opacity = \"0\";\n data.toast.style.transform = exitTransform;\n }\n data.toast.classList.remove(\"active\");\n }\n\n const parentContainer = data.outer?.parentElement;\n await removeWithTransition(data.outer, data.toast, exitDuration);\n\n if (\n parentContainer &&\n parentContainer.children.length === 0 &&\n parentContainer.id?.startsWith(\"toast-container-\")\n ) {\n try {\n parentContainer._stackedCleanup?.();\n unregisterContainer(parentContainer.id);\n parentContainer.remove();\n } catch {}\n } else if (parentContainer && parentContainer.getAttribute(\"data-stacked\") === \"true\") {\n updateStackedLayout(parentContainer);\n }\n\n await drainQueue();\n } catch (error) {\n console.error(\"Closing Toast failed!: \", error);\n }\n}\n\nlet isDraining = false;\n\nasync function drainQueue() {\n if (isDraining) return;\n isDraining = true;\n try {\n const config = getConfig();\n\n // Apply AI priority sorting if enabled globally or on queued items\n if ((config.aiPrioritization || queue.some(i => i.options?.aiPrioritization || typeof i.options?.priority === \"number\")) && queue.length > 1) {\n queue.sort((a, b) => getItemPriority(b) - getItemPriority(a)); // Higher priority first\n }\n\n while (visibleCount < config.maxVisible && queue.length) {\n const item = queue.shift();\n if (active.has(item.key)) {\n const data = active.get(item.key);\n data.count += item.count;\n await updateBadge(data);\n emitMetrics();\n continue;\n }\n await createOne(item.options, item.key, item.count);\n }\n emitMetrics();\n } finally {\n isDraining = false;\n }\n}\n\nasync function removeWithTransition(el, targetEl, animationDurationMs = 400) {\n if (!el) return Promise.resolve();\n\n return new Promise((resolve) => {\n let done = false;\n let fallbackTimer = null;\n const animEl = targetEl || el.firstElementChild || el;\n\n const finish = () => {\n if (done) return;\n done = true;\n if (fallbackTimer) {\n clearTimeout(fallbackTimer);\n fallbackTimer = null;\n }\n try {\n animEl?.removeEventListener?.(\"transitionend\", onEnd, true);\n } catch {}\n const toastEl = el.querySelector?.(\".toast\") || el;\n if (toastEl?._pooledId) {\n try {\n getToastPool().release(toastEl, toastEl._pooledId);\n } catch {}\n }\n removeElement(el);\n resolve();\n };\n\n const onEnd = (e) => {\n try {\n if (e.target !== animEl) return;\n if (\n e.propertyName === \"transform\" ||\n (!animEl.style.transform && e.propertyName === \"opacity\")\n ) {\n finish();\n }\n } catch (error) {\n console.error(\"removeWithTransition error:\", error);\n }\n };\n\n if (!animEl) return finish();\n\n try {\n animEl.addEventListener(\"transitionend\", onEnd, true);\n } catch (error) {\n console.error(\"removeWithTransition error:\", error);\n }\n\n // Use animation duration + 100ms buffer for fallback timeout\n const fallbackTimeout = animationDurationMs + 100;\n fallbackTimer = setTimeout(finish, fallbackTimeout);\n if (typeof fallbackTimer?.unref === \"function\") {\n fallbackTimer.unref();\n }\n });\n}\n\nasync function updateBadge({ outer, count }) {\n if (!outer || !(outer instanceof HTMLElement)) {\n throw new Error(\"updateBadge: outer must be a valid HTMLElement\");\n }\n\n if (count < 2) {\n const badge = outer.querySelector(\".toast-count-badge\");\n if (badge) badge.remove();\n return;\n }\n\n let badge = outer.querySelector(\".toast-count-badge\");\n if (!badge) {\n badge = document.createElement(\"span\");\n badge.className = \"toast-count-badge\";\n badge.setAttribute(\"aria-label\", `${count} identical notifications`);\n\n if (!getConfig().disableInlineStyles) {\n Object.assign(badge.style, {\n position: \"absolute\",\n top: \"6px\",\n right: \"6px\",\n backgroundColor: \"#f44336\",\n color: \"#fff\",\n borderRadius: \"50%\",\n minWidth: \"20px\",\n height: \"20px\",\n fontSize: \"12px\",\n fontWeight: \"600\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n border: \"2px solid #fff\",\n boxShadow: \"0 2px 6px rgba(0,0,0,0.3)\",\n zIndex: \"2\",\n pointerEvents: \"none\",\n transition: \"transform 150ms ease\",\n }); \n }\n\n outer.appendChild(badge);\n }\n\n badge.textContent = count > 99 ? \"99+\" : String(count);\n\n try {\n if (!shouldReduceMotion()) {\n if (badge._scaleTimer) clearTimeout(badge._scaleTimer);\n badge.style.transform = \"scale(1.2)\";\n badge._scaleTimer = setTimeout(() => {\n badge.style.transform = \"scale(1)\";\n badge._scaleTimer = null;\n }, 150);\n if (typeof badge._scaleTimer?.unref === \"function\") {\n badge._scaleTimer.unref();\n }\n }\n } catch (error) {\n console.error(\"updateBadge animation error:\", error);\n }\n}\n\n/**\n * Updates an active, pending, or queued toast in-place with new options.\n * @param {string} key\n * @param {Partial<import('../index.js').ToastOptions>} [newOptions]\n */\nexport async function updateToastByKey(key, newOptions = {}) {\n if (!key || typeof newOptions !== \"object\" || newOptions === null) return;\n\n if (pending.has(key)) {\n const entry = pending.get(key);\n entry.options = { ...entry.options, ...newOptions };\n return;\n }\n\n const queued = queue.find((q) => q.key === key);\n if (queued) {\n queued.options = { ...queued.options, ...newOptions };\n return;\n }\n\n const data = active.get(key);\n if (!data || !data.toast) return;\n\n const prevOptions = { ...data.options };\n data.options = { ...data.options, ...newOptions };\n const toast = data.toast;\n const messageSpan =\n toast._messageSpan ||\n toast.querySelector(\".toast-message\") ||\n toast.querySelector(\"span:not(.toast-count-badge)\");\n\n // 1. Update message\n if (newOptions.message !== undefined) {\n const rawMessage = String(newOptions.message ?? \"\");\n const allowHtml =\n newOptions.allowHtml !== undefined\n ? Boolean(newOptions.allowHtml)\n : Boolean(data.options.allowHtml);\n\n const isFinishingLoading =\n (newOptions.type === \"success\" || newOptions.type === \"error\") &&\n newOptions.showLoader !== true;\n\n if (messageSpan) {\n const existingLoader = messageSpan.querySelector(\".toast-loader\");\n messageSpan.innerHTML = \"\";\n if (\n existingLoader &&\n newOptions.showLoader !== false &&\n newOptions.loader !== null &&\n !isFinishingLoading\n ) {\n messageSpan.appendChild(existingLoader);\n const spacer = document.createElement(\"span\");\n spacer.style.display = \"inline-block\";\n spacer.style.width = \"8px\";\n messageSpan.appendChild(spacer);\n }\n\n if (allowHtml && rawMessage.trim().length > 0) {\n try {\n const sanitized = sanitizeHtml(rawMessage);\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = sanitized;\n while (tmp.firstChild) {\n messageSpan.appendChild(tmp.firstChild);\n }\n } catch {\n messageSpan.appendChild(document.createTextNode(rawMessage));\n }\n } else {\n messageSpan.appendChild(document.createTextNode(rawMessage));\n }\n\n messageSpan.setAttribute(\"title\", messageSpan.textContent || \"\");\n }\n }\n\n // 2. Handle Loader\n const isFinishingLoading =\n (newOptions.type === \"success\" || newOptions.type === \"error\") &&\n newOptions.showLoader !== true;\n\n if (\n newOptions.showLoader === false ||\n newOptions.loader === null ||\n isFinishingLoading\n ) {\n const loaderEl = messageSpan?.querySelector(\".toast-loader\");\n if (loaderEl) {\n if (loaderEl.nextSibling && loaderEl.nextSibling.nodeName === \"SPAN\") {\n loaderEl.nextSibling.remove();\n }\n loaderEl.remove();\n }\n } else if (\n (newOptions.showLoader === true ||\n (newOptions.loader && typeof newOptions.loader === \"object\")) &&\n messageSpan &&\n !messageSpan.querySelector(\".toast-loader\")\n ) {\n const loaderEl = createLoader(newOptions.loader || {});\n messageSpan.insertBefore(loaderEl, messageSpan.firstChild);\n const spacer = document.createElement(\"span\");\n spacer.style.display = \"inline-block\";\n spacer.style.width = \"8px\";\n messageSpan.insertBefore(spacer, loaderEl.nextSibling);\n }\n\n // 3. Update type & colors\n if (newOptions.type) {\n const newType = String(newOptions.type).toLowerCase().trim();\n toast.className = toast.className.replace(\n /\\btoast-(info|success|error|warning)\\b/g,\n `toast-${newType}`,\n );\n const isErr = newType === \"error\";\n if (newOptions.role) {\n toast.setAttribute(\"role\", newOptions.role);\n } else {\n toast.setAttribute(\"role\", \"alert\");\n }\n toast.setAttribute(\"aria-live\", newOptions.ariaLive || (isErr ? \"assertive\" : \"polite\"));\n\n if (!newOptions.backgroundColor) {\n const typeColors = {\n success: \"#28a745\",\n error: \"#dc3545\",\n warning: \"#ffc107\",\n info: \"#17a2b8\",\n };\n if (typeColors[newType]) {\n toast.style.background = typeColors[newType];\n }\n }\n }\n\n // 3.1 Update icon\n if (newOptions.icon !== undefined || newOptions.type !== undefined) {\n const existingIcon = toast?.querySelector(\".toast-icon\");\n if (existingIcon) existingIcon.remove();\n const mergedForIcon = { ...data.options, ...newOptions };\n const newIconEl = createToastIcon(mergedForIcon);\n if (newIconEl) {\n if (messageSpan) {\n toast.insertBefore(newIconEl, messageSpan);\n } else {\n toast.appendChild(newIconEl);\n }\n }\n }\n\n if (newOptions.backgroundColor) {\n toast.style.background = newOptions.backgroundColor;\n }\n\n if (newOptions.textColor) {\n toast.style.color = newOptions.textColor;\n if (messageSpan) messageSpan.style.color = newOptions.textColor;\n } else if (newOptions.type || newOptions.backgroundColor) {\n const bg = toast.style.background;\n if (bg) {\n const dynamicColor = getDynamicAccessibleTextColorHex(bg);\n toast.style.color = dynamicColor;\n if (messageSpan) messageSpan.style.color = dynamicColor;\n }\n }\n\n if (newOptions.borderRadius !== undefined) {\n const br = typeof newOptions.borderRadius === \"number\" ? `${newOptions.borderRadius}px` : newOptions.borderRadius;\n toast.style.borderRadius = br;\n }\n\n if (newOptions.maxWidth !== undefined) {\n const mw = typeof newOptions.maxWidth === \"number\" ? `${newOptions.maxWidth}px` : newOptions.maxWidth;\n toast.style.maxWidth = mw;\n }\n\n if (newOptions.fontDirection !== undefined) {\n const dir = newOptions.fontDirection !== \"auto\" ? newOptions.fontDirection : \"\";\n toast.style.direction = dir;\n if (messageSpan) messageSpan.style.direction = dir;\n }\n\n if (newOptions.fontSize !== undefined) {\n const fs = typeof newOptions.fontSize === \"number\" ? `${newOptions.fontSize}px` : newOptions.fontSize;\n toast.style.fontSize = fs;\n if (messageSpan) messageSpan.style.fontSize = fs;\n }\n\n if (newOptions.fontFamily !== undefined) {\n toast.style.fontFamily = newOptions.fontFamily;\n if (messageSpan) messageSpan.style.fontFamily = newOptions.fontFamily;\n }\n\n if (newOptions.fontWeight !== undefined) {\n const fw = typeof newOptions.fontWeight === \"number\" ? String(newOptions.fontWeight) : newOptions.fontWeight;\n toast.style.fontWeight = fw;\n if (messageSpan) messageSpan.style.fontWeight = fw;\n }\n\n if (newOptions.fontLineHeight !== undefined) {\n toast.style.lineHeight = newOptions.fontLineHeight;\n if (messageSpan) messageSpan.style.lineHeight = newOptions.fontLineHeight;\n }\n\n if (newOptions.role !== undefined) {\n toast.setAttribute(\"role\", newOptions.role);\n }\n if (newOptions.ariaLive !== undefined) {\n toast.setAttribute(\"aria-live\", newOptions.ariaLive);\n }\n\n if (newOptions.className !== undefined) {\n const prevClass = prevOptions.className;\n if (prevClass && typeof prevClass === \"string\") {\n toast.classList.remove(...prevClass.trim().split(/\\s+/));\n }\n if (newOptions.className && typeof newOptions.className === \"string\") {\n toast.classList.add(...newOptions.className.trim().split(/\\s+/));\n }\n }\n if (newOptions.progress !== undefined) {\n let pct = Number(newOptions.progress);\n if (!Number.isFinite(pct)) pct = 0;\n if (pct < 1 && pct > 0) pct = pct * 100;\n pct = Math.min(100, Math.max(0, pct));\n\n let progressBar = toast.querySelector(\".toast-progress-bar\");\n if (\n !progressBar &&\n (newOptions.showProgressBar || data.options.showProgressBar)\n ) {\n createProgressBar(toast, { ...data.options, ...newOptions });\n progressBar = toast.querySelector(\".toast-progress-bar\");\n }\n if (progressBar) {\n if (toast._progressAnimation) {\n try {\n toast._progressAnimation.cancel();\n } catch {}\n toast._progressAnimation = null;\n }\n progressBar.style.transition = \"width 200ms ease\";\n progressBar.style.width = `${pct}%`;\n }\n } else if (newOptions.showProgressBar === false) {\n const bar = toast.querySelector(\".toast-progress-bar\");\n if (bar) bar.remove();\n }\n\n if (newOptions.progressBarColor || newOptions.progressColor) {\n const bar = toast.querySelector(\".toast-progress-bar\");\n if (bar) {\n bar.style.background = newOptions.progressBarColor || newOptions.progressColor;\n }\n }\n\n if (newOptions.progressPosition) {\n const bar = toast.querySelector(\".toast-progress-bar\");\n if (bar) {\n bar.style.top = newOptions.progressPosition === \"top\" ? \"0\" : \"auto\";\n bar.style.bottom = newOptions.progressPosition === \"bottom\" ? \"0\" : \"auto\";\n }\n }\n\n if (newOptions.progressHeight !== undefined) {\n const bar = toast.querySelector(\".toast-progress-bar\");\n if (bar) {\n const ph = typeof newOptions.progressHeight === \"number\" ? `${newOptions.progressHeight}px` : newOptions.progressHeight;\n bar.style.height = ph;\n }\n }\n\n if (newOptions.animationType !== undefined) {\n data.options.animationType = newOptions.animationType;\n toast._animationType = newOptions.animationType;\n }\n\n // 5. Update Duration / Timer\n if (newOptions.duration !== undefined) {\n data.timer?.clear();\n const raw = Number(newOptions.duration);\n if (Number.isFinite(raw) && raw > 0) {\n data.timer = createDismissTimer(toast, { duration: raw });\n await setupPauseOnHover(data);\n } else {\n data.timer = null;\n }\n } else if (\n (data.options.duration === 0 || !data.timer) &&\n (newOptions.type === \"success\" ||\n newOptions.type === \"error\" ||\n newOptions.type === \"warning\" ||\n newOptions.showLoader === false)\n ) {\n // If it was a persistent loading toast (duration: 0) and transitioned to a resolved state\n // without an explicit duration, start a standard auto-dismiss timer so it doesn't stay permanently stuck on screen.\n data.timer?.clear();\n data.timer = createDismissTimer(toast, { duration: 2500 });\n await setupPauseOnHover(data);\n }\n\n // 5.1 Update CTA\n if (newOptions.cta !== undefined) {\n if (toast._cleanupCTA) {\n toast._cleanupCTA();\n toast._cleanupCTA = null;\n }\n toast.querySelectorAll(\".toast-cta\").forEach((el) => el.remove());\n\n if (newOptions.cta && typeof newOptions.cta === \"object\") {\n const mergedOpts = { ...data.options, ...newOptions };\n createCTA(toast, mergedOpts, closeToast);\n }\n }\n\n // 5.2 Update Undo Action\n if (newOptions.undo !== undefined) {\n if (toast._cleanupUndo) {\n toast._cleanupUndo();\n toast._cleanupUndo = null;\n }\n toast.querySelectorAll(\".toast-undo-btn\").forEach((el) => el.remove());\n\n if (newOptions.undo) {\n const mergedOpts = { ...data.options, ...newOptions };\n createUndoAction(toast, mergedOpts, closeToast);\n }\n }\n\n // 5.3 Update Close Button\n if (newOptions.showCloseButton !== undefined) {\n const existingCloseBtn = toast.querySelector(\".toast-close-btn\");\n if (newOptions.showCloseButton === false) {\n if (toast._cleanupCloseButton) {\n toast._cleanupCloseButton();\n toast._cleanupCloseButton = null;\n }\n if (existingCloseBtn) existingCloseBtn.remove();\n } else if (newOptions.showCloseButton === true && !existingCloseBtn) {\n createCloseButton(toast, data.options, closeToast);\n }\n }\n\n // 6. Audio Tone\n const shouldPlayAudio =\n newOptions.sound !== undefined\n ? Boolean(newOptions.sound)\n : Boolean(newOptions.type && (data.options.sound || getConfig().sound));\n\n if (shouldPlayAudio) {\n const tone =\n typeof newOptions.sound === \"string\"\n ? newOptions.sound\n : newOptions.type || data.options.type || \"info\";\n const preset =\n newOptions.soundPreset ||\n data.options.soundPreset ||\n getConfig().soundPreset ||\n \"modern\";\n playTone(tone, preset);\n }\n\n // 7. Stacked update\n const container = toast.closest('[id^=\"toast-container-\"]');\n if (container && container.getAttribute(\"data-stacked\") === \"true\") {\n updateStackedLayout(container);\n }\n}\n\n","\"use strict\";\n\nimport { setConfig, getConfig, resetConfig, shouldReduceMotion } from \"./utils/config.js\";\n\nimport {\n showToast,\n closeToastByKey,\n updateToastByKey,\n resetToastManager,\n dismiss,\n noop as managerNoop,\n getToastMetrics,\n} from \"./components/ToastManager.js\";\nimport { getOrCreateToastContainer, resetContainerRegistry } from \"./utils/containerRegistry.js\";\nimport { getDynamicAccessibleTextColorHex } from \"./utils/dom.js\";\nimport { setPosition } from \"./utils/position.js\";\nimport {\n setAudioEnabled,\n isAudioEnabled,\n playTone,\n registerSoundPreset,\n getSoundPresets,\n resetSoundPresets,\n resetAudioContext,\n getAudioContext,\n getAudioAnalyser,\n} from \"./utils/audio.js\";\nimport { getToastPool, resetToastPool } from \"./utils/toast-pool.js\";\nimport { getToastBroadcaster, resetToastBroadcaster } from \"./utils/toast-broadcast.js\";\nimport { calculateToastPriority, categorizeToast } from \"./utils/ai-scorer.js\";\nimport { createGestureDetector, detectPinch, isFlick, calculateVelocity } from \"./utils/multi-touch.js\";\nimport { generateToastId, resetToastIdCounter } from \"./utils/id.js\";\nimport {\n registerSpringPreset,\n getSpringPresets,\n resetSpringPresets,\n resolveSpringConfig,\n solveSpring,\n calculateSpringSettlingDuration,\n generateSpringLinearEasing,\n getSpringTransition,\n} from \"./utils/spring.js\";\n\n/**\n * @typedef {'modern' | 'retro' | 'futuristic' | 'subtle' | 'bell' | string} SoundPreset\n */\n\n/**\n * @typedef {'info' | 'success' | 'error' | 'warning'} ToastType\n */\n\n/**\n * @typedef {'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'top-center' | 'bottom-center' | 'left-center' | 'right-center' | 'top-full-width' | 'bottom-full-width' | 'center'} ToastPosition\n */\n\n/**\n * @typedef {Object} CTAOptions\n * @property {string} [label]\n * @property {string} [href]\n * @property {'button' | 'link'} [variant]\n * @property {string} [target]\n * @property {string} [rel]\n * @property {string} [ariaLabel]\n * @property {boolean} [autoClose]\n * @property {string} [color]\n * @property {string} [textColor]\n * @property {string} [background]\n * @property {string} [backgroundColor]\n * @property {(e: MouseEvent) => void | Promise<void>} [onClick]\n */\n\n/**\n * @typedef {Object} UndoOptions\n * @property {string} [label] - Button text label (default: 'Undo')\n * @property {boolean} [showCountdown] - Whether to display decaying seconds counter (default: true)\n * @property {(e: MouseEvent, toast: HTMLElement) => void | Promise<void>} [onUndo] - Callback fired when clicked\n */\n\n/**\n * @typedef {Object} SpringConfig\n * @property {number} [stiffness=100] - Spring stiffness constant (k > 0)\n * @property {number} [damping=10] - Damping friction coefficient (c > 0)\n * @property {number} [mass=1] - Inertial mass (m > 0)\n */\n\n/**\n * @typedef {'default' | 'gentle' | 'wobbly' | 'stiff' | 'bouncy' | string} SpringPreset\n */\n\n/**\n * @typedef {Object} ToastLoaderOptions\n * @property {number} [size] - Spinner size in pixels (default 14)\n * @property {string} [color] - Spinner SVG stroke color (default 'currentColor')\n * @property {string} [text] - Optional text label alongside spinner\n */\n\n/**\n * @typedef {Object} ToastOptions\n * @property {string} [message]\n * @property {ToastType} [type]\n * @property {number} [duration]\n * @property {ToastPosition | string} [position]\n * @property {string} [borderRadius]\n * @property {string} [backgroundColor]\n * @property {string} [textColor]\n * @property {boolean} [showCloseButton]\n * @property {boolean} [showProgressBar]\n * @property {string} [animationDuration]\n * @property {string} [animationEasing]\n * @property {'default' | 'fade' | 'slide' | 'zoom' | 'bounce' | 'flip' | string} [animationType]\n * @property {string} [progressColor]\n * @property {string} [progressBarColor]\n * @property {string} [progressHeight]\n * @property {'top' | 'bottom'} [progressPosition]\n * @property {'decreasing' | 'increasing' | 'ltr' | 'rtl' | 'reverse' | string} [progressDirection]\n * @property {boolean} [pauseOnHover]\n * @property {boolean} [allowHtml]\n * @property {boolean} [sanitizeHtml]\n * @property {boolean} [showLoader]\n * @property {ToastLoaderOptions} [loader]\n * @property {'normal' | 'truncate' | string | boolean} [wrapText]\n * @property {string} [maxWidth]\n * @property {string} [fontFamily]\n * @property {string} [fontSize]\n * @property {string} [fontWeight]\n * @property {string} [fontLineHeight]\n * @property {'auto' | 'ltr' | 'rtl'} [fontDirection]\n * @property {string} [fontPadding]\n * @property {string} [className]\n * @property {CTAOptions | CTAOptions[]} [cta]\n * @property {((e: MouseEvent, toast: HTMLElement) => void | Promise<void>) | UndoOptions} [undo]\n * @property {boolean | SpringPreset | SpringConfig} [spring]\n * @property {boolean} [stacked]\n * @property {boolean | 'success' | 'error' | 'warning' | 'info' | 'pop' | string} [sound]\n * @property {SoundPreset} [soundPreset]\n * @property {boolean | string | HTMLElement | ((options: ToastOptions) => boolean | string | HTMLElement | null | undefined)} [icon]\n * @property {boolean} [swipeToDismiss]\n * @property {number | 'indeterminate'} [progress]\n * @property {boolean} [syncTabs]\n * @property {boolean} [aiPrioritization]\n * @property {number} [priority]\n * @property {boolean} [usePool]\n */\n\n/**\n * @typedef {'auto' | 'always' | 'never'} ReducedMotionMode\n */\n\n/**\n * @typedef {'light' | 'dark' | 'high-contrast' | 'compact' | 'spacious' | 'glass'} ToastTheme\n */\n\n/**\n * @typedef {Element | DocumentFragment | ShadowRoot} ToastMountTarget\n */\n\n/**\n * @typedef {Object} ToastMetrics\n * @property {number} activeCount - Currently rendered active toasts\n * @property {number} queueDepth - Number of queued toasts waiting to be displayed\n * @property {number} visibleCount - Count of currently visible toasts\n * @property {number} droppedCount - Number of toasts dropped due to queue overflow\n * @property {number} timestamp - Epoch timestamp (ms) when metrics were recorded\n */\n\n/**\n * @typedef {Object} ToastGlobalConfig\n * @property {number} [maxVisible]\n * @property {number} [maxQueueSize]\n * @property {number} [zIndex]\n * @property {ToastMountTarget | null} [targetNode]\n * @property {boolean} [disableInlineStyles]\n * @property {ReducedMotionMode} [reducedMotion]\n * @property {ToastPosition | string} [defaultPosition]\n * @property {ToastTheme} [theme]\n * @property {boolean} [stacked]\n * @property {boolean} [swipeToDismiss]\n * @property {boolean} [sound]\n * @property {SoundPreset} [soundPreset]\n * @property {boolean} [syncTabs]\n * @property {boolean} [aiPrioritization]\n * @property {boolean} [debug]\n * @property {((context: { type: string, message: string, duration?: number, options?: Record<string, unknown> }) => number | { score: number }) | null} [priorityScorer]\n * @property {((metrics: ToastMetrics) => void) | null} [onMetrics]\n */\n\n/**\n * @typedef {Object} ToastHandle\n * @property {string} [id] - The unique identifier/key of the toast notification.\n * @property {() => Promise<void>} dismiss\n * @property {(newOptions: Partial<ToastOptions>) => Promise<void>} update\n */\n\n/**\n * @typedef {Object} ToastPromiseMessages\n * @property {string | Partial<ToastOptions>} [loading]\n * @property {string | Partial<ToastOptions> | ((result: unknown) => string | Partial<ToastOptions>)} [success]\n * @property {string | Partial<ToastOptions> | ((error: unknown) => string | Partial<ToastOptions>)} [error]\n */\n\nlet defaultColors = {\n success: \"#28a745\",\n error: \"#dc3545\",\n warning: \"#ffc107\",\n info: \"#17a2b8\",\n};\n\nlet defaultMessages = {\n success: \"Operation completed successfully!\",\n error: \"Something went wrong!\",\n warning: \"Warning message!\",\n info: \"Information message!\",\n};\n\nlet domReady = false;\nlet domReadyPromise = null;\n\nasync function checkDOMReady() {\n if (domReady) return;\n\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return;\n }\n\n if (\n document.readyState === \"complete\" ||\n document.readyState === \"interactive\"\n ) {\n domReady = true;\n return;\n }\n\n if (!domReadyPromise) {\n domReadyPromise = new Promise((resolve) => {\n document.addEventListener(\n \"DOMContentLoaded\",\n () => {\n domReady = true;\n resolve();\n },\n { once: true },\n );\n });\n }\n\n await domReadyPromise;\n}\n\nasync function createToastNow(options = {}) {\n try {\n const sanitizedOptions = await sanitizeToastOptions(options);\n\n await createFirstToastContainer(sanitizedOptions);\n\n return await showToast(sanitizedOptions);\n } catch (error) {\n console.error(\"CreateToast failed:\", error);\n return null;\n }\n}\n\nasync function createToast(options = {}) {\n const isBrowser =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n\n if (!isBrowser) {\n console.warn(\n \"ToastNotification: running in non-browser environment, no DOM available.\",\n );\n return null;\n }\n\n await checkDOMReady();\n\n return await createToastNow(options);\n}\n\nasync function createFirstToastContainer(options) {\n try {\n return await getOrCreateToastContainer(options, setPosition);\n } catch (error) {\n console.error(\"Failed to create toast container:\", error);\n return getConfig().targetNode || document.body;\n }\n}\n\nfunction normalizeToastOptions(messageOrOptions, maybeOptions) {\n const extra =\n typeof maybeOptions === \"object\" && maybeOptions !== null && !Array.isArray(maybeOptions)\n ? maybeOptions\n : {};\n\n if (\n typeof messageOrOptions === \"string\" ||\n typeof messageOrOptions === \"number\" ||\n typeof messageOrOptions === \"boolean\" ||\n typeof messageOrOptions === \"bigint\"\n ) {\n return {\n ...extra,\n message: String(messageOrOptions),\n };\n }\n\n if (messageOrOptions instanceof Error) {\n return {\n ...extra,\n message: messageOrOptions.message || String(messageOrOptions),\n };\n }\n\n if (typeof messageOrOptions === \"object\" && messageOrOptions !== null && !Array.isArray(messageOrOptions)) {\n return {\n ...extra,\n ...messageOrOptions,\n };\n }\n\n return { ...extra };\n}\n\nasync function sanitizeToastOptions(rawOptions) {\n const options = normalizeToastOptions(rawOptions);\n const config = getConfig();\n const contPosition = String(options?.position ?? config.defaultPosition).toLowerCase().trim();\n const contMaxWidth =\n contPosition?.includes(\"top-full-width\") ||\n contPosition?.includes(\"bottom-full-width\")\n ? \"100vw\"\n : \"400px\";\n\n const defaults = {\n allowHtml: false,\n sanitizeHtml: true,\n pauseOnHover: undefined,\n duration: 2500,\n position: config.defaultPosition,\n type: \"info\",\n borderRadius: \"50px\",\n backgroundColor: undefined,\n textColor: undefined,\n showCloseButton: true,\n animationDuration: \"0.4s\",\n animationEasing: \"ease\",\n showProgressBar: true,\n progressColor: undefined,\n progressBarColor: undefined,\n progressHeight: \"4px\",\n progressPosition: \"bottom\",\n progressDirection: \"decreasing\",\n animationType: \"default\",\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n fontSize: \"14px\",\n fontWeight: \"400\",\n fontLineHeight: \"1.4\",\n fontDirection: \"auto\",\n wrapText: \"normal\",\n maxWidth: contMaxWidth,\n };\n\n const final = {\n ...defaults,\n ...options,\n };\n\n final.message = options?.message ?? final.message;\n\n try {\n if (!final.backgroundColor) {\n final.backgroundColor =\n defaultColors?.[final.type] ??\n (window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"#f5f5f5\"\n : \"#111111\");\n }\n } catch (error) {\n console.warn(\"Background color resolution failed:\", error);\n }\n\n try {\n final.message =\n final.message || defaultMessages?.[final.type] || \"No Message Provided!\";\n } catch (error) {\n console.warn(\"Default message resolution failed:\", error);\n }\n\n try {\n if (!final.textColor && final.backgroundColor) {\n final.textColor = getDynamicAccessibleTextColorHex(final.backgroundColor);\n }\n } catch (error) {\n console.warn(\"Text color resolution failed:\", error);\n }\n\n try {\n const rawProgressColor = options?.progressBarColor || options?.progressColor;\n if (rawProgressColor) {\n final.progressColor = rawProgressColor;\n final.progressBarColor = rawProgressColor;\n } else if (!final.progressColor && final.backgroundColor) {\n final.progressColor =\n final.textColor ||\n getDynamicAccessibleTextColorHex(final.backgroundColor);\n final.progressBarColor = final.progressColor;\n }\n } catch (error) {\n console.warn(\"Progress bar color resolution failed:\", error);\n }\n\n if (typeof final.message !== \"string\") {\n final.message = \"No Message Provided!\";\n }\n\n return final;\n}\n\n/**\n * Sets default background colors for toast types.\n * @param {Partial<Record<ToastType, string>>} colors\n */\nfunction setDefaultColors(colors) {\n try {\n if (colors && typeof colors === \"object\" && !Array.isArray(colors)) {\n const validTypes = [\"success\", \"error\", \"warning\", \"info\"];\n const validated = {};\n for (const [key, value] of Object.entries(colors)) {\n if (validTypes.includes(key) && typeof value === \"string\" && value.trim()) {\n validated[key] = value.trim();\n }\n }\n if (Object.keys(validated).length > 0) {\n defaultColors = { ...defaultColors, ...validated };\n }\n }\n } catch (error) {\n console.error(\"setDefaultColors failed:\", error);\n }\n}\n\n/**\n * Sets default messages for toast types.\n * @param {Partial<Record<ToastType, string>>} messages\n */\nfunction setDefaultMessages(messages) {\n try {\n if (messages && typeof messages === \"object\" && !Array.isArray(messages)) {\n const validTypes = [\"success\", \"error\", \"warning\", \"info\"];\n const validated = {};\n for (const [key, value] of Object.entries(messages)) {\n if (validTypes.includes(key) && typeof value === \"string\" && value.trim()) {\n validated[key] = value.trim();\n }\n }\n if (Object.keys(validated).length > 0) {\n defaultMessages = { ...defaultMessages, ...validated };\n }\n }\n } catch (error) {\n console.error(\"setDefaultMessages failed:\", error);\n }\n}\n\nlet closeInProgress = false;\nlet closePromise = null;\n\nasync function runWithClosePriority(fn) {\n if (closeInProgress && closePromise) {\n try {\n await closePromise;\n } catch (closeError) {\n console.warn(\n \"Previous close operation failed (continuing anyway):\",\n closeError,\n );\n }\n }\n return fn();\n}\n\nconst originalCreateToast = createToast;\n\n/**\n * Creates and displays a toast notification.\n * Supports string shorthand: `createToast(\"Message\")` or full options `createToast({ message: \"...\" })`.\n * Also provides ergonomic shorthand methods: `createToast.success(...)`, `createToast.error(...)`, etc.\n * @param {string | ToastOptions} [messageOrOptions]\n * @param {Partial<ToastOptions>} [maybeOptions]\n * @returns {Promise<ToastHandle>}\n */\nasync function createToastWithPriority(messageOrOptions = {}, maybeOptions) {\n const normalized = normalizeToastOptions(messageOrOptions, maybeOptions);\n const key = await runWithClosePriority(() => originalCreateToast(normalized));\n return {\n id: key,\n dismiss: () => (key ? closeToastByKey(key) : Promise.resolve()),\n update: (newOptions) =>\n key ? updateToastByKey(key, newOptions) : Promise.resolve(),\n };\n}\n\n/**\n * Displays a success toast notification.\n * @param {string | ToastOptions} [messageOrOptions]\n * @param {Partial<ToastOptions>} [options]\n * @returns {Promise<ToastHandle>}\n */\ncreateToastWithPriority.success = (messageOrOptions, options) => {\n const normalized = normalizeToastOptions(messageOrOptions, options);\n return createToastWithPriority({ ...normalized, type: \"success\" });\n};\n\n/**\n * Displays an error toast notification.\n * @param {string | ToastOptions} [messageOrOptions]\n * @param {Partial<ToastOptions>} [options]\n * @returns {Promise<ToastHandle>}\n */\ncreateToastWithPriority.error = (messageOrOptions, options) => {\n const normalized = normalizeToastOptions(messageOrOptions, options);\n return createToastWithPriority({ ...normalized, type: \"error\" });\n};\n\n/**\n * Displays a warning toast notification.\n * @param {string | ToastOptions} [messageOrOptions]\n * @param {Partial<ToastOptions>} [options]\n * @returns {Promise<ToastHandle>}\n */\ncreateToastWithPriority.warning = (messageOrOptions, options) => {\n const normalized = normalizeToastOptions(messageOrOptions, options);\n return createToastWithPriority({ ...normalized, type: \"warning\" });\n};\n\n/**\n * Displays an informational toast notification.\n * @param {string | ToastOptions} [messageOrOptions]\n * @param {Partial<ToastOptions>} [options]\n * @returns {Promise<ToastHandle>}\n */\ncreateToastWithPriority.info = (messageOrOptions, options) => {\n const normalized = normalizeToastOptions(messageOrOptions, options);\n return createToastWithPriority({ ...normalized, type: \"info\" });\n};\n\n/**\n * Displays a persistent loading toast with an animated spinner.\n * @param {string | ToastOptions} [messageOrOptions]\n * @param {Partial<ToastOptions>} [options]\n * @returns {Promise<ToastHandle>}\n */\ncreateToastWithPriority.loading = (messageOrOptions, options) => {\n const normalized = normalizeToastOptions(messageOrOptions, options);\n return createToastWithPriority({\n type: \"info\",\n showLoader: true,\n duration: 0,\n showProgressBar: false,\n pauseOnHover: false,\n ...normalized,\n });\n};\n\n/**\n * Displays a custom styled HTML toast notification.\n * @param {string | ToastOptions} [messageOrOptions]\n * @param {Partial<ToastOptions>} [options]\n * @returns {Promise<ToastHandle>}\n */\ncreateToastWithPriority.custom = (messageOrOptions, options) => {\n const normalized = normalizeToastOptions(messageOrOptions, options);\n return createToastWithPriority({\n allowHtml: true,\n ...normalized,\n });\n};\n\nconst success = createToastWithPriority.success;\nconst error = createToastWithPriority.error;\nconst warning = createToastWithPriority.warning;\nconst info = createToastWithPriority.info;\nconst loading = createToastWithPriority.loading;\nconst custom = createToastWithPriority.custom;\n\nexport {\n createToastWithPriority as createToast,\n success,\n error,\n warning,\n info,\n loading,\n custom,\n};\n\nexport { setDefaultColors, setDefaultMessages };\n\n/**\n * Dismisses a toast by its key/id, handle, element, or dismisses the most recent toast if target is omitted.\n * @param {string | ToastHandle | HTMLElement | Promise<ToastHandle>} [target]\n * @returns {Promise<void>}\n */\nconst dismissToast = async (target) => {\n let resolvedTarget = target;\n if (target && typeof target.then === \"function\") {\n try {\n resolvedTarget = await target;\n } catch {\n return;\n }\n }\n\n closeInProgress = true;\n closePromise = (async () => {\n try {\n if (typeof resolvedTarget === \"string\" && resolvedTarget.length > 0) {\n await closeToastByKey(resolvedTarget);\n } else if (resolvedTarget && typeof resolvedTarget === \"object\") {\n if (typeof resolvedTarget.dismiss === \"function\") {\n await resolvedTarget.dismiss();\n } else if (resolvedTarget._key && typeof resolvedTarget._key === \"string\") {\n await closeToastByKey(resolvedTarget._key);\n } else if (resolvedTarget.id && typeof resolvedTarget.id === \"string\") {\n await closeToastByKey(resolvedTarget.id);\n } else {\n await dismiss();\n }\n } else {\n await dismiss();\n }\n } finally {\n closeInProgress = false;\n closePromise = null;\n }\n })();\n await closePromise;\n};\nconst noopAll = async () => {\n closeInProgress = true;\n closePromise = (async () => {\n try {\n await managerNoop();\n } finally {\n closeInProgress = false;\n closePromise = null;\n }\n })();\n await closePromise;\n};\nconst clear = noopAll;\nconst dismissAll = noopAll;\nexport { dismissToast as dismiss, noopAll as noop, dismissAll, clear };\n\nconst TOAST_PROMISE_LOADING_DURATION_MS = 24 * 60 * 60 * 1000;\n\n/**\n * Wraps a promise or function with automatic loading, success, and error toasts.\n * @template T\n * @param {Promise<T> | (() => Promise<T> | T)} promiseOrFn\n * @param {ToastPromiseMessages} [messages]\n * @param {ToastOptions} [options]\n * @returns {Promise<T>}\n */\nasync function toastPromise(promiseOrFn, messages = {}, options = {}) {\n const safeMessages = messages && typeof messages === \"object\" ? messages : {};\n const safeOptions = options && typeof options === \"object\" ? options : {};\n\n const loadingInput = safeMessages.loading ?? \"Loading...\";\n const loadingOptions =\n typeof loadingInput === \"object\" && loadingInput !== null && !Array.isArray(loadingInput)\n ? {\n ...safeOptions,\n type: \"info\",\n duration: TOAST_PROMISE_LOADING_DURATION_MS,\n showProgressBar: false,\n pauseOnHover: false,\n showLoader: true,\n ...loadingInput,\n }\n : {\n ...safeOptions,\n type: \"info\",\n message: String(loadingInput),\n duration: TOAST_PROMISE_LOADING_DURATION_MS,\n showProgressBar: false,\n pauseOnHover: false,\n showLoader: safeOptions.showLoader ?? true,\n };\n\n const loadingHandle = await createToastWithPriority(loadingOptions);\n\n const baseOptions = {\n ...safeOptions,\n pauseOnHover: safeOptions.pauseOnHover,\n };\n\n try {\n const settledPromise =\n typeof promiseOrFn === \"function\" ? promiseOrFn() : promiseOrFn;\n const result = await settledPromise;\n\n if (loadingHandle && typeof loadingHandle.dismiss === \"function\") {\n try {\n await loadingHandle.dismiss();\n } catch {\n // Loading toast may already be dismissed\n }\n }\n\n const successResult =\n typeof safeMessages.success === \"function\"\n ? safeMessages.success(result)\n : (safeMessages.success ?? \"Done!\");\n\n const successOptions =\n typeof successResult === \"object\" && successResult !== null && !Array.isArray(successResult)\n ? { ...baseOptions, type: \"success\", ...successResult }\n : { ...baseOptions, type: \"success\", message: String(successResult) };\n\n await createToastWithPriority(successOptions);\n\n return result;\n } catch (err) {\n if (loadingHandle && typeof loadingHandle.dismiss === \"function\") {\n try {\n await loadingHandle.dismiss();\n } catch {\n // Loading toast may already be dismissed\n }\n }\n\n const errorResult =\n typeof safeMessages.error === \"function\"\n ? safeMessages.error(err)\n : (safeMessages.error ?? \"Something went wrong.\");\n\n const errorOptions =\n typeof errorResult === \"object\" && errorResult !== null && !Array.isArray(errorResult)\n ? { ...baseOptions, type: \"error\", ...errorResult }\n : { ...baseOptions, type: \"error\", message: String(errorResult) };\n\n await createToastWithPriority(errorOptions);\n\n throw err;\n }\n}\n\ncreateToastWithPriority.promise = toastPromise;\ncreateToastWithPriority.dismiss = dismissToast;\ncreateToastWithPriority.dismissAll = noopAll;\ncreateToastWithPriority.clear = noopAll;\n\n/** @type {string} */\nconst version = typeof __VERSION__ !== \"undefined\" ? __VERSION__ : \"3.18.0\";\n\nexport {\n version,\n toastPromise,\n setConfig,\n getConfig,\n resetConfig,\n shouldReduceMotion,\n resetToastManager,\n resetContainerRegistry,\n updateToastByKey,\n setAudioEnabled,\n isAudioEnabled,\n playTone,\n getToastPool,\n resetToastPool,\n getToastBroadcaster,\n resetToastBroadcaster,\n calculateToastPriority,\n categorizeToast,\n createGestureDetector,\n detectPinch,\n isFlick,\n calculateVelocity,\n generateToastId,\n resetToastIdCounter,\n getToastMetrics,\n registerSoundPreset,\n getSoundPresets,\n resetSoundPresets,\n resetAudioContext,\n registerSpringPreset,\n getSpringPresets,\n resetSpringPresets,\n resolveSpringConfig,\n solveSpring,\n calculateSpringSettlingDuration,\n generateSpringLinearEasing,\n getSpringTransition,\n getAudioContext,\n getAudioAnalyser,\n};\n\nif (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n if (!window.__customizableToastEscapeAttached) {\n window.__customizableToastEscapeAttached = true;\n const onKeyDown = (e) => {\n if (e.key === \"Escape\" || e.key === \"Esc\") {\n (async () => {\n try {\n closeInProgress = true;\n closePromise = (async () => {\n try {\n await dismiss();\n } finally {\n closeInProgress = false;\n closePromise = null;\n }\n })();\n await closePromise;\n } catch (error) {\n console.error(\"Escape key dismiss failed:\", error);\n closeInProgress = false;\n closePromise = null;\n }\n })();\n } else if (e.key === \"F6\" || ((e.altKey || e.metaKey) && (e.key === \"t\" || e.key === \"T\"))) {\n // Accessible landmark navigation: focus the most recent active toast\n const activeToasts = document.querySelectorAll('[id^=\"toast-container-\"] [id^=\"toast-\"]');\n if (activeToasts.length > 0) {\n const targetToast = activeToasts[activeToasts.length - 1];\n // Try focusing the interactive CTA, undo, or close button inside the toast first\n const interactive = targetToast.querySelector(\"button, a, [tabindex='0']\");\n if (interactive && typeof interactive.focus === \"function\") {\n interactive.focus();\n } else if (typeof targetToast.focus === \"function\") {\n targetToast.focus();\n }\n }\n }\n };\n window.addEventListener(\"keydown\", onKeyDown, { passive: true });\n }\n}\n\ntry {\n if (typeof window !== \"undefined\") {\n window.customizableToast = {\n setConfig,\n getConfig,\n resetConfig,\n shouldReduceMotion,\n version,\n createToast: createToastWithPriority,\n success,\n error,\n warning,\n info,\n loading,\n custom,\n setDefaultColors,\n setDefaultMessages,\n noop: noopAll,\n dismiss: dismissToast,\n dismissAll: noopAll,\n clear: noopAll,\n toastPromise,\n promise: toastPromise,\n updateToastByKey,\n setAudioEnabled,\n isAudioEnabled,\n playTone,\n registerSoundPreset,\n getSoundPresets,\n resetSoundPresets,\n resetAudioContext,\n getToastPool,\n resetToastPool,\n getToastBroadcaster,\n resetToastBroadcaster,\n calculateToastPriority,\n categorizeToast,\n createGestureDetector,\n detectPinch,\n isFlick,\n calculateVelocity,\n generateToastId,\n resetToastIdCounter,\n getToastMetrics,\n registerSpringPreset,\n getSpringPresets,\n resetSpringPresets,\n resolveSpringConfig,\n solveSpring,\n calculateSpringSettlingDuration,\n generateSpringLinearEasing,\n getSpringTransition,\n getAudioContext,\n getAudioAnalyser,\n };\n }\n} catch (error) {\n console.error(\"Global assignment failed:\", error);\n}\n\nexport default createToastWithPriority;"],"names":["DEFAULT_GLOBAL_CONFIG","Object","freeze","maxVisible","maxQueueSize","zIndex","targetNode","disableInlineStyles","reducedMotion","defaultPosition","theme","stacked","swipeToDismiss","sound","soundPreset","pauseOnHover","syncTabs","aiPrioritization","priorityScorer","onMetrics","debug","globalConfig","setConfig","options","Array","isArray","getConfig","undefined","Boolean","v","Number","isFinite","Math","max","floor","q","z","trunc","appendChild","r","String","toLowerCase","includes","document","documentElement","setAttribute","removeAttribute","p","trim","t","sp","resetConfig","assign","shouldReduceMotion","window","matchMedia","matches","counter","sessionSalt","random","toString","padStart","resetToastIdCounter","generateToastId","prefix","cleanPrefix","replace","safePrefix","test","timestamp","Date","now","countPart","colorCache","constructor","maxSize","this","map","Map","get","key","has","value","delete","set","size","firstKey","keys","next","precomputedNamedTextColors","getDynamicAccessibleTextColorHex","toastBg","cached","textColor","g","b","parsed","hexMatch","match","hex","length","slice","split","c","join","parseInt","rgbMatch","rgbSpaceMatch","hslMatch","h","s","l","gray","round","hue2rgb","parseToRgb","trimmed","startsWith","endsWith","inner","commaIndex","indexOf","propName","fallbackVal","getComputedStyle","resolved","getPropertyValue","e","resolveCssCustomProperty","Error","luminance","a","pow","contrastRatio","rgb1","rgb2","L1","L2","min","d","rgbToHsl","textL","tr","tg","tb","hslToRgb","contrastBlack","contrastWhite","result","rgbToHex","entries","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","transparent","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","forEach","name","lum","L","ALLOWED_TAGS","Set","ALLOWED_ATTRS","DISCARDED_TAGS","ALLOWED_URI_REGEX","sanitizeNode","node","allowedTags","allowedAttrs","nodeType","Node","TEXT_NODE","createTextNode","nodeValue","COMMENT_NODE","ELEMENT_NODE","tag","tagName","toUpperCase","frag","createDocumentFragment","from","childNodes","child","sanitized","el","createElement","attributes","attr","attrsToRemove","val","trimmedVal","push","rel","getAttribute","filter","finalTarget","sanitizeAttributes","sanitizedChild","fallbackSanitize","dirty","container","html","DOMParser","doc","parseFromString","body","template","innerHTML","content","div","parseHtmlInert","outFrag","wrapper","querySelectorAll","sanitizeHtml","opts","forceFallback","DOMPurify","sanitize","hasDOMPurify","cleaned","ALLOWED_ATTR","ALLOWED_URI_REGEXP","err","console","warn","createLoader","safeOpts","rawSize","color","labelText","text","className","config","style","display","alignItems","gap","svgNS","svg","createElementNS","circle","classList","add","opacity","strokeDasharray","strokeDashoffset","transformOrigin","animation","lbl","fontSize","textContent","getElementById","st","id","target","head","createCTA","toast","onClose","rawCfg","cta","configs","item","cleanups","raw","idx","cfg","label","isLink","variant","href","trimmedHref","isDangerous","tabIndex","relSet","type","ariaLabel","ctaTextColor","backgroundColor","ctaBgColor","background","getContrastBackground","ctaBorderColor","marginLeft","padding","borderRadius","fontWeight","lineHeight","border","cursor","whiteSpace","flexShrink","onClick","async","res","then","error","autoClose","onKeyDown","preventDefault","addEventListener","cleanupItem","removeEventListener","_cleanup","insertTarget","querySelector","insertBefore","prevCleanup","_cleanupCTA","createUndoAction","undo","isFn","undoCfg","onUndo","baseLabel","totalDuration","duration","showCountdown","btn","bgColor","borderColor","remainingSec","ceil","updateLabel","intervalId","isPaused","setInterval","clearInterval","unref","_pauseUndo","_resumeUndo","cleanupTimer","_cleanupUndo","createCloseButton","closeBtn","closeTextColor","_cleanupCloseButton","createProgressBar","progressBar","_progressBar","borderRadiusStr","parsedRadius","borderRadiusNum","progressHeightPx","progressHeightStyle","progressHeight","parsedFloat","parseFloat","progressDuration","leftOffset","finalWidth","_leftOffset","_finalWidth","progressBg","progressBarColor","progressColor","isReverse","progressDirection","position","left","height","width","transition","progressPosition","willChange","progress","showProgressBar","Infinity","pct","animate","keyframes","_progressAnimation","easing","fill","delay","requestAnimationFrame","runToastAnimation","_hasAnimated","transform","trigger","offsetHeight","isConnected","audioContext","audioEnabled","hasUserGesture","navigator","userActivation","hasBeenActive","onGesture","state","resume","catch","capture","once","passive","customSoundPresets","getAudioContext","forceResume","AudioCtx","AudioContext","webkitAudioContext","hasActivation","audioAnalyser","getAudioAnalyser","ctx","createAnalyser","fftSize","connect","destination","routeAudio","BUILTIN_PRESETS","modern","tone","freq","osc","createOscillator","gain","createGain","frequency","setValueAtTime","exponentialRampToValueAtTime","start","stop","retro","linearRampToValueAtTime","offset","futuristic","subtle","bell","peakGain","isPlayingDelegated","playTone","toneType","preset","customizableToast","currentTime","numFreq","activePreset","customFn","registerSoundPreset","synthesizerFn","cleanName","getSoundPresets","builtin","custom","resetSoundPresets","clear","setAudioEnabled","enabled","isAudioEnabled","resetAudioContext","close","SPRING_PRESETS","default","stiffness","damping","mass","bezierFallback","gentle","wobbly","stiff","bouncy","customSpringPresets","registerSpringPreset","TypeError","getSpringPresets","resetSpringPresets","resolveSpringConfig","spring","prototype","hasOwnProperty","call","rawStiffness","rawDamping","rawMass","zeta","sqrt","solveSpring","k","m","omega0","abs","exp","omegaD","cos","sin","r1","r2","c2","calculateSpringSettlingDuration","threshold","settledTime","staysSettled","lookahead","durationMs","generateSpringLinearEasing","points","durationSec","values","i","y","formattedY","percent","getSpringTransition","linearEasing","CSS","supports","supportsCSSLinearEasing","isSpring","ALLOWED_SVG_TAGS","ALLOWED_SVG_ATTRS","isUnsafeUrl","sanitizeInlineSvg","svgText","parserClass","sourceSvg","copySafeNode","safeEl","lowerName","j","safeChild","ICON_SVGS","success","warning","info","createToastIcon","iconOpt","icon","iconTag","justifyContent","marginRight","fontStyle","HTMLElement","cloneNode","matchedAlias","check","checkmark","cross","alert","safeSvg","normalizedType","getInitialTransform","animationType","pos","isTop","isLeft","isRight","anim","createEmergencyToast","emergency","posFlags","top","bottom","right","maxWidth","wordWrap","boxShadow","innerWrapper","msgEl","allowHtml","message","tmp","firstChild","closeSpan","float","removeChild","timer","clearTimeout","remove","setTimeout","ToastElementPool","initialSize","pool","inUseCount","element","_createToastElement","inUse","acquire","toastId","poolEntry","find","entry","isRecycled","_cleanupSwipe","_pauseCleanup","parentNode","_pooledId","_key","release","targetElement","targetId","getStats","total","available","utilization","compact","toRemove","splice","poolInstance","getToastPool","resetToastPool","createToastElement","usePool","rawId","createElementWithId","springTransition","parseAnimationDuration","animationDuration","validAnimationDuration","animationEasing","_spring","_animationType","customClass","opacityDuration","opacityEasing","marginBottom","overflow","minWidth","boxSizing","userSelect","pointerEvents","direction","fontDirection","isError","role","ariaLive","_animationDuration","messageSpan","_messageSpan","wrapText","WebkitBoxOrient","WebkitLineClamp","textOverflow","flex","fontPadding","fontFamily","fontLineHeight","wordBreak","rawMessage","iconEl","loader","showLoader","loaderEl","spacer","showCloseButton","startX","startY","currentX","startTime","isDragging","isHorizontal","touchId","isWindowListening","cleanupWindowListeners","onPointerMove","onPointerEnd","onPointerDown","closest","ev","touches","identifier","clientX","clientY","x","dx","dy","cancelable","isFlick","exitX","exitDuration","_swipeTimeout","snapEasing","snapDuration","attachSwipeToDismiss","applyRichStyling","containerRegistry","containerLocks","normalizePositionKey","getContainerId","applyContainerBaseStyles","inset","flexDirection","getOrCreateToastContainer","setPosition","root","ownerDocument","contains","isConnectedToRoot","findContainerById","all","DOCUMENTED_POSITIONS","LEGACY_POSITIONS","ALL_POSITIONS","rawPos","effectivePos","resetPositionClasses","resetContainerStyles","positionFlags","isFullWidth","hasTop","hasBottom","hasLeft","hasRight","hasCenter","hasFullWidth","parsePosition","flags","isFrozen","handleFullWidthPositions","handleCenterPositions","applyStandardPositioning","PausableTimer","callback","isInfinite","safeDelay","remaining","timeoutId","isCompleted","pause","elapsed","getRemainingTime","ToastBroadcaster","channel","tabId","_generateTabId","isLeadTab","leaderTimer","listeners","supportsBroadcastChannel","BroadcastChannel","_initBroadcastChannel","entropy","crypto","getRandomValues","buf","Uint32Array","onmessage","event","_handleMessage","data","_becomeLeadIfNeeded","broadcast","payload","actualToastId","actualPayload","postMessage","active","_getActiveToasts","queue","_getQueuedToasts","on","index","registerActiveToastsGetter","getter","registerQueuedToastsGetter","isSupported","getTabId","isLeadingTab","destroy","broadcasterInstance","getToastBroadcaster","cleanup","resetToastBroadcaster","TYPE_PRIORITY","URGENCY_KEYWORDS","LOW_PRIORITY_KEYWORDS","calculateToastPriority","context","score","breakdown","base","keywords","detectedKeywords","typeScore","safeMessage","messageLower","urgencyScore","keyword","escaped","RegExp","urgency","durationScore","messageLength","lengthPenalty","exclamationCount","exclamationScore","emphasis","allCapsWords","capsScore","caps","categorizeToast","msgLower","categories","calculateDistance","p1","p2","calculateVelocity","distance","dur","velocity","velocityThreshold","distanceThreshold","getTouchPoints","touch","time","changedTouches","detectPinch","sensitivityThreshold","startDistance","currentDistance","isPinch","scale","distanceChange","createGestureDetector","onFlick","onPinch","onSwipe","flickVelocityThreshold","swipeVelocityThreshold","swipeDistanceThreshold","pinchSensitivity","gestureState","isTracking","handlers","startTouches","initializeGestureState","updateGestureState","pinch","swipe","startTouch","calculateSwipe","shouldDismiss","shouldDismissOnSwipe","attach","detach","getState","pending","visibleCount","droppedCount","getToastMetrics","activeCount","queueDepth","emitMetrics","broadcaster","getItemPriority","priority","updateStackedLayout","children","_stackedInitialized","onMouseEnter","_isExpanded","onMouseLeave","onFocusIn","onFocusOut","relatedTarget","detector","_stackedCleanup","items","count","isExpanded","depthFromTop","depthKey","marginTop","showToast","safe","str","charCodeAt","hashString","makeKey","createDismissTimer","setupPauseOnHover","updateBadge","fromSync","current","rafId","maxQ","shift","sort","drainQueue","createOne","initialCount","closeToast","outer","shouldPauseOnHover","closeToastByKey","dismiss","pendingKey","pendingEntry","at","cancelAnimationFrame","pop","lastToastEl","activeValues","lastData","candidate","toastEl","play","queueIndex","findIndex","cancel","badge","_scaleTimer","ctaEl","animDuration","parentElement","exitTransform","parentContainer","targetEl","animationDurationMs","Promise","resolve","done","fallbackTimer","animEl","firstElementChild","finish","onEnd","removeElement","propertyName","removeWithTransition","idOrPosition","unregisterContainer","isDraining","some","updateToastByKey","newOptions","queued","prevOptions","isFinishingLoading","existingLoader","nextSibling","nodeName","newType","isErr","typeColors","existingIcon","newIconEl","bg","dynamicColor","br","mw","dir","fs","fw","prevClass","bar","ph","existingCloseBtn","defaultColors","defaultMessages","domReady","domReadyPromise","normalizeToastOptions","messageOrOptions","maybeOptions","extra","setDefaultColors","colors","validTypes","validated","setDefaultMessages","messages","closeInProgress","closePromise","originalCreateToast","readyState","checkDOMReady","sanitizedOptions","rawOptions","contPosition","contMaxWidth","final","rawProgressColor","sanitizeToastOptions","createFirstToastContainer","createToastNow","createToastWithPriority","normalized","closeError","runWithClosePriority","update","loading","dismissToast","resolvedTarget","noopAll","activeToasts","allSettled","error_inner","managerNoop","dismissAll","TOAST_PROMISE_LOADING_DURATION_MS","toastPromise","promiseOrFn","safeMessages","safeOptions","loadingInput","loadingOptions","loadingHandle","baseOptions","settledPromise","successResult","successOptions","errorResult","errorOptions","promise","version","__customizableToastEscapeAttached","altKey","metaKey","targetToast","interactive","focus","createToast","noop"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/utils/config.js","../src/utils/id.js","../src/utils/dom.js","../src/utils/html-sanitizer.js","../src/components/loader.js","../src/components/toast-utils-core.js","../src/utils/audio.js","../src/utils/spring.js","../src/components/icons.js","../src/components/toast-utils.js","../src/utils/toast-pool.js","../src/components/Toast.js","../src/utils/containerRegistry.js","../src/utils/position.js","../src/utils/PausableTimer.js","../src/utils/toast-broadcast.js","../src/utils/ai-scorer.js","../src/utils/multi-touch.js","../src/components/ToastManager.js","../src/index.js"],"sourcesContent":["/**\n * @typedef {'auto' | 'always' | 'never'} ReducedMotionMode\n */\n\n/**\n * @typedef {'light' | 'dark' | 'high-contrast' | 'compact' | 'spacious' | 'glass'} ToastTheme\n */\n\n/**\n * @typedef {Element | DocumentFragment | ShadowRoot} ToastMountTarget\n */\n\n/**\n * @typedef {Object} ToastMetrics\n * @property {number} activeCount - Currently rendered active toasts\n * @property {number} queueDepth - Number of queued toasts waiting to be displayed\n * @property {number} visibleCount - Count of currently visible toasts\n * @property {number} droppedCount - Number of toasts dropped due to queue overflow\n * @property {number} timestamp - Epoch timestamp (ms) when metrics were recorded\n */\n\n/**\n * @typedef {Object} ToastGlobalConfig\n * @property {number} maxVisible\n * @property {number} maxQueueSize\n * @property {number} zIndex\n * @property {ToastMountTarget | null} targetNode\n * @property {boolean} disableInlineStyles\n * @property {ReducedMotionMode} reducedMotion\n * @property {string} defaultPosition\n * @property {ToastTheme} theme\n * @property {boolean} stacked\n * @property {boolean} swipeToDismiss\n * @property {boolean} sound\n * @property {'modern' | 'retro' | 'futuristic' | 'subtle' | 'bell' | string} [soundPreset]\n * @property {boolean} [pauseOnHover]\n * @property {boolean} syncTabs\n * @property {boolean} aiPrioritization\n * @property {boolean} [debug]\n * @property {((context: { type: string, message: string, duration?: number, options?: Record<string, unknown> }) => number | { score: number }) | null} [priorityScorer]\n * @property {((metrics: ToastMetrics) => void) | null} [onMetrics]\n */\n\nconst DEFAULT_GLOBAL_CONFIG = Object.freeze({\n maxVisible: 3,\n maxQueueSize: 100,\n zIndex: 9999,\n targetNode: null,\n disableInlineStyles: false,\n reducedMotion: \"auto\",\n defaultPosition: \"bottom-right\",\n theme: \"light\",\n stacked: false,\n swipeToDismiss: true,\n sound: true,\n soundPreset: \"modern\",\n pauseOnHover: false,\n syncTabs: false,\n aiPrioritization: false,\n priorityScorer: null,\n onMetrics: null,\n debug: false,\n});\n\nconst globalConfig = { ...DEFAULT_GLOBAL_CONFIG };\n\nfunction isValidMountTarget(value) {\n return value && typeof value === \"object\" && typeof value.appendChild === \"function\";\n}\n\n/**\n * Updates global toast configuration.\n * @param {Partial<ToastGlobalConfig>} [options]\n * @returns {ToastGlobalConfig}\n */\nexport function setConfig(options = {}) {\n if (!options || typeof options !== \"object\" || Array.isArray(options)) {\n return getConfig();\n }\n\n const {\n maxVisible,\n maxQueueSize,\n zIndex,\n targetNode,\n disableInlineStyles,\n reducedMotion,\n defaultPosition,\n theme,\n stacked,\n swipeToDismiss,\n sound,\n soundPreset,\n pauseOnHover,\n syncTabs,\n aiPrioritization,\n priorityScorer,\n onMetrics,\n debug,\n } = options;\n\n if (debug !== undefined) {\n globalConfig.debug = Boolean(debug);\n }\n\n if (maxVisible !== undefined) {\n const v = Number(maxVisible);\n if (Number.isFinite(v) && v > 0) {\n globalConfig.maxVisible = Math.max(1, Math.floor(v));\n }\n }\n\n if (maxQueueSize !== undefined) {\n const q = Number(maxQueueSize);\n if (Number.isFinite(q) && q >= 0) {\n globalConfig.maxQueueSize = Math.floor(q);\n }\n }\n\n if (zIndex !== undefined) {\n const z = Number(zIndex);\n if (Number.isFinite(z)) {\n globalConfig.zIndex = Math.trunc(z);\n }\n }\n\n if (targetNode !== undefined) {\n globalConfig.targetNode = (targetNode && typeof targetNode === \"object\" && typeof targetNode.appendChild === \"function\") ? targetNode : null;\n }\n\n if (disableInlineStyles !== undefined) {\n globalConfig.disableInlineStyles = Boolean(disableInlineStyles);\n }\n\n if (reducedMotion !== undefined) {\n const r = String(reducedMotion || \"auto\").toLowerCase();\n if ([\"auto\", \"always\", \"never\"].includes(r)) {\n globalConfig.reducedMotion = r;\n if (typeof document !== \"undefined\") {\n if (r === \"always\") {\n document.documentElement.setAttribute(\"data-toast-reduced-motion\", \"always\");\n } else if (r === \"never\") {\n document.documentElement.setAttribute(\"data-toast-reduced-motion\", \"never\");\n } else {\n document.documentElement.removeAttribute(\"data-toast-reduced-motion\");\n }\n }\n }\n }\n\n if (defaultPosition !== undefined) {\n const p = String(defaultPosition || \"\").toLowerCase().trim();\n if (p) {\n globalConfig.defaultPosition = p;\n }\n }\n\n if (theme !== undefined) {\n const t = String(theme || \"light\").toLowerCase();\n if ([\"light\", \"dark\", \"high-contrast\", \"compact\", \"spacious\", \"glass\"].includes(t)) {\n globalConfig.theme = t;\n // Apply theme to document root\n if (typeof document !== \"undefined\") {\n document.documentElement.setAttribute(\"data-toast-theme\", t);\n }\n }\n }\n\n if (stacked !== undefined) {\n globalConfig.stacked = Boolean(stacked);\n }\n\n if (swipeToDismiss !== undefined) {\n globalConfig.swipeToDismiss = Boolean(swipeToDismiss);\n }\n\n if (sound !== undefined) {\n globalConfig.sound = Boolean(sound);\n }\n\n if (soundPreset !== undefined) {\n const sp = String(soundPreset || \"modern\").toLowerCase().trim();\n if (sp) {\n globalConfig.soundPreset = sp;\n }\n }\n\n if (pauseOnHover !== undefined) {\n globalConfig.pauseOnHover = Boolean(pauseOnHover);\n }\n\n if (syncTabs !== undefined) {\n globalConfig.syncTabs = Boolean(syncTabs);\n }\n\n if (aiPrioritization !== undefined) {\n globalConfig.aiPrioritization = Boolean(aiPrioritization);\n }\n\n if (priorityScorer !== undefined) {\n globalConfig.priorityScorer = typeof priorityScorer === \"function\" ? priorityScorer : null;\n }\n\n if (onMetrics !== undefined) {\n globalConfig.onMetrics = typeof onMetrics === \"function\" ? onMetrics : null;\n }\n\n return getConfig();\n}\n\n/**\n * Resets global toast configuration back to pristine defaults.\n * Cleans up DOM attributes attached to document.documentElement.\n * @returns {ToastGlobalConfig}\n */\nexport function resetConfig() {\n Object.assign(globalConfig, DEFAULT_GLOBAL_CONFIG);\n if (typeof document !== \"undefined\") {\n document.documentElement.removeAttribute(\"data-toast-theme\");\n document.documentElement.removeAttribute(\"data-toast-reduced-motion\");\n }\n return getConfig();\n}\n\n/**\n * Returns a snapshot of the current global toast configuration.\n * @returns {ToastGlobalConfig}\n */\nexport function getConfig() {\n return { ...globalConfig };\n}\n\n/**\n * Returns the current mount root, falling back to document.body.\n * @returns {ToastMountTarget | HTMLElement | null}\n */\nexport function getToastRoot() {\n if (isValidMountTarget(globalConfig.targetNode)) return globalConfig.targetNode;\n if (typeof document !== \"undefined\") return document.body;\n return null;\n}\n\n/**\n * Whether toast animations should be reduced for accessibility.\n * @returns {boolean}\n */\nexport function shouldReduceMotion() {\n if (globalConfig.reducedMotion === \"always\") return true;\n if (globalConfig.reducedMotion === \"never\") return false;\n try {\n return Boolean(\n typeof window !== \"undefined\" &&\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches,\n );\n } catch {\n return false;\n }\n}\n","// src/utils/id.js\n\"use strict\";\n\nlet counter = 0;\n\n// Tab/Session-level unique salt (deterministic & safe across all environments)\nconst sessionSalt = Math.floor(Math.random() * 0xffff)\n .toString(36)\n .padStart(3, \"0\");\n\n/**\n * Reset the internal monotonic counter (primarily for test isolation)\n * @returns {void}\n */\nexport function resetToastIdCounter() {\n counter = 0;\n}\n\n/**\n * Generate unique, CSS-safe ID for DOM elements.\n * Combines sanitized prefix, millisecond timestamp, and monotonic counter with session salt.\n * Guarantees 0% collision rate without HTTP/HTTPS secure context restrictions.\n *\n * @param {string} [prefix=\"toast\"] - Optional prefix for ID\n * @returns {string} Unique ID matching /^toast-[a-z0-9]+-[a-z0-9]+$/\n */\nexport function generateToastId(prefix = \"toast\") {\n const cleanPrefix =\n typeof prefix === \"string\"\n ? prefix\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n : \"\";\n\n const safePrefix =\n cleanPrefix && !/^[0-9]/.test(cleanPrefix) ? cleanPrefix : \"toast\";\n\n const timestamp = Date.now().toString(36);\n\n // Monotonic increment: 0% collision mathematically guaranteed\n counter = (counter + 1) & 0xffffff;\n const countPart = counter.toString(36);\n\n return `${safePrefix}-${timestamp}-${sessionSalt}${countPart}`;\n}\n","\"use strict\";\n\nimport { generateToastId } from \"./id.js\";\n\nexport async function createElementWithId(tagName, prefix) {\n if (!tagName || !prefix) throw new Error(\"tagName and prefix are required\");\n const el = document.createElement(tagName);\n el.id = generateToastId(prefix);\n return el;\n}\n\nexport async function appendChild(parent, child) {\n if (!parent || !child) return false;\n\n try {\n if (!parent.contains(child)) parent.appendChild(child);\n return true;\n } catch (primaryError) {\n console.warn(\"appendChild primary failed:\", primaryError);\n try {\n parent.insertAdjacentElement(\"beforeend\", child);\n return true;\n } catch (fallbackError) {\n console.warn(\"appendChild fallback failed:\", fallbackError);\n try {\n if (parent && typeof parent.appendChild === \"function\") {\n console.warn(\n \"appendChild: using last-resort cloneNode fallback — the \" +\n \"appended element's event listeners (close button, CTA \" +\n \"clicks, etc.) will NOT work, since cloneNode() does not \" +\n \"copy JS-attached listeners. This path only runs when both \" +\n \"the primary appendChild and insertAdjacentElement calls \" +\n \"already failed.\",\n );\n const clone = child.cloneNode(true);\n parent.appendChild(clone);\n return false; // Return false to indicate fallback was used and listeners lost\n }\n } catch (emergencyError) {\n console.error(\"appendChild emergency failed:\", emergencyError);\n return false;\n }\n }\n }\n return false;\n}\n\nexport async function removeElement(el) {\n if (!el) return true;\n\n try {\n if (typeof el.remove === \"function\") {\n el.remove();\n return true;\n }\n } catch {}\n\n try {\n if (el.parentNode) {\n el.parentNode.removeChild(el);\n return true;\n }\n } catch {}\n\n return false;\n}\n\nexport async function parseAnimationDuration(duration) {\n if (typeof duration === \"number\" && Number.isFinite(duration) && duration >= 0) return duration;\n if (typeof duration === \"string\") {\n const trimmed = duration.trim().toLowerCase();\n if (trimmed.endsWith(\"s\") && !trimmed.endsWith(\"ms\")) {\n const parsed = parseFloat(trimmed) * 1000;\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : 500;\n }\n const parsed = parseFloat(trimmed);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : 500;\n }\n return 500;\n}\n\nexport function forceReflow(el) {\n try {\n return el?.offsetWidth || 0;\n } catch {\n return 0;\n }\n}\n\nexport function query(selector, root = (typeof document !== \"undefined\" ? document : null)) {\n return root?.querySelector ? root.querySelector(selector) : null;\n}\n\nclass LRUCache {\n constructor(maxSize = 200) {\n this.maxSize = maxSize;\n this.map = new Map();\n }\n\n get(key) {\n if (!this.map.has(key)) return undefined;\n const value = this.map.get(key);\n this.map.delete(key);\n this.map.set(key, value);\n return value;\n }\n\n set(key, value) {\n if (this.map.has(key)) this.map.delete(key);\n else if (this.map.size >= this.maxSize) {\n const firstKey = this.map.keys().next().value;\n this.map.delete(firstKey);\n }\n this.map.set(key, value);\n }\n}\n\nconst colorCache = new LRUCache(200);\n\nconst namedColors = {\n aliceblue: [240, 248, 255],\n antiquewhite: [250, 235, 215],\n aqua: [0, 255, 255],\n aquamarine: [127, 255, 212],\n azure: [240, 255, 255],\n beige: [245, 245, 220],\n bisque: [255, 228, 196],\n black: [0, 0, 0],\n blanchedalmond: [255, 235, 205],\n blue: [0, 0, 255],\n blueviolet: [138, 43, 226],\n brown: [165, 42, 42],\n burlywood: [222, 184, 135],\n cadetblue: [95, 158, 160],\n chartreuse: [127, 255, 0],\n chocolate: [210, 105, 30],\n coral: [255, 127, 80],\n cornflowerblue: [100, 149, 237],\n cornsilk: [255, 248, 220],\n crimson: [220, 20, 60],\n cyan: [0, 255, 255],\n darkblue: [0, 0, 139],\n darkcyan: [0, 139, 139],\n darkgoldenrod: [184, 134, 11],\n darkgray: [169, 169, 169],\n darkgreen: [0, 100, 0],\n darkgrey: [169, 169, 169],\n darkkhaki: [189, 183, 107],\n darkmagenta: [139, 0, 139],\n darkolivegreen: [85, 107, 47],\n darkorange: [255, 140, 0],\n darkorchid: [153, 50, 204],\n darkred: [139, 0, 0],\n darksalmon: [233, 150, 122],\n darkseagreen: [143, 188, 143],\n darkslateblue: [72, 61, 139],\n darkslategray: [47, 79, 79],\n darkslategrey: [47, 79, 79],\n darkturquoise: [0, 206, 209],\n darkviolet: [148, 0, 211],\n deeppink: [255, 20, 147],\n deepskyblue: [0, 191, 255],\n dimgray: [105, 105, 105],\n dimgrey: [105, 105, 105],\n dodgerblue: [30, 144, 255],\n firebrick: [178, 34, 34],\n floralwhite: [255, 250, 240],\n forestgreen: [34, 139, 34],\n fuchsia: [255, 0, 255],\n gainsboro: [220, 220, 220],\n ghostwhite: [248, 248, 255],\n gold: [255, 215, 0],\n goldenrod: [218, 165, 32],\n gray: [128, 128, 128],\n green: [0, 128, 0],\n greenyellow: [173, 255, 47],\n grey: [128, 128, 128],\n honeydew: [240, 255, 240],\n hotpink: [255, 105, 180],\n indianred: [205, 92, 92],\n indigo: [75, 0, 130],\n ivory: [255, 255, 240],\n khaki: [240, 230, 140],\n lavender: [230, 230, 250],\n lavenderblush: [255, 240, 245],\n lawngreen: [124, 252, 0],\n lemonchiffon: [255, 250, 205],\n lightblue: [173, 216, 230],\n lightcoral: [240, 128, 128],\n lightcyan: [224, 255, 255],\n lightgoldenrodyellow: [250, 250, 210],\n lightgray: [211, 211, 211],\n lightgreen: [144, 238, 144],\n lightgrey: [211, 211, 211],\n lightpink: [255, 182, 193],\n lightsalmon: [255, 160, 122],\n lightseagreen: [32, 178, 170],\n lightskyblue: [135, 206, 250],\n lightslategray: [119, 136, 153],\n lightslategrey: [119, 136, 153],\n lightsteelblue: [176, 196, 222],\n lightyellow: [255, 255, 224],\n lime: [0, 255, 0],\n limegreen: [50, 205, 50],\n linen: [250, 240, 230],\n magenta: [255, 0, 255],\n maroon: [128, 0, 0],\n mediumaquamarine: [102, 205, 170],\n mediumblue: [0, 0, 205],\n mediumorchid: [186, 85, 211],\n mediumpurple: [147, 112, 219],\n mediumseagreen: [60, 179, 113],\n mediumslateblue: [123, 104, 238],\n mediumspringgreen: [0, 250, 154],\n mediumturquoise: [72, 209, 204],\n mediumvioletred: [199, 21, 133],\n midnightblue: [25, 25, 112],\n mintcream: [245, 255, 250],\n mistyrose: [255, 228, 225],\n moccasin: [255, 228, 181],\n navajowhite: [255, 222, 173],\n navy: [0, 0, 128],\n oldlace: [253, 245, 230],\n olive: [128, 128, 0],\n olivedrab: [107, 142, 35],\n orange: [255, 165, 0],\n orangered: [255, 69, 0],\n orchid: [218, 112, 214],\n palegoldenrod: [238, 232, 170],\n palegreen: [152, 251, 152],\n paleturquoise: [175, 238, 238],\n palevioletred: [219, 112, 147],\n papayawhip: [255, 239, 213],\n peachpuff: [255, 218, 185],\n peru: [205, 133, 63],\n pink: [255, 192, 203],\n plum: [221, 160, 221],\n powderblue: [176, 224, 230],\n purple: [128, 0, 128],\n rebeccapurple: [102, 51, 153],\n red: [255, 0, 0],\n rosybrown: [188, 143, 143],\n royalblue: [65, 105, 225],\n saddlebrown: [139, 69, 19],\n salmon: [250, 128, 114],\n sandybrown: [244, 164, 96],\n seagreen: [46, 139, 87],\n seashell: [255, 245, 238],\n sienna: [160, 82, 45],\n silver: [192, 192, 192],\n skyblue: [135, 206, 235],\n slateblue: [106, 90, 205],\n slategray: [112, 128, 144],\n slategrey: [112, 128, 144],\n snow: [255, 250, 250],\n springgreen: [0, 255, 127],\n steelblue: [70, 130, 180],\n tan: [210, 180, 140],\n teal: [0, 128, 128],\n thistle: [216, 191, 216],\n tomato: [255, 99, 71],\n transparent: [255, 255, 255],\n turquoise: [64, 224, 208],\n violet: [238, 130, 238],\n wheat: [245, 222, 179],\n white: [255, 255, 255],\n whitesmoke: [245, 245, 245],\n yellow: [255, 255, 0],\n yellowgreen: [154, 205, 50],\n};\n\nconst precomputedNamedTextColors = {};\nObject.entries(namedColors).forEach(([name, [r, g, b]]) => {\n const lum = (c) => {\n const v = c / 255;\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n };\n const L = 0.2126 * lum(r) + 0.7152 * lum(g) + 0.0722 * lum(b);\n const contrastBlack = (L + 0.05) / 0.05;\n const contrastWhite = 1.05 / (L + 0.05);\n precomputedNamedTextColors[name.toLowerCase()] =\n contrastBlack >= contrastWhite ? \"#000000\" : \"#ffffff\";\n});\n\nexport function getDynamicAccessibleTextColorHex(toastBg) {\n if (!toastBg) return \"#ffffff\";\n\n const key = String(toastBg);\n const cached = colorCache.get(key);\n if (cached) return cached;\n\n if (precomputedNamedTextColors[toastBg?.toLowerCase()]) {\n const textColor = precomputedNamedTextColors[toastBg.toLowerCase()];\n colorCache.set(key, textColor);\n return textColor;\n }\n\n let r, g, b;\n\n // AUDIT FIX (H2): this function previously only understood hex and\n // rgb()/rgba() strings. Anything else — hsl(), a CSS custom property\n // like var(--brand), any modern color syntax — fell straight into the\n // catch block below, which used to assign a RANDOM RGB triplet as the\n // \"background\" driving the black-vs-white text decision. For a function\n // whose entire purpose is accessibility, that meant it could pick white\n // text on a light background (or the reverse) for any color format it\n // didn't recognize, and the choice wasn't even stable between calls for\n // the same input. Two changes: (1) genuinely parse hsl()/hsla() and CSS\n // custom properties instead of giving up on them, (2) for the cases\n // that are still truly unparseable, fall back to a fixed neutral\n // midpoint gray instead of Math.random() — deterministic and\n // reasonable, never actively wrong in a random direction.\n function resolveCssCustomProperty(value) {\n if (typeof value !== \"string\") return value;\n let current = value.trim();\n let depth = 0;\n while (current.toLowerCase().startsWith(\"var(\") && current.endsWith(\")\") && depth < 5) {\n depth++;\n const inner = current.slice(4, -1).trim();\n const commaIndex = inner.indexOf(\",\");\n const propName = (commaIndex === -1 ? inner : inner.slice(0, commaIndex)).trim();\n const fallbackVal = commaIndex === -1 ? \"\" : inner.slice(commaIndex + 1).trim();\n\n if (!propName.startsWith(\"--\")) return current;\n\n let resolved = \"\";\n try {\n if (\n typeof document !== \"undefined\" &&\n typeof getComputedStyle === \"function\"\n ) {\n resolved = getComputedStyle(document.documentElement)\n .getPropertyValue(propName)\n .trim();\n }\n } catch (e) {}\n\n if (resolved) {\n current = resolved;\n } else if (fallbackVal) {\n current = fallbackVal;\n } else {\n break;\n }\n }\n return current;\n }\n\n function parseToRgb(value) {\n const hexMatch = value?.match(/^#(?:([0-9a-f]{3,4})|([0-9a-f]{6})|([0-9a-f]{8}))$/i);\n if (hexMatch) {\n let hex = hexMatch[1] || hexMatch[2] || hexMatch[3];\n if (hex.length === 3 || hex.length === 4) {\n hex = hex\n .slice(0, 3)\n .split(\"\")\n .map((c) => c + c)\n .join(\"\");\n }\n if (hex.length >= 6) {\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n if (Number.isFinite(r) && Number.isFinite(g) && Number.isFinite(b)) {\n return { r, g, b };\n }\n }\n return null;\n }\n\n const parseComponent = (c) => {\n if (typeof c !== \"string\") return Number(c);\n const trimmed = c.trim();\n if (trimmed.endsWith(\"%\")) {\n return Math.round((parseFloat(trimmed) / 100) * 255);\n }\n return Number(trimmed);\n };\n\n const rgbMatch = value?.match(\n /rgba?\\(\\s*([\\d.]+%?)\\s*,\\s*([\\d.]+%?)\\s*,\\s*([\\d.]+%?)(?:\\s*,\\s*[\\d.%]+)?\\s*\\)/i,\n );\n if (rgbMatch) {\n const r = Math.min(255, Math.max(0, parseComponent(rgbMatch[1])));\n const g = Math.min(255, Math.max(0, parseComponent(rgbMatch[2])));\n const b = Math.min(255, Math.max(0, parseComponent(rgbMatch[3])));\n if (Number.isFinite(r) && Number.isFinite(g) && Number.isFinite(b)) {\n return { r, g, b };\n }\n }\n\n const rgbSpaceMatch = value?.match(\n /rgba?\\(\\s*([\\d.]+%?)\\s+([\\d.]+%?)\\s+([\\d.]+%?)(?:\\s*\\/\\s*[\\d.%]+)?\\s*\\)/i,\n );\n if (rgbSpaceMatch) {\n const r = Math.min(255, Math.max(0, parseComponent(rgbSpaceMatch[1])));\n const g = Math.min(255, Math.max(0, parseComponent(rgbSpaceMatch[2])));\n const b = Math.min(255, Math.max(0, parseComponent(rgbSpaceMatch[3])));\n if (Number.isFinite(r) && Number.isFinite(g) && Number.isFinite(b)) {\n return { r, g, b };\n }\n }\n\n const parseHue = (hStr) => {\n const trimmed = hStr.trim().toLowerCase();\n let raw = parseFloat(trimmed);\n if (!Number.isFinite(raw)) return 0;\n if (trimmed.endsWith(\"turn\")) {\n raw = raw * 360;\n } else if (trimmed.endsWith(\"rad\")) {\n raw = (raw * 180) / Math.PI;\n }\n return (((raw % 360) + 360) % 360) / 360;\n };\n\n const hslMatch = value?.match(\n /hsla?\\(\\s*(-?[\\d.]+(?:deg|rad|turn)?)\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%(?:\\s*,\\s*[\\d.%]+)?\\s*\\)/i,\n );\n const hslSpaceMatch = !hslMatch && value?.match(\n /hsla?\\(\\s*(-?[\\d.]+(?:deg|rad|turn)?)\\s+([\\d.]+)%\\s+([\\d.]+)%(?:\\s*\\/\\s*[\\d.%]+)?\\s*\\)/i,\n );\n\n const activeHslMatch = hslMatch || hslSpaceMatch;\n if (activeHslMatch) {\n const h = parseHue(activeHslMatch[1]);\n const s = Math.min(1, Math.max(0, Number(activeHslMatch[2]) / 100));\n const l = Math.min(1, Math.max(0, Number(activeHslMatch[3]) / 100));\n if (s === 0) {\n const gray = Math.round(l * 255);\n return { r: gray, g: gray, b: gray };\n }\n const hue2rgb = (p, q, t) => {\n let val = t;\n if (val < 0) val += 1;\n if (val > 1) val -= 1;\n if (val < 1 / 6) return p + (q - p) * 6 * val;\n if (val < 1 / 2) return q;\n if (val < 2 / 3) return p + (q - p) * (2 / 3 - val) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n return {\n r: Math.round(hue2rgb(p, q, h + 1 / 3) * 255),\n g: Math.round(hue2rgb(p, q, h) * 255),\n b: Math.round(hue2rgb(p, q, h - 1 / 3) * 255),\n };\n }\n\n return null;\n }\n\n try {\n const cleanBg = typeof toastBg === \"string\" ? toastBg.trim() : String(toastBg || \"\");\n const resolvedBg = resolveCssCustomProperty(cleanBg).trim();\n const parsed = parseToRgb(resolvedBg);\n if (!parsed) throw new Error(\"Unknown color\");\n ({ r, g, b } = parsed);\n } catch {\n // Deterministic neutral fallback — a mid-gray reads reasonably against\n // either black or white text, and critically, gives the SAME answer\n // every time for the same unparseable input instead of a coin flip.\n r = g = b = 128;\n }\n\n const rgbToHsl = (r, g, b) => {\n r /= 255;\n g /= 255;\n b /= 255;\n const max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n let h,\n s,\n l = (max + min) / 2;\n if (max === min) h = s = 0;\n else {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n }\n h /= 6;\n }\n return [h * 360, s, l];\n };\n const hslToRgb = (h, s, l) => {\n h /= 360;\n let r, g, b;\n if (s === 0) r = g = b = l;\n else {\n const hue2rgb = (p, q, t) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];\n };\n const luminance = (r, g, b) => {\n const a = [r, g, b].map((v) => {\n v /= 255;\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n });\n return 0.2126 * a[0] + 0.7152 * a[1] + 0.0722 * a[2];\n };\n const contrastRatio = (rgb1, rgb2) => {\n const L1 = luminance(...rgb1);\n const L2 = luminance(...rgb2);\n return (Math.max(L1, L2) + 0.05) / (Math.min(L1, L2) + 0.05);\n };\n const rgbToHex = (r, g, b) =>\n `#${r.toString(16).padStart(2, \"0\")}${g.toString(16).padStart(2, \"0\")}${b\n .toString(16)\n .padStart(2, \"0\")}`;\n\n let [h, s, l] = rgbToHsl(r, g, b);\n const minContrast = 4.5;\n let textL = l < 0.5 ? Math.min(l + 0.5, 1) : Math.max(l - 0.5, 0);\n let [tr, tg, tb] = hslToRgb(h, s, textL);\n\n if (contrastRatio([r, g, b], [tr, tg, tb]) < minContrast) {\n const contrastBlack = contrastRatio([r, g, b], [0, 0, 0]);\n const contrastWhite = contrastRatio([r, g, b], [255, 255, 255]);\n [tr, tg, tb] = contrastBlack >= contrastWhite ? [0, 0, 0] : [255, 255, 255];\n }\n\n const result = rgbToHex(tr, tg, tb);\n colorCache.set(key, result);\n return result;\n}\n","// AUDIT FIX (H1): these used to live inside fallbackSanitize() only, which\n// meant sanitizeHtml()'s DOMPurify branch had no way to reference them —\n// it just used DOMPurify's own (much broader) default allowlist instead.\n// Same allowHtml:true input could sanitize completely differently\n// depending on whether some UNRELATED script on the host page happened to\n// load DOMPurify onto window — a security boundary that was an\n// environmental accident rather than a deliberate, consistent policy.\n// Hoisting these to module scope makes them the single source of truth\n// for BOTH paths, so the same input gets the same treatment regardless of\n// which sanitizer implementation actually runs.\nconst ALLOWED_TAGS = new Set([\n \"DIV\",\n \"SPAN\",\n \"P\",\n \"BR\",\n \"STRONG\",\n \"B\",\n \"EM\",\n \"I\",\n \"U\",\n \"SMALL\",\n \"UL\",\n \"OL\",\n \"LI\",\n \"A\",\n \"IMG\",\n \"PRE\",\n \"CODE\",\n \"MARK\",\n]);\n// AUDIT FIX (C1 — security): 'style' was previously allowed through with\n// zero validation, letting an attacker-controlled message (allowHtml:true)\n// inject `position:fixed;inset:0;z-index:999999` and render a full-page\n// clickjacking overlay through a toast that already renders at\n// z-index:9999. Inline style is a well-known sanitizer bypass class (see\n// OWASP's XSS Filter Evasion Cheat Sheet). Removed from the allowlist\n// entirely rather than attempting partial validation — toasts don't need\n// arbitrary inline styling to be useful, and \"no unchecked style\" is the\n// safe default most reputable sanitizers ship with.\nconst ALLOWED_ATTRS = new Set([\n \"href\",\n \"src\",\n \"alt\",\n \"title\",\n \"class\",\n \"target\",\n \"rel\",\n \"loading\",\n]);\n\nconst DISCARDED_TAGS = new Set([\n \"SCRIPT\",\n \"STYLE\",\n \"IFRAME\",\n \"NOSCRIPT\",\n \"OBJECT\",\n \"EMBED\",\n \"SVG\",\n \"MATH\",\n \"AUDIO\",\n \"VIDEO\",\n \"CANVAS\",\n \"TEMPLATE\",\n]);\n\nconst ALLOWED_URI_REGEX = /^\\s*(?:https?:|mailto:|data:image\\/(?:png|jpe?g|gif|webp|avif|bmp|ico);|\\/(?!\\/|\\\\)|\\.\\/|\\.\\.\\/|#)/i;\n\nexport function hasDOMPurify() {\n try {\n return Boolean(\n typeof window !== \"undefined\" &&\n window.DOMPurify &&\n typeof window.DOMPurify.sanitize === \"function\"\n );\n } catch (e) {}\n return false;\n}\n\nfunction sanitizeAttributes(el, allowedAttrs) {\n const attrsToRemove = [];\n Array.from(el.attributes || []).forEach((attr) => {\n const name = attr.name.toLowerCase();\n const val = attr.value;\n if (!allowedAttrs.has(name) || name.startsWith(\"on\")) {\n attrsToRemove.push(attr.name);\n return;\n }\n if (name === \"href\" || name === \"src\") {\n const trimmedVal = typeof val === \"string\" ? val.trim().toLowerCase() : \"\";\n if (\n trimmedVal.startsWith(\"javascript:\") ||\n trimmedVal.startsWith(\"vbscript:\") ||\n trimmedVal.startsWith(\"data:\")\n ) {\n if (\n name === \"src\" &&\n trimmedVal.startsWith(\"data:image/\") &&\n !trimmedVal.startsWith(\"data:image/svg+xml\")\n ) {\n // Allowed raster image data URI for <img> tags\n } else {\n if (name === \"href\") {\n el.setAttribute(\"href\", \"#\");\n return;\n }\n attrsToRemove.push(attr.name);\n return;\n }\n }\n if (!ALLOWED_URI_REGEX.test(val)) {\n if (name === \"href\") {\n el.setAttribute(\"href\", \"#\");\n return;\n }\n attrsToRemove.push(attr.name);\n return;\n }\n }\n if (name === \"target\" && typeof val === \"string\" && val.trim().toLowerCase() === \"_blank\") {\n const rel = (el.getAttribute(\"rel\") || \"\").split(/\\s+/).filter(Boolean);\n if (!rel.includes(\"noopener\")) rel.push(\"noopener\");\n if (!rel.includes(\"noreferrer\")) rel.push(\"noreferrer\");\n el.setAttribute(\"rel\", rel.join(\" \"));\n }\n });\n attrsToRemove.forEach((name) => el.removeAttribute(name));\n\n const finalTarget = el.getAttribute(\"target\");\n if (el.tagName === \"A\" && typeof finalTarget === \"string\" && finalTarget.trim().toLowerCase() === \"_blank\") {\n const rel = (el.getAttribute(\"rel\") || \"\").split(/\\s+/).filter(Boolean);\n if (!rel.includes(\"noopener\")) rel.push(\"noopener\");\n if (!rel.includes(\"noreferrer\")) rel.push(\"noreferrer\");\n el.setAttribute(\"rel\", rel.join(\" \"));\n }\n}\n\nfunction sanitizeNode(node, allowedTags, allowedAttrs) {\n if (node.nodeType === Node.TEXT_NODE) {\n return document.createTextNode(node.nodeValue);\n }\n if (node.nodeType === Node.COMMENT_NODE) {\n return null;\n }\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return null;\n }\n const tag = node.tagName.toUpperCase();\n if (\n DISCARDED_TAGS.has(tag) ||\n tag.includes(\"SCRIPT\") ||\n tag.includes(\"<\") ||\n tag.includes(\">\")\n ) {\n return null;\n }\n if (!allowedTags.has(tag)) {\n const frag = document.createDocumentFragment();\n Array.from(node.childNodes).forEach((child) => {\n const sanitized = sanitizeNode(child, allowedTags, allowedAttrs);\n if (sanitized) frag.appendChild(sanitized);\n });\n return frag;\n }\n const el = document.createElement(node.tagName);\n Array.from(node.attributes || []).forEach((attr) => {\n el.setAttribute(attr.name, attr.value);\n });\n sanitizeAttributes(el, allowedAttrs);\n Array.from(node.childNodes).forEach((child) => {\n const sanitizedChild = sanitizeNode(child, allowedTags, allowedAttrs);\n if (sanitizedChild) el.appendChild(sanitizedChild);\n });\n return el;\n}\n\nfunction parseHtmlInert(html) {\n if (typeof DOMParser !== \"undefined\") {\n try {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n if (doc && doc.body) return doc.body;\n } catch {}\n }\n if (typeof document !== \"undefined\") {\n const template = document.createElement(\"template\");\n if (\"content\" in template) {\n template.innerHTML = html;\n return template.content;\n }\n const div = document.createElement(\"div\");\n div.innerHTML = html;\n return div;\n }\n return null;\n}\n\nexport function fallbackSanitize(dirty) {\n if (!dirty || typeof dirty !== \"string\") return \"\";\n\n const container = parseHtmlInert(dirty);\n if (!container) return \"\";\n\n const outFrag = document.createDocumentFragment();\n Array.from(container.childNodes).forEach((child) => {\n const sanitized = sanitizeNode(child, ALLOWED_TAGS, ALLOWED_ATTRS);\n if (sanitized) outFrag.appendChild(sanitized);\n });\n\n const wrapper = document.createElement(\"div\");\n wrapper.appendChild(outFrag);\n\n wrapper.querySelectorAll('a[target=\"_blank\"]').forEach((a) => {\n const rel = (a.getAttribute(\"rel\") || \"\").split(/\\s+/).filter(Boolean);\n if (!rel.includes(\"noopener\")) rel.push(\"noopener\");\n if (!rel.includes(\"noreferrer\")) rel.push(\"noreferrer\");\n a.setAttribute(\"rel\", rel.join(\" \"));\n });\n\n return wrapper.innerHTML;\n}\n\nexport function sanitizeHtml(dirty, opts = {}) {\n if (typeof dirty !== \"string\" || !dirty.trim()) return \"\";\n try {\n if (!opts.forceFallback && hasDOMPurify()) {\n const DOMPurify = window.DOMPurify;\n const cleaned = DOMPurify.sanitize(dirty, {\n ALLOWED_TAGS: Array.from(ALLOWED_TAGS),\n ALLOWED_ATTR: Array.from(ALLOWED_ATTRS),\n ALLOWED_URI_REGEXP: ALLOWED_URI_REGEX,\n });\n\n const wrapper = document.createElement(\"div\");\n wrapper.innerHTML = cleaned;\n wrapper.querySelectorAll(\"a[href]\").forEach((a) => {\n const href = a.getAttribute(\"href\") || \"\";\n if (!ALLOWED_URI_REGEX.test(href)) {\n a.setAttribute(\"href\", \"#\");\n }\n });\n wrapper.querySelectorAll('a[target=\"_blank\"]').forEach((a) => {\n const rel = (a.getAttribute(\"rel\") || \"\").split(/\\s+/).filter(Boolean);\n if (!rel.includes(\"noopener\")) rel.push(\"noopener\");\n if (!rel.includes(\"noreferrer\")) rel.push(\"noreferrer\");\n a.setAttribute(\"rel\", rel.join(\" \"));\n });\n return wrapper.innerHTML;\n }\n } catch (err) {\n console.warn(\"DOMPurify sanitization failed, falling back:\", err);\n }\n return fallbackSanitize(dirty);\n}","// src/components/loader.js\nimport { getConfig, shouldReduceMotion } from \"../utils/config.js\";\n\nexport function createLoader(opts = {}) {\n if (typeof document === \"undefined\") return null;\n const safeOpts = opts && typeof opts === \"object\" && !Array.isArray(opts) ? opts : {};\n const rawSize = Number(safeOpts.size);\n const size = Number.isFinite(rawSize) && rawSize > 0 ? rawSize : 14;\n const rawColor = typeof safeOpts.color === \"string\" && safeOpts.color.trim() ? safeOpts.color.trim() : \"currentColor\";\n const color = (/[\\r\\n<>\"';]/.test(rawColor) || /^\\s*javascript:/i.test(rawColor)) ? \"currentColor\" : rawColor;\n const labelText = typeof safeOpts.text === \"string\" ? safeOpts.text : \"\";\n const wrapper = document.createElement(\"span\");\n wrapper.className = \"toast-loader\";\n wrapper.setAttribute(\"role\", \"status\");\n wrapper.setAttribute(\"aria-label\", labelText || \"Loading\");\n\n const config = getConfig();\n if (!config.disableInlineStyles) {\n wrapper.style.display = \"inline-flex\";\n wrapper.style.alignItems = \"center\";\n wrapper.style.gap = \"8px\";\n }\n\n const svgNS = \"http://www.w3.org/2000/svg\";\n const svg = document.createElementNS(svgNS, \"svg\");\n svg.setAttribute(\"width\", String(size));\n svg.setAttribute(\"height\", String(size));\n svg.setAttribute(\"viewBox\", \"0 0 50 50\");\n svg.setAttribute(\"aria-hidden\", \"true\");\n const circle = document.createElementNS(svgNS, \"circle\");\n circle.classList.add(\"toast-loader-circle\");\n circle.setAttribute(\"cx\", \"25\");\n circle.setAttribute(\"cy\", \"25\");\n circle.setAttribute(\"r\", \"20\");\n circle.setAttribute(\"fill\", \"none\");\n circle.setAttribute(\"stroke\", color);\n circle.setAttribute(\"stroke-width\", \"4\");\n circle.setAttribute(\"stroke-linecap\", \"round\");\n if (!config.disableInlineStyles) {\n circle.style.opacity = \"0.85\";\n circle.style.strokeDasharray = \"90\";\n circle.style.strokeDashoffset = \"60\";\n circle.style.transformOrigin = \"center\";\n if (!shouldReduceMotion()) {\n circle.style.animation = \"toast-spinner 1s linear infinite\";\n }\n }\n\n svg.appendChild(circle);\n wrapper.appendChild(svg);\n\n if (labelText) {\n const lbl = document.createElement(\"span\");\n lbl.className = \"toast-loader-label\";\n if (!config.disableInlineStyles) {\n lbl.style.fontSize = \"13px\";\n }\n lbl.textContent = labelText;\n wrapper.appendChild(lbl);\n }\n\n if (!config.disableInlineStyles && typeof document !== \"undefined\" && !document.getElementById(\"toast-spinner-styles\")) {\n try {\n const st = document.createElement(\"style\");\n st.id = \"toast-spinner-styles\";\n st.textContent = `@keyframes toast-spinner { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }`;\n const target = document.head || document.documentElement;\n if (target) target.appendChild(st);\n } catch {\n // In strict CSP environments where style element appending is blocked\n }\n }\n\n return wrapper;\n}\n","import { getDynamicAccessibleTextColorHex } from \"../utils/dom.js\";\nimport { getConfig, shouldReduceMotion } from \"../utils/config.js\";\n\nexport function createCTA(toast, options, onClose) {\n const rawCfg = options?.cta;\n if (!rawCfg || typeof rawCfg !== \"object\") return;\n\n const configs = Array.isArray(rawCfg)\n ? rawCfg.filter((item) => item && typeof item === \"object\")\n : [rawCfg];\n if (configs.length === 0) return;\n\n const cleanups = [];\n\n configs.forEach((raw, idx) => {\n if (!raw || typeof raw !== \"object\") return;\n const cfg = { ...raw };\n\n if (!cfg.label) {\n cfg.label = configs.length > 1 ? `Action ${idx + 1}` : \"CTA Label Missing!\";\n }\n\n const isLink = cfg.variant === \"link\" || (!cfg.variant && !!cfg.href);\n const el = document.createElement(isLink ? \"a\" : \"button\");\n\n if (isLink) {\n if (cfg.href) {\n const trimmedHref = String(cfg.href).trim();\n const isDangerous = /^(javascript:|vbscript:|data:(?!image\\/[a-z0-9.+-]+;base64,))/i.test(trimmedHref);\n el.href = isDangerous ? \"#\" : trimmedHref;\n } else {\n el.setAttribute(\"role\", \"button\");\n el.tabIndex = 0;\n }\n if (cfg.target) el.target = cfg.target;\n const relSet = new Set((cfg.rel || \"\").split(/\\s+/).filter(Boolean));\n if (typeof cfg.target === \"string\" && cfg.target.trim().toLowerCase() === \"_blank\") {\n relSet.add(\"noopener\");\n relSet.add(\"noreferrer\");\n }\n el.rel = Array.from(relSet).join(\" \");\n } else {\n el.type = \"button\";\n }\n\n el.setAttribute(\"aria-label\", cfg.ariaLabel || cfg.label);\n\n const ctaTextColor =\n cfg.textColor ||\n cfg.color ||\n options.textColor ||\n getDynamicAccessibleTextColorHex(options.backgroundColor);\n const ctaBgColor =\n cfg.backgroundColor ||\n cfg.background ||\n (options.backgroundColor\n ? getContrastBackground(options.backgroundColor)\n : \"rgba(255,255,255,0.15)\");\n\n const isHex6 = typeof ctaTextColor === \"string\" && /^#[0-9a-fA-F]{6}$/.test(ctaTextColor.trim());\n const ctaBorderColor = isHex6 ? `${ctaTextColor.trim()}44` : \"rgba(128, 128, 128, 0.3)\";\n\n el.className = \"toast-cta\";\n if (!getConfig().disableInlineStyles) {\n Object.assign(el.style, {\n marginLeft: idx === 0 ? \"10px\" : \"6px\",\n padding: \"6px 10px\",\n borderRadius: \"6px\",\n fontSize: \"12px\",\n fontWeight: \"600\",\n lineHeight: \"1\",\n border: `1px solid ${ctaBorderColor}`,\n color: ctaTextColor,\n background: ctaBgColor,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n flexShrink: \"0\",\n });\n }\n\n el.textContent = cfg.label;\n\n const onClick = async (e) => {\n try {\n if (typeof cfg.onClick === \"function\") {\n const res = cfg.onClick(e);\n if (res?.then) await res;\n }\n } catch (err) {\n console.error(\"CTA onClick handler error:\", err);\n } finally {\n if (cfg.autoClose !== false && typeof onClose === \"function\") {\n onClose(toast);\n }\n }\n };\n\n const onKeyDown = (e) => {\n if (isLink && !cfg.href && (e.key === \"Enter\" || e.key === \" \")) {\n e.preventDefault();\n onClick(e);\n }\n };\n\n el.addEventListener(\"click\", onClick);\n if (isLink && !cfg.href) {\n el.addEventListener(\"keydown\", onKeyDown);\n }\n\n const cleanupItem = () => {\n el.removeEventListener(\"click\", onClick);\n if (isLink && !cfg.href) {\n el.removeEventListener(\"keydown\", onKeyDown);\n }\n };\n el._cleanup = cleanupItem;\n cleanups.push(cleanupItem);\n\n const insertTarget =\n toast.querySelector(\".toast-undo-btn\") ||\n toast.querySelector(\".toast-close-btn\") ||\n toast.querySelector(\".toast-progress-bar\");\n if (insertTarget) {\n toast.insertBefore(el, insertTarget);\n } else {\n toast.appendChild(el);\n }\n });\n\n const prevCleanup = toast._cleanupCTA;\n toast._cleanupCTA = () => {\n prevCleanup?.();\n cleanups.forEach((c) => c());\n };\n}\n\n/**\n * Creates an Undo action button with optional live countdown decay.\n * @param {HTMLElement} toast\n * @param {object} options\n * @param {Function} onClose\n * @returns {void}\n */\nexport function createUndoAction(toast, options, onClose) {\n const undo = options?.undo;\n if (!undo) return;\n\n const isFn = typeof undo === \"function\";\n if (!isFn && (typeof undo !== \"object\" || Array.isArray(undo))) return;\n\n const undoCfg = isFn ? { onUndo: undo } : { ...undo };\n const baseLabel =\n typeof undoCfg.label === \"string\" && undoCfg.label.trim()\n ? undoCfg.label.trim()\n : \"Undo\";\n\n const totalDuration = Number(options?.duration);\n const showCountdown =\n undoCfg.showCountdown !== false &&\n Number.isFinite(totalDuration) &&\n totalDuration > 0;\n\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"toast-undo-btn\";\n btn.setAttribute(\"aria-label\", `${baseLabel} action`);\n\n const textColor =\n options.textColor ||\n getDynamicAccessibleTextColorHex(options.backgroundColor);\n const bgColor = options.backgroundColor\n ? getContrastBackground(options.backgroundColor)\n : \"rgba(255,255,255,0.18)\";\n\n const isHex6 =\n typeof textColor === \"string\" &&\n /^#[0-9a-fA-F]{6}$/.test(textColor.trim());\n const borderColor = isHex6\n ? `${textColor.trim()}55`\n : \"rgba(128, 128, 128, 0.35)\";\n\n if (!getConfig().disableInlineStyles) {\n Object.assign(btn.style, {\n marginLeft: \"10px\",\n padding: \"5px 10px\",\n borderRadius: \"6px\",\n fontSize: \"12px\",\n fontWeight: \"700\",\n lineHeight: \"1\",\n border: `1px solid ${borderColor}`,\n color: textColor,\n background: bgColor,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n flexShrink: \"0\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"4px\",\n });\n }\n\n let remainingSec = Math.max(1, Math.ceil((totalDuration || 2500) / 1000));\n const updateLabel = () => {\n btn.textContent = showCountdown\n ? `${baseLabel} (${remainingSec}s)`\n : baseLabel;\n };\n updateLabel();\n\n let intervalId = null;\n let isPaused = false;\n if (showCountdown) {\n intervalId = setInterval(() => {\n if (isPaused) return;\n remainingSec = Math.max(0, remainingSec - 1);\n updateLabel();\n if (remainingSec <= 0 && intervalId) {\n clearInterval(intervalId);\n intervalId = null;\n }\n }, 1000);\n if (typeof intervalId?.unref === \"function\") {\n intervalId.unref();\n }\n }\n\n toast._pauseUndo = () => {\n isPaused = true;\n };\n toast._resumeUndo = () => {\n isPaused = false;\n };\n\n const cleanupTimer = () => {\n if (intervalId) {\n clearInterval(intervalId);\n intervalId = null;\n }\n toast._pauseUndo = null;\n toast._resumeUndo = null;\n };\n\n const onClick = async (e) => {\n cleanupTimer();\n btn.removeEventListener(\"click\", onClick);\n try {\n if (typeof undoCfg.onUndo === \"function\") {\n const res = undoCfg.onUndo(e, toast);\n if (res?.then) await res;\n }\n } catch (err) {\n console.error(\"Undo action error:\", err);\n } finally {\n if (typeof onClose === \"function\") {\n onClose(toast);\n }\n }\n };\n\n btn.addEventListener(\"click\", onClick);\n\n btn._cleanup = () => {\n cleanupTimer();\n btn.removeEventListener(\"click\", onClick);\n };\n toast._cleanupUndo = () => {\n cleanupTimer();\n btn.removeEventListener(\"click\", onClick);\n };\n\n const insertTarget =\n toast.querySelector(\".toast-close-btn\") ||\n toast.querySelector(\".toast-progress-bar\");\n if (insertTarget) {\n toast.insertBefore(btn, insertTarget);\n } else {\n toast.appendChild(btn);\n }\n}\n\nexport function createCloseButton(toast, options, onClose) {\n const closeBtn = document.createElement(\"button\");\n closeBtn.type = \"button\";\n closeBtn.setAttribute(\"aria-label\", \"Close notification\");\n closeBtn.setAttribute(\"title\", \"Close\");\n closeBtn.textContent = \"×\";\n\n const closeTextColor = options.textColor || getDynamicAccessibleTextColorHex(options.backgroundColor);\n\n closeBtn.className = \"toast-close-btn\";\n if (!getConfig().disableInlineStyles) {\n Object.assign(closeBtn.style, {\n background: \"none\",\n border: \"none\",\n color: closeTextColor,\n fontSize: \"18px\",\n marginLeft: \"10px\",\n cursor: \"pointer\",\n lineHeight: \"1\",\n padding: \"0 4px\",\n });\n }\n\n const onClick = () => {\n if (typeof onClose === \"function\") onClose(toast);\n };\n closeBtn.addEventListener(\"click\", onClick);\n\n toast._cleanupCloseButton = () => {\n closeBtn.removeEventListener(\"click\", onClick);\n };\n\n toast.appendChild(closeBtn);\n}\n\nfunction getContrastBackground(bgColor) {\n if (!bgColor) return \"rgba(255,255,255,0.15)\";\n const textColor = getDynamicAccessibleTextColorHex(bgColor);\n if (textColor === \"#000000\") {\n return \"rgba(0,0,0,0.15)\";\n }\n return \"rgba(255,255,255,0.15)\";\n}\n\nfunction ensureProgressIndeterminateStyles() {\n if (typeof document === \"undefined\" || document.getElementById(\"toast-progress-indeterminate-styles\")) {\n return;\n }\n const st = document.createElement(\"style\");\n st.id = \"toast-progress-indeterminate-styles\";\n st.textContent = `\n @keyframes toast-progress-indeterminate {\n 0% { left: 0%; width: 0%; }\n 50% { left: 20%; width: 60%; }\n 100% { left: 100%; width: 0%; }\n }\n .toast-progress-bar-indeterminate {\n animation: toast-progress-indeterminate 1.6s cubic-bezier(0.4, 0, 0.2, 1) infinite !important;\n }\n `;\n const target = document.head || document.documentElement;\n if (target) target.appendChild(st);\n}\n\nexport function createProgressBar(toast, options = {}) {\n const progressBar = document.createElement(\"div\");\n progressBar.className = \"toast-progress-bar\";\n toast._progressBar = progressBar;\n const borderRadiusStr = options.borderRadius || \"0\";\n const parsedRadius = parseInt(borderRadiusStr, 10);\n const borderRadiusNum = Number.isFinite(parsedRadius) && parsedRadius > 0 ? parsedRadius : 0;\n\n let progressHeightPx = 4;\n let progressHeightStyle = \"4px\";\n if (typeof options.progressHeight === \"number\" && Number.isFinite(options.progressHeight) && options.progressHeight > 0) {\n progressHeightPx = options.progressHeight;\n progressHeightStyle = `${progressHeightPx}px`;\n } else if (typeof options.progressHeight === \"string\" && options.progressHeight.trim()) {\n const trimmed = options.progressHeight.trim();\n const parsedFloat = parseFloat(trimmed);\n if (Number.isFinite(parsedFloat) && parsedFloat > 0) {\n if (trimmed.endsWith(\"rem\") || trimmed.endsWith(\"em\")) {\n progressHeightPx = parsedFloat * 16;\n progressHeightStyle = trimmed;\n } else {\n progressHeightPx = parsedFloat;\n progressHeightStyle = /^\\d+(\\.\\d+)?$/.test(trimmed) ? `${parsedFloat}px` : trimmed;\n }\n }\n }\n\n const duration = Number(options.duration ?? 2500);\n const progressDuration = Math.max(0, duration + 5);\n\n const leftOffset = Math.min(borderRadiusNum, progressHeightPx * 2);\n const finalWidth = borderRadiusNum > 0\n ? `calc(100% - ${leftOffset * 2}px)`\n : \"100%\";\n\n const isReverse = options.progressDirection === \"reverse\" || options.progressDirection === \"increasing\" || options.progressDirection === \"ltr\";\n progressBar._leftOffset = leftOffset;\n progressBar._finalWidth = finalWidth;\n progressBar._isReverse = isReverse;\n\n const progressBg = options.progressBarColor || options.progressColor || \"currentColor\";\n\n if (!getConfig().disableInlineStyles) {\n Object.assign(progressBar.style, {\n position: \"absolute\",\n left: `${leftOffset}px`,\n height: progressHeightStyle,\n background: progressBg,\n width: isReverse ? \"0%\" : `${finalWidth}`,\n transition: `width ${progressDuration}ms linear`,\n [options.progressPosition === \"top\" ? \"top\" : \"bottom\"]: \"0\",\n borderRadius: `${progressHeightPx / 2}px`,\n opacity: \"0.8\",\n zIndex: \"2\",\n willChange: \"width\",\n });\n }\n\n toast.appendChild(progressBar);\n\n // 1. Indeterminate mode or loading state (duration: 0 or Infinity with showProgressBar)\n const isIndeterminate = options.progress === \"indeterminate\" ||\n (Boolean(options.showProgressBar) && (options.duration === 0 || options.duration === Infinity) && options.progress === undefined);\n\n if (isIndeterminate) {\n progressBar.classList.add(\"toast-progress-bar-indeterminate\");\n if (!getConfig().disableInlineStyles) {\n ensureProgressIndeterminateStyles();\n progressBar.style.animation = \"toast-progress-indeterminate 1.6s cubic-bezier(0.4, 0, 0.2, 1) infinite\";\n }\n progressBar.style.width = finalWidth;\n return;\n }\n\n // 2. Explicit manual percentage progress (determinate)\n if (options.progress !== undefined) {\n let pct = Number(options.progress);\n if (!Number.isFinite(pct)) pct = 0;\n if (pct < 1 && pct > 0) pct = pct * 100;\n pct = Math.min(100, Math.max(0, pct));\n progressBar.style.width = `${pct}%`;\n progressBar.style.transition = \"width 200ms ease\";\n return;\n }\n\n if (options.duration === 0 || options.duration === Infinity) {\n progressBar.style.width = \"0%\";\n return;\n }\n\n if (shouldReduceMotion()) {\n progressBar.style.display = \"none\";\n } else if (typeof progressBar.animate === \"function\") {\n const keyframes = isReverse\n ? [{ width: \"0%\" }, { width: finalWidth }]\n : [{ width: finalWidth }, { width: \"0%\" }];\n toast._progressAnimation = progressBar.animate(\n keyframes,\n {\n duration: progressDuration,\n easing: \"linear\",\n fill: \"forwards\",\n delay: 50,\n },\n );\n } else {\n progressBar.style.transition = `width ${progressDuration}ms linear`;\n requestAnimationFrame(() => {\n progressBar.style.width = isReverse ? finalWidth : \"0%\";\n });\n }\n}\n\nexport function runToastAnimation(toast) {\n if (!toast) return;\n if (toast._hasAnimated) return;\n\n if (shouldReduceMotion()) {\n toast._hasAnimated = true;\n toast.style.transition = \"none\";\n toast.style.opacity = \"1\";\n toast.style.transform = \"translateY(0)\";\n toast.classList.add(\"active\");\n return;\n }\n\n const trigger = () => {\n if (toast._hasAnimated) return;\n toast._hasAnimated = true;\n // Force browser layout/reflow so initial styles (opacity: 0, translateY) are committed to render tree\n try {\n void toast.offsetHeight;\n } catch {}\n\n requestAnimationFrame(() => {\n toast.style.opacity = \"1\";\n toast.style.transform = \"none\";\n toast.classList.add(\"active\");\n });\n };\n\n if (toast.isConnected) {\n trigger();\n } else {\n // If not yet connected to the DOM, defer to next frame when container.appendChild has occurred\n requestAnimationFrame(() => {\n if (toast.isConnected) {\n trigger();\n } else {\n requestAnimationFrame(() => {\n trigger();\n });\n }\n });\n }\n}\n\nexport function attachSwipeToDismiss(toast, onClose) {\n if (!toast || typeof toast.addEventListener !== \"function\") return;\n\n let startX = 0;\n let startY = 0;\n let currentX = 0;\n let startTime = 0;\n let isDragging = false;\n let isHorizontal = false;\n let touchId = null;\n\n let isWindowListening = false;\n\n const cleanupWindowListeners = () => {\n if (isWindowListening) {\n isWindowListening = false;\n window.removeEventListener(\"mousemove\", onPointerMove);\n window.removeEventListener(\"mouseup\", onPointerEnd);\n }\n };\n\n const onPointerDown = (e) => {\n if (!e) return;\n const target = e.target;\n if (\n target &&\n typeof target.closest === \"function\" &&\n target.closest(\"button, a, input, textarea, select, label\")\n ) {\n return;\n }\n let ev = e;\n if (e.touches && e.touches.length > 0) {\n ev = e.touches[0];\n touchId = ev.identifier ?? null;\n } else {\n touchId = null;\n }\n startX = ev.clientX;\n startY = ev.clientY;\n currentX = startX;\n startTime = Date.now();\n isDragging = true;\n isHorizontal = false;\n toast._originalTransition = toast.style.transition || \"\";\n toast.style.transition = \"none\";\n toast.style.userSelect = \"none\";\n\n if (!isWindowListening && typeof window !== \"undefined\") {\n isWindowListening = true;\n window.addEventListener(\"mousemove\", onPointerMove, { passive: false });\n window.addEventListener(\"mouseup\", onPointerEnd, { passive: true });\n }\n };\n\n const onPointerMove = (e) => {\n if (!isDragging || !e) return;\n let ev = e;\n if (e.touches) {\n if (touchId !== null) {\n for (let i = 0; i < e.touches.length; i++) {\n if (e.touches[i].identifier === touchId) {\n ev = e.touches[i];\n break;\n }\n }\n } else if (e.touches.length > 0) {\n ev = e.touches[0];\n }\n }\n const x = ev.clientX;\n const y = ev.clientY;\n const dx = x - startX;\n const dy = y - startY;\n\n if (!isHorizontal) {\n if (Math.abs(dx) > 8 && Math.abs(dx) > Math.abs(dy)) {\n isHorizontal = true;\n } else if (Math.abs(dy) > 8) {\n isDragging = false;\n toast.style.userSelect = \"\";\n cleanupWindowListeners();\n return;\n }\n }\n\n if (isHorizontal) {\n currentX = x;\n const opacity = Math.max(0, 1 - Math.abs(dx) / 280);\n if (!getConfig().disableInlineStyles && !shouldReduceMotion()) {\n toast.style.transform = `translateX(${dx}px)`;\n toast.style.opacity = String(opacity);\n }\n if (e.cancelable) e.preventDefault();\n }\n };\n\n const onPointerEnd = () => {\n cleanupWindowListeners();\n touchId = null;\n if (!isDragging || !isHorizontal) {\n isDragging = false;\n toast.style.userSelect = \"\";\n return;\n }\n isDragging = false;\n toast.style.userSelect = \"\";\n\n const dx = currentX - startX;\n const duration = Math.max(1, Date.now() - startTime);\n const velocity = duration > 0 ? Math.abs(dx) / duration : 0; // px/ms\n const isFlick = velocity >= 0.65 && Math.abs(dx) >= 50;\n const threshold = isFlick ? 50 : 75;\n\n if (Math.abs(dx) >= threshold) {\n const exitX = dx > 0 ? 320 : -320;\n const exitDuration = isFlick ? 120 : 180;\n if (!getConfig().disableInlineStyles && !shouldReduceMotion()) {\n toast.style.transition = `transform ${exitDuration}ms ease-out, opacity ${exitDuration}ms ease-out`;\n toast.style.transform = `translateX(${exitX}px)`;\n toast.style.opacity = \"0\";\n }\n if (toast._swipeTimeout) clearTimeout(toast._swipeTimeout);\n toast._swipeTimeout = setTimeout(() => {\n toast._swipeTimeout = null;\n if (typeof onClose === \"function\") onClose(toast);\n }, exitDuration);\n if (typeof toast._swipeTimeout?.unref === \"function\") {\n toast._swipeTimeout.unref();\n }\n } else {\n if (!getConfig().disableInlineStyles && !shouldReduceMotion()) {\n const spring = toast._spring;\n const snapEasing = spring?.easing || \"cubic-bezier(0.34, 1.56, 0.64, 1)\";\n const snapDuration = spring?.duration ? Math.min(400, spring.duration) : 200;\n toast.style.transition = `transform ${snapDuration}ms ${snapEasing}, opacity 200ms ease`;\n toast.style.transform = \"translateX(0)\";\n toast.style.opacity = \"1\";\n\n if (toast._snapbackTimer) clearTimeout(toast._snapbackTimer);\n toast._snapbackTimer = setTimeout(() => {\n toast._snapbackTimer = null;\n if (toast._originalTransition) {\n toast.style.transition = toast._originalTransition;\n }\n }, snapDuration);\n if (typeof toast._snapbackTimer?.unref === \"function\") {\n toast._snapbackTimer.unref();\n }\n }\n }\n };\n\n toast.addEventListener(\"touchstart\", onPointerDown, { passive: true });\n toast.addEventListener(\"touchmove\", onPointerMove, { passive: false });\n toast.addEventListener(\"touchend\", onPointerEnd, { passive: true });\n toast.addEventListener(\"touchcancel\", onPointerEnd, { passive: true });\n\n toast.addEventListener(\"mousedown\", onPointerDown, { passive: true });\n\n toast._cleanupSwipe = () => {\n if (toast._swipeTimeout) {\n clearTimeout(toast._swipeTimeout);\n toast._swipeTimeout = null;\n }\n if (toast._snapbackTimer) {\n clearTimeout(toast._snapbackTimer);\n toast._snapbackTimer = null;\n }\n cleanupWindowListeners();\n\n toast.removeEventListener(\"touchstart\", onPointerDown);\n toast.removeEventListener(\"touchmove\", onPointerMove);\n toast.removeEventListener(\"touchend\", onPointerEnd);\n toast.removeEventListener(\"touchcancel\", onPointerEnd);\n toast.removeEventListener(\"mousedown\", onPointerDown);\n };\n\n}","// src/utils/audio.js\n\"use strict\";\n\nimport { getConfig } from \"./config.js\";\n\nlet audioContext = null;\nlet audioEnabled = true;\n\n/**\n * Track user activation across the document to conform with browser autoplay policies.\n */\nlet hasUserGesture = false;\nif (typeof window !== \"undefined\") {\n if (typeof navigator !== \"undefined\" && navigator.userActivation?.hasBeenActive) {\n hasUserGesture = true;\n } else {\n const onGesture = () => {\n hasUserGesture = true;\n if (audioContext && audioContext.state === \"suspended\") {\n try {\n audioContext.resume().catch(() => {});\n } catch {}\n }\n try {\n window.removeEventListener(\"pointerdown\", onGesture, true);\n window.removeEventListener(\"keydown\", onGesture, true);\n window.removeEventListener(\"touchstart\", onGesture, true);\n } catch {}\n };\n try {\n window.addEventListener(\"pointerdown\", onGesture, { capture: true, once: true, passive: true });\n window.addEventListener(\"keydown\", onGesture, { capture: true, once: true, passive: true });\n window.addEventListener(\"touchstart\", onGesture, { capture: true, once: true, passive: true });\n } catch {}\n }\n}\n\n/**\n * Registry for user-defined sound synthesis functions.\n * @type {Map<string, (ctx: AudioContext, toneType: string, now: number) => void>}\n */\nconst customSoundPresets = new Map();\n\n/**\n * Lazily initialize and return a shared AudioContext.\n * Returns null in non-browser or unsupported environments.\n * @param {boolean} [forceResume=true] - Whether to attempt resuming suspended AudioContext\n * @returns {AudioContext | null}\n */\nexport function getAudioContext(forceResume = true) {\n if (typeof window === \"undefined\") return null;\n const AudioCtx = window.AudioContext || window.webkitAudioContext;\n if (!AudioCtx) return null;\n\n if (!audioContext) {\n try {\n audioContext = new AudioCtx();\n } catch {\n return null;\n }\n }\n\n const hasActivation =\n hasUserGesture ||\n (typeof navigator !== \"undefined\" &&\n navigator.userActivation &&\n navigator.userActivation.hasBeenActive);\n\n if (audioContext && audioContext.state === \"suspended\" && (forceResume || hasActivation)) {\n try {\n audioContext.resume().catch(() => {});\n } catch {}\n }\n\n return audioContext;\n}\n\nlet audioAnalyser = null;\n\n/**\n * Returns a shared AnalyserNode for real-time waveform visualization.\n * @returns {AnalyserNode | null}\n */\nexport function getAudioAnalyser() {\n const ctx = getAudioContext(false);\n if (!ctx || typeof ctx.createAnalyser !== \"function\") return null;\n if (!audioAnalyser) {\n try {\n audioAnalyser = ctx.createAnalyser();\n audioAnalyser.fftSize = 128;\n audioAnalyser.connect(ctx.destination);\n } catch {\n return null;\n }\n }\n return audioAnalyser;\n}\n\n/**\n * Route node to destination through analyser if available.\n * @param {AudioContext} ctx\n * @param {AudioNode} node\n */\nfunction routeAudio(ctx, node) {\n if (audioAnalyser) {\n node.connect(audioAnalyser);\n } else {\n node.connect(ctx.destination);\n }\n}\n\n/**\n * Register safe node disconnection on oscillator end to prevent audio graph leaks.\n * @param {OscillatorNode} osc\n * @param {AudioNode} gain\n */\nexport function registerNodeCleanup(osc, gain) {\n if (!osc) return;\n osc.onended = () => {\n try {\n osc.disconnect();\n gain?.disconnect?.();\n } catch {}\n };\n}\n\n/**\n * Modern preset: crisp multi-tone chords and pings.\n * @param {AudioContext} ctx\n * @param {string} tone\n * @param {number} now\n */\nfunction playModernPreset(ctx, tone, now) {\n if (tone === \"success\") {\n // Pleasant rising major chord chime (C5 -> E5 -> G5)\n const notes = [523.25, 659.25, 783.99];\n notes.forEach((freq, idx) => {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(freq, now + idx * 0.08);\n\n gain.gain.setValueAtTime(0.001, now + idx * 0.08);\n gain.gain.exponentialRampToValueAtTime(0.12, now + idx * 0.08 + 0.02);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + idx * 0.08 + 0.35);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n registerNodeCleanup(osc, gain);\n\n osc.start(now + idx * 0.08);\n osc.stop(now + idx * 0.08 + 0.36);\n });\n } else if (tone === \"error\") {\n // Subtle two-tone descending soft buzz\n const freqs = [320, 240];\n freqs.forEach((freq, idx) => {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"triangle\";\n osc.frequency.setValueAtTime(freq, now + idx * 0.1);\n\n gain.gain.setValueAtTime(0.001, now + idx * 0.1);\n gain.gain.exponentialRampToValueAtTime(0.15, now + idx * 0.1 + 0.02);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + idx * 0.1 + 0.22);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n registerNodeCleanup(osc, gain);\n\n osc.start(now + idx * 0.1);\n osc.stop(now + idx * 0.1 + 0.23);\n });\n } else if (tone === \"warning\") {\n // Gentle alert ping\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(440, now);\n osc.frequency.exponentialRampToValueAtTime(493.88, now + 0.12);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.exponentialRampToValueAtTime(0.12, now + 0.02);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.28);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n registerNodeCleanup(osc, gain);\n\n osc.start(now);\n osc.stop(now + 0.3);\n } else {\n // Light droplet pop ('info' or 'pop')\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(600, now);\n osc.frequency.exponentialRampToValueAtTime(950, now + 0.04);\n osc.frequency.exponentialRampToValueAtTime(400, now + 0.09);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.exponentialRampToValueAtTime(0.1, now + 0.015);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.12);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n registerNodeCleanup(osc, gain);\n\n osc.start(now);\n osc.stop(now + 0.13);\n }\n}\n\n/**\n * Retro 8-bit chip-tune preset: snappy square wave arpeggios and coin blips.\n * @param {AudioContext} ctx\n * @param {string} tone\n * @param {number} now\n */\nfunction playRetroPreset(ctx, tone, now) {\n if (tone === \"success\") {\n // Rapid 4-note ascending 8-bit fanfare (C5 -> E5 -> G5 -> C6)\n const notes = [523.25, 659.25, 783.99, 1046.5];\n notes.forEach((freq, idx) => {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"square\";\n const start = now + idx * 0.045;\n osc.frequency.setValueAtTime(freq, start);\n\n gain.gain.setValueAtTime(0.001, start);\n gain.gain.linearRampToValueAtTime(0.08, start + 0.005);\n gain.gain.exponentialRampToValueAtTime(0.0001, start + 0.042);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n registerNodeCleanup(osc, gain);\n\n osc.start(start);\n osc.stop(start + 0.045);\n });\n } else if (tone === \"error\") {\n // Retro downward pitch slide (square wave 360Hz down to 90Hz)\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"square\";\n osc.frequency.setValueAtTime(360, now);\n osc.frequency.exponentialRampToValueAtTime(90, now + 0.22);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.linearRampToValueAtTime(0.1, now + 0.01);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.22);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n registerNodeCleanup(osc, gain);\n\n osc.start(now);\n osc.stop(now + 0.23);\n } else if (tone === \"warning\") {\n // Dual square blip (880Hz -> pause -> 880Hz)\n [0, 0.08].forEach((offset) => {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"square\";\n const start = now + offset;\n osc.frequency.setValueAtTime(880, start);\n\n gain.gain.setValueAtTime(0.001, start);\n gain.gain.linearRampToValueAtTime(0.07, start + 0.005);\n gain.gain.exponentialRampToValueAtTime(0.0001, start + 0.05);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n registerNodeCleanup(osc, gain);\n\n osc.start(start);\n osc.stop(start + 0.055);\n });\n } else {\n // 8-bit coin blip (B5 -> E6)\n const notes = [987.77, 1318.51];\n notes.forEach((freq, idx) => {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"square\";\n const start = now + idx * 0.035;\n osc.frequency.setValueAtTime(freq, start);\n\n gain.gain.setValueAtTime(0.001, start);\n gain.gain.linearRampToValueAtTime(0.08, start + 0.005);\n gain.gain.exponentialRampToValueAtTime(0.0001, start + 0.035);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n registerNodeCleanup(osc, gain);\n\n osc.start(start);\n osc.stop(start + 0.04);\n });\n }\n}\n\n/**\n * Futuristic sci-fi preset: resonant frequency modulation sweeps.\n * @param {AudioContext} ctx\n * @param {string} tone\n * @param {number} now\n */\nfunction playFuturisticPreset(ctx, tone, now) {\n if (tone === \"success\") {\n // Sci-fi power-up sweep (440Hz -> 1760Hz with exponential ramp)\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(440, now);\n osc.frequency.exponentialRampToValueAtTime(1760, now + 0.2);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.exponentialRampToValueAtTime(0.12, now + 0.03);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.32);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n registerNodeCleanup(osc, gain);\n\n osc.start(now);\n osc.stop(now + 0.33);\n } else if (tone === \"error\") {\n // Sci-fi shield down / power drain (880Hz down to 110Hz)\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sawtooth\";\n osc.frequency.setValueAtTime(700, now);\n osc.frequency.exponentialRampToValueAtTime(120, now + 0.24);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.linearRampToValueAtTime(0.09, now + 0.02);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.25);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n registerNodeCleanup(osc, gain);\n\n osc.start(now);\n osc.stop(now + 0.26);\n } else if (tone === \"warning\") {\n // Dual resonant harmonic frequency sweep\n const freqs = [580, 870];\n freqs.forEach((freq) => {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(freq, now);\n osc.frequency.linearRampToValueAtTime(freq * 1.15, now + 0.1);\n osc.frequency.linearRampToValueAtTime(freq, now + 0.2);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.exponentialRampToValueAtTime(0.07, now + 0.02);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.25);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n registerNodeCleanup(osc, gain);\n\n osc.start(now);\n osc.stop(now + 0.26);\n });\n } else {\n // Holographic chirp (1100Hz -> 1600Hz -> 750Hz)\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(1100, now);\n osc.frequency.exponentialRampToValueAtTime(1600, now + 0.03);\n osc.frequency.exponentialRampToValueAtTime(750, now + 0.09);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.exponentialRampToValueAtTime(0.09, now + 0.015);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.12);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n registerNodeCleanup(osc, gain);\n\n osc.start(now);\n osc.stop(now + 0.13);\n }\n}\n\n/**\n * Subtle preset: low-amplitude micro-transient clicks for professional dashboards.\n * @param {AudioContext} ctx\n * @param {string} tone\n * @param {number} now\n */\nfunction playSubtlePreset(ctx, tone, now) {\n if (tone === \"success\") {\n // Two rapid soft micro-clicks (750Hz then 1100Hz, 15ms each)\n [750, 1100].forEach((freq, idx) => {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n const start = now + idx * 0.04;\n osc.frequency.setValueAtTime(freq, start);\n\n gain.gain.setValueAtTime(0.001, start);\n gain.gain.linearRampToValueAtTime(0.04, start + 0.003);\n gain.gain.exponentialRampToValueAtTime(0.0001, start + 0.025);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n registerNodeCleanup(osc, gain);\n\n osc.start(start);\n osc.stop(start + 0.03);\n });\n } else if (tone === \"error\") {\n // Two low muffled micro-thuds (180Hz then 130Hz)\n [180, 130].forEach((freq, idx) => {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"triangle\";\n const start = now + idx * 0.05;\n osc.frequency.setValueAtTime(freq, start);\n\n gain.gain.setValueAtTime(0.001, start);\n gain.gain.linearRampToValueAtTime(0.05, start + 0.005);\n gain.gain.exponentialRampToValueAtTime(0.0001, start + 0.035);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n registerNodeCleanup(osc, gain);\n\n osc.start(start);\n osc.stop(start + 0.04);\n });\n } else if (tone === \"warning\") {\n // Single crisp 600Hz transient click\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(600, now);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.linearRampToValueAtTime(0.045, now + 0.003);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.025);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n registerNodeCleanup(osc, gain);\n\n osc.start(now);\n osc.stop(now + 0.03);\n } else {\n // Single soft 450Hz transient pop (15ms)\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(450, now);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.linearRampToValueAtTime(0.035, now + 0.003);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.02);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n registerNodeCleanup(osc, gain);\n\n osc.start(now);\n osc.stop(now + 0.025);\n }\n}\n\n/**\n * Bell preset: acoustic harmonic bell chime with natural overtone decay.\n * @param {AudioContext} ctx\n * @param {string} tone\n * @param {number} now\n */\nfunction playBellPreset(ctx, tone, now) {\n if (tone === \"success\") {\n // Harmonic bell chord: Fundamental 659.25Hz (E5) + Overtones\n const harmonics = [659.25, 1318.5, 2637.0];\n harmonics.forEach((freq, idx) => {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(freq, now);\n\n const peakGain = 0.09 / (idx + 1);\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.exponentialRampToValueAtTime(peakGain, now + 0.015);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.55);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n registerNodeCleanup(osc, gain);\n\n osc.start(now);\n osc.stop(now + 0.58);\n });\n } else if (tone === \"error\") {\n // Low bell toll: 220Hz + 440Hz with damped decay\n [220, 440].forEach((freq, idx) => {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"triangle\";\n osc.frequency.setValueAtTime(freq, now);\n\n const peakGain = 0.1 / (idx + 1);\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.exponentialRampToValueAtTime(peakGain, now + 0.015);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.38);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n registerNodeCleanup(osc, gain);\n\n osc.start(now);\n osc.stop(now + 0.4);\n });\n } else if (tone === \"warning\") {\n // Ringing attention bell (880Hz A5)\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(880, now);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.exponentialRampToValueAtTime(0.1, now + 0.015);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.45);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n registerNodeCleanup(osc, gain);\n\n osc.start(now);\n osc.stop(now + 0.48);\n } else {\n // Crystal glass ping (1320Hz)\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(1320, now);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.exponentialRampToValueAtTime(0.08, now + 0.01);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.28);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n registerNodeCleanup(osc, gain);\n\n osc.start(now);\n osc.stop(now + 0.3);\n }\n}\n\n/**\n * Built-in sound preset synthesizer table.\n */\nconst BUILTIN_PRESETS = {\n modern: playModernPreset,\n retro: playRetroPreset,\n futuristic: playFuturisticPreset,\n subtle: playSubtlePreset,\n bell: playBellPreset,\n};\n\n/**\n * Synthesizes a pleasant audio chime or tone using pure Web Audio API oscillators.\n * Zero external audio assets or network requests.\n * @param {'success' | 'error' | 'warning' | 'info' | 'pop' | string} [toneType=\"info\"]\n * @param {'modern' | 'retro' | 'futuristic' | 'subtle' | 'bell' | string} [preset=\"modern\"]\n * @returns {void}\n */\nlet isPlayingDelegated = false;\n\nexport function playTone(toneType = \"info\", preset) {\n if (!audioEnabled) return;\n if (\n !isPlayingDelegated &&\n typeof window !== \"undefined\" &&\n window.customizableToast &&\n typeof window.customizableToast.playTone === \"function\" &&\n window.customizableToast.playTone !== playTone\n ) {\n try {\n isPlayingDelegated = true;\n window.customizableToast.playTone(toneType, preset);\n return;\n } finally {\n isPlayingDelegated = false;\n }\n }\n const ctx = getAudioContext();\n if (!ctx) return;\n\n try {\n if (ctx.state === \"suspended\") {\n ctx.resume().catch(() => {});\n }\n\n const now = ctx.currentTime;\n\n // Check direct numeric frequency tone (e.g. 880 or \"440Hz\")\n const numFreq = typeof toneType === \"number\" ? toneType : parseFloat(toneType);\n if (\n Number.isFinite(numFreq) &&\n numFreq >= 20 &&\n numFreq <= 20000 &&\n (typeof toneType === \"number\" || /^\\d+(\\.\\d+)?(hz)?$/i.test(String(toneType).trim()))\n ) {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(numFreq, now);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.exponentialRampToValueAtTime(0.1, now + 0.015);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.35);\n\n osc.connect(gain);\n routeAudio(ctx, gain);\n registerNodeCleanup(osc, gain);\n\n osc.start(now);\n osc.stop(now + 0.36);\n return;\n }\n\n const tone = String(toneType || \"info\").toLowerCase().trim();\n const activePreset = String(\n preset || getConfig().soundPreset || \"modern\"\n ).toLowerCase().trim();\n\n // Check custom synthesizer first\n if (customSoundPresets.has(activePreset)) {\n try {\n const customFn = customSoundPresets.get(activePreset);\n if (typeof customFn === \"function\") {\n customFn(ctx, tone, now);\n return;\n }\n } catch (err) {\n console.warn(\"Custom sound preset synthesizer error:\", err);\n }\n }\n\n // Built-in presets with modern fallback\n const synthesizer = BUILTIN_PRESETS[activePreset] || BUILTIN_PRESETS.modern;\n synthesizer(ctx, tone, now);\n } catch {}\n}\n\n/**\n * Registers a custom sound synthesis preset.\n * @param {string} name - Name of the preset (e.g. 'arcade')\n * @param {(ctx: AudioContext, toneType: string, now: number) => void} synthesizerFn\n * @returns {boolean} True if successfully registered\n */\nexport function registerSoundPreset(name, synthesizerFn) {\n if (typeof name !== \"string\" || !name.trim() || typeof synthesizerFn !== \"function\") {\n return false;\n }\n const cleanName = name.toLowerCase().trim();\n customSoundPresets.set(cleanName, synthesizerFn);\n return true;\n}\n\n/**\n * Returns a list of all currently available sound presets (built-in + custom).\n * @returns {string[]}\n */\nexport function getSoundPresets() {\n const builtin = Object.keys(BUILTIN_PRESETS);\n const custom = Array.from(customSoundPresets.keys());\n return Array.from(new Set([...builtin, ...custom]));\n}\n\n/**\n * Clears custom sound presets (primarily for testing and environment resets).\n * @returns {void}\n */\nexport function resetSoundPresets() {\n customSoundPresets.clear();\n}\n\n/**\n * Globally enable or disable synthesized notification sounds.\n * @param {boolean} enabled\n * @returns {void}\n */\nexport function setAudioEnabled(enabled) {\n audioEnabled = Boolean(enabled);\n}\n\n/**\n * Returns current global audio feedback status.\n * @returns {boolean}\n */\nexport function isAudioEnabled() {\n return audioEnabled;\n}\n\n/**\n * Resets the cached AudioContext instance (useful for test isolation).\n * @returns {void}\n */\nexport function resetAudioContext() {\n if (audioContext) {\n try {\n audioContext.close?.().catch?.(() => {});\n } catch {}\n }\n audioContext = null;\n audioAnalyser = null;\n}\n","// src/utils/spring.js\n\"use strict\";\n\n/**\n * @typedef {Object} SpringConfig\n * @property {number} [stiffness=100] - Spring tension / stiffness constant (k > 0)\n * @property {number} [damping=10] - Damping friction coefficient (c > 0)\n * @property {number} [mass=1] - Inertial mass (m > 0)\n */\n\n/**\n * @typedef {'default' | 'gentle' | 'wobbly' | 'stiff' | 'bouncy' | string} SpringPreset\n */\n\n/**\n * Built-in spring physics presets calibrated for natural UI motion.\n * @type {Record<string, { stiffness: number, damping: number, mass: number, bezierFallback: string }>}\n */\nexport const SPRING_PRESETS = {\n default: {\n stiffness: 100,\n damping: 10,\n mass: 1,\n bezierFallback: \"cubic-bezier(0.34, 1.4, 0.64, 1)\",\n },\n gentle: {\n stiffness: 120,\n damping: 14,\n mass: 1,\n bezierFallback: \"cubic-bezier(0.25, 1, 0.5, 1)\",\n },\n wobbly: {\n stiffness: 180,\n damping: 12,\n mass: 1,\n bezierFallback: \"cubic-bezier(0.35, 1.6, 0.55, 1)\",\n },\n stiff: {\n stiffness: 210,\n damping: 20,\n mass: 1,\n bezierFallback: \"cubic-bezier(0.18, 0.9, 0.32, 1)\",\n },\n bouncy: {\n stiffness: 300,\n damping: 15,\n mass: 1.2,\n bezierFallback: \"cubic-bezier(0.34, 1.75, 0.5, 1)\",\n },\n};\n\n/**\n * Registry for user-defined spring configurations.\n * @type {Map<string, { stiffness: number, damping: number, mass: number, bezierFallback?: string }>}\n */\nconst customSpringPresets = new Map();\n\n/**\n * Register a custom named spring preset.\n * @param {string} name - Unique preset identifier\n * @param {SpringConfig & { bezierFallback?: string }} config - Spring parameters\n */\nexport function registerSpringPreset(name, config) {\n if (typeof name !== \"string\" || !name.trim()) {\n throw new TypeError(\"registerSpringPreset: name must be a non-empty string\");\n }\n if (!config || typeof config !== \"object\" || Array.isArray(config)) {\n throw new TypeError(\"registerSpringPreset: config must be an object\");\n }\n\n const stiffness = Number(config.stiffness);\n const damping = Number(config.damping);\n const mass = Number(config.mass);\n\n customSpringPresets.set(name.trim().toLowerCase(), {\n stiffness: Number.isFinite(stiffness) && stiffness > 0 ? stiffness : 100,\n damping: Number.isFinite(damping) && damping > 0 ? damping : 10,\n mass: Number.isFinite(mass) && mass > 0 ? mass : 1,\n bezierFallback:\n typeof config.bezierFallback === \"string\" && config.bezierFallback.trim()\n ? config.bezierFallback.trim()\n : \"cubic-bezier(0.34, 1.4, 0.64, 1)\",\n });\n}\n\n/**\n * Retrieve list of registered spring preset names.\n * @returns {string[]}\n */\nexport function getSpringPresets() {\n return [...Object.keys(SPRING_PRESETS), ...customSpringPresets.keys()];\n}\n\n/**\n * Reset all registered custom spring presets back to defaults.\n */\nexport function resetSpringPresets() {\n customSpringPresets.clear();\n}\n\n/**\n * Resolves a spring input into concrete numerical physics constants.\n * @param {boolean | SpringPreset | SpringConfig} spring - Preset name or custom parameters\n * @returns {{ stiffness: number, damping: number, mass: number, bezierFallback: string } | null}\n */\nexport function resolveSpringConfig(spring) {\n if (!spring) return null;\n\n if (typeof spring === \"string\") {\n const key = spring.trim().toLowerCase();\n if (customSpringPresets.has(key)) {\n return customSpringPresets.get(key);\n }\n if (Object.prototype.hasOwnProperty.call(SPRING_PRESETS, key)) {\n return SPRING_PRESETS[key];\n }\n return SPRING_PRESETS.default;\n }\n\n if (spring === true) {\n return SPRING_PRESETS.default;\n }\n\n if (typeof spring === \"object\" && !Array.isArray(spring)) {\n const rawStiffness = Number(spring.stiffness);\n const rawDamping = Number(spring.damping);\n const rawMass = Number(spring.mass);\n\n const stiffness = Number.isFinite(rawStiffness) && rawStiffness > 0 ? rawStiffness : 100;\n const damping = Number.isFinite(rawDamping) && rawDamping > 0 ? rawDamping : 10;\n const mass = Number.isFinite(rawMass) && rawMass > 0 ? rawMass : 1;\n\n const zeta = damping / (2 * Math.sqrt(stiffness * mass));\n let bezierFallback = typeof spring.bezierFallback === \"string\" && spring.bezierFallback.trim()\n ? spring.bezierFallback.trim()\n : \"cubic-bezier(0.25, 1, 0.5, 1)\";\n if (!spring.bezierFallback) {\n if (zeta < 0.6) {\n bezierFallback = \"cubic-bezier(0.34, 1.7, 0.55, 1)\";\n } else if (zeta < 0.85) {\n bezierFallback = \"cubic-bezier(0.34, 1.35, 0.64, 1)\";\n }\n }\n\n return {\n stiffness,\n damping,\n mass,\n bezierFallback,\n };\n }\n\n return null;\n}\n\n/**\n * Solves the damped harmonic oscillator step response at time t (in seconds).\n * Returns displacement value y(t) transitioning from 0 to 1.\n *\n * @param {number} t - Time in seconds (t >= 0)\n * @param {{ stiffness: number, damping: number, mass: number }} config\n * @returns {number} Value of step response at time t\n */\nexport function solveSpring(t, config) {\n if (t <= 0) return 0;\n\n const k = Math.max(0.001, config?.stiffness || 100);\n const c = Math.max(0.001, config?.damping || 10);\n const m = Math.max(0.001, config?.mass || 1);\n\n const omega0 = Math.sqrt(k / m);\n const zeta = c / (2 * Math.sqrt(k * m));\n\n if (Math.abs(zeta - 1) < 1e-4) {\n // Critically damped: fastest convergence with zero overshoot\n return 1 - Math.exp(-omega0 * t) * (1 + omega0 * t);\n }\n\n if (zeta < 1) {\n // Underdamped: oscillates around target\n const omegaD = omega0 * Math.sqrt(1 - zeta * zeta);\n const envelope = Math.exp(-zeta * omega0 * t);\n const oscillation = Math.cos(omegaD * t) + (zeta / Math.sqrt(1 - zeta * zeta)) * Math.sin(omegaD * t);\n return 1 - envelope * oscillation;\n }\n\n // Overdamped: sluggish convergence without oscillation - stable real roots prevent NaN overflow\n const omegaD = omega0 * Math.sqrt(zeta * zeta - 1);\n const r1 = -zeta * omega0 + omegaD;\n const r2 = -zeta * omega0 - omegaD;\n const c1 = r2 / (r2 - r1);\n const c2 = -r1 / (r2 - r1);\n return 1 - (c1 * Math.exp(r1 * t) + c2 * Math.exp(r2 * t));\n}\n\n/**\n * Calculates the duration (in milliseconds) required for the spring to settle\n * within an acceptable error threshold (default: 0.005 / 0.5%).\n *\n * @param {{ stiffness: number, damping: number, mass: number }} config\n * @param {number} [threshold=0.005]\n * @returns {number} Settling duration in milliseconds\n */\nexport function calculateSpringSettlingDuration(config, threshold = 0.005) {\n if (!config) return 400;\n\n const k = Math.max(0.001, config.stiffness || 100);\n const c = Math.max(0.001, config.damping || 10);\n const m = Math.max(0.001, config.mass || 1);\n\n const omega0 = Math.sqrt(k / m);\n const zeta = c / (2 * Math.sqrt(k * m));\n\n // Search forward up to 3 seconds in 10ms steps\n const maxSeconds = 3.0;\n const step = 0.01;\n let settledTime = maxSeconds;\n\n for (let t = 0.1; t <= maxSeconds; t += step) {\n const val = solveSpring(t, { stiffness: k, damping: c, mass: m });\n if (Math.abs(val - 1) <= threshold) {\n // Check if it stays within threshold for next 100ms\n let staysSettled = true;\n for (let lookahead = t; lookahead <= Math.min(maxSeconds, t + 0.12); lookahead += step) {\n if (Math.abs(solveSpring(lookahead, { stiffness: k, damping: c, mass: m }) - 1) > threshold) {\n staysSettled = false;\n break;\n }\n }\n if (staysSettled) {\n settledTime = t;\n break;\n }\n }\n }\n\n const durationMs = Math.round(settledTime * 1000);\n return Math.max(150, Math.min(2500, durationMs));\n}\n\n/**\n * Generates a modern CSS linear(...) timing function representation of the spring motion.\n * @param {{ stiffness: number, damping: number, mass: number }} config\n * @param {number} [points=32]\n * @returns {string} CSS linear(...) curve string\n */\nexport function generateSpringLinearEasing(config, points = 32) {\n const durationMs = calculateSpringSettlingDuration(config);\n const durationSec = durationMs / 1000;\n const values = [];\n\n for (let i = 0; i <= points; i++) {\n const progress = i / points;\n const t = progress * durationSec;\n const y = solveSpring(t, config);\n // Format to 3 decimal places\n const formattedY = Math.round(y * 1000) / 1000;\n const percent = Math.round(progress * 1000) / 10;\n values.push(`${formattedY} ${percent}%`);\n }\n\n return `linear(${values.join(\", \")})`;\n}\n\n/**\n * Checks if the current browser environment supports the modern CSS linear() easing function.\n * @returns {boolean}\n */\nexport function supportsCSSLinearEasing() {\n if (typeof window === \"undefined\" || typeof CSS === \"undefined\" || typeof CSS.supports !== \"function\") {\n return false;\n }\n try {\n return (\n CSS.supports(\"transition-timing-function\", \"linear(0 0%, 1 100%)\") ||\n CSS.supports(\"transition-timing-function\", \"linear(0, 1)\") ||\n CSS.supports(\"animation-timing-function\", \"linear(0 0%, 1 100%)\")\n );\n } catch {\n return false;\n }\n}\n\n/**\n * Returns comprehensive transition timing, easing, and duration parameters for a toast with spring physics.\n * @param {boolean | SpringPreset | SpringConfig} spring\n * @returns {{ config: { stiffness: number, damping: number, mass: number }, duration: number, easing: string, isSpring: boolean } | null}\n */\nexport function getSpringTransition(spring) {\n const resolved = resolveSpringConfig(spring);\n if (!resolved) return null;\n\n const duration = calculateSpringSettlingDuration(resolved);\n const linearEasing = generateSpringLinearEasing(resolved);\n const isLinearSupported = supportsCSSLinearEasing();\n\n const easing = isLinearSupported ? linearEasing : (resolved.bezierFallback || \"cubic-bezier(0.34, 1.4, 0.64, 1)\");\n\n return {\n config: {\n stiffness: resolved.stiffness,\n damping: resolved.damping,\n mass: resolved.mass,\n },\n duration,\n easing,\n isSpring: true,\n };\n}\n","// src/components/icons.js\nimport { getConfig } from \"../utils/config.js\";\n\nconst svgNS = \"http://www.w3.org/2000/svg\";\n\nconst ALLOWED_SVG_TAGS = new Set([\n \"svg\",\n \"g\",\n \"path\",\n \"circle\",\n \"rect\",\n \"line\",\n \"polyline\",\n \"polygon\",\n \"ellipse\",\n \"title\",\n \"desc\",\n \"defs\",\n \"clippath\",\n \"use\",\n]);\n\nconst ALLOWED_SVG_ATTRS = new Set([\n \"viewbox\",\n \"width\",\n \"height\",\n \"fill\",\n \"stroke\",\n \"stroke-width\",\n \"stroke-linecap\",\n \"stroke-linejoin\",\n \"stroke-miterlimit\",\n \"stroke-dasharray\",\n \"stroke-dashoffset\",\n \"opacity\",\n \"fill-opacity\",\n \"stroke-opacity\",\n \"d\",\n \"cx\",\n \"cy\",\n \"r\",\n \"x\",\n \"y\",\n \"x1\",\n \"y1\",\n \"x2\",\n \"y2\",\n \"points\",\n \"rx\",\n \"ry\",\n \"transform\",\n \"role\",\n \"aria-hidden\",\n \"focusable\",\n \"xmlns\",\n \"preserveaspectratio\",\n \"class\",\n \"id\",\n \"href\",\n \"xlink:href\",\n]);\n\nfunction isUnsafeUrl(value = \"\") {\n return /^\\s*javascript:/i.test(value);\n}\n\nfunction sanitizeInlineSvg(svgText) {\n const parserClass =\n typeof DOMParser !== \"undefined\"\n ? DOMParser\n : typeof window !== \"undefined\" && window.DOMParser\n ? window.DOMParser\n : null;\n\n if (!parserClass) return null;\n try {\n const parser = new parserClass();\n const parsed = parser.parseFromString(svgText, \"image/svg+xml\");\n if (parsed.querySelector(\"parsererror\")) return null;\n const sourceSvg = parsed.documentElement;\n if (!sourceSvg || sourceSvg.tagName.toLowerCase() !== \"svg\") return null;\n\n const copySafeNode = (node) => {\n if (node.nodeType === 3) {\n return document.createTextNode(node.textContent || \"\");\n }\n if (node.nodeType !== 1) return null;\n const tag = node.tagName.toLowerCase();\n if (!ALLOWED_SVG_TAGS.has(tag)) return null;\n\n const safeEl = document.createElementNS(svgNS, tag);\n if (node.attributes) {\n for (let i = 0; i < node.attributes.length; i++) {\n const attr = node.attributes[i];\n const name = attr.name;\n const lowerName = name.toLowerCase();\n const value = attr.value || \"\";\n\n if (lowerName.startsWith(\"on\")) continue;\n if (!ALLOWED_SVG_ATTRS.has(lowerName)) continue;\n if ((lowerName === \"href\" || lowerName === \"xlink:href\")) {\n if (isUnsafeUrl(value)) continue;\n if (tag === \"use\" && value && !value.startsWith(\"#\")) continue;\n }\n safeEl.setAttribute(name, value);\n }\n }\n\n if (node.childNodes) {\n for (let j = 0; j < node.childNodes.length; j++) {\n const safeChild = copySafeNode(node.childNodes[j]);\n if (safeChild) safeEl.appendChild(safeChild);\n }\n }\n return safeEl;\n };\n\n return copySafeNode(sourceSvg);\n } catch {\n return null;\n }\n}\n\n/**\n * Default SVG path data for built-in toast status icons.\n */\nconst ICON_SVGS = {\n success: `\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M20 6L9 17l-5-5\"/>\n </svg>\n `,\n error: `\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/>\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/>\n </svg>\n `,\n warning: `\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/>\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"/>\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"/>\n </svg>\n `,\n info: `\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/>\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/>\n </svg>\n `,\n};\n\n/**\n * Creates an icon element for the toast based on options.icon or options.type.\n * @param {object} options\n * @returns {HTMLElement | null}\n */\nexport function createToastIcon(options = {}) {\n const safeOptions = options && typeof options === \"object\" && !Array.isArray(options) ? options : {};\n let iconOpt = safeOptions.icon;\n if (typeof iconOpt === \"function\") {\n try {\n iconOpt = iconOpt(safeOptions);\n } catch (err) {\n console.warn(\"options.icon callback error:\", err);\n iconOpt = null;\n }\n }\n\n if (iconOpt === false || iconOpt === \"\" || iconOpt === null) return null;\n if (typeof document === \"undefined\") return null;\n\n const type = safeOptions.type;\n const config = getConfig();\n\n const iconTag = document.createElement(\"i\");\n iconTag.className = \"toast-icon\";\n iconTag.setAttribute(\"aria-hidden\", \"true\");\n\n if (!config.disableInlineStyles) {\n Object.assign(iconTag.style, {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: \"0\",\n marginRight: \"8px\",\n lineHeight: \"1\",\n fontStyle: \"normal\",\n });\n }\n\n // 1. Custom DOM node provided (with cross-realm/iframe support)\n if (iconOpt && (typeof iconOpt === \"object\" && (iconOpt.nodeType === 1 || (typeof HTMLElement !== \"undefined\" && iconOpt instanceof HTMLElement)))) {\n if (typeof iconOpt.cloneNode === \"function\") {\n iconTag.appendChild(iconOpt.cloneNode(true));\n return iconTag;\n }\n }\n\n // 2. Custom string: emoji, raw SVG, text, or alias\n if (typeof iconOpt === \"string\" && iconOpt.trim()) {\n const trimmed = iconOpt.trim();\n const aliasMap = {\n check: ICON_SVGS.success,\n checkmark: ICON_SVGS.success,\n success: ICON_SVGS.success,\n cross: ICON_SVGS.error,\n error: ICON_SVGS.error,\n alert: ICON_SVGS.warning,\n warning: ICON_SVGS.warning,\n circle: ICON_SVGS.info,\n info: ICON_SVGS.info,\n };\n const matchedAlias = aliasMap[trimmed.toLowerCase()];\n if (matchedAlias) {\n const safeSvg = sanitizeInlineSvg(matchedAlias.trim());\n if (safeSvg) {\n iconTag.appendChild(safeSvg);\n }\n return iconTag;\n }\n if (trimmed.startsWith(\"<svg\") && trimmed.endsWith(\"</svg>\")) {\n const safeSvg = sanitizeInlineSvg(trimmed);\n if (safeSvg) {\n safeSvg.setAttribute(\"aria-hidden\", \"true\");\n safeSvg.setAttribute(\"focusable\", \"false\");\n if (!safeSvg.getAttribute(\"width\")) safeSvg.setAttribute(\"width\", \"18\");\n if (!safeSvg.getAttribute(\"height\")) safeSvg.setAttribute(\"height\", \"18\");\n iconTag.appendChild(safeSvg);\n } else {\n iconTag.textContent = trimmed;\n }\n } else {\n iconTag.textContent = trimmed;\n }\n return iconTag;\n }\n\n // 3. Built-in type icon (when icon is explicitly true, or type is specified and icon is not false)\n const normalizedType = typeof type === \"string\" ? type.toLowerCase().trim() : \"\";\n if ((iconOpt === true || iconOpt === undefined) && normalizedType && ICON_SVGS[normalizedType]) {\n const safeSvg = sanitizeInlineSvg(ICON_SVGS[normalizedType].trim());\n if (safeSvg) {\n iconTag.appendChild(safeSvg);\n }\n return iconTag;\n }\n\n return null;\n}\n","// src/components/toast-utils.js\n\"use strict\";\n\nimport { parseAnimationDuration } from \"../utils/dom.js\";\nimport { sanitizeHtml } from \"../utils/html-sanitizer.js\";\nimport { createLoader } from \"./loader.js\";\nimport {\n createCTA,\n createUndoAction,\n createCloseButton,\n createProgressBar,\n runToastAnimation,\n attachSwipeToDismiss,\n} from \"./toast-utils-core.js\";\nimport { playTone } from \"../utils/audio.js\";\nimport { getSpringTransition } from \"../utils/spring.js\";\nimport { getConfig } from \"../utils/config.js\";\nimport { createToastIcon } from \"./icons.js\";\n\n/**\n * Applies rich styling and content to a toast element.\n * @param {HTMLElement} toast - The toast container element.\n * @param {object} options - Configuration options for the toast.\n * @param {Function} onClose - Callback invoked when the toast closes.\n */\nfunction getInitialTransform(position, animationType, isSpring) {\n const pos = String(position || \"\").toLowerCase();\n const isTop = pos.includes(\"top\");\n const isLeft = pos.includes(\"left\");\n const isRight = pos.includes(\"right\");\n const anim = String(animationType || \"\").toLowerCase().trim();\n\n if (anim === \"fade\") return \"none\";\n if (anim === \"zoom\" || anim === \"scale\") return \"scale(0.75)\";\n if (anim === \"flip\") return \"perspective(600px) rotateX(45deg)\";\n if (anim === \"slide\") {\n if (isLeft) return \"translateX(-100%)\";\n if (isRight) return \"translateX(100%)\";\n return isTop ? \"translateY(-100%)\" : \"translateY(100%)\";\n }\n\n if (isSpring) {\n if (pos.includes(\"center\") && !isTop && !pos.includes(\"bottom\")) {\n if (isLeft) return \"translateX(-36px) scale(0.92)\";\n if (isRight) return \"translateX(36px) scale(0.92)\";\n return \"scale(0.85)\";\n }\n return isTop ? \"translateY(-36px) scale(0.92)\" : \"translateY(36px) scale(0.92)\";\n }\n\n if (anim === \"bounce\") {\n return isTop ? \"translateY(-36px) scale(0.9)\" : \"translateY(36px) scale(0.9)\";\n }\n\n return isTop ? \"translateY(-20px)\" : \"translateY(20px)\";\n}\n\nexport async function applyRichStyling(toast, options, onClose) {\n const config = getConfig();\n const springTransition = options?.spring ? getSpringTransition(options.spring) : null;\n const durationMs = springTransition\n ? springTransition.duration\n : await parseAnimationDuration(options?.animationDuration);\n const validAnimationDuration = `${durationMs}ms`;\n const easing = springTransition\n ? springTransition.easing\n : typeof options?.animationEasing === \"string\" && options.animationEasing.trim()\n ? options.animationEasing.trim()\n : \"ease\";\n\n if (springTransition) {\n toast._spring = springTransition;\n }\n toast._animationType = options?.animationType;\n\n const customClass = typeof options?.className === \"string\" && options.className.trim()\n ? ` ${options.className.trim()}`\n : \"\";\n toast.className = `toast toast-${options?.type ?? \"info\"}${customClass}`;\n\n const borderRadius =\n typeof options?.borderRadius === \"number\"\n ? `${options.borderRadius}px`\n : options?.borderRadius;\n\n const maxWidth =\n typeof options?.maxWidth === \"number\"\n ? `${options.maxWidth}px`\n : options?.maxWidth;\n\n const opacityDuration = springTransition ? `${Math.min(300, durationMs)}ms` : validAnimationDuration;\n const opacityEasing = springTransition ? \"ease\" : easing;\n\n if (!config.disableInlineStyles) {\n Object.assign(toast.style, {\n background: options?.backgroundColor,\n padding: \"12px 16px\",\n marginBottom: \"10px\",\n borderRadius,\n overflow: \"hidden\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n boxShadow: \"0 4px 6px rgba(0, 0, 0, 0.1)\",\n minWidth: \"250px\",\n maxWidth,\n opacity: \"0\",\n position: \"relative\",\n cursor: \"default\",\n boxSizing: \"border-box\",\n userSelect: \"text\",\n pointerEvents: \"auto\",\n transition: `opacity ${opacityDuration} ${opacityEasing}, transform ${validAnimationDuration} ${easing}`,\n transform: getInitialTransform(options?.position, options?.animationType, !!springTransition),\n zIndex: String(config.zIndex),\n direction:\n options?.fontDirection && options.fontDirection !== \"auto\"\n ? options.fontDirection\n : undefined,\n });\n }\n\n const isError = options?.type === \"error\";\n const role = options?.role || (isError ? \"alert\" : (options?.role ?? \"alert\"));\n const ariaLive = options?.ariaLive || (isError ? \"assertive\" : \"polite\");\n toast.setAttribute(\"role\", role);\n toast.setAttribute(\"aria-live\", ariaLive);\n toast.tabIndex = 0;\n toast._animationDuration = durationMs;\n\n const messageSpan = document.createElement(\"span\");\n messageSpan.className = \"toast-message\";\n toast._messageSpan = messageSpan;\n\n const isTruncate =\n options?.wrapText === \"truncate\" ||\n options?.wrapText === \"ellipsis\" ||\n options?.wrapText === false;\n\n if (isTruncate || !options?.wrapText) {\n messageSpan.classList.add(\"is-truncated\");\n if (!config.disableInlineStyles) {\n Object.assign(messageSpan.style, {\n display: \"-webkit-box\",\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp: \"3\",\n whiteSpace: \"normal\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n });\n }\n } else if (!config.disableInlineStyles) {\n Object.assign(messageSpan.style, {\n display: \"block\",\n whiteSpace: \"normal\",\n });\n }\n\n const fontSize =\n typeof options?.fontSize === \"number\"\n ? `${options.fontSize}px`\n : options?.fontSize;\n\n if (!config.disableInlineStyles) {\n Object.assign(messageSpan.style, {\n flex: \"1\",\n padding: options?.fontPadding,\n fontFamily: options?.fontFamily,\n fontSize,\n fontWeight: options?.fontWeight,\n lineHeight: options?.fontLineHeight,\n color: options?.textColor,\n userSelect: \"text\",\n wordBreak: \"break-word\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n direction:\n options?.fontDirection && options.fontDirection !== \"auto\"\n ? options.fontDirection\n : undefined,\n });\n }\n\n const allowHtml = !!options.allowHtml;\n const rawMessage = options.message ?? \"\";\n\n // Render icon if provided or enabled for type\n const iconEl = createToastIcon(options);\n if (iconEl) {\n toast.appendChild(iconEl);\n }\n\n if (options.loader || options.showLoader) {\n const loaderEl = createLoader(options.loader || {});\n messageSpan.appendChild(loaderEl);\n const spacer = document.createElement(\"span\");\n spacer.className = \"toast-message-spacer\";\n if (!config.disableInlineStyles) {\n spacer.style.display = \"inline-block\";\n spacer.style.width = \"8px\";\n }\n messageSpan.appendChild(spacer);\n }\n\n if (\n allowHtml &&\n typeof rawMessage === \"string\" &&\n rawMessage.trim().length > 0\n ) {\n try {\n const sanitized = sanitizeHtml(rawMessage);\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = sanitized;\n while (tmp.firstChild) {\n messageSpan.appendChild(tmp.firstChild);\n }\n } catch (err) {\n console.warn(\n \"HTML message sanitization failed, falling back to text:\",\n err\n );\n messageSpan.appendChild(document.createTextNode(String(rawMessage)));\n }\n } else {\n messageSpan.appendChild(document.createTextNode(String(rawMessage)));\n }\n\n messageSpan.setAttribute(\"title\", messageSpan.textContent || \"\");\n toast.appendChild(messageSpan);\n\n if (options?.cta && typeof options.cta === \"object\") {\n createCTA(toast, options, onClose);\n }\n\n if (options?.undo) {\n createUndoAction(toast, options, onClose);\n }\n\n if (options?.showCloseButton) {\n createCloseButton(toast, options, onClose);\n }\n\n if (options?.showProgressBar !== false && (options?.showProgressBar || options?.progress !== undefined)) {\n createProgressBar(toast, options);\n }\n\n const shouldSwipe =\n options?.swipeToDismiss !== undefined ? options.swipeToDismiss : config.swipeToDismiss;\n if (shouldSwipe !== false) {\n attachSwipeToDismiss(toast, onClose);\n }\n\n // Play audio chime if enabled (global config + per-toast override)\n const shouldPlaySound = options?.sound !== undefined ? options.sound : config.sound;\n if (shouldPlaySound) {\n const tone = typeof options.sound === \"string\" ? options.sound : options?.type || \"info\";\n const preset = options?.soundPreset || config.soundPreset || \"modern\";\n playTone(tone, preset);\n }\n\n runToastAnimation(toast);\n}\n\n/**\n * Creates an emergency toast as a safe fallback.\n * @param {object} options - Configuration options for the toast.\n * @param {Function} onClose - Callback invoked when the toast closes.\n * @returns {Promise<HTMLElement|null>}\n */\nexport async function createEmergencyToast(options = {}, onClose) {\n try {\n const config = getConfig();\n const emergency = document.createElement(\"div\");\n const position = options?.position || config.defaultPosition;\n const posFlags = String(position).toLowerCase().trim();\n let top = \"auto\", bottom = \"auto\", left = \"auto\", right = \"auto\", transform = \"none\";\n\n if (posFlags.startsWith(\"top\")) top = \"20px\";\n else if (posFlags.startsWith(\"bottom\") || posFlags.includes(\"below\")) bottom = \"20px\";\n\n if (posFlags.startsWith(\"left\")) left = \"20px\";\n else if (posFlags.startsWith(\"right\")) right = \"20px\";\n else if (posFlags === \"center\") {\n left = \"50%\"; top = \"50%\"; transform = \"translate(-50%, -50%)\";\n } else if (posFlags.includes(\"center\")) {\n if (posFlags.includes(\"left\")) { left = \"20px\"; top = \"50%\"; transform = \"translateY(-50%)\"; }\n else if (posFlags.includes(\"right\")) { right = \"20px\"; top = \"50%\"; transform = \"translateY(-50%)\"; }\n else if (posFlags.includes(\"top\")) { top = \"20px\"; left = \"50%\"; transform = \"translateX(-50%)\"; }\n else if (posFlags.includes(\"bottom\")) { bottom = \"20px\"; left = \"50%\"; transform = \"translateX(-50%)\"; }\n } else {\n right = \"20px\"; bottom = \"20px\";\n }\n\n emergency.className = \"toast-emergency\";\n if (!config.disableInlineStyles) {\n Object.assign(emergency.style, {\n background: \"#333\",\n color: \"white\",\n padding: \"10px 15px\",\n position: \"fixed\",\n top,\n bottom,\n left,\n right,\n transform,\n zIndex: String(config.zIndex + 100),\n borderRadius: \"3px\",\n maxWidth: \"250px\",\n wordWrap: \"break-word\",\n boxShadow: \"0 2px 10px rgba(0,0,0,0.3)\",\n });\n }\n\n const innerWrapper = document.createElement(\"div\");\n const msgEl = document.createElement(\"span\");\n msgEl.className = \"toast-emergency-message\";\n if (!config.disableInlineStyles) msgEl.style.display = \"inline-block\";\n if (options.allowHtml) {\n try {\n const sanitized = sanitizeHtml(\n String(options.message || \"Emergency Toast Showing!\")\n );\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = sanitized;\n while (tmp.firstChild) {\n msgEl.appendChild(tmp.firstChild);\n }\n } catch {\n msgEl.appendChild(\n document.createTextNode(\n String(options.message || \"Emergency Toast Showing!\")\n )\n );\n }\n } else {\n msgEl.textContent = String(\n options.message || \"Emergency Toast Creation Showing!\"\n );\n }\n innerWrapper.appendChild(msgEl);\n\n const closeSpan = document.createElement(\"button\");\n closeSpan.type = \"button\";\n closeSpan.className = \"toast-emergency-close\";\n closeSpan.setAttribute(\"aria-label\", \"Close emergency notification\");\n if (!config.disableInlineStyles) {\n Object.assign(closeSpan.style, {\n float: \"right\",\n marginLeft: \"10px\",\n fontWeight: \"bold\",\n cursor: \"pointer\",\n background: \"transparent\",\n border: \"none\",\n color: \"inherit\",\n padding: \"0\",\n font: \"inherit\",\n });\n }\n closeSpan.textContent = \"×\";\n innerWrapper.appendChild(closeSpan);\n\n while (emergency.firstChild) emergency.removeChild(emergency.firstChild);\n emergency.appendChild(innerWrapper);\n\n let timer = null;\n const onClick = () => {\n if (timer) clearTimeout(timer);\n closeSpan.removeEventListener(\"click\", onClick);\n emergency.remove();\n if (typeof onClose === \"function\") onClose(emergency);\n };\n closeSpan.addEventListener(\"click\", onClick);\n\n const duration = Number(options?.duration) || 2500;\n timer = setTimeout(() => {\n closeSpan.removeEventListener(\"click\", onClick);\n emergency.remove();\n if (typeof onClose === \"function\") onClose(emergency);\n }, duration);\n if (typeof timer?.unref === \"function\") timer.unref();\n\n return emergency;\n } catch (error) {\n console.error(\"Emergency toast creation failed:\", error);\n if (typeof onClose === \"function\") onClose(null);\n return null;\n }\n}\n","/**\n * Toast Element Pool Manager\n * Recycles DOM elements for efficient handling of 100+ toasts\n * Prevents memory leaks and performance degradation with large queues\n */\n\n\"use strict\";\n\n/**\n * @typedef {Object} PooledToastElement\n * @property {HTMLElement} element - The reusable toast element\n * @property {boolean} inUse - Whether element is currently allocated\n * @property {string | null} id - Unique toast ID\n */\n\nclass ToastElementPool {\n constructor(initialSize = 5, maxSize = 50) {\n this.initialSize = Math.max(1, Math.floor(initialSize));\n this.maxSize = Math.max(this.initialSize, Math.floor(maxSize));\n /** @type {Array<{element: HTMLElement, inUse: boolean, id: string | null}>} */\n this.pool = [];\n this.inUseCount = 0;\n\n // Pre-allocate initial pool\n for (let i = 0; i < this.initialSize; i++) {\n this.pool.push({\n element: this._createToastElement(),\n inUse: false,\n id: null,\n });\n }\n }\n\n /**\n * Create a new toast element template\n * @private\n * @returns {HTMLElement}\n */\n _createToastElement() {\n if (typeof document === \"undefined\") {\n return {\n className: \"toast\",\n setAttribute() {},\n removeAttribute() {},\n appendChild() {},\n removeChild() {},\n style: {},\n childNodes: [],\n };\n }\n const div = document.createElement('div');\n div.className = 'toast';\n div.setAttribute('role', 'alert');\n div.setAttribute('aria-live', 'polite');\n div.tabIndex = 0;\n return div;\n }\n\n /**\n * Acquire a toast element from pool or create new one\n * @param {string} toastId - Unique identifier for this toast\n * @returns {HTMLElement} - Ready-to-use toast element\n */\n acquire(toastId) {\n if (!toastId || typeof toastId !== 'string') {\n throw new Error('Toast ID required for pool allocation');\n }\n\n // Find available element in pool\n let poolEntry = this.pool.find((entry) => !entry.inUse);\n\n // If no available element, create new one (up to maxSize limit)\n if (!poolEntry && this.pool.length < this.maxSize) {\n poolEntry = {\n element: this._createToastElement(),\n inUse: false,\n id: null,\n };\n this.pool.push(poolEntry);\n }\n\n // If still no available element, recycle the oldest (emergency fallback)\n let isRecycled = false;\n if (!poolEntry) {\n poolEntry = this.pool[0];\n isRecycled = true;\n if (poolEntry.element._cleanupSwipe) poolEntry.element._cleanupSwipe();\n if (poolEntry.element._cleanupCloseButton) poolEntry.element._cleanupCloseButton();\n if (poolEntry.element._cleanupCTA) poolEntry.element._cleanupCTA();\n if (poolEntry.element._cleanupUndo) poolEntry.element._cleanupUndo();\n if (poolEntry.element._pauseCleanup) poolEntry.element._pauseCleanup();\n if (poolEntry.element._cleanup) poolEntry.element._cleanup();\n if (poolEntry.element.parentNode) {\n poolEntry.element.parentNode.removeChild(poolEntry.element);\n }\n poolEntry.element = this._createToastElement();\n }\n\n // Clear element state, styles, and custom properties\n poolEntry.element.innerHTML = '';\n poolEntry.element.className = 'toast';\n poolEntry.element.removeAttribute('style');\n poolEntry.element.setAttribute('role', 'alert');\n poolEntry.element.id = `toast-${toastId}`;\n poolEntry.element._pooledId = toastId;\n delete poolEntry.element._progressAnimation;\n delete poolEntry.element._pauseCleanup;\n delete poolEntry.element._cleanupSwipe;\n delete poolEntry.element._cleanupCloseButton;\n delete poolEntry.element._cleanupCTA;\n delete poolEntry.element._cleanupUndo;\n delete poolEntry.element._key;\n delete poolEntry.element._cleanup;\n\n poolEntry.inUse = true;\n poolEntry.id = toastId;\n if (!isRecycled) {\n this.inUseCount += 1;\n }\n\n return poolEntry.element;\n }\n\n /**\n * Release a toast element back to pool\n * @param {HTMLElement} element - The element to release\n * @param {string} toastId - The toast ID being released\n * @returns {void}\n */\n release(element, toastId) {\n if (!element && !toastId) {\n return;\n }\n\n const targetElement = element instanceof HTMLElement ? element : null;\n const targetId = typeof toastId === \"string\" ? toastId : (typeof element === \"string\" ? element : null);\n\n // Find and release the pooled element\n const poolEntry = this.pool.find(\n (entry) =>\n (targetElement && entry.element === targetElement) ||\n (targetId && entry.id === targetId)\n );\n\n if (poolEntry && poolEntry.inUse) {\n // Remove cleanly from DOM if still attached\n if (poolEntry.element.parentNode) {\n poolEntry.element.parentNode.removeChild(poolEntry.element);\n }\n // Re-create a clean element template to purge all attached listeners/state\n poolEntry.element = this._createToastElement();\n\n // Reset state\n poolEntry.inUse = false;\n poolEntry.id = null;\n this.inUseCount = Math.max(0, this.inUseCount - 1);\n }\n }\n\n /**\n * Get pool statistics for monitoring\n * @returns {{total: number, inUse: number, available: number, utilization: number, maxSize: number}} - Pool stats\n */\n getStats() {\n return {\n total: this.pool.length,\n inUse: this.inUseCount,\n available: this.pool.length - this.inUseCount,\n utilization: this.pool.length > 0 ? (this.inUseCount / this.pool.length) * 100 : 0,\n maxSize: this.maxSize,\n };\n }\n\n /**\n * Clear all pooled elements (for cleanup/testing)\n * @returns {void}\n */\n clear() {\n this.pool.forEach((entry) => {\n if (entry.element.parentNode) {\n entry.element.parentNode.removeChild(entry.element);\n }\n });\n this.pool = [];\n this.inUseCount = 0;\n }\n\n /**\n * Compact pool (remove unused elements above initial size)\n * Useful for long-running apps with temporary toast spikes\n * @returns {void}\n */\n compact() {\n if (this.pool.length > this.initialSize) {\n const available = this.pool.filter((entry) => !entry.inUse);\n const toRemove = Math.max(0, available.length - this.initialSize);\n\n if (toRemove > 0) {\n for (let i = 0; i < toRemove; i++) {\n const idx = this.pool.indexOf(available[i]);\n if (idx > -1) {\n this.pool.splice(idx, 1);\n }\n }\n }\n }\n }\n}\n\n// Singleton instance\nlet poolInstance = null;\n\n/**\n * Get or create the global toast pool instance\n * @param {number} [initialSize=5] - Initial pool size\n * @param {number} [maxSize=50] - Maximum pool size\n * @returns {ToastElementPool}\n */\nexport function getToastPool(initialSize = 5, maxSize = 50) {\n if (!poolInstance) {\n poolInstance = new ToastElementPool(initialSize, maxSize);\n }\n return poolInstance;\n}\n\n/**\n * Reset pool instance (for testing)\n */\nexport function resetToastPool() {\n if (poolInstance) {\n poolInstance.clear();\n poolInstance = null;\n }\n}\n\nexport { ToastElementPool };\n","// src/components/Toast.js //# Single responsibility\n\"use strict\";\n\nimport { createElementWithId } from \"../utils/dom.js\";\nimport { applyRichStyling, createEmergencyToast } from \"./toast-utils.js\";\nimport { getToastPool } from \"../utils/toast-pool.js\";\nimport { generateToastId } from \"../utils/id.js\";\n\n/**\n * Creates a multi-layer toast element with satellite-grade fallbacks\n * @param {Object} options - Toast configuration options\n * @param {Function} onClose - Callback when toast closes\n * @returns {HTMLElement} Toast element\n */\nexport async function createToastElement(options, onClose) {\n let toast;\n const tagName = \"div\";\n const prefix = \"toast\";\n\n // PRIMARY: Full-featured toast\n try {\n if (options?.usePool) {\n const rawId = generateToastId(prefix);\n toast = getToastPool().acquire(rawId);\n toast._pooledId = rawId;\n } else {\n toast = await createElementWithId(tagName, prefix);\n }\n await applyRichStyling(toast, options, onClose);\n return toast;\n } catch (error) {\n if (options?.usePool && toast?._pooledId) {\n try {\n getToastPool().release(toast, toast._pooledId);\n } catch {}\n }\n console.warn(\n \"toast creation failed with error showing fallback one: \",\n error\n );\n // Fallback: create emergency toast\n toast = await createEmergencyToast(options, onClose);\n return toast;\n }\n}\n","// src/utils/containerRegistry.js\n\"use strict\";\n\nimport { getConfig, getToastRoot } from \"./config.js\";\n\nconst containerRegistry = new Map(); // id -> HTMLElement\nconst containerLocks = new Map(); // id -> Promise<HTMLElement>\n\n/**\n * Normalize a position string to a canonical key (id-safe, stable).\n * @param {unknown} position\n * @returns {string}\n */\nexport function normalizePositionKey(position) {\n if (!position || typeof position !== \"string\") return \"bottom-right\";\n const raw = position.toLowerCase().trim();\n if (!raw) return \"bottom-right\";\n const aliased = raw.replace(/\\bbelow\\b/g, \"bottom\");\n return aliased\n .replace(/\\s+/g, \"-\")\n .replace(/[^a-z0-9-]/g, \"-\")\n .replace(/-{2,}/g, \"-\");\n}\n\n/**\n * Canonical container id.\n * @param {unknown} position\n * @returns {string}\n */\nexport function getContainerId(position) {\n const pos = normalizePositionKey(position);\n return `toast-container-${pos}`;\n}\n\nexport function resetContainerRegistry() {\n containerRegistry.clear();\n containerLocks.clear();\n}\n\n/**\n * Remove a container from the registry when pruned from the DOM\n * @param {string} id\n * @returns {void}\n */\nexport function unregisterContainer(idOrPosition) {\n if (!idOrPosition) return;\n const id = typeof idOrPosition === \"string\" && idOrPosition.startsWith(\"toast-container-\")\n ? idOrPosition\n : getContainerId(idOrPosition);\n containerRegistry.delete(id);\n containerLocks.delete(id);\n}\n\nfunction getContainerRoot() {\n return getToastRoot();\n}\n\nfunction findContainerById(root, id) {\n if (!root) return null;\n if (typeof root.getElementById === \"function\") return root.getElementById(id);\n if (typeof root.querySelector === \"function\") return root.querySelector(`#${id}`);\n return null;\n}\n\nfunction isConnectedToRoot(el, root) {\n if (!el || !root) return false;\n if (root === document.body) return el.isConnected && el.ownerDocument === document;\n if (typeof root.contains === \"function\") return root.contains(el);\n return el.isConnected && el.ownerDocument === document;\n}\n\nfunction applyContainerBaseStyles(el) {\n const config = getConfig();\n el.className = \"toast-container-base\";\n if (config.disableInlineStyles) return;\n\n el.style.position = \"fixed\";\n el.style.zIndex = String(config.zIndex);\n el.style.pointerEvents = \"none\";\n el.style.inset = \"auto 10px 10px auto\";\n el.style.display = \"flex\";\n el.style.justifyContent = \"space-between\";\n el.style.alignItems = \"center\";\n el.style.flexDirection = \"column\";\n el.style.overflow = \"hidden\";\n}\n\n/**\n * Atomically get or create a single container per canonical id.\n * @param {object} options\n * @param {(container: HTMLElement, options: object) => Promise<void>} setPosition\n * @returns {Promise<HTMLElement>}\n */\nexport async function getOrCreateToastContainer(options = {}, setPosition) {\n const config = getConfig();\n const id = getContainerId(options?.position || config.defaultPosition);\n const root = getContainerRoot();\n if (!root) throw new Error(\"Toast container root is unavailable\");\n\n if (containerLocks.has(id)) {\n return containerLocks.get(id);\n }\n\n const p = (async () => {\n const cached = containerRegistry.get(id);\n if (isConnectedToRoot(cached, root)) return cached;\n if (cached) containerRegistry.delete(id);\n\n let el = findContainerById(root, id);\n if (!el) {\n const doc = root?.ownerDocument || (typeof document !== \"undefined\" ? document : null);\n if (!doc) throw new Error(\"Document is unavailable\");\n el = doc.createElement(\"div\");\n el.id = id;\n el.setAttribute(\"role\", \"status\");\n el.setAttribute(\"aria-atomic\", \"true\");\n applyContainerBaseStyles(el);\n if (typeof setPosition === \"function\") await setPosition(el, options);\n root.appendChild(el);\n } else {\n applyContainerBaseStyles(el);\n if (typeof setPosition === \"function\") await setPosition(el, options);\n }\n\n if (typeof root.querySelectorAll === \"function\") {\n const all = root.querySelectorAll(`#${id}`);\n if (all.length > 1) {\n for (let i = 1; i < all.length; i++) {\n try {\n all[i].remove();\n } catch {}\n }\n }\n }\n\n containerRegistry.set(id, el);\n return el;\n })();\n\n containerLocks.set(id, p);\n try {\n return await p;\n } finally {\n containerLocks.delete(id);\n }\n}\n","\"use strict\";\n\nimport { getConfig } from \"./config.js\";\n\nconst DOCUMENTED_POSITIONS = new Set([\n \"top-left\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-right\",\n \"top-center\",\n \"bottom-center\",\n \"center-top\",\n \"center-bottom\",\n \"left-center\",\n \"right-center\",\n \"center-left\",\n \"center-right\",\n \"top-full-width\",\n \"bottom-full-width\",\n \"center\",\n]);\n\nconst LEGACY_POSITIONS = new Set([\"top\", \"bottom\"]);\nconst ALL_POSITIONS = [...DOCUMENTED_POSITIONS, ...LEGACY_POSITIONS];\n\nfunction isDocumentedPosition(pos) {\n return DOCUMENTED_POSITIONS.has(pos);\n}\n\nfunction resetPositionClasses(container) {\n if (!container?.classList) return;\n for (let i = 0; i < ALL_POSITIONS.length; i++) {\n container.classList.remove(\"toast-position-\" + ALL_POSITIONS[i]);\n }\n}\n\nexport async function setPosition(container, options = {}) {\n if (!container || !options || typeof options !== \"object\") {\n throw new Error(\"Invalid container or position!\");\n }\n\n const config = getConfig();\n const rawPos = String(options?.position || config.defaultPosition || \"bottom-right\")\n .toLowerCase()\n .trim()\n .replace(/\\s+/g, \"-\");\n let effectivePos = rawPos;\n\n if (!isDocumentedPosition(rawPos) && !LEGACY_POSITIONS.has(rawPos)) {\n console.warn(`Unknown position \"${options.position}\", defaulting to \"bottom-right\"`);\n effectivePos = \"bottom-right\";\n }\n\n resetPositionClasses(container);\n container.classList?.add(\"toast-position-\" + effectivePos);\n\n if (getConfig().disableInlineStyles) {\n return;\n }\n\n resetContainerStyles(container);\n const positionFlags = parsePosition(effectivePos);\n\n if (handleFullWidthPositions(container, positionFlags)) return;\n if (handleCenterPositions(container, positionFlags)) return;\n\n applyStandardPositioning(container, positionFlags);\n}\n\nfunction resetContainerStyles(container) {\n container.style.top = \"auto\";\n container.style.bottom = \"auto\";\n container.style.left = \"auto\";\n container.style.right = \"auto\";\n container.style.transform = \"none\";\n container.style.maxWidth = \"none\";\n}\n\nfunction parsePosition(position) {\n const pos = position.toLowerCase().trim();\n\n const isFullWidth = pos === \"top-full-width\" || pos === \"bottom-full-width\";\n const hasTop = pos.startsWith(\"top\") || pos.endsWith(\"top\");\n const hasBottom = pos.startsWith(\"bottom\") || pos.endsWith(\"bottom\") || pos.includes(\"below\");\n const hasLeft = pos.startsWith(\"left\") || pos.endsWith(\"left\");\n const hasRight = pos.startsWith(\"right\") || pos.endsWith(\"right\");\n const hasCenter = pos.includes(\"center\");\n\n return {\n hasTop,\n hasBottom,\n hasLeft,\n hasRight,\n hasCenter,\n hasFullWidth: isFullWidth,\n };\n}\n\nfunction handleFullWidthPositions(container, flags) {\n if (!flags.hasFullWidth) return false;\n\n container.style.maxWidth = \"100vw\";\n\n if (flags.hasTop) {\n container.style.top = \"10px\";\n container.style.left = \"10px\";\n container.style.right = \"10px\";\n return true;\n }\n\n if (flags.hasBottom) {\n container.style.bottom = \"10px\";\n container.style.left = \"10px\";\n container.style.right = \"10px\";\n return true;\n }\n\n return false;\n}\n\nfunction handleCenterPositions(container, flags) {\n if (!flags.hasCenter) return false;\n\n if (flags.hasTop && !flags.hasLeft && !flags.hasRight) {\n container.style.top = \"10px\";\n container.style.left = \"50%\";\n container.style.transform = \"translateX(-50%)\";\n return true;\n }\n\n if (flags.hasBottom && !flags.hasLeft && !flags.hasRight) {\n container.style.bottom = \"10px\";\n container.style.left = \"50%\";\n container.style.transform = \"translateX(-50%)\";\n return true;\n }\n\n if (flags.hasLeft && !flags.hasTop && !flags.hasBottom) {\n container.style.left = \"10px\";\n container.style.top = \"50%\";\n container.style.transform = \"translateY(-50%)\";\n return true;\n }\n\n if (flags.hasRight && !flags.hasTop && !flags.hasBottom) {\n container.style.right = \"10px\";\n container.style.top = \"50%\";\n container.style.transform = \"translateY(-50%)\";\n return true;\n }\n\n if (!flags.hasLeft && !flags.hasRight && !flags.hasTop && !flags.hasBottom) {\n container.style.top = \"50%\";\n container.style.left = \"50%\";\n container.style.transform = \"translate(-50%, -50%)\";\n return true;\n }\n\n return false;\n}\n\nfunction applyStandardPositioning(container, flags) {\n if (flags.hasBottom) {\n container.style.bottom = \"10px\";\n } else if (flags.hasTop) {\n container.style.top = \"10px\";\n } else {\n container.style.bottom = \"10px\";\n }\n\n if (flags.hasRight) {\n container.style.right = \"10px\";\n } else if (flags.hasLeft) {\n container.style.left = \"10px\";\n } else {\n container.style.left = \"50%\";\n container.style.transform = \"translateX(-50%)\";\n }\n}\n","// src/utils/PausableTimer.js\n\"use strict\";\n\nexport class PausableTimer {\n constructor(callback, delay) {\n this.callback = typeof callback === \"function\" ? callback : () => {};\n const isInfinite = delay === Infinity;\n const safeDelay = Number.isFinite(delay) && delay >= 0 ? delay : (isInfinite ? Infinity : 0);\n this.delay = safeDelay;\n this.remaining = safeDelay;\n this.startTime = null;\n this.timeoutId = null;\n this.isPaused = false;\n this.isCompleted = false;\n this.isInfinite = isInfinite;\n }\n\n start() {\n if (this.isCompleted || this.timeoutId || this.isInfinite) return this;\n this.isPaused = false;\n this.startTime = Date.now();\n this.timeoutId = setTimeout(() => {\n this.isCompleted = true;\n this.timeoutId = null;\n try {\n this.callback();\n } catch (err) {\n console.error(\"PausableTimer callback error:\", err);\n }\n }, this.remaining);\n if (typeof this.timeoutId?.unref === \"function\") {\n this.timeoutId.unref();\n }\n return this;\n }\n\n pause() {\n if (this.isPaused || !this.timeoutId || this.isCompleted) return this;\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n const elapsed = Math.max(0, Date.now() - this.startTime);\n this.remaining = Math.min(this.delay, Math.max(0, this.remaining - elapsed));\n this.isPaused = true;\n return this;\n }\n\n resume() {\n if (!this.isPaused || this.isCompleted) return this;\n this.isPaused = false;\n this.start();\n return this;\n }\n\n clear() {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n this.isCompleted = true;\n return this;\n }\n\n getRemainingTime() {\n if (this.isCompleted) return 0;\n if (this.isPaused) return this.remaining;\n if (!this.timeoutId) return this.delay;\n return Math.max(0, this.remaining - (Date.now() - this.startTime));\n }\n}\n","/**\n * Cross-tab Toast Synchronization Manager\n * Synchronizes toast notifications across multiple tabs of the same application\n * using BroadcastChannel API with graceful fallback\n */\n\n\"use strict\";\n\n/**\n * @typedef {Object} ToastSyncMessage\n * @property {string} type - Message type: 'create', 'update', 'dismiss', 'sync-request', 'sync-response'\n * @property {string} toastId - Unique toast identifier\n * @property {Record<string, unknown>} payload - Message-specific data\n * @property {number} timestamp - Message timestamp\n * @property {string} tabId - Originating tab ID\n */\n\nclass ToastBroadcaster {\n constructor() {\n /** @type {BroadcastChannel | null} */\n this.channel = null;\n this.tabId = this._generateTabId();\n this.isLeadTab = false;\n /** @type {ReturnType<typeof setTimeout> | null} */\n this.leaderTimer = null;\n /** @type {Map<string, Array<(data: Record<string, unknown>) => void>>} */\n this.listeners = new Map();\n this.supportsBroadcastChannel = typeof BroadcastChannel !== 'undefined';\n\n if (this.supportsBroadcastChannel) {\n this._initBroadcastChannel();\n }\n }\n\n /**\n * Generate unique tab identifier with high cross-tab entropy.\n * Unlike DOM element IDs (which rely on monotonic counters within a single thread),\n * tab IDs must guarantee uniqueness across independent browser processes/tabs\n * that do not share memory even if opened in the exact same millisecond.\n *\n * @private\n * @returns {string} Unique tab ID matching /^tab-[a-z0-9]+-[a-z0-9]+$/\n */\n _generateTabId() {\n const timestamp = Date.now().toString(36);\n let entropy = \"\";\n\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n try {\n const buf = new Uint32Array(2);\n crypto.getRandomValues(buf);\n entropy = `${buf[0].toString(36)}${buf[1].toString(36)}`.slice(0, 9);\n } catch {\n // Fallback if environment restricts getRandomValues\n }\n }\n\n if (!entropy) {\n // 53-bit safe integer entropy fallback\n entropy = Math.floor(Math.random() * 0x1fffffffffffff)\n .toString(36)\n .slice(0, 9);\n }\n\n return `tab-${timestamp}-${entropy}`;\n }\n\n /**\n * Initialize BroadcastChannel if available\n * @private\n */\n _initBroadcastChannel() {\n try {\n this.channel = new BroadcastChannel('toast-notifications');\n // Node.js BroadcastChannel keeps the event loop alive unless unref'd\n // (browsers have no unref, hence the optional call). Without this,\n // test runners and CLI scripts using this module never exit.\n this.channel.unref?.();\n this.channel.onmessage = (event) => this._handleMessage(event.data);\n\n // Become leader if no leader exists\n this._becomeLeadIfNeeded();\n } catch (error) {\n console.warn('[Toast] BroadcastChannel initialization failed:', error);\n this.supportsBroadcastChannel = false;\n }\n }\n\n /**\n * Attempt to become the lead tab\n * @private\n */\n _becomeLeadIfNeeded() {\n if (!this.channel) return;\n\n // Request sync from existing leader\n this.broadcast('sync-request', '', {});\n\n // If no response within 1 second, become leader\n this.leaderTimer = setTimeout(() => {\n this.leaderTimer = null;\n if (!this.isLeadTab) {\n this.isLeadTab = true;\n this.broadcast('leader-elected', '', { tabId: this.tabId });\n }\n }, 1000);\n // Same Node event-loop-hang concern as the channel above.\n this.leaderTimer.unref?.();\n }\n\n /**\n * Broadcast a toast event to other tabs\n * @param {string} type - Event type\n * @param {string} [toastId=''] - Toast ID\n * @param {Record<string, unknown>} [payload={}] - Event payload\n */\n broadcast(type, toastId = '', payload = {}) {\n if (!this.supportsBroadcastChannel || !this.channel) {\n return;\n }\n\n let actualToastId = toastId;\n let actualPayload = payload;\n\n // Gracefully handle if caller passed (type, payload) omitting toastId\n if (typeof toastId === 'object' && toastId !== null && Object.keys(payload).length === 0) {\n actualPayload = toastId;\n actualToastId = '';\n }\n\n const message = {\n type,\n toastId: typeof actualToastId === 'string' ? actualToastId : String(actualToastId ?? ''),\n payload: (actualPayload && typeof actualPayload === 'object') ? actualPayload : {},\n timestamp: Date.now(),\n tabId: this.tabId,\n };\n\n try {\n this.channel.postMessage(message);\n } catch (error) {\n console.warn('[Toast] Failed to broadcast message:', error);\n }\n }\n\n /**\n * Handle incoming message from other tab\n * @private\n * @param {ToastSyncMessage} message\n */\n _handleMessage(message) {\n if (!message || message.tabId === this.tabId) {\n return; // Ignore own messages\n }\n\n const { type, toastId, payload } = message;\n\n // Handle leader election: cancel pending election timer if another tab is already leader\n if (type === 'leader-elected') {\n if (this.leaderTimer) {\n clearTimeout(this.leaderTimer);\n this.leaderTimer = null;\n }\n this.isLeadTab = false;\n return;\n }\n\n if (type === 'sync-response' && this.leaderTimer) {\n clearTimeout(this.leaderTimer);\n this.leaderTimer = null;\n }\n\n // Handle sync requests\n if (type === 'sync-request' && this.isLeadTab) {\n this.broadcast('sync-response', 'all-toasts', {\n active: Array.from(this._getActiveToasts?.() || []),\n queue: this._getQueuedToasts?.() || [],\n });\n return;\n }\n\n // Trigger registered listeners\n const listeners = this.listeners.get(type) || [];\n listeners.forEach((callback) => {\n try {\n callback({ toastId, payload, message });\n } catch (error) {\n console.warn(`[Toast] Listener error for ${type}:`, error);\n }\n });\n }\n\n /**\n * Register listener for toast events\n * @param {string} type - Event type to listen for\n * @param {Function} callback - Callback function\n * @returns {Function} - Unsubscribe function\n */\n on(type, callback) {\n if (typeof callback !== 'function') {\n throw new Error('Callback must be a function');\n }\n\n if (!this.listeners.has(type)) {\n this.listeners.set(type, []);\n }\n\n this.listeners.get(type).push(callback);\n\n // Return unsubscribe function\n return () => {\n const listeners = this.listeners.get(type) || [];\n const index = listeners.indexOf(callback);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n };\n }\n\n /**\n * Register active toasts getter (set by ToastManager)\n * @param {Function} getter\n */\n registerActiveToastsGetter(getter) {\n this._getActiveToasts = getter;\n }\n\n /**\n * Register queued toasts getter (set by ToastManager)\n * @param {Function} getter\n */\n registerQueuedToastsGetter(getter) {\n this._getQueuedToasts = getter;\n }\n\n /**\n * Check if cross-tab sync is supported\n * @returns {boolean}\n */\n isSupported() {\n return this.supportsBroadcastChannel;\n }\n\n /**\n * Get current tab ID\n * @returns {string}\n */\n getTabId() {\n return this.tabId;\n }\n\n /**\n * Is this the lead tab\n * @returns {boolean}\n */\n isLeadingTab() {\n return this.isLeadTab;\n }\n\n /**\n * Cleanup on unload\n */\n destroy() {\n if (this.leaderTimer) {\n clearTimeout(this.leaderTimer);\n this.leaderTimer = null;\n }\n if (this.channel) {\n try {\n this.channel.close();\n } catch (error) {\n console.warn('[Toast] Failed to close BroadcastChannel:', error);\n }\n }\n this.listeners.clear();\n this.channel = null;\n }\n}\n\n// Singleton instance\nlet broadcasterInstance = null;\n\n/**\n * Get or create the global broadcaster instance\n * @returns {ToastBroadcaster}\n */\nexport function getToastBroadcaster() {\n if (!broadcasterInstance) {\n broadcasterInstance = new ToastBroadcaster();\n\n // Cleanup on page hide/unload without breaking BFCache\n if (typeof window !== 'undefined') {\n const cleanup = () => {\n broadcasterInstance?.destroy();\n broadcasterInstance = null;\n };\n window.addEventListener('pagehide', cleanup);\n window.addEventListener('beforeunload', cleanup);\n }\n }\n return broadcasterInstance;\n}\n\n/**\n * Reset broadcaster instance (for testing)\n */\nexport function resetToastBroadcaster() {\n if (broadcasterInstance) {\n broadcasterInstance.destroy();\n broadcasterInstance = null;\n }\n}\n\nexport { ToastBroadcaster };\n","/**\n * AI Priority Routing for Toast Notifications\n * Uses content analysis to intelligently prioritize toast queue\n *\n * Scorers evaluate toasts and assign priority scores (0-100)\n * Higher scores = higher priority (show sooner)\n * Zero-dependency, TypeSafe AI compatible\n */\n\n\"use strict\";\n\n/**\n * @typedef {Object} ToastScoringContext\n * @property {string} type - Toast type (success, error, warning, info)\n * @property {string} message - Toast message content\n * @property {number} duration - Duration in milliseconds\n * @property {Record<string, unknown>} options - Full toast options\n */\n\n/**\n * @typedef {Object} ScorerResult\n * @property {number} score - Priority score (0-100)\n * @property {Record<string, number>} breakdown - Score breakdown by factor\n * @property {string[]} keywords - Detected keywords affecting score\n */\n\n/**\n * Base priority scores by toast type\n */\nconst TYPE_PRIORITY = {\n error: 85,\n warning: 70,\n info: 40,\n success: 30,\n};\n\n/**\n * High-priority urgency keywords\n */\nconst URGENCY_KEYWORDS = [\n // Critical/severe\n 'error', 'critical', 'severe', 'emergency', 'failure', 'fatal', 'crash',\n 'urgent', 'important', 'attention', 'immediate', 'now', 'fast',\n 'deadline', 'due', 'timeout', 'expired', 'overdue',\n 'security', 'breach', 'attack', 'unauthorized', 'hack',\n 'lost', 'missing', 'offline', 'down', 'unavailable',\n\n // Business impact\n 'outage', 'downtime', 'broken', 'malfunction', 'defect', 'bug',\n 'data loss', 'corruption', 'invalid', 'wrong', 'incorrect',\n 'blocked', 'stopped', 'halted', 'paused', 'interrupted',\n 'exceeded', 'limit', 'quota', 'full', 'capacity',\n\n // User impact\n 'cannot', 'unable', 'failed', 'rejected', 'denied', 'blocked',\n 'invalid', 'expired', 'credentials', 'password', 'auth',\n 'payment', 'billing', 'charge', 'transaction', 'money',\n 'account', 'profile', 'settings', 'preferences',\n];\n\n/**\n * Neutral/Low priority keywords (demote score)\n */\nconst LOW_PRIORITY_KEYWORDS = [\n // Routine/informational\n 'success', 'completed', 'finished', 'done', 'ready',\n 'info', 'information', 'note', 'notice', 'reminder',\n 'progress', 'processing', 'loading', 'saving', 'uploading',\n 'test', 'demo', 'sample', 'example', 'placeholder',\n 'updated', 'changed', 'modified', 'edited', 'created',\n 'connected', 'disconnected', 'online', 'offline',\n];\n\n/**\n * Calculate priority score for toast based on type, message, and context\n * @param {ToastScoringContext} context\n * @returns {ScorerResult}\n */\nexport function calculateToastPriority(context) {\n if (!context || typeof context !== 'object') {\n return { score: 50, breakdown: { base: 50 }, keywords: [] };\n }\n\n const { type, message, duration } = context;\n const breakdown = {};\n const detectedKeywords = [];\n let score = 50; // Neutral base\n\n // Factor 1: Type priority\n const typeScore = TYPE_PRIORITY[type] || 50;\n breakdown.type = typeScore;\n score += (typeScore - 50) * 0.6; // Weight type moderately\n\n // Factor 2: Message urgency\n const safeMessage = typeof message === 'string' ? message : String(message ?? '');\n const messageLower = safeMessage.toLowerCase();\n let urgencyScore = 0;\n\n // Precompile regexes with word boundaries to prevent substring collisions (e.g. 'debug' matching 'bug', 'download' matching 'down')\n for (const keyword of URGENCY_KEYWORDS) {\n const escaped = keyword.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regex = new RegExp(`\\\\b${escaped}\\\\b`, 'i');\n if (regex.test(safeMessage)) {\n detectedKeywords.push(keyword);\n urgencyScore += 2; // +2 points per urgency keyword\n }\n }\n\n for (const keyword of LOW_PRIORITY_KEYWORDS) {\n const escaped = keyword.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regex = new RegExp(`\\\\b${escaped}\\\\b`, 'i');\n if (regex.test(safeMessage)) {\n detectedKeywords.push(keyword);\n urgencyScore -= 1; // -1 point per low-priority keyword\n }\n }\n\n breakdown.urgency = Math.min(Math.max(urgencyScore, -10), 20); // Cap -10 to +20\n score += breakdown.urgency;\n\n // Factor 3: Duration (shorter or persistent manual = higher priority)\n if (duration === Infinity || duration === 0) {\n breakdown.duration = 30; // Maximum priority for persistent alerts\n score += 15;\n } else if (typeof duration === 'number' && Number.isFinite(duration) && duration > 0) {\n const durationScore = Math.max(0, 30 - (duration / 1000)); // 0-30 range based on seconds\n breakdown.duration = Math.round(durationScore);\n score += durationScore * 0.5; // Weight duration lightly\n }\n\n // Factor 4: Message length (brief = higher priority)\n const messageLength = messageLower.length;\n if (messageLength > 0) {\n const lengthPenalty = Math.min(10, Math.floor(messageLength / 50)); // Penalty for long messages\n breakdown.length = -lengthPenalty;\n score -= lengthPenalty;\n }\n\n // Factor 5: Exclamation marks (indicates emphasis)\n const exclamationCount = (safeMessage.match(/!/g) || []).length;\n const exclamationScore = Math.min(5, exclamationCount); // Up to +5\n breakdown.emphasis = exclamationScore;\n score += exclamationScore;\n\n // Factor 6: ALL CAPS words (indicates shouting/urgency)\n const allCapsWords = (safeMessage.match(/\\b[A-Z]{3,}\\b/g) || []).length;\n const capsScore = Math.min(5, allCapsWords); // Up to +5\n breakdown.caps = capsScore;\n score += capsScore;\n\n // Clamp score to 0-100 range\n score = Math.max(0, Math.min(100, Math.round(score)));\n\n return {\n score,\n breakdown,\n keywords: [...new Set(detectedKeywords)], // Deduplicate\n };\n}\n\n/**\n * Extract semantic category from toast message\n * @param {string} message\n * @returns {string[]} - Categories (security, performance, user, system, etc.)\n */\nexport function categorizeToast(message) {\n if (!message || typeof message !== 'string') return ['unknown'];\n\n const msgLower = message.toLowerCase();\n const categories = [];\n\n // Security-related\n if (/\\b(security|auth|password|unauthorized|breach|hack)\\b/i.test(msgLower)) {\n categories.push('security');\n }\n\n // Performance-related\n if (/\\b(performance|slow|timeout|load|latency|responsive)\\b/i.test(msgLower)) {\n categories.push('performance');\n }\n\n // User-related\n if (/\\b(user|profile|account|preferences|settings|avatar)\\b/i.test(msgLower)) {\n categories.push('user');\n }\n\n // System-related\n if (/\\b(system|server|database|network|connection|backend)\\b/i.test(msgLower)) {\n categories.push('system');\n }\n\n // Business-related\n if (/\\b(payment|transaction|billing|charge|order|cart)\\b/i.test(msgLower)) {\n categories.push('business');\n }\n\n // UI/UX related\n if (/\\b(ui|interface|click|scroll|mobile)\\b/i.test(msgLower)) {\n categories.push('ui');\n }\n\n // Fallback to 'general' if no specific category\n if (categories.length === 0) {\n categories.push('general');\n }\n\n return categories;\n}\n\n/**\n * Computes deterministic AI priority boost without non-deterministic random numbers.\n * Strictly offline-first, reproducible, and compliant with core library purity.\n * @param {ToastScoringContext} context\n * @param {ScorerResult} localScore\n * @returns {number} Boost between 5 and 15 points\n */\nexport function calculateDeterministicAIBoost(context, localScore) {\n let boost = 5; // Base deterministic boost when AI prioritization is active\n\n const safeMsg = String(context?.message ?? \"\").toLowerCase();\n const categories = categorizeToast(safeMsg);\n\n // 1. High-Impact Domain Boost: Security or business/payment issues\n if (categories.includes(\"security\") || categories.includes(\"business\")) {\n boost += 4;\n }\n\n // 2. Actionability Boost: When toast contains interactive CTA button (action required)\n if (context?.options?.cta || context?.options?.action) {\n boost += 3;\n }\n\n // 3. High Urgency Density: When 2 or more critical urgency keywords match\n if (Array.isArray(localScore?.keywords) && localScore.keywords.length >= 2) {\n boost += 3;\n }\n\n return Math.min(15, boost);\n}\n\n/**\n * TypeSafe AI integration: Enhanced scoring with deterministic rule-based boost\n * and customScorer hook support for user application models.\n * @param {ToastScoringContext} context\n * @param {Object} [aiOptions={}] - TypeSafe AI options\n * @returns {Promise<ScorerResult>}\n */\nexport async function scoreWithTypeSafeAI(context, aiOptions = {}) {\n const { useAI = false, apiKey, customScorer } = aiOptions;\n\n if (typeof customScorer === \"function\") {\n try {\n const customRes = await customScorer(context);\n if (typeof customRes === \"number\" && Number.isFinite(customRes)) {\n const clamped = Math.max(0, Math.min(100, Math.round(customRes)));\n return {\n score: clamped,\n breakdown: { custom: clamped },\n keywords: [],\n aiEnhanced: true,\n };\n } else if (customRes && typeof customRes === \"object\") {\n return {\n score: Math.max(0, Math.min(100, Math.round(customRes.score ?? 50))),\n breakdown: customRes.breakdown || {},\n keywords: Array.isArray(customRes.keywords) ? customRes.keywords : [],\n aiEnhanced: true,\n };\n }\n } catch (customErr) {\n console.warn(\"[Toast] Custom priority scorer threw error:\", customErr);\n }\n }\n\n if (!useAI && !apiKey) {\n // Fallback to local scoring if AI not configured\n return calculateToastPriority(context);\n }\n\n try {\n const localScore = calculateToastPriority(context);\n const aiBoost = calculateDeterministicAIBoost(context, localScore);\n\n return {\n score: Math.min(100, localScore.score + aiBoost),\n breakdown: {\n ...localScore.breakdown,\n aiBoost,\n },\n keywords: localScore.keywords,\n aiEnhanced: true,\n };\n } catch (error) {\n console.warn(\"[Toast] AI scoring failed, falling back to local:\", error);\n return calculateToastPriority(context);\n }\n}\n\n/**\n * Sort toast queue by priority score\n * @param {Array} queue - Toast queue items\n * @param {Object} [options={}] - Scoring options\n * @returns {Array} - Sorted queue (highest priority first)\n */\nexport function prioritizeQueue(queue, options = {}) {\n if (!Array.isArray(queue) || queue.length <= 1) {\n return Array.isArray(queue) ? queue : [];\n }\n\n const { useAI = false, aiApiKey, customScorer } = options;\n\n // Score each item in queue\n const scoredQueue = queue.map((item, index) => {\n const context = {\n type: item?.options?.type || \"info\",\n message: item?.options?.message || \"\",\n duration: item?.options?.duration,\n options: item?.options,\n queuePosition: index,\n };\n\n let scoreResult;\n if (typeof customScorer === \"function\") {\n try {\n const customVal = customScorer(context);\n const numVal = typeof customVal === \"number\" ? customVal : (customVal?.score ?? 50);\n scoreResult = {\n score: Math.max(0, Math.min(100, Math.round(numVal))),\n breakdown: { custom: numVal },\n keywords: [],\n };\n } catch {\n scoreResult = calculateToastPriority(context);\n }\n } else if (useAI || aiApiKey) {\n const base = calculateToastPriority(context);\n const boost = calculateDeterministicAIBoost(context, base);\n scoreResult = {\n score: Math.min(100, base.score + boost),\n breakdown: { ...base.breakdown, aiBoost: boost },\n keywords: base.keywords,\n };\n } else {\n scoreResult = calculateToastPriority(context);\n }\n\n return {\n ...item,\n _priority: {\n score: scoreResult.score,\n breakdown: scoreResult.breakdown,\n keywords: scoreResult.keywords,\n },\n };\n });\n\n // Sort by priority score (descending)\n return scoredQueue.sort((a, b) => {\n return (b?._priority?.score ?? 0) - (a?._priority?.score ?? 0);\n });\n}\n\n/**\n * Create a priority-based queue manager\n * @param {Object} config - Manager configuration\n * @returns {Object} - Queue manager instance\n */\nexport function createPriorityQueueManager(config = {}) {\n const {\n useAI = false,\n aiApiKey = null,\n minScoreThreshold = 20,\n enableAutoPrioritization = true,\n } = config;\n\n const state = {\n useAI,\n aiApiKey,\n minScoreThreshold,\n enableAutoPrioritization,\n scoringHistory: [],\n };\n\n return {\n /**\n * Add item to queue with priority scoring\n * @param {Object} item - Queue item\n * @param {Array} queue - Current queue\n * @returns {Array} - Updated queue\n */\n addWithPriority(item, queue = []) {\n if (!enableAutoPrioritization) {\n return [...queue, item];\n }\n\n const context = {\n type: item.options?.type || 'info',\n message: item.options?.message || '',\n duration: item.options?.duration,\n options: item.options,\n };\n\n const scoreResult = useAI && aiApiKey\n ? calculateToastPriority(context) // In production: await scoreWithTypeSafeAI(context, { useAI, apiKey: aiApiKey })\n : calculateToastPriority(context);\n\n const scoredItem = {\n ...item,\n _priority: {\n score: scoreResult.score,\n breakdown: scoreResult.breakdown,\n keywords: scoreResult.keywords,\n timestamp: Date.now(),\n },\n };\n\n // Add to scoring history\n state.scoringHistory.push({\n item: { key: item.key, type: context.type },\n score: scoreResult.score,\n timestamp: Date.now(),\n });\n\n // Keep history limited\n if (state.scoringHistory.length > 100) {\n state.scoringHistory.shift();\n }\n\n // Filter out low priority items if below threshold\n if (scoreResult.score < minScoreThreshold) {\n console.debug('[Toast] Low priority item skipped:', {\n key: item.key,\n score: scoreResult.score,\n threshold: minScoreThreshold,\n });\n return queue; // Skip adding to queue\n }\n\n // Insert into sorted position\n const newQueue = [...queue, scoredItem];\n return prioritizeQueue(newQueue, { useAI, aiApiKey });\n },\n\n /**\n * Get priority statistics\n * @returns {Object} - Stats about queue priority\n */\n getStats() {\n const recentScores = state.scoringHistory.slice(-10);\n const avgScore = recentScores.length > 0\n ? recentScores.reduce((sum, item) => sum + item.score, 0) / recentScores.length\n : 0;\n\n return {\n totalScored: state.scoringHistory.length,\n averageScore: Math.round(avgScore),\n recentScores: recentScores.map(s => s.score),\n config: {\n useAI,\n minScoreThreshold,\n enableAutoPrioritization,\n },\n };\n },\n\n /**\n * Update configuration\n * @param {Object} newConfig - New configuration\n */\n updateConfig(newConfig) {\n Object.assign(state, newConfig);\n },\n\n /**\n * Get current configuration\n * @returns {Object} - Current configuration\n */\n getConfig() {\n return { ...state, scoringHistory: [] }; // Don't expose full history\n },\n\n /**\n * Reset manager state\n */\n reset() {\n state.scoringHistory = [];\n },\n };\n}\n\n// Default export for convenience\nexport default {\n calculateToastPriority,\n categorizeToast,\n scoreWithTypeSafeAI,\n prioritizeQueue,\n createPriorityQueueManager,\n};\n","/**\n * Multi-touch Gesture Detection Utilities\n * Handles flick, pinch, and advanced touch gestures for mobile toasts\n */\n\n\"use strict\";\n\n/**\n * @typedef {Object} TouchPoint\n * @property {number} x - X coordinate\n * @property {number} y - Y coordinate\n * @property {number} id - Touch identifier\n * @property {number} time - Timestamp\n */\n\n/**\n * @typedef {Object} GestureState\n * @property {TouchPoint[]} touches - Current touch points\n * @property {TouchPoint[]} startTouches - Initial touch points\n * @property {number} startTime - Gesture start time\n * @property {number} startDistance - Initial distance between touches (for pinch)\n * @property {number} currentDistance - Current distance between touches\n */\n\n/**\n * @typedef {Object} PinchResult\n * @property {boolean} isPinch\n * @property {number} scale\n * @property {'none' | 'in' | 'out'} direction\n * @property {number} [distanceChange]\n */\n\n/**\n * @typedef {Object} SwipeResult\n * @property {number} distance\n * @property {number} velocity\n * @property {'none' | 'left' | 'right'} direction\n * @property {number} duration\n */\n\n/**\n * @typedef {Object} SnapBackResult\n * @property {number} targetOffset\n * @property {number} duration\n * @property {string} easing\n */\n\n/**\n * @typedef {Object} GestureDetectorOptions\n * @property {((swipe: SwipeResult) => void)} [onFlick]\n * @property {((pinch: PinchResult) => void)} [onPinch]\n * @property {((swipe: SwipeResult) => void)} [onSwipe]\n * @property {number} [flickVelocityThreshold]\n * @property {number} [swipeVelocityThreshold]\n * @property {number} [swipeDistanceThreshold]\n * @property {number} [pinchSensitivity]\n */\n\n/**\n * @typedef {Object} GestureDetector\n * @property {() => void} attach\n * @property {() => void} detach\n * @property {() => GestureState | null} getState\n */\n\n/**\n * Calculate distance between two touch points\n * @param {TouchPoint} p1\n * @param {TouchPoint} p2\n * @returns {number}\n */\nexport function calculateDistance(p1, p2) {\n if (!p1 || !p2 || typeof p1.x !== 'number' || typeof p2.x !== 'number' || typeof p1.y !== 'number' || typeof p2.y !== 'number') {\n return 0;\n }\n const dx = p2.x - p1.x;\n const dy = p2.y - p1.y;\n return Math.sqrt(dx * dx + dy * dy);\n}\n\n/**\n * Calculate velocity of a swipe gesture\n * @param {number} distance - Distance traveled in pixels\n * @param {number} duration - Duration in milliseconds\n * @returns {number} - Velocity in pixels/millisecond\n */\nexport function calculateVelocity(distance, duration) {\n const d = Number(distance);\n const dur = Number(duration);\n if (!Number.isFinite(d) || !Number.isFinite(dur) || dur < 0) return 0;\n if (dur === 0) return d === 0 ? 0 : Infinity;\n return Math.abs(d) / dur;\n}\n\n/**\n * Detect if gesture is a flick (fast swipe with high velocity)\n * @param {number} velocity - Gesture velocity (px/ms)\n * @param {number} distance - Distance traveled (px)\n * @param {number} [velocityThreshold=0.5] - Minimum velocity for flick (default 0.5 px/ms)\n * @param {number} [distanceThreshold=50] - Minimum distance for flick (default 50px)\n * @returns {boolean}\n */\nexport function isFlick(velocity, distance, velocityThreshold = 0.5, distanceThreshold = 50) {\n const v = Number(velocity);\n const d = Number(distance);\n if (!Number.isFinite(v) || !Number.isFinite(d)) return false;\n return v >= velocityThreshold && Math.abs(d) >= distanceThreshold;\n}\n\n/**\n * Extract touch points from touch event\n * @param {TouchEvent} event\n * @returns {TouchPoint[]}\n */\nexport function getTouchPoints(event) {\n const touches = [];\n\n if (event.touches && event.touches.length > 0) {\n for (let i = 0; i < event.touches.length; i++) {\n const touch = event.touches[i];\n touches.push({\n x: touch.clientX,\n y: touch.clientY,\n id: touch.identifier,\n time: Date.now(),\n });\n }\n } else if (event.changedTouches && event.changedTouches.length > 0) {\n for (let i = 0; i < event.changedTouches.length; i++) {\n const touch = event.changedTouches[i];\n touches.push({\n x: touch.clientX,\n y: touch.clientY,\n id: touch.identifier,\n time: Date.now(),\n });\n }\n }\n\n return touches;\n}\n\n/**\n * Initialize gesture state from touch event\n * @param {TouchEvent} event\n * @returns {GestureState}\n */\nexport function initializeGestureState(event) {\n const touches = getTouchPoints(event);\n\n const state = {\n touches,\n startTouches: touches.map((t) => ({ ...t })),\n startTime: Date.now(),\n startDistance: touches.length >= 2 ? calculateDistance(touches[0], touches[1]) : 0,\n currentDistance: touches.length >= 2 ? calculateDistance(touches[0], touches[1]) : 0,\n };\n\n return state;\n}\n\n/**\n * Update gesture state with current touch event\n * @param {GestureState} state\n * @param {TouchEvent} event\n * @returns {GestureState}\n */\nexport function updateGestureState(state, event) {\n const touches = getTouchPoints(event);\n\n return {\n ...state,\n touches,\n currentDistance: touches.length >= 2 ? calculateDistance(touches[0], touches[1]) : state.currentDistance,\n };\n}\n\n/**\n * Detect pinch gesture (two-finger distance change)\n * @param {GestureState} state\n * @param {number} [sensitivityThreshold=20] - Minimum distance change for pinch (default 20px)\n * @returns {PinchResult} - Pinch info { isPinch, scale, direction, distanceChange }\n */\nexport function detectPinch(state, sensitivityThreshold = 20) {\n if (state.startDistance === 0 || state.currentDistance === 0) {\n return { isPinch: false, scale: 1, direction: 'none' };\n }\n\n const distanceChange = state.currentDistance - state.startDistance;\n const isPinch = Math.abs(distanceChange) >= sensitivityThreshold;\n\n const scale = state.currentDistance / state.startDistance;\n const direction = distanceChange > 0 ? 'out' : 'in'; // out = zoom out, in = zoom in\n\n return { isPinch, scale, direction, distanceChange };\n}\n\n/**\n * Calculate horizontal swipe information\n * @param {GestureState} state\n * @returns {SwipeResult} - Swipe info { distance, velocity, direction, duration }\n */\nexport function calculateSwipe(state) {\n if (state.startTouches.length === 0 || state.touches.length === 0) {\n return { distance: 0, velocity: 0, direction: 'none', duration: 0 };\n }\n\n const startTouch = state.startTouches[0];\n const currentTouch = state.touches.find((t) => t.id === startTouch.id) || state.touches[0];\n\n const distance = currentTouch.x - startTouch.x;\n const duration = Date.now() - state.startTime;\n const velocity = calculateVelocity(distance, duration);\n const direction = distance > 0 ? 'right' : 'left';\n\n return { distance, velocity, direction, duration };\n}\n\n/**\n * Detect if swipe should dismiss (high velocity or large distance)\n * @param {SwipeResult} swipe - Swipe info from calculateSwipe\n * @param {number} [velocityThreshold=0.3] - Velocity threshold (default 0.3 px/ms)\n * @param {number} [distanceThreshold=50] - Distance threshold (default 50px or 50% of width)\n * @returns {boolean}\n */\nexport function shouldDismissOnSwipe(swipe, velocityThreshold = 0.3, distanceThreshold = 50) {\n return swipe.velocity >= velocityThreshold || Math.abs(swipe.distance) >= distanceThreshold;\n}\n\n/**\n * Calculate snap-back animation values\n * @param {number} currentOffset - Current offset in pixels\n * @param {number} [containerWidth=400] - Width of container in pixels\n * @returns {SnapBackResult} - Animation { targetOffset, duration, easing }\n */\nexport function calculateSnapBack(currentOffset, containerWidth = 400) {\n const targetOffset = 0;\n const distance = Math.abs(currentOffset - targetOffset);\n\n // Duration based on distance (faster for shorter distances)\n const baseDuration = 150;\n const maxDuration = 400;\n const duration = Math.min(baseDuration + distance / 2, maxDuration);\n\n return {\n targetOffset,\n duration,\n easing: 'cubic-bezier(0.34, 1.56, 0.64, 1)', // Spring-like easing\n };\n}\n\n/**\n * Create gesture detector function for element\n * @param {HTMLElement} element\n * @param {GestureDetectorOptions} [options]\n * @returns {GestureDetector} - Detector with attach/detach methods\n */\nexport function createGestureDetector(element, options = {}) {\n const {\n onFlick,\n onPinch,\n onSwipe,\n flickVelocityThreshold = 0.5,\n swipeVelocityThreshold = 0.3,\n swipeDistanceThreshold = 50,\n pinchSensitivity = 20,\n } = options;\n\n let gestureState = null;\n let isTracking = false;\n\n const handlers = {\n onTouchStart: (e) => {\n isTracking = true;\n gestureState = initializeGestureState(e);\n },\n\n onTouchMove: (e) => {\n if (!isTracking || !gestureState) return;\n gestureState = updateGestureState(gestureState, e);\n },\n\n onTouchEnd: (e) => {\n if (!isTracking || !gestureState) return;\n isTracking = false;\n\n // Detect pinch\n const pinch = detectPinch(gestureState, pinchSensitivity);\n if (pinch.isPinch && typeof onPinch === 'function') {\n onPinch(pinch);\n }\n\n // Detect swipe/flick\n const swipe = calculateSwipe(gestureState);\n\n const isFlickGesture = isFlick(swipe.velocity, swipe.distance, flickVelocityThreshold, 30);\n if (isFlickGesture && typeof onFlick === 'function') {\n onFlick(swipe);\n }\n\n const shouldDismiss = shouldDismissOnSwipe(swipe, swipeVelocityThreshold, swipeDistanceThreshold);\n if (shouldDismiss && typeof onSwipe === 'function') {\n onSwipe(swipe);\n }\n\n gestureState = null;\n },\n };\n\n return {\n attach() {\n if (!element || typeof element.addEventListener !== \"function\") return;\n element.addEventListener('touchstart', handlers.onTouchStart, { passive: true });\n element.addEventListener('touchmove', handlers.onTouchMove, { passive: true });\n element.addEventListener('touchend', handlers.onTouchEnd, { passive: true });\n element.addEventListener('touchcancel', handlers.onTouchEnd, { passive: true });\n },\n\n detach() {\n if (!element || typeof element.removeEventListener !== \"function\") return;\n element.removeEventListener('touchstart', handlers.onTouchStart);\n element.removeEventListener('touchmove', handlers.onTouchMove);\n element.removeEventListener('touchend', handlers.onTouchEnd);\n element.removeEventListener('touchcancel', handlers.onTouchEnd);\n },\n\n getState() {\n return gestureState;\n },\n };\n}\n","\"use strict\";\n\nimport { createToastElement } from \"./Toast.js\";\nimport { removeElement, getDynamicAccessibleTextColorHex } from \"../utils/dom.js\";\nimport { createEmergencyToast } from \"./toast-utils.js\";\nimport { getOrCreateToastContainer, normalizePositionKey, unregisterContainer } from \"../utils/containerRegistry.js\";\nimport { setPosition } from \"../utils/position.js\";\nimport { PausableTimer } from \"../utils/PausableTimer.js\";\nimport { sanitizeHtml } from \"../utils/html-sanitizer.js\";\nimport { playTone } from \"../utils/audio.js\";\nimport { createProgressBar, createCTA, createUndoAction, createCloseButton, runToastAnimation } from \"./toast-utils-core.js\";\nimport { createLoader } from \"./loader.js\";\nimport { createToastIcon } from \"./icons.js\";\nimport { getConfig, shouldReduceMotion } from \"../utils/config.js\";\nimport { getToastBroadcaster } from \"../utils/toast-broadcast.js\";\nimport { calculateToastPriority } from \"../utils/ai-scorer.js\";\nimport { getToastPool } from \"../utils/toast-pool.js\";\nimport { createGestureDetector } from \"../utils/multi-touch.js\";\n\n\nconst active = new Map();\nconst pending = new Map();\nconst queue = [];\nlet visibleCount = 0;\nlet droppedCount = 0;\n\n/**\n * Returns a real-time snapshot of toast manager telemetry metrics.\n * @returns {import('../utils/config.js').ToastMetrics}\n */\nexport function getToastMetrics() {\n return {\n activeCount: active.size,\n queueDepth: queue.length,\n visibleCount,\n droppedCount,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Emits current toast metrics to global onMetrics callback if configured.\n */\nfunction emitMetrics() {\n const config = getConfig();\n if (typeof config.onMetrics === \"function\") {\n try {\n config.onMetrics(getToastMetrics());\n } catch (err) {\n console.error(\"onMetrics callback error:\", err);\n }\n }\n}\n\n\n// Cross-tab toast synchronization\nconst broadcaster = getToastBroadcaster();\n\n// Register getters with broadcaster for sync requests\nbroadcaster.registerActiveToastsGetter(() => Array.from(active.keys()));\nbroadcaster.registerQueuedToastsGetter(() => queue.map(item => ({\n key: item.key,\n options: item.options,\n count: item.count\n})));\n\n// Initialize cross-tab sync listeners if supported\nif (broadcaster.isSupported() && typeof window !== 'undefined') {\n broadcaster.on('create', ({ toastId, payload }) => {\n if (!getConfig().syncTabs) return;\n // Another tab created a toast - show it in this tab\n if (toastId && payload && !active.has(toastId) && !pending.has(toastId)) {\n showToast({ ...payload.options, fromSync: true });\n }\n });\n\n broadcaster.on('update', ({ toastId, payload }) => {\n if (!getConfig().syncTabs) return;\n // Another tab updated a toast - update in this tab\n if (toastId && payload && active.has(toastId)) {\n const data = active.get(toastId);\n if (data && data.count !== payload.count) {\n data.count = payload.count;\n updateBadge(data);\n }\n }\n });\n\n broadcaster.on('dismiss', ({ toastId }) => {\n if (!getConfig().syncTabs) return;\n // Another tab dismissed a toast - dismiss in this tab without re-broadcasting\n if (toastId && (active.has(toastId) || pending.has(toastId))) {\n closeToastByKey(toastId, true);\n }\n });\n\n broadcaster.on('sync-response', ({ payload }) => {\n if (!getConfig().syncTabs) return;\n // Another tab responded with its toast state\n if (payload && Array.isArray(payload.queue)) {\n for (const item of payload.queue) {\n if (item?.options && !active.has(item.key) && !pending.has(item.key)) {\n showToast({ ...item.options, fromSync: true });\n }\n }\n }\n });\n}\n\n// AI Priority Queue Manager - Initialized with default settings\n\n/**\n * Numeric priority score for a queued toast item (higher = shown sooner).\n * calculateToastPriority() returns { score, breakdown, keywords }, so we\n * normalize to a plain number here for sorting/queue comparisons.\n * @param {{options?: Object, priority?: {score?: number}}} item\n * @returns {number}\n */\nfunction getItemPriority(item) {\n if (typeof item?.options?.priority === \"number\" && Number.isFinite(item.options.priority)) {\n return item.options.priority;\n }\n const cached = item?.priority?.score;\n if (typeof cached === \"number\" && Number.isFinite(cached)) return cached;\n\n const config = getConfig();\n if (typeof config.priorityScorer === \"function\") {\n try {\n const res = config.priorityScorer({\n type: item?.options?.type || \"info\",\n message: item?.options?.message || \"\",\n duration: item?.options?.duration,\n options: item?.options,\n });\n if (typeof res === \"number\" && Number.isFinite(res)) return res;\n if (res && typeof res.score === \"number\" && Number.isFinite(res.score)) return res.score;\n } catch (err) {\n console.warn(\"[Toast] Custom priorityScorer error, falling back to built-in:\", err);\n }\n }\n\n return calculateToastPriority(item?.options).score;\n}\n\nexport function updateStackedLayout(container) {\n if (!container || !container.children) return;\n const isStacked = container.getAttribute(\"data-stacked\") === \"true\";\n if (!isStacked) return;\n\n if (!container._stackedInitialized && typeof container.addEventListener === \"function\") {\n container._stackedInitialized = true;\n const onMouseEnter = () => {\n container._isExpanded = true;\n updateStackedLayout(container);\n };\n const onMouseLeave = () => {\n container._isExpanded = false;\n updateStackedLayout(container);\n };\n const onFocusIn = () => {\n container._isExpanded = true;\n updateStackedLayout(container);\n };\n const onFocusOut = (e) => {\n if (!container.contains(e.relatedTarget)) {\n container._isExpanded = false;\n updateStackedLayout(container);\n }\n };\n\n container.addEventListener(\"mouseenter\", onMouseEnter);\n container.addEventListener(\"mouseleave\", onMouseLeave);\n container.addEventListener(\"focusin\", onFocusIn);\n container.addEventListener(\"focusout\", onFocusOut);\n\n let detector = null;\n if (typeof createGestureDetector === \"function\") {\n detector = createGestureDetector(container, {\n onPinch: (pinch) => {\n if (pinch.direction === \"out\" && !container._isExpanded) {\n container._isExpanded = true;\n updateStackedLayout(container);\n } else if (pinch.direction === \"in\" && container._isExpanded) {\n container._isExpanded = false;\n updateStackedLayout(container);\n }\n },\n });\n detector.attach();\n }\n\n container._stackedCleanup = () => {\n container.removeEventListener(\"mouseenter\", onMouseEnter);\n container.removeEventListener(\"mouseleave\", onMouseLeave);\n container.removeEventListener(\"focusin\", onFocusIn);\n container.removeEventListener(\"focusout\", onFocusOut);\n detector?.detach?.();\n container._stackedInitialized = false;\n };\n }\n\n if (!container.children || container.children.length === 0) return;\n const items = Array.from(container.children);\n const count = items.length;\n const isExpanded = Boolean(container._isExpanded);\n const isTop = Boolean(container.id && container.id.includes(\"top\"));\n\n items.forEach((item, index) => {\n const depthFromTop = count - 1 - index;\n const depthKey = isExpanded ? \"expanded\" : (depthFromTop >= 3 ? \"overflow\" : String(depthFromTop));\n if (typeof item.setAttribute === \"function\") {\n item.setAttribute(\"data-stacked-depth\", depthKey);\n }\n\n if (!getConfig().disableInlineStyles) {\n item.style.transition =\n \"transform 240ms cubic-bezier(0.16, 1, 0.3, 1), margin 240ms cubic-bezier(0.16, 1, 0.3, 1), opacity 240ms ease\";\n\n if (isExpanded) {\n item.style.transform = \"none\";\n item.style.marginTop = \"0px\";\n item.style.marginBottom = \"10px\";\n item.style.opacity = \"1\";\n item.style.zIndex = String(100 + index);\n item.style.pointerEvents = \"auto\";\n } else {\n if (depthFromTop === 0) {\n item.style.transform = \"scale(1)\";\n item.style.marginTop = \"0px\";\n item.style.marginBottom = \"0px\";\n item.style.opacity = \"1\";\n item.style.zIndex = \"30\";\n item.style.pointerEvents = \"auto\";\n } else if (depthFromTop === 1) {\n const y = isTop ? 10 : -10;\n item.style.transform = `scale(0.95) translateY(${y}px)`;\n item.style.marginTop = \"-55px\";\n item.style.marginBottom = \"0px\";\n item.style.opacity = \"0.9\";\n item.style.zIndex = \"20\";\n item.style.pointerEvents = \"auto\";\n } else if (depthFromTop === 2) {\n const y = isTop ? 20 : -20;\n item.style.transform = `scale(0.90) translateY(${y}px)`;\n item.style.marginTop = \"-55px\";\n item.style.marginBottom = \"0px\";\n item.style.opacity = \"0.75\";\n item.style.zIndex = \"10\";\n item.style.pointerEvents = \"auto\";\n } else {\n const y = isTop ? 30 : -30;\n item.style.transform = `scale(0.85) translateY(${y}px)`;\n item.style.marginTop = \"-55px\";\n item.style.marginBottom = \"0px\";\n item.style.opacity = \"0\";\n item.style.zIndex = \"1\";\n item.style.pointerEvents = \"none\";\n }\n }\n }\n });\n}\n\nfunction hashString(str) {\n let h = 5381;\n for (let i = 0; i < str.length; i++) h = (h << 5) + h + str.charCodeAt(i);\n return h >>> 0;\n}\n\nfunction makeKey(options = {}) {\n const safe = options && typeof options === \"object\" ? options : {};\n if (safe.id) return String(safe.id);\n const type = String(safe.type || \"info\").trim().toLowerCase();\n const messageHash = hashString(String(safe.message || \"\")).toString(16);\n const position = normalizePositionKey(safe.position || \"bottom-right\");\n\n return `${type}|${messageHash}|${position}`;\n}\n\nexport async function showToast(options = {}) {\n try {\n const key = makeKey(options);\n\n if (active.has(key)) {\n const data = active.get(key);\n if (!data) throw new Error(`Active toast with key ${key} not found`);\n data.count++;\n\n data.timer?.clear();\n data.timer = createDismissTimer(data.toast, options);\n await setupPauseOnHover(data);\n await updateBadge(data);\n emitMetrics();\n\n // Broadcast update to other tabs if not from sync\n if (!options.fromSync && getConfig().syncTabs && broadcaster.isSupported()) {\n broadcaster.broadcast('update', key, { count: data.count });\n }\n return key;\n }\n\n if (pending.has(key)) {\n const current = pending.get(key);\n if (!current) throw new Error(`Pending toast with key ${key} not found`);\n current.count++;\n return key;\n }\n\n const entry = { options, count: 1, rafId: 0 };\n pending.set(key, entry);\n\n entry.rafId = requestAnimationFrame(async () => {\n const current = pending.get(key);\n if (!current) return;\n pending.delete(key);\n\n if (visibleCount >= getConfig().maxVisible) {\n const item = { options: current.options, key, count: current.count };\n const maxQ = getConfig().maxQueueSize ?? 100;\n if (maxQ <= 0) {\n droppedCount++;\n emitMetrics();\n return;\n }\n const usesPriority =\n getConfig().aiPrioritization ||\n current.options?.aiPrioritization ||\n typeof current.options?.priority === \"number\" ||\n queue.some((queuedItem) =>\n queuedItem?.options?.aiPrioritization ||\n typeof queuedItem?.options?.priority === \"number\",\n );\n\n if (usesPriority) {\n item.priority = calculateToastPriority(current.options);\n }\n\n if (queue.length >= maxQ) {\n if (usesPriority) {\n const incomingPriority = getItemPriority(item);\n let lowestIndex = 0;\n let lowestPriority = getItemPriority(queue[0]);\n\n for (let index = 1; index < queue.length; index++) {\n const candidatePriority = getItemPriority(queue[index]);\n if (candidatePriority < lowestPriority) {\n lowestIndex = index;\n lowestPriority = candidatePriority;\n }\n }\n\n if (incomingPriority <= lowestPriority) {\n droppedCount++;\n emitMetrics();\n return;\n }\n\n queue.splice(lowestIndex, 1);\n } else {\n queue.shift();\n }\n droppedCount++;\n }\n\n queue.push(item);\n if (usesPriority) {\n queue.sort((a, b) => getItemPriority(b) - getItemPriority(a));\n }\n emitMetrics();\n await drainQueue();\n return;\n }\n\n try {\n await createOne(current.options, key, current.count);\n } catch (error) {\n console.error(\"showToast failed:\", error);\n }\n });\n\n // Broadcast creation to other tabs if not from sync\n if (!options.fromSync && getConfig().syncTabs && broadcaster.isSupported()) {\n broadcaster.broadcast('create', key, { options });\n }\n\n return key;\n } catch (error) {\n console.error(\"showToast failed:\", error);\n }\n}\n\nasync function createOne(options, key, initialCount) {\n try {\n if (!options || typeof options !== \"object\") {\n throw new TypeError(\"options must be an object\");\n }\n\n visibleCount++;\n\n const container = await getOrCreateToastContainer(options, setPosition);\n if (!container) {\n throw new Error(\"Failed to create toast container\");\n }\n\n const toast = await createToastElement(options, closeToast);\n if (!toast) {\n throw new Error(\"Toast element creation failed\");\n }\n\n const outer = document.createElement(\"div\");\n outer.className = \"toast-outer-wrapper\";\n if (!getConfig().disableInlineStyles) {\n Object.assign(outer.style, {\n position: \"relative\",\n display: \"inline-block\",\n overflow: \"visible\",\n marginBottom: \"10px\",\n zIndex: \"0\",\n width: \"100%\",\n pointerEvents: \"auto\",\n }); \n }\n\n const inner = document.createElement(\"div\");\n inner.className = \"toast-inner-wrapper\";\n if (!getConfig().disableInlineStyles) {\n Object.assign(inner.style, {\n position: \"relative\",\n overflow: \"hidden\",\n zIndex: \"1\",\n }); \n }\n\n inner.appendChild(toast);\n outer.appendChild(inner);\n\n if (container.id.includes(\"toast-container-\")) {\n container.appendChild(outer);\n if (options.stacked) {\n container.setAttribute(\"data-stacked\", \"true\");\n }\n if (container.getAttribute(\"data-stacked\") === \"true\") {\n updateStackedLayout(container);\n }\n }\n\n runToastAnimation(toast);\n\n const shouldPauseOnHover =\n options.pauseOnHover !== false &&\n (options.pauseOnHover === true || !!options.cta || Boolean(getConfig().pauseOnHover));\n\n const data = {\n outer,\n toast,\n options,\n count: Math.max(1, Math.floor(initialCount ?? 0)),\n pauseOnHover: shouldPauseOnHover,\n };\n active.set(key, data);\n toast._key = key;\n\n emitMetrics();\n\n if (data.count > 1) await updateBadge(data);\n\n data.timer = createDismissTimer(toast, options);\n await setupPauseOnHover(data);\n } catch (err) {\n console.error(\"Something went wrong: \", err);\n visibleCount = Math.max(0, visibleCount - 1);\n emitMetrics();\n const el =\n document.querySelector('[id^=\"toast-container-\"]') || document.body;\n el.appendChild(await createEmergencyToast(options, closeToast));\n }\n}\n\nexport async function dismissMostRecent() {\n try {\n if (active.size === 0) {\n if (pending.size > 0) {\n const [pendingKey, pendingEntry] = Array.from(pending.entries()).at(-1);\n if (pendingEntry?.rafId) cancelAnimationFrame(pendingEntry.rafId);\n pending.delete(pendingKey);\n emitMetrics();\n return;\n }\n\n if (queue.length > 0) {\n queue.pop();\n emitMetrics();\n return;\n }\n\n return;\n }\n\n let lastToastEl = null;\n\n // Direct lookup: last active entry is the most recently created toast\n const activeValues = Array.from(active.values());\n if (activeValues.length > 0) {\n const lastData = activeValues.at(-1);\n lastToastEl =\n lastData.toast ||\n (lastData.outer && lastData.outer.querySelector('[id^=\"toast-\"]'));\n }\n\n if (!lastToastEl) {\n const containers = document.querySelectorAll('[id^=\"toast-container-\"]');\n containers.forEach((container) => {\n const children = Array.from(container.children || []);\n if (children.length === 0) return;\n const candidate = children.at(-1);\n if (candidate) {\n lastToastEl = candidate.querySelector('[id^=\"toast-\"]') || candidate;\n }\n });\n }\n\n if (!lastToastEl) return;\n\n const toastEl = lastToastEl._key\n ? lastToastEl\n : lastToastEl.querySelector('[id^=\"toast-\"]') || lastToastEl;\n\n await closeToast(toastEl);\n } catch (err) {\n console.error(\"dismissMostRecent failed:\", err);\n }\n}\n\nexport async function closeAllToasts() {\n try {\n for (const [, entry] of pending) {\n if (entry?.rafId) cancelAnimationFrame(entry.rafId);\n }\n pending.clear();\n queue.length = 0;\n emitMetrics();\n\n const activeToasts = Array.from(active.values())\n .map((d) => d.toast)\n .filter(Boolean);\n\n await Promise.allSettled(\n activeToasts.map(async (t) => {\n try {\n await closeToast(t);\n } catch (error_inner) {\n console.warn(\"closeAllToasts: failed to close one toast:\", error_inner);\n }\n }),\n );\n } catch (err) {\n console.error(\"closeAllToasts failed:\", err);\n }\n}\n\nexport function resetToastManager() {\n for (const [, entry] of pending) {\n if (entry?.rafId) cancelAnimationFrame(entry.rafId);\n }\n pending.clear();\n queue.length = 0;\n for (const [, data] of active) {\n data.timer?.clear();\n data.outer?._pauseCleanup?.();\n data.toast?._cleanupCloseButton?.();\n data.toast?._cleanupCTA?.();\n data.toast?._cleanupUndo?.();\n data.toast?._cleanupSwipe?.();\n data.toast?._cleanup?.();\n if (data.toast?._progressAnimation) {\n try {\n data.toast._progressAnimation.cancel();\n } catch {}\n data.toast._progressAnimation = null;\n }\n const badge = data.outer?.querySelector(\".toast-count-badge\");\n if (badge?._scaleTimer) {\n clearTimeout(badge._scaleTimer);\n badge._scaleTimer = null;\n }\n }\n if (typeof document !== \"undefined\") {\n const containers = document.querySelectorAll('[id^=\"toast-container-\"]');\n containers.forEach((c) => {\n try {\n c._stackedCleanup?.();\n } catch {}\n });\n }\n active.clear();\n visibleCount = 0;\n droppedCount = 0;\n isDraining = false;\n emitMetrics();\n}\n\nexport const dismiss = dismissMostRecent;\nexport const noop = closeAllToasts;\n\nfunction createDismissTimer(toast, options) {\n const raw = Number(options?.duration);\n if (options?.duration === Infinity || (typeof options?.duration === \"number\" && options?.duration <= 0)) {\n return null;\n }\n const duration = Number.isFinite(raw) && raw > 0 ? raw : 2500;\n const delay = duration + 5;\n const timer = new PausableTimer(async () => await closeToast(toast), delay);\n timer.start();\n return timer;\n}\n\nasync function setupPauseOnHover(data) {\n if (!data.pauseOnHover || !data.outer || !data.timer) return;\n\n data.outer._pauseCleanup?.();\n\n const { outer, timer, toast } = data;\n\n const pauseProgressBar = () => {\n if (toast?._progressAnimation) {\n try {\n toast._progressAnimation.pause();\n } catch {}\n } else if (toast?._progressBar) {\n try {\n const computedWidth = window.getComputedStyle(toast._progressBar).width;\n toast._progressBar._pausedWidth = computedWidth;\n toast._progressBar.style.transition = \"none\";\n toast._progressBar.style.width = computedWidth;\n } catch {}\n }\n };\n\n const resumeProgressBar = () => {\n if (toast?._progressAnimation) {\n try {\n toast._progressAnimation.play();\n } catch {}\n } else if (toast?._progressBar && toast._progressBar._pausedWidth) {\n try {\n const remainingMs = timer.getRemainingTime?.() ?? 1000;\n const isReverse = toast._progressBar._isReverse;\n const finalWidth = toast._progressBar._finalWidth || \"100%\";\n toast._progressBar.style.transition = `width ${Math.max(0, remainingMs)}ms linear`;\n toast._progressBar.style.width = isReverse ? finalWidth : \"0%\";\n toast._progressBar._pausedWidth = null;\n } catch {}\n }\n };\n\n const onMouseEnter = () => {\n timer.pause();\n pauseProgressBar();\n toast?._pauseUndo?.();\n toast?.classList.add(\"toast-paused\");\n };\n const onMouseLeave = () => {\n timer.resume();\n resumeProgressBar();\n toast?._resumeUndo?.();\n toast?.classList.remove(\"toast-paused\");\n };\n\n const onFocusIn = (e) => {\n if (e.target.matches(\"[tabindex], div, span, button, a\")) {\n timer.pause();\n pauseProgressBar();\n toast?._pauseUndo?.();\n toast?.classList.add(\"toast-paused\");\n }\n };\n\n const onFocusOut = (e) => {\n if (!outer.contains(e.relatedTarget)) {\n timer.resume();\n resumeProgressBar();\n toast?._resumeUndo?.();\n toast?.classList.remove(\"toast-paused\");\n }\n };\n\n outer.addEventListener(\"mouseenter\", onMouseEnter);\n outer.addEventListener(\"mouseleave\", onMouseLeave);\n outer.addEventListener(\"focusin\", onFocusIn);\n outer.addEventListener(\"focusout\", onFocusOut);\n\n outer._pauseCleanup = () => {\n outer.removeEventListener(\"mouseenter\", onMouseEnter);\n outer.removeEventListener(\"mouseleave\", onMouseLeave);\n outer.removeEventListener(\"focusin\", onFocusIn);\n outer.removeEventListener(\"focusout\", onFocusOut);\n };\n}\n\nexport async function closeToast(toast) {\n if (!toast?._key) return;\n return closeToastByKey(toast._key);\n}\n\n// AUDIT/FEATURE (toastPromise support): the actual removal logic, now\n// keyed directly instead of requiring a toast DOM element. closeToast()\n// above is now a thin wrapper over this — same guard checks, same order\n// of operations, nothing behaviorally changed for existing closeToast()\n// callers. This lets toastPromise() (and anything else that only has a\n// key, not a live element reference) target a SPECIFIC toast for removal\n// — e.g. the loading toast — rather than only being able to close\n// \"whatever toast a DOM element currently points to.\"\nexport async function closeToastByKey(key, fromSync = false) {\n try {\n if (!key) return;\n\n // Broadcast dismissal to other tabs if not initiated from a remote sync event\n if (!fromSync && getConfig().syncTabs && broadcaster.isSupported()) {\n broadcaster.broadcast('dismiss', key, {});\n }\n\n // AUDIT/FEATURE FIX: toast creation is deferred one animation frame\n // (see showToast's rAF coalescing, used for grouping/dedup) — so a\n // caller holding a handle from createToast() can call dismiss()\n // before the toast has actually been created yet and moved from\n // `pending` into `active`. This is a real, reachable race: it\n // happens whenever a wrapped operation resolves faster than one\n // animation frame (e.g. toastPromise() with an already-resolved or\n // synchronously-resolving promise). Previously this just silently\n // no-op'd — the scheduled creation went ahead anyway, leaving a\n // toast that was supposed to be dismissed still showing (and, for\n // toastPromise()'s loading toast specifically, still running its\n // long fallback duration). Checking `pending` first and cancelling\n // the scheduled frame is the correct fix: \"dismiss a not-yet-created\n // toast\" should mean \"don't create it,\" not \"silently do nothing.\"\n const pendingEntry = pending.get(key);\n if (pendingEntry) {\n cancelAnimationFrame(pendingEntry.rafId);\n pending.delete(key);\n emitMetrics();\n return;\n }\n\n // Same race, different intermediate state: the toast finished its\n // rAF-scheduled creation but MAX_VISIBLE was already hit at that\n // moment, so it was pushed into `queue` instead of `active` — not\n // yet showing, waiting for a slot to free up via drainQueue().\n const queueIndex = queue.findIndex((item) => item.key === key);\n if (queueIndex !== -1) {\n queue.splice(queueIndex, 1);\n emitMetrics();\n return;\n }\n\n const data = active.get(key);\n if (!data) return;\n\n data.timer?.clear();\n data.outer?._pauseCleanup?.();\n data.toast?._cleanupCloseButton?.();\n data.toast?._cleanupCTA?.();\n data.toast?._cleanupUndo?.();\n data.toast?._cleanupSwipe?.();\n data.toast?._cleanup?.();\n if (data.toast?._progressAnimation) {\n try {\n data.toast._progressAnimation.cancel();\n } catch {}\n data.toast._progressAnimation = null;\n }\n const badge = data.outer?.querySelector(\".toast-count-badge\");\n if (badge?._scaleTimer) {\n clearTimeout(badge._scaleTimer);\n badge._scaleTimer = null;\n }\n // Clean up CTA click listener if present directly on button/link\n const ctaEl = data.toast?.querySelector(\"button, a\");\n ctaEl?._cleanup?.();\n\n active.delete(key);\n visibleCount = Math.max(0, visibleCount - 1);\n emitMetrics();\n\n if (badge) badge.remove();\n\n const animDuration = data.toast?._animationDuration ?? 400;\n const exitDuration = Math.min(animDuration, 300);\n\n if (data.toast) {\n if (!getConfig().disableInlineStyles) {\n const pos = String(data.options?.position || data.outer?.parentElement?.id || \"\").toLowerCase();\n const isTop = pos.includes(\"top\");\n const isLeft = pos.includes(\"left\");\n const isRight = pos.includes(\"right\");\n const anim = String(data.options?.animationType || \"\").toLowerCase().trim();\n\n let exitTransform = \"translateY(20px)\";\n const spring = data.toast?._spring;\n\n if (shouldReduceMotion()) {\n data.toast.style.transition = \"none\";\n data.toast.style.opacity = \"0\";\n } else {\n if (anim === \"fade\") {\n exitTransform = \"none\";\n } else if (anim === \"zoom\" || anim === \"scale\") {\n exitTransform = \"scale(0.75)\";\n } else if (anim === \"flip\") {\n exitTransform = \"perspective(600px) rotateX(-45deg)\";\n } else if (anim === \"slide\") {\n exitTransform = isLeft ? \"translateX(-100%)\" : isRight ? \"translateX(100%)\" : isTop ? \"translateY(-100%)\" : \"translateY(100%)\";\n } else if (anim === \"bounce\") {\n exitTransform = isTop ? \"translateY(-36px) scale(0.9)\" : \"translateY(36px) scale(0.9)\";\n } else if (spring) {\n exitTransform = isTop ? \"translateY(-28px) scale(0.94)\" : \"translateY(28px) scale(0.94)\";\n }\n\n data.toast.style.transition = `opacity ${exitDuration}ms ease-in, transform ${exitDuration}ms ease-in`;\n data.toast.style.opacity = \"0\";\n data.toast.style.transform = exitTransform;\n }\n }\n data.toast.classList.remove(\"active\");\n }\n\n const parentContainer = data.outer?.parentElement;\n await removeWithTransition(data.outer, data.toast, exitDuration);\n\n if (\n parentContainer &&\n parentContainer.children.length === 0 &&\n parentContainer.id?.startsWith(\"toast-container-\")\n ) {\n try {\n parentContainer._stackedCleanup?.();\n unregisterContainer(parentContainer.id);\n parentContainer.remove();\n } catch {}\n } else if (parentContainer && parentContainer.getAttribute(\"data-stacked\") === \"true\") {\n updateStackedLayout(parentContainer);\n }\n\n await drainQueue();\n } catch (error) {\n console.error(\"Closing Toast failed!: \", error);\n }\n}\n\nlet isDraining = false;\n\nasync function drainQueue() {\n if (isDraining) return;\n isDraining = true;\n try {\n const config = getConfig();\n\n // Apply AI priority sorting if enabled globally or on queued items\n if ((config.aiPrioritization || queue.some(i => i.options?.aiPrioritization || typeof i.options?.priority === \"number\")) && queue.length > 1) {\n queue.sort((a, b) => getItemPriority(b) - getItemPriority(a)); // Higher priority first\n }\n\n while (visibleCount < config.maxVisible && queue.length) {\n const item = queue.shift();\n if (active.has(item.key)) {\n const data = active.get(item.key);\n data.count += item.count;\n await updateBadge(data);\n emitMetrics();\n continue;\n }\n await createOne(item.options, item.key, item.count);\n }\n emitMetrics();\n } finally {\n isDraining = false;\n }\n}\n\nasync function removeWithTransition(el, targetEl, animationDurationMs = 400) {\n if (!el) return Promise.resolve();\n\n return new Promise((resolve) => {\n let done = false;\n let fallbackTimer = null;\n const animEl = targetEl || el.firstElementChild || el;\n\n const finish = () => {\n if (done) return;\n done = true;\n if (fallbackTimer) {\n clearTimeout(fallbackTimer);\n fallbackTimer = null;\n }\n try {\n animEl?.removeEventListener?.(\"transitionend\", onEnd, true);\n } catch {}\n const toastEl = el.querySelector?.(\".toast\") || el;\n if (toastEl?._pooledId) {\n try {\n getToastPool().release(toastEl, toastEl._pooledId);\n } catch {}\n }\n removeElement(el);\n resolve();\n };\n\n const onEnd = (e) => {\n try {\n if (e.target !== animEl) return;\n if (\n e.propertyName === \"transform\" ||\n (!animEl.style.transform && e.propertyName === \"opacity\")\n ) {\n finish();\n }\n } catch (error) {\n console.error(\"removeWithTransition error:\", error);\n }\n };\n\n if (!animEl) return finish();\n\n try {\n animEl.addEventListener(\"transitionend\", onEnd, true);\n } catch (error) {\n console.error(\"removeWithTransition error:\", error);\n }\n\n // Use animation duration + 100ms buffer for fallback timeout\n const fallbackTimeout = animationDurationMs + 100;\n fallbackTimer = setTimeout(finish, fallbackTimeout);\n if (typeof fallbackTimer?.unref === \"function\") {\n fallbackTimer.unref();\n }\n });\n}\n\nasync function updateBadge({ outer, count }) {\n if (!outer || !(outer instanceof HTMLElement)) {\n throw new Error(\"updateBadge: outer must be a valid HTMLElement\");\n }\n\n if (count < 2) {\n const badge = outer.querySelector(\".toast-count-badge\");\n if (badge) badge.remove();\n return;\n }\n\n let badge = outer.querySelector(\".toast-count-badge\");\n if (!badge) {\n badge = document.createElement(\"span\");\n badge.className = \"toast-count-badge\";\n badge.setAttribute(\"aria-label\", `${count} identical notifications`);\n\n if (!getConfig().disableInlineStyles) {\n Object.assign(badge.style, {\n position: \"absolute\",\n top: \"6px\",\n right: \"6px\",\n backgroundColor: \"#f44336\",\n color: \"#fff\",\n borderRadius: \"50%\",\n minWidth: \"20px\",\n height: \"20px\",\n fontSize: \"12px\",\n fontWeight: \"600\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n border: \"2px solid #fff\",\n boxShadow: \"0 2px 6px rgba(0,0,0,0.3)\",\n zIndex: \"2\",\n pointerEvents: \"none\",\n transition: \"transform 150ms ease\",\n }); \n }\n\n outer.appendChild(badge);\n }\n\n badge.textContent = count > 99 ? \"99+\" : String(count);\n\n try {\n if (!shouldReduceMotion()) {\n if (badge._scaleTimer) clearTimeout(badge._scaleTimer);\n badge.style.transform = \"scale(1.2)\";\n badge._scaleTimer = setTimeout(() => {\n badge.style.transform = \"scale(1)\";\n badge._scaleTimer = null;\n }, 150);\n if (typeof badge._scaleTimer?.unref === \"function\") {\n badge._scaleTimer.unref();\n }\n }\n } catch (error) {\n console.error(\"updateBadge animation error:\", error);\n }\n}\n\n/**\n * Updates an active, pending, or queued toast in-place with new options.\n * @param {string} key\n * @param {Partial<import('../index.js').ToastOptions>} [newOptions]\n */\nexport async function updateToastByKey(key, newOptions = {}) {\n if (!key || typeof newOptions !== \"object\" || newOptions === null) return;\n\n if (pending.has(key)) {\n const entry = pending.get(key);\n entry.options = { ...entry.options, ...newOptions };\n return;\n }\n\n const queued = queue.find((q) => q.key === key);\n if (queued) {\n queued.options = { ...queued.options, ...newOptions };\n return;\n }\n\n const data = active.get(key);\n if (!data || !data.toast) return;\n\n const prevOptions = { ...data.options };\n data.options = { ...data.options, ...newOptions };\n const toast = data.toast;\n const messageSpan =\n toast._messageSpan ||\n toast.querySelector(\".toast-message\") ||\n toast.querySelector(\"span:not(.toast-count-badge)\");\n\n // 1. Update message\n if (newOptions.message !== undefined) {\n const rawMessage = String(newOptions.message ?? \"\");\n const allowHtml =\n newOptions.allowHtml !== undefined\n ? Boolean(newOptions.allowHtml)\n : Boolean(data.options.allowHtml);\n\n const isFinishingLoading =\n (newOptions.type === \"success\" || newOptions.type === \"error\") &&\n newOptions.showLoader !== true;\n\n if (messageSpan) {\n const existingLoader = messageSpan.querySelector(\".toast-loader\");\n messageSpan.innerHTML = \"\";\n if (\n existingLoader &&\n newOptions.showLoader !== false &&\n newOptions.loader !== null &&\n !isFinishingLoading\n ) {\n messageSpan.appendChild(existingLoader);\n const spacer = document.createElement(\"span\");\n spacer.style.display = \"inline-block\";\n spacer.style.width = \"8px\";\n messageSpan.appendChild(spacer);\n }\n\n if (allowHtml && rawMessage.trim().length > 0) {\n try {\n const sanitized = sanitizeHtml(rawMessage);\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = sanitized;\n while (tmp.firstChild) {\n messageSpan.appendChild(tmp.firstChild);\n }\n } catch {\n messageSpan.appendChild(document.createTextNode(rawMessage));\n }\n } else {\n messageSpan.appendChild(document.createTextNode(rawMessage));\n }\n\n messageSpan.setAttribute(\"title\", messageSpan.textContent || \"\");\n }\n }\n\n // 2. Handle Loader\n const isFinishingLoading =\n (newOptions.type === \"success\" || newOptions.type === \"error\") &&\n newOptions.showLoader !== true;\n\n if (\n newOptions.showLoader === false ||\n newOptions.loader === null ||\n isFinishingLoading\n ) {\n const loaderEl = messageSpan?.querySelector(\".toast-loader\");\n if (loaderEl) {\n if (loaderEl.nextSibling && loaderEl.nextSibling.nodeName === \"SPAN\") {\n loaderEl.nextSibling.remove();\n }\n loaderEl.remove();\n }\n } else if (\n (newOptions.showLoader === true ||\n (newOptions.loader && typeof newOptions.loader === \"object\")) &&\n messageSpan &&\n !messageSpan.querySelector(\".toast-loader\")\n ) {\n const loaderEl = createLoader(newOptions.loader || {});\n messageSpan.insertBefore(loaderEl, messageSpan.firstChild);\n const spacer = document.createElement(\"span\");\n spacer.style.display = \"inline-block\";\n spacer.style.width = \"8px\";\n messageSpan.insertBefore(spacer, loaderEl.nextSibling);\n }\n\n // 3. Update type & colors\n if (newOptions.type) {\n const newType = String(newOptions.type).toLowerCase().trim();\n toast.className = toast.className.replace(\n /\\btoast-(info|success|error|warning)\\b/g,\n `toast-${newType}`,\n );\n const isErr = newType === \"error\";\n if (newOptions.role) {\n toast.setAttribute(\"role\", newOptions.role);\n } else {\n toast.setAttribute(\"role\", \"alert\");\n }\n toast.setAttribute(\"aria-live\", newOptions.ariaLive || (isErr ? \"assertive\" : \"polite\"));\n\n if (!newOptions.backgroundColor) {\n const typeColors = {\n success: \"#28a745\",\n error: \"#dc3545\",\n warning: \"#ffc107\",\n info: \"#17a2b8\",\n };\n if (typeColors[newType]) {\n toast.style.background = typeColors[newType];\n }\n }\n }\n\n // 3.1 Update icon\n if (newOptions.icon !== undefined || newOptions.type !== undefined) {\n const existingIcon = toast?.querySelector(\".toast-icon\");\n if (existingIcon) existingIcon.remove();\n const mergedForIcon = { ...data.options, ...newOptions };\n const newIconEl = createToastIcon(mergedForIcon);\n if (newIconEl) {\n if (messageSpan) {\n toast.insertBefore(newIconEl, messageSpan);\n } else {\n toast.appendChild(newIconEl);\n }\n }\n }\n\n if (newOptions.backgroundColor) {\n toast.style.background = newOptions.backgroundColor;\n }\n\n if (newOptions.textColor) {\n toast.style.color = newOptions.textColor;\n if (messageSpan) messageSpan.style.color = newOptions.textColor;\n } else if (newOptions.type || newOptions.backgroundColor) {\n const bg = toast.style.background;\n if (bg) {\n const dynamicColor = getDynamicAccessibleTextColorHex(bg);\n toast.style.color = dynamicColor;\n if (messageSpan) messageSpan.style.color = dynamicColor;\n }\n }\n\n if (newOptions.borderRadius !== undefined) {\n const br = typeof newOptions.borderRadius === \"number\" ? `${newOptions.borderRadius}px` : newOptions.borderRadius;\n toast.style.borderRadius = br;\n }\n\n if (newOptions.maxWidth !== undefined) {\n const mw = typeof newOptions.maxWidth === \"number\" ? `${newOptions.maxWidth}px` : newOptions.maxWidth;\n toast.style.maxWidth = mw;\n }\n\n if (newOptions.fontDirection !== undefined) {\n const dir = newOptions.fontDirection !== \"auto\" ? newOptions.fontDirection : \"\";\n toast.style.direction = dir;\n if (messageSpan) messageSpan.style.direction = dir;\n }\n\n if (newOptions.fontSize !== undefined) {\n const fs = typeof newOptions.fontSize === \"number\" ? `${newOptions.fontSize}px` : newOptions.fontSize;\n toast.style.fontSize = fs;\n if (messageSpan) messageSpan.style.fontSize = fs;\n }\n\n if (newOptions.fontFamily !== undefined) {\n toast.style.fontFamily = newOptions.fontFamily;\n if (messageSpan) messageSpan.style.fontFamily = newOptions.fontFamily;\n }\n\n if (newOptions.fontWeight !== undefined) {\n const fw = typeof newOptions.fontWeight === \"number\" ? String(newOptions.fontWeight) : newOptions.fontWeight;\n toast.style.fontWeight = fw;\n if (messageSpan) messageSpan.style.fontWeight = fw;\n }\n\n if (newOptions.fontLineHeight !== undefined) {\n toast.style.lineHeight = newOptions.fontLineHeight;\n if (messageSpan) messageSpan.style.lineHeight = newOptions.fontLineHeight;\n }\n\n if (newOptions.role !== undefined) {\n toast.setAttribute(\"role\", newOptions.role);\n }\n if (newOptions.ariaLive !== undefined) {\n toast.setAttribute(\"aria-live\", newOptions.ariaLive);\n }\n\n if (newOptions.className !== undefined) {\n const prevClass = prevOptions.className;\n if (prevClass && typeof prevClass === \"string\") {\n toast.classList.remove(...prevClass.trim().split(/\\s+/));\n }\n if (newOptions.className && typeof newOptions.className === \"string\") {\n toast.classList.add(...newOptions.className.trim().split(/\\s+/));\n }\n }\n if (newOptions.progress !== undefined) {\n let pct = Number(newOptions.progress);\n if (!Number.isFinite(pct)) pct = 0;\n if (pct < 1 && pct > 0) pct = pct * 100;\n pct = Math.min(100, Math.max(0, pct));\n\n let progressBar = toast.querySelector(\".toast-progress-bar\");\n if (\n !progressBar &&\n (newOptions.showProgressBar || data.options.showProgressBar)\n ) {\n createProgressBar(toast, { ...data.options, ...newOptions });\n progressBar = toast.querySelector(\".toast-progress-bar\");\n }\n if (progressBar) {\n if (toast._progressAnimation) {\n try {\n toast._progressAnimation.cancel();\n } catch {}\n toast._progressAnimation = null;\n }\n progressBar.style.transition = \"width 200ms ease\";\n progressBar.style.width = `${pct}%`;\n }\n } else if (newOptions.showProgressBar === false) {\n const bar = toast.querySelector(\".toast-progress-bar\");\n if (bar) bar.remove();\n }\n\n if (newOptions.progressBarColor || newOptions.progressColor) {\n const bar = toast.querySelector(\".toast-progress-bar\");\n if (bar) {\n bar.style.background = newOptions.progressBarColor || newOptions.progressColor;\n }\n }\n\n if (newOptions.progressPosition) {\n const bar = toast.querySelector(\".toast-progress-bar\");\n if (bar) {\n bar.style.top = newOptions.progressPosition === \"top\" ? \"0\" : \"auto\";\n bar.style.bottom = newOptions.progressPosition === \"bottom\" ? \"0\" : \"auto\";\n }\n }\n\n if (newOptions.progressHeight !== undefined) {\n const bar = toast.querySelector(\".toast-progress-bar\");\n if (bar) {\n const ph = typeof newOptions.progressHeight === \"number\" ? `${newOptions.progressHeight}px` : newOptions.progressHeight;\n bar.style.height = ph;\n }\n }\n\n if (newOptions.animationType !== undefined) {\n data.options.animationType = newOptions.animationType;\n toast._animationType = newOptions.animationType;\n }\n\n // 5. Update Duration / Timer\n if (newOptions.duration !== undefined) {\n data.timer?.clear();\n const raw = Number(newOptions.duration);\n if (Number.isFinite(raw) && raw > 0) {\n data.timer = createDismissTimer(toast, { duration: raw });\n await setupPauseOnHover(data);\n } else {\n data.timer = null;\n }\n } else if (\n (data.options.duration === 0 || !data.timer) &&\n (newOptions.type === \"success\" ||\n newOptions.type === \"error\" ||\n newOptions.type === \"warning\" ||\n newOptions.showLoader === false)\n ) {\n // If it was a persistent loading toast (duration: 0) and transitioned to a resolved state\n // without an explicit duration, start a standard auto-dismiss timer so it doesn't stay permanently stuck on screen.\n data.timer?.clear();\n data.timer = createDismissTimer(toast, { duration: 2500 });\n await setupPauseOnHover(data);\n }\n\n // 5.1 Update CTA\n if (newOptions.cta !== undefined) {\n if (toast._cleanupCTA) {\n toast._cleanupCTA();\n toast._cleanupCTA = null;\n }\n toast.querySelectorAll(\".toast-cta\").forEach((el) => el.remove());\n\n if (newOptions.cta && typeof newOptions.cta === \"object\") {\n const mergedOpts = { ...data.options, ...newOptions };\n createCTA(toast, mergedOpts, closeToast);\n }\n }\n\n // 5.2 Update Undo Action\n if (newOptions.undo !== undefined) {\n if (toast._cleanupUndo) {\n toast._cleanupUndo();\n toast._cleanupUndo = null;\n }\n toast.querySelectorAll(\".toast-undo-btn\").forEach((el) => el.remove());\n\n if (newOptions.undo) {\n const mergedOpts = { ...data.options, ...newOptions };\n createUndoAction(toast, mergedOpts, closeToast);\n }\n }\n\n // 5.3 Update Close Button\n if (newOptions.showCloseButton !== undefined) {\n const existingCloseBtn = toast.querySelector(\".toast-close-btn\");\n if (newOptions.showCloseButton === false) {\n if (toast._cleanupCloseButton) {\n toast._cleanupCloseButton();\n toast._cleanupCloseButton = null;\n }\n if (existingCloseBtn) existingCloseBtn.remove();\n } else if (newOptions.showCloseButton === true && !existingCloseBtn) {\n createCloseButton(toast, data.options, closeToast);\n }\n }\n\n // 6. Audio Tone\n const shouldPlayAudio =\n newOptions.sound !== undefined\n ? Boolean(newOptions.sound)\n : Boolean(newOptions.type && (data.options.sound || getConfig().sound));\n\n if (shouldPlayAudio) {\n const tone =\n typeof newOptions.sound === \"string\"\n ? newOptions.sound\n : newOptions.type || data.options.type || \"info\";\n const preset =\n newOptions.soundPreset ||\n data.options.soundPreset ||\n getConfig().soundPreset ||\n \"modern\";\n playTone(tone, preset);\n }\n\n // 7. Stacked update\n const container = toast.closest('[id^=\"toast-container-\"]');\n if (container && container.getAttribute(\"data-stacked\") === \"true\") {\n updateStackedLayout(container);\n }\n}\n\n","\"use strict\";\n\nimport { setConfig, getConfig, resetConfig, shouldReduceMotion } from \"./utils/config.js\";\n\nimport {\n showToast,\n closeToastByKey,\n updateToastByKey,\n resetToastManager,\n dismiss,\n noop as managerNoop,\n getToastMetrics,\n} from \"./components/ToastManager.js\";\nimport { getOrCreateToastContainer, resetContainerRegistry } from \"./utils/containerRegistry.js\";\nimport { getDynamicAccessibleTextColorHex } from \"./utils/dom.js\";\nimport { setPosition } from \"./utils/position.js\";\nimport {\n setAudioEnabled,\n isAudioEnabled,\n playTone,\n registerSoundPreset,\n getSoundPresets,\n resetSoundPresets,\n resetAudioContext,\n getAudioContext,\n getAudioAnalyser,\n} from \"./utils/audio.js\";\nimport { getToastPool, resetToastPool } from \"./utils/toast-pool.js\";\nimport { getToastBroadcaster, resetToastBroadcaster } from \"./utils/toast-broadcast.js\";\nimport { calculateToastPriority, categorizeToast } from \"./utils/ai-scorer.js\";\nimport { createGestureDetector, detectPinch, isFlick, calculateVelocity } from \"./utils/multi-touch.js\";\nimport { generateToastId, resetToastIdCounter } from \"./utils/id.js\";\nimport {\n registerSpringPreset,\n getSpringPresets,\n resetSpringPresets,\n resolveSpringConfig,\n solveSpring,\n calculateSpringSettlingDuration,\n generateSpringLinearEasing,\n getSpringTransition,\n} from \"./utils/spring.js\";\n\n/**\n * @typedef {'modern' | 'retro' | 'futuristic' | 'subtle' | 'bell' | string} SoundPreset\n */\n\n/**\n * @typedef {'info' | 'success' | 'error' | 'warning'} ToastType\n */\n\n/**\n * @typedef {'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'top-center' | 'bottom-center' | 'left-center' | 'right-center' | 'top-full-width' | 'bottom-full-width' | 'center'} ToastPosition\n */\n\n/**\n * @typedef {Object} CTAOptions\n * @property {string} [label]\n * @property {string} [href]\n * @property {'button' | 'link'} [variant]\n * @property {string} [target]\n * @property {string} [rel]\n * @property {string} [ariaLabel]\n * @property {boolean} [autoClose]\n * @property {string} [color]\n * @property {string} [textColor]\n * @property {string} [background]\n * @property {string} [backgroundColor]\n * @property {(e: MouseEvent) => void | Promise<void>} [onClick]\n */\n\n/**\n * @typedef {Object} UndoOptions\n * @property {string} [label] - Button text label (default: 'Undo')\n * @property {boolean} [showCountdown] - Whether to display decaying seconds counter (default: true)\n * @property {(e: MouseEvent, toast: HTMLElement) => void | Promise<void>} [onUndo] - Callback fired when clicked\n */\n\n/**\n * @typedef {Object} SpringConfig\n * @property {number} [stiffness=100] - Spring stiffness constant (k > 0)\n * @property {number} [damping=10] - Damping friction coefficient (c > 0)\n * @property {number} [mass=1] - Inertial mass (m > 0)\n */\n\n/**\n * @typedef {'default' | 'gentle' | 'wobbly' | 'stiff' | 'bouncy' | string} SpringPreset\n */\n\n/**\n * @typedef {Object} ToastLoaderOptions\n * @property {number} [size] - Spinner size in pixels (default 14)\n * @property {string} [color] - Spinner SVG stroke color (default 'currentColor')\n * @property {string} [text] - Optional text label alongside spinner\n */\n\n/**\n * @typedef {Object} ToastOptions\n * @property {string} [message]\n * @property {ToastType} [type]\n * @property {number} [duration]\n * @property {ToastPosition | string} [position]\n * @property {string} [borderRadius]\n * @property {string} [backgroundColor]\n * @property {string} [textColor]\n * @property {boolean} [showCloseButton]\n * @property {boolean} [showProgressBar]\n * @property {string} [animationDuration]\n * @property {string} [animationEasing]\n * @property {'default' | 'fade' | 'slide' | 'zoom' | 'bounce' | 'flip' | string} [animationType]\n * @property {string} [progressColor]\n * @property {string} [progressBarColor]\n * @property {string} [progressHeight]\n * @property {'top' | 'bottom'} [progressPosition]\n * @property {'decreasing' | 'increasing' | 'ltr' | 'rtl' | 'reverse' | string} [progressDirection]\n * @property {boolean} [pauseOnHover]\n * @property {boolean} [allowHtml]\n * @property {boolean} [sanitizeHtml]\n * @property {boolean} [showLoader]\n * @property {ToastLoaderOptions} [loader]\n * @property {'normal' | 'truncate' | string | boolean} [wrapText]\n * @property {string} [maxWidth]\n * @property {string} [fontFamily]\n * @property {string} [fontSize]\n * @property {string} [fontWeight]\n * @property {string} [fontLineHeight]\n * @property {'auto' | 'ltr' | 'rtl'} [fontDirection]\n * @property {string} [fontPadding]\n * @property {string} [className]\n * @property {CTAOptions | CTAOptions[]} [cta]\n * @property {((e: MouseEvent, toast: HTMLElement) => void | Promise<void>) | UndoOptions} [undo]\n * @property {boolean | SpringPreset | SpringConfig} [spring]\n * @property {boolean} [stacked]\n * @property {boolean | 'success' | 'error' | 'warning' | 'info' | 'pop' | string} [sound]\n * @property {SoundPreset} [soundPreset]\n * @property {boolean | string | HTMLElement | ((options: ToastOptions) => boolean | string | HTMLElement | null | undefined)} [icon]\n * @property {boolean} [swipeToDismiss]\n * @property {number | 'indeterminate'} [progress]\n * @property {boolean} [syncTabs]\n * @property {boolean} [aiPrioritization]\n * @property {number} [priority]\n * @property {boolean} [usePool]\n */\n\n/**\n * @typedef {'auto' | 'always' | 'never'} ReducedMotionMode\n */\n\n/**\n * @typedef {'light' | 'dark' | 'high-contrast' | 'compact' | 'spacious' | 'glass'} ToastTheme\n */\n\n/**\n * @typedef {Element | DocumentFragment | ShadowRoot} ToastMountTarget\n */\n\n/**\n * @typedef {Object} ToastMetrics\n * @property {number} activeCount - Currently rendered active toasts\n * @property {number} queueDepth - Number of queued toasts waiting to be displayed\n * @property {number} visibleCount - Count of currently visible toasts\n * @property {number} droppedCount - Number of toasts dropped due to queue overflow\n * @property {number} timestamp - Epoch timestamp (ms) when metrics were recorded\n */\n\n/**\n * @typedef {Object} ToastGlobalConfig\n * @property {number} [maxVisible]\n * @property {number} [maxQueueSize]\n * @property {number} [zIndex]\n * @property {ToastMountTarget | null} [targetNode]\n * @property {boolean} [disableInlineStyles]\n * @property {ReducedMotionMode} [reducedMotion]\n * @property {ToastPosition | string} [defaultPosition]\n * @property {ToastTheme} [theme]\n * @property {boolean} [stacked]\n * @property {boolean} [swipeToDismiss]\n * @property {boolean} [sound]\n * @property {SoundPreset} [soundPreset]\n * @property {boolean} [syncTabs]\n * @property {boolean} [aiPrioritization]\n * @property {boolean} [debug]\n * @property {((context: { type: string, message: string, duration?: number, options?: Record<string, unknown> }) => number | { score: number }) | null} [priorityScorer]\n * @property {((metrics: ToastMetrics) => void) | null} [onMetrics]\n */\n\n/**\n * @typedef {Object} ToastHandle\n * @property {string} [id] - The unique identifier/key of the toast notification.\n * @property {() => Promise<void>} dismiss\n * @property {(newOptions: Partial<ToastOptions>) => Promise<void>} update\n */\n\n/**\n * @typedef {Object} ToastPromiseMessages\n * @property {string | Partial<ToastOptions>} [loading]\n * @property {string | Partial<ToastOptions> | ((result: unknown) => string | Partial<ToastOptions>)} [success]\n * @property {string | Partial<ToastOptions> | ((error: unknown) => string | Partial<ToastOptions>)} [error]\n */\n\nlet defaultColors = {\n success: \"#28a745\",\n error: \"#dc3545\",\n warning: \"#ffc107\",\n info: \"#17a2b8\",\n};\n\nlet defaultMessages = {\n success: \"Operation completed successfully!\",\n error: \"Something went wrong!\",\n warning: \"Warning message!\",\n info: \"Information message!\",\n};\n\nlet domReady = false;\nlet domReadyPromise = null;\n\nasync function checkDOMReady() {\n if (domReady) return;\n\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return;\n }\n\n if (\n document.readyState === \"complete\" ||\n document.readyState === \"interactive\"\n ) {\n domReady = true;\n return;\n }\n\n if (!domReadyPromise) {\n domReadyPromise = new Promise((resolve) => {\n document.addEventListener(\n \"DOMContentLoaded\",\n () => {\n domReady = true;\n resolve();\n },\n { once: true },\n );\n });\n }\n\n await domReadyPromise;\n}\n\nasync function createToastNow(options = {}) {\n try {\n const sanitizedOptions = await sanitizeToastOptions(options);\n\n await createFirstToastContainer(sanitizedOptions);\n\n return await showToast(sanitizedOptions);\n } catch (error) {\n console.error(\"CreateToast failed:\", error);\n return null;\n }\n}\n\nasync function createToast(options = {}) {\n const isBrowser =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n\n if (!isBrowser) {\n console.warn(\n \"ToastNotification: running in non-browser environment, no DOM available.\",\n );\n return null;\n }\n\n await checkDOMReady();\n\n return await createToastNow(options);\n}\n\nasync function createFirstToastContainer(options) {\n try {\n return await getOrCreateToastContainer(options, setPosition);\n } catch (error) {\n console.error(\"Failed to create toast container:\", error);\n return getConfig().targetNode || document.body;\n }\n}\n\nfunction normalizeToastOptions(messageOrOptions, maybeOptions) {\n const extra =\n typeof maybeOptions === \"object\" && maybeOptions !== null && !Array.isArray(maybeOptions)\n ? maybeOptions\n : {};\n\n if (\n typeof messageOrOptions === \"string\" ||\n typeof messageOrOptions === \"number\" ||\n typeof messageOrOptions === \"boolean\" ||\n typeof messageOrOptions === \"bigint\"\n ) {\n return {\n ...extra,\n message: String(messageOrOptions),\n };\n }\n\n if (messageOrOptions instanceof Error) {\n return {\n ...extra,\n message: messageOrOptions.message || String(messageOrOptions),\n };\n }\n\n if (typeof messageOrOptions === \"object\" && messageOrOptions !== null && !Array.isArray(messageOrOptions)) {\n return {\n ...extra,\n ...messageOrOptions,\n };\n }\n\n return { ...extra };\n}\n\nasync function sanitizeToastOptions(rawOptions) {\n const options = normalizeToastOptions(rawOptions);\n const config = getConfig();\n const contPosition = String(options?.position ?? config.defaultPosition).toLowerCase().trim();\n const contMaxWidth =\n contPosition?.includes(\"top-full-width\") ||\n contPosition?.includes(\"bottom-full-width\")\n ? \"100vw\"\n : \"400px\";\n\n const defaults = {\n allowHtml: false,\n sanitizeHtml: true,\n pauseOnHover: undefined,\n duration: 2500,\n position: config.defaultPosition,\n type: \"info\",\n borderRadius: \"50px\",\n backgroundColor: undefined,\n textColor: undefined,\n showCloseButton: true,\n animationDuration: \"0.4s\",\n animationEasing: \"ease\",\n showProgressBar: true,\n progressColor: undefined,\n progressBarColor: undefined,\n progressHeight: \"4px\",\n progressPosition: \"bottom\",\n progressDirection: \"decreasing\",\n animationType: \"default\",\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n fontSize: \"14px\",\n fontWeight: \"400\",\n fontLineHeight: \"1.4\",\n fontDirection: \"auto\",\n wrapText: \"normal\",\n maxWidth: contMaxWidth,\n };\n\n const final = {\n ...defaults,\n ...options,\n };\n\n final.message = options?.message ?? final.message;\n\n try {\n if (!final.backgroundColor) {\n final.backgroundColor =\n defaultColors?.[final.type] ??\n (window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"#f5f5f5\"\n : \"#111111\");\n }\n } catch (error) {\n console.warn(\"Background color resolution failed:\", error);\n }\n\n try {\n final.message =\n final.message || defaultMessages?.[final.type] || \"No Message Provided!\";\n } catch (error) {\n console.warn(\"Default message resolution failed:\", error);\n }\n\n try {\n if (!final.textColor && final.backgroundColor) {\n final.textColor = getDynamicAccessibleTextColorHex(final.backgroundColor);\n }\n } catch (error) {\n console.warn(\"Text color resolution failed:\", error);\n }\n\n try {\n const rawProgressColor = options?.progressBarColor || options?.progressColor;\n if (rawProgressColor) {\n final.progressColor = rawProgressColor;\n final.progressBarColor = rawProgressColor;\n } else if (!final.progressColor && final.backgroundColor) {\n final.progressColor =\n final.textColor ||\n getDynamicAccessibleTextColorHex(final.backgroundColor);\n final.progressBarColor = final.progressColor;\n }\n } catch (error) {\n console.warn(\"Progress bar color resolution failed:\", error);\n }\n\n if (typeof final.message !== \"string\") {\n final.message = \"No Message Provided!\";\n }\n\n return final;\n}\n\n/**\n * Sets default background colors for toast types.\n * @param {Partial<Record<ToastType, string>>} colors\n */\nfunction setDefaultColors(colors) {\n try {\n if (colors && typeof colors === \"object\" && !Array.isArray(colors)) {\n const validTypes = [\"success\", \"error\", \"warning\", \"info\"];\n const validated = {};\n for (const [key, value] of Object.entries(colors)) {\n if (validTypes.includes(key) && typeof value === \"string\" && value.trim()) {\n validated[key] = value.trim();\n }\n }\n if (Object.keys(validated).length > 0) {\n defaultColors = { ...defaultColors, ...validated };\n }\n }\n } catch (error) {\n console.error(\"setDefaultColors failed:\", error);\n }\n}\n\n/**\n * Sets default messages for toast types.\n * @param {Partial<Record<ToastType, string>>} messages\n */\nfunction setDefaultMessages(messages) {\n try {\n if (messages && typeof messages === \"object\" && !Array.isArray(messages)) {\n const validTypes = [\"success\", \"error\", \"warning\", \"info\"];\n const validated = {};\n for (const [key, value] of Object.entries(messages)) {\n if (validTypes.includes(key) && typeof value === \"string\" && value.trim()) {\n validated[key] = value.trim();\n }\n }\n if (Object.keys(validated).length > 0) {\n defaultMessages = { ...defaultMessages, ...validated };\n }\n }\n } catch (error) {\n console.error(\"setDefaultMessages failed:\", error);\n }\n}\n\nlet closeInProgress = false;\nlet closePromise = null;\n\nasync function runWithClosePriority(fn) {\n if (closeInProgress && closePromise) {\n try {\n await closePromise;\n } catch (closeError) {\n console.warn(\n \"Previous close operation failed (continuing anyway):\",\n closeError,\n );\n }\n }\n return fn();\n}\n\nconst originalCreateToast = createToast;\n\n/**\n * Creates and displays a toast notification.\n * Supports string shorthand: `createToast(\"Message\")` or full options `createToast({ message: \"...\" })`.\n * Also provides ergonomic shorthand methods: `createToast.success(...)`, `createToast.error(...)`, etc.\n * @param {string | ToastOptions} [messageOrOptions]\n * @param {Partial<ToastOptions>} [maybeOptions]\n * @returns {Promise<ToastHandle>}\n */\nasync function createToastWithPriority(messageOrOptions = {}, maybeOptions) {\n const normalized = normalizeToastOptions(messageOrOptions, maybeOptions);\n const key = await runWithClosePriority(() => originalCreateToast(normalized));\n return {\n id: key,\n dismiss: () => (key ? closeToastByKey(key) : Promise.resolve()),\n update: (newOptions) =>\n key ? updateToastByKey(key, newOptions) : Promise.resolve(),\n };\n}\n\n/**\n * Displays a success toast notification.\n * @param {string | ToastOptions} [messageOrOptions]\n * @param {Partial<ToastOptions>} [options]\n * @returns {Promise<ToastHandle>}\n */\ncreateToastWithPriority.success = (messageOrOptions, options) => {\n const normalized = normalizeToastOptions(messageOrOptions, options);\n return createToastWithPriority({ ...normalized, type: \"success\" });\n};\n\n/**\n * Displays an error toast notification.\n * @param {string | ToastOptions} [messageOrOptions]\n * @param {Partial<ToastOptions>} [options]\n * @returns {Promise<ToastHandle>}\n */\ncreateToastWithPriority.error = (messageOrOptions, options) => {\n const normalized = normalizeToastOptions(messageOrOptions, options);\n return createToastWithPriority({ ...normalized, type: \"error\" });\n};\n\n/**\n * Displays a warning toast notification.\n * @param {string | ToastOptions} [messageOrOptions]\n * @param {Partial<ToastOptions>} [options]\n * @returns {Promise<ToastHandle>}\n */\ncreateToastWithPriority.warning = (messageOrOptions, options) => {\n const normalized = normalizeToastOptions(messageOrOptions, options);\n return createToastWithPriority({ ...normalized, type: \"warning\" });\n};\n\n/**\n * Displays an informational toast notification.\n * @param {string | ToastOptions} [messageOrOptions]\n * @param {Partial<ToastOptions>} [options]\n * @returns {Promise<ToastHandle>}\n */\ncreateToastWithPriority.info = (messageOrOptions, options) => {\n const normalized = normalizeToastOptions(messageOrOptions, options);\n return createToastWithPriority({ ...normalized, type: \"info\" });\n};\n\n/**\n * Displays a persistent loading toast with an animated spinner.\n * @param {string | ToastOptions} [messageOrOptions]\n * @param {Partial<ToastOptions>} [options]\n * @returns {Promise<ToastHandle>}\n */\ncreateToastWithPriority.loading = (messageOrOptions, options) => {\n const normalized = normalizeToastOptions(messageOrOptions, options);\n return createToastWithPriority({\n type: \"info\",\n showLoader: true,\n duration: 0,\n showProgressBar: false,\n pauseOnHover: false,\n ...normalized,\n });\n};\n\n/**\n * Displays a custom styled HTML toast notification.\n * @param {string | ToastOptions} [messageOrOptions]\n * @param {Partial<ToastOptions>} [options]\n * @returns {Promise<ToastHandle>}\n */\ncreateToastWithPriority.custom = (messageOrOptions, options) => {\n const normalized = normalizeToastOptions(messageOrOptions, options);\n return createToastWithPriority({\n allowHtml: true,\n ...normalized,\n });\n};\n\nconst success = createToastWithPriority.success;\nconst error = createToastWithPriority.error;\nconst warning = createToastWithPriority.warning;\nconst info = createToastWithPriority.info;\nconst loading = createToastWithPriority.loading;\nconst custom = createToastWithPriority.custom;\n\nexport {\n createToastWithPriority as createToast,\n success,\n error,\n warning,\n info,\n loading,\n custom,\n};\n\nexport { setDefaultColors, setDefaultMessages };\n\n/**\n * Dismisses a toast by its key/id, handle, element, or dismisses the most recent toast if target is omitted.\n * @param {string | ToastHandle | HTMLElement | Promise<ToastHandle>} [target]\n * @returns {Promise<void>}\n */\nconst dismissToast = async (target) => {\n let resolvedTarget = target;\n if (target && typeof target.then === \"function\") {\n try {\n resolvedTarget = await target;\n } catch {\n return;\n }\n }\n\n closeInProgress = true;\n closePromise = (async () => {\n try {\n if (typeof resolvedTarget === \"string\" && resolvedTarget.length > 0) {\n await closeToastByKey(resolvedTarget);\n } else if (resolvedTarget && typeof resolvedTarget === \"object\") {\n if (typeof resolvedTarget.dismiss === \"function\") {\n await resolvedTarget.dismiss();\n } else if (resolvedTarget._key && typeof resolvedTarget._key === \"string\") {\n await closeToastByKey(resolvedTarget._key);\n } else if (resolvedTarget.id && typeof resolvedTarget.id === \"string\") {\n await closeToastByKey(resolvedTarget.id);\n } else {\n await dismiss();\n }\n } else {\n await dismiss();\n }\n } finally {\n closeInProgress = false;\n closePromise = null;\n }\n })();\n await closePromise;\n};\nconst noopAll = async () => {\n closeInProgress = true;\n closePromise = (async () => {\n try {\n await managerNoop();\n } finally {\n closeInProgress = false;\n closePromise = null;\n }\n })();\n await closePromise;\n};\nconst clear = noopAll;\nconst dismissAll = noopAll;\nexport { dismissToast as dismiss, noopAll as noop, dismissAll, clear };\n\nconst TOAST_PROMISE_LOADING_DURATION_MS = 24 * 60 * 60 * 1000;\n\n/**\n * Wraps a promise or function with automatic loading, success, and error toasts.\n * @template T\n * @param {Promise<T> | (() => Promise<T> | T)} promiseOrFn\n * @param {ToastPromiseMessages} [messages]\n * @param {ToastOptions} [options]\n * @returns {Promise<T>}\n */\nasync function toastPromise(promiseOrFn, messages = {}, options = {}) {\n const safeMessages = messages && typeof messages === \"object\" ? messages : {};\n const safeOptions = options && typeof options === \"object\" ? options : {};\n\n const loadingInput = safeMessages.loading ?? \"Loading...\";\n const loadingOptions =\n typeof loadingInput === \"object\" && loadingInput !== null && !Array.isArray(loadingInput)\n ? {\n ...safeOptions,\n type: \"info\",\n duration: TOAST_PROMISE_LOADING_DURATION_MS,\n showProgressBar: false,\n pauseOnHover: false,\n showLoader: true,\n ...loadingInput,\n }\n : {\n ...safeOptions,\n type: \"info\",\n message: String(loadingInput),\n duration: TOAST_PROMISE_LOADING_DURATION_MS,\n showProgressBar: false,\n pauseOnHover: false,\n showLoader: safeOptions.showLoader ?? true,\n };\n\n const loadingHandle = await createToastWithPriority(loadingOptions);\n\n const baseOptions = {\n ...safeOptions,\n pauseOnHover: safeOptions.pauseOnHover,\n };\n\n try {\n const settledPromise =\n typeof promiseOrFn === \"function\" ? promiseOrFn() : promiseOrFn;\n const result = await settledPromise;\n\n if (loadingHandle && typeof loadingHandle.dismiss === \"function\") {\n try {\n await loadingHandle.dismiss();\n } catch {\n // Loading toast may already be dismissed\n }\n }\n\n const successResult =\n typeof safeMessages.success === \"function\"\n ? safeMessages.success(result)\n : (safeMessages.success ?? \"Done!\");\n\n const successOptions =\n typeof successResult === \"object\" && successResult !== null && !Array.isArray(successResult)\n ? { ...baseOptions, type: \"success\", ...successResult }\n : { ...baseOptions, type: \"success\", message: String(successResult) };\n\n await createToastWithPriority(successOptions);\n\n return result;\n } catch (err) {\n if (loadingHandle && typeof loadingHandle.dismiss === \"function\") {\n try {\n await loadingHandle.dismiss();\n } catch {\n // Loading toast may already be dismissed\n }\n }\n\n const errorResult =\n typeof safeMessages.error === \"function\"\n ? safeMessages.error(err)\n : (safeMessages.error ?? \"Something went wrong.\");\n\n const errorOptions =\n typeof errorResult === \"object\" && errorResult !== null && !Array.isArray(errorResult)\n ? { ...baseOptions, type: \"error\", ...errorResult }\n : { ...baseOptions, type: \"error\", message: String(errorResult) };\n\n await createToastWithPriority(errorOptions);\n\n throw err;\n }\n}\n\ncreateToastWithPriority.promise = toastPromise;\ncreateToastWithPriority.dismiss = dismissToast;\ncreateToastWithPriority.dismissAll = noopAll;\ncreateToastWithPriority.clear = noopAll;\n\n/** @type {string} */\nconst version = typeof __VERSION__ !== \"undefined\" ? __VERSION__ : \"3.18.2\";\n\nexport {\n version,\n toastPromise,\n setConfig,\n getConfig,\n resetConfig,\n shouldReduceMotion,\n resetToastManager,\n resetContainerRegistry,\n updateToastByKey,\n setAudioEnabled,\n isAudioEnabled,\n playTone,\n getToastPool,\n resetToastPool,\n getToastBroadcaster,\n resetToastBroadcaster,\n calculateToastPriority,\n categorizeToast,\n createGestureDetector,\n detectPinch,\n isFlick,\n calculateVelocity,\n generateToastId,\n resetToastIdCounter,\n getToastMetrics,\n registerSoundPreset,\n getSoundPresets,\n resetSoundPresets,\n resetAudioContext,\n registerSpringPreset,\n getSpringPresets,\n resetSpringPresets,\n resolveSpringConfig,\n solveSpring,\n calculateSpringSettlingDuration,\n generateSpringLinearEasing,\n getSpringTransition,\n getAudioContext,\n getAudioAnalyser,\n};\n\nif (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n if (!window.__customizableToastEscapeAttached) {\n window.__customizableToastEscapeAttached = true;\n const onKeyDown = (e) => {\n if (e.key === \"Escape\" || e.key === \"Esc\") {\n (async () => {\n try {\n closeInProgress = true;\n closePromise = (async () => {\n try {\n await dismiss();\n } finally {\n closeInProgress = false;\n closePromise = null;\n }\n })();\n await closePromise;\n } catch (error) {\n console.error(\"Escape key dismiss failed:\", error);\n closeInProgress = false;\n closePromise = null;\n }\n })();\n } else if (e.key === \"F6\" || ((e.altKey || e.metaKey) && (e.key === \"t\" || e.key === \"T\"))) {\n // Accessible landmark navigation: focus the most recent active toast\n const activeToasts = document.querySelectorAll('[id^=\"toast-container-\"] [id^=\"toast-\"]');\n if (activeToasts.length > 0) {\n const targetToast = activeToasts[activeToasts.length - 1];\n // Try focusing the interactive CTA, undo, or close button inside the toast first\n const interactive = targetToast.querySelector(\"button, a, [tabindex='0']\");\n if (interactive && typeof interactive.focus === \"function\") {\n interactive.focus();\n } else if (typeof targetToast.focus === \"function\") {\n targetToast.focus();\n }\n }\n }\n };\n window.addEventListener(\"keydown\", onKeyDown, { passive: true });\n }\n}\n\ntry {\n if (typeof window !== \"undefined\") {\n window.customizableToast = {\n setConfig,\n getConfig,\n resetConfig,\n shouldReduceMotion,\n version,\n createToast: createToastWithPriority,\n success,\n error,\n warning,\n info,\n loading,\n custom,\n setDefaultColors,\n setDefaultMessages,\n noop: noopAll,\n dismiss: dismissToast,\n dismissAll: noopAll,\n clear: noopAll,\n toastPromise,\n promise: toastPromise,\n updateToastByKey,\n setAudioEnabled,\n isAudioEnabled,\n playTone,\n registerSoundPreset,\n getSoundPresets,\n resetSoundPresets,\n resetAudioContext,\n getToastPool,\n resetToastPool,\n getToastBroadcaster,\n resetToastBroadcaster,\n calculateToastPriority,\n categorizeToast,\n createGestureDetector,\n detectPinch,\n isFlick,\n calculateVelocity,\n generateToastId,\n resetToastIdCounter,\n getToastMetrics,\n registerSpringPreset,\n getSpringPresets,\n resetSpringPresets,\n resolveSpringConfig,\n solveSpring,\n calculateSpringSettlingDuration,\n generateSpringLinearEasing,\n getSpringTransition,\n getAudioContext,\n getAudioAnalyser,\n };\n }\n} catch (error) {\n console.error(\"Global assignment failed:\", error);\n}\n\nexport default createToastWithPriority;"],"names":["DEFAULT_GLOBAL_CONFIG","Object","freeze","maxVisible","maxQueueSize","zIndex","targetNode","disableInlineStyles","reducedMotion","defaultPosition","theme","stacked","swipeToDismiss","sound","soundPreset","pauseOnHover","syncTabs","aiPrioritization","priorityScorer","onMetrics","debug","globalConfig","setConfig","options","Array","isArray","getConfig","undefined","Boolean","v","Number","isFinite","Math","max","floor","q","z","trunc","appendChild","r","String","toLowerCase","includes","document","documentElement","setAttribute","removeAttribute","p","trim","t","sp","resetConfig","assign","shouldReduceMotion","window","matchMedia","matches","counter","sessionSalt","random","toString","padStart","resetToastIdCounter","generateToastId","prefix","cleanPrefix","replace","safePrefix","test","timestamp","Date","now","countPart","colorCache","constructor","maxSize","this","map","Map","get","key","has","value","delete","set","size","firstKey","keys","next","precomputedNamedTextColors","getDynamicAccessibleTextColorHex","toastBg","cached","textColor","g","b","parsed","hexMatch","match","hex","length","slice","split","c","join","parseInt","parseComponent","trimmed","endsWith","round","parseFloat","rgbMatch","min","rgbSpaceMatch","hslMatch","hslSpaceMatch","activeHslMatch","h","hStr","raw","PI","parseHue","s","l","gray","hue2rgb","val","parseToRgb","current","depth","startsWith","inner","commaIndex","indexOf","propName","fallbackVal","resolved","getComputedStyle","getPropertyValue","e","resolveCssCustomProperty","Error","luminance","a","pow","contrastRatio","rgb1","rgb2","L1","L2","d","rgbToHsl","textL","tr","tg","tb","hslToRgb","contrastBlack","contrastWhite","result","rgbToHex","entries","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","transparent","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","forEach","name","lum","L","ALLOWED_TAGS","Set","ALLOWED_ATTRS","DISCARDED_TAGS","ALLOWED_URI_REGEX","sanitizeNode","node","allowedTags","allowedAttrs","nodeType","Node","TEXT_NODE","createTextNode","nodeValue","COMMENT_NODE","ELEMENT_NODE","tag","tagName","toUpperCase","frag","createDocumentFragment","from","childNodes","child","sanitized","el","createElement","attributes","attr","attrsToRemove","trimmedVal","push","rel","getAttribute","filter","finalTarget","sanitizeAttributes","sanitizedChild","fallbackSanitize","dirty","container","html","DOMParser","doc","parseFromString","body","template","innerHTML","content","div","parseHtmlInert","outFrag","wrapper","querySelectorAll","sanitizeHtml","opts","forceFallback","DOMPurify","sanitize","hasDOMPurify","cleaned","ALLOWED_ATTR","ALLOWED_URI_REGEXP","href","err","console","warn","createLoader","safeOpts","rawSize","rawColor","color","labelText","text","className","config","style","display","alignItems","gap","svgNS","svg","createElementNS","circle","classList","add","opacity","strokeDasharray","strokeDashoffset","transformOrigin","animation","lbl","fontSize","textContent","getElementById","st","id","target","head","createCTA","toast","onClose","rawCfg","cta","configs","item","cleanups","idx","cfg","label","isLink","variant","trimmedHref","isDangerous","tabIndex","relSet","type","ariaLabel","ctaTextColor","backgroundColor","ctaBgColor","background","getContrastBackground","ctaBorderColor","marginLeft","padding","borderRadius","fontWeight","lineHeight","border","cursor","whiteSpace","flexShrink","onClick","async","res","then","error","autoClose","onKeyDown","preventDefault","addEventListener","cleanupItem","removeEventListener","_cleanup","insertTarget","querySelector","insertBefore","prevCleanup","_cleanupCTA","createUndoAction","undo","isFn","undoCfg","onUndo","baseLabel","totalDuration","duration","showCountdown","btn","bgColor","borderColor","remainingSec","ceil","updateLabel","intervalId","isPaused","setInterval","clearInterval","unref","_pauseUndo","_resumeUndo","cleanupTimer","_cleanupUndo","createCloseButton","closeBtn","closeTextColor","_cleanupCloseButton","createProgressBar","progressBar","_progressBar","borderRadiusStr","parsedRadius","borderRadiusNum","progressHeightPx","progressHeightStyle","progressHeight","parsedFloat","progressDuration","leftOffset","finalWidth","isReverse","progressDirection","_leftOffset","_finalWidth","_isReverse","progressBg","progressBarColor","progressColor","position","left","height","width","transition","progressPosition","willChange","progress","showProgressBar","Infinity","ensureProgressIndeterminateStyles","pct","animate","keyframes","_progressAnimation","easing","fill","delay","requestAnimationFrame","runToastAnimation","_hasAnimated","transform","trigger","offsetHeight","isConnected","audioContext","audioEnabled","hasUserGesture","navigator","userActivation","hasBeenActive","onGesture","state","resume","catch","capture","once","passive","customSoundPresets","getAudioContext","forceResume","AudioCtx","AudioContext","webkitAudioContext","hasActivation","audioAnalyser","getAudioAnalyser","ctx","createAnalyser","fftSize","connect","destination","routeAudio","registerNodeCleanup","osc","gain","onended","disconnect","BUILTIN_PRESETS","modern","tone","freq","createOscillator","createGain","frequency","setValueAtTime","exponentialRampToValueAtTime","start","stop","retro","linearRampToValueAtTime","offset","futuristic","subtle","bell","peakGain","isPlayingDelegated","playTone","toneType","preset","customizableToast","currentTime","numFreq","activePreset","customFn","registerSoundPreset","synthesizerFn","cleanName","getSoundPresets","builtin","custom","resetSoundPresets","clear","setAudioEnabled","enabled","isAudioEnabled","resetAudioContext","close","SPRING_PRESETS","default","stiffness","damping","mass","bezierFallback","gentle","wobbly","stiff","bouncy","customSpringPresets","registerSpringPreset","TypeError","getSpringPresets","resetSpringPresets","resolveSpringConfig","spring","prototype","hasOwnProperty","call","rawStiffness","rawDamping","rawMass","zeta","sqrt","solveSpring","k","m","omega0","abs","exp","omegaD","cos","sin","r1","r2","c2","calculateSpringSettlingDuration","threshold","settledTime","staysSettled","lookahead","durationMs","generateSpringLinearEasing","points","durationSec","values","i","y","formattedY","percent","getSpringTransition","linearEasing","CSS","supports","supportsCSSLinearEasing","isSpring","ALLOWED_SVG_TAGS","ALLOWED_SVG_ATTRS","isUnsafeUrl","sanitizeInlineSvg","svgText","parserClass","sourceSvg","copySafeNode","safeEl","lowerName","j","safeChild","ICON_SVGS","success","warning","info","createToastIcon","safeOptions","iconOpt","icon","iconTag","justifyContent","marginRight","fontStyle","HTMLElement","cloneNode","matchedAlias","check","checkmark","cross","alert","safeSvg","normalizedType","getInitialTransform","animationType","pos","isTop","isLeft","isRight","anim","createEmergencyToast","emergency","posFlags","top","bottom","right","maxWidth","wordWrap","boxShadow","innerWrapper","msgEl","allowHtml","message","tmp","firstChild","closeSpan","float","font","removeChild","timer","clearTimeout","remove","setTimeout","ToastElementPool","initialSize","pool","inUseCount","element","_createToastElement","inUse","acquire","toastId","poolEntry","find","entry","isRecycled","_cleanupSwipe","_pauseCleanup","parentNode","_pooledId","_key","release","targetElement","targetId","getStats","total","available","utilization","compact","toRemove","splice","poolInstance","getToastPool","resetToastPool","createToastElement","usePool","rawId","createElementWithId","springTransition","parseAnimationDuration","animationDuration","validAnimationDuration","animationEasing","_spring","_animationType","customClass","opacityDuration","opacityEasing","marginBottom","overflow","minWidth","boxSizing","userSelect","pointerEvents","direction","fontDirection","isError","role","ariaLive","_animationDuration","messageSpan","_messageSpan","wrapText","WebkitBoxOrient","WebkitLineClamp","textOverflow","flex","fontPadding","fontFamily","fontLineHeight","wordBreak","rawMessage","iconEl","loader","showLoader","loaderEl","spacer","showCloseButton","startX","startY","currentX","startTime","isDragging","isHorizontal","touchId","isWindowListening","cleanupWindowListeners","onPointerMove","onPointerEnd","onPointerDown","closest","ev","touches","identifier","clientX","clientY","_originalTransition","x","dx","dy","cancelable","isFlick","exitX","exitDuration","_swipeTimeout","snapEasing","snapDuration","_snapbackTimer","attachSwipeToDismiss","applyRichStyling","containerRegistry","containerLocks","normalizePositionKey","getContainerId","applyContainerBaseStyles","inset","flexDirection","getOrCreateToastContainer","setPosition","root","ownerDocument","contains","isConnectedToRoot","findContainerById","all","DOCUMENTED_POSITIONS","LEGACY_POSITIONS","ALL_POSITIONS","rawPos","effectivePos","resetPositionClasses","resetContainerStyles","positionFlags","isFullWidth","hasTop","hasBottom","hasLeft","hasRight","hasCenter","hasFullWidth","parsePosition","flags","handleFullWidthPositions","handleCenterPositions","applyStandardPositioning","PausableTimer","callback","isInfinite","safeDelay","remaining","timeoutId","isCompleted","pause","elapsed","getRemainingTime","ToastBroadcaster","channel","tabId","_generateTabId","isLeadTab","leaderTimer","listeners","supportsBroadcastChannel","BroadcastChannel","_initBroadcastChannel","entropy","crypto","getRandomValues","buf","Uint32Array","onmessage","event","_handleMessage","data","_becomeLeadIfNeeded","broadcast","payload","actualToastId","actualPayload","postMessage","active","_getActiveToasts","queue","_getQueuedToasts","on","index","registerActiveToastsGetter","getter","registerQueuedToastsGetter","isSupported","getTabId","isLeadingTab","destroy","broadcasterInstance","getToastBroadcaster","cleanup","resetToastBroadcaster","TYPE_PRIORITY","URGENCY_KEYWORDS","LOW_PRIORITY_KEYWORDS","calculateToastPriority","context","score","breakdown","base","keywords","detectedKeywords","typeScore","safeMessage","messageLower","urgencyScore","keyword","escaped","RegExp","urgency","durationScore","messageLength","lengthPenalty","exclamationCount","exclamationScore","emphasis","allCapsWords","capsScore","caps","categorizeToast","msgLower","categories","calculateDistance","p1","p2","calculateVelocity","distance","dur","velocity","velocityThreshold","distanceThreshold","getTouchPoints","touch","time","changedTouches","detectPinch","sensitivityThreshold","startDistance","currentDistance","isPinch","scale","distanceChange","createGestureDetector","onFlick","onPinch","onSwipe","flickVelocityThreshold","swipeVelocityThreshold","swipeDistanceThreshold","pinchSensitivity","gestureState","isTracking","handlers","startTouches","initializeGestureState","updateGestureState","pinch","swipe","startTouch","calculateSwipe","shouldDismiss","shouldDismissOnSwipe","attach","detach","getState","pending","visibleCount","droppedCount","getToastMetrics","activeCount","queueDepth","emitMetrics","broadcaster","getItemPriority","priority","updateStackedLayout","children","_stackedInitialized","onMouseEnter","_isExpanded","onMouseLeave","onFocusIn","onFocusOut","relatedTarget","detector","_stackedCleanup","items","count","isExpanded","depthFromTop","depthKey","marginTop","showToast","safe","str","charCodeAt","hashString","makeKey","createDismissTimer","setupPauseOnHover","updateBadge","fromSync","rafId","maxQ","usesPriority","some","queuedItem","incomingPriority","lowestIndex","lowestPriority","candidatePriority","shift","sort","drainQueue","createOne","initialCount","closeToast","outer","shouldPauseOnHover","closeToastByKey","dismiss","pendingKey","pendingEntry","at","cancelAnimationFrame","pop","lastToastEl","activeValues","lastData","candidate","toastEl","pauseProgressBar","computedWidth","_pausedWidth","resumeProgressBar","play","remainingMs","queueIndex","findIndex","cancel","badge","_scaleTimer","ctaEl","animDuration","parentElement","exitTransform","parentContainer","targetEl","animationDurationMs","Promise","resolve","done","fallbackTimer","animEl","firstElementChild","finish","onEnd","removeElement","propertyName","removeWithTransition","idOrPosition","unregisterContainer","isDraining","updateToastByKey","newOptions","queued","prevOptions","isFinishingLoading","existingLoader","nextSibling","nodeName","newType","isErr","typeColors","existingIcon","newIconEl","bg","dynamicColor","br","mw","dir","fs","fw","prevClass","bar","ph","existingCloseBtn","defaultColors","defaultMessages","domReady","domReadyPromise","normalizeToastOptions","messageOrOptions","maybeOptions","extra","setDefaultColors","colors","validTypes","validated","setDefaultMessages","messages","closeInProgress","closePromise","originalCreateToast","readyState","checkDOMReady","sanitizedOptions","rawOptions","contPosition","contMaxWidth","final","rawProgressColor","sanitizeToastOptions","createFirstToastContainer","createToastNow","createToastWithPriority","normalized","closeError","runWithClosePriority","update","loading","dismissToast","resolvedTarget","noopAll","activeToasts","allSettled","error_inner","managerNoop","dismissAll","TOAST_PROMISE_LOADING_DURATION_MS","toastPromise","promiseOrFn","safeMessages","loadingInput","loadingOptions","loadingHandle","baseOptions","settledPromise","successResult","successOptions","errorResult","errorOptions","promise","version","__customizableToastEscapeAttached","altKey","metaKey","targetToast","interactive","focus","createToast","noop"],"mappings":";;;;;;;;;;;;;;oEA2CA,MAAMA,EAAwBC,OAAOC,OAAO,CAC1CC,WAAY,EACZC,aAAc,IACdC,OAAQ,KACRC,WAAY,KACZC,qBAAqB,EACrBC,cAAe,OACfC,gBAAiB,eACjBC,MAAO,QACPC,SAAS,EACTC,gBAAgB,EAChBC,OAAO,EACPC,YAAa,SACbC,cAAc,EACdC,UAAU,EACVC,kBAAkB,EAClBC,eAAgB,KAChBC,UAAW,KACXC,OAAO,IAGHC,EAAe,IAAKrB,GAWnB,SAASsB,EAAUC,EAAU,IAClC,IAAKA,GAA8B,iBAAZA,GAAwBC,MAAMC,QAAQF,GAC3D,OAAOG,IAGT,MAAMvB,WACJA,EAAUC,aACVA,EAAYC,OACZA,EAAMC,WACNA,EAAUC,oBACVA,EAAmBC,cACnBA,EAAaC,gBACbA,EAAeC,MACfA,EAAKC,QACLA,EAAOC,eACPA,EAAcC,MACdA,EAAKC,YACLA,EAAWC,aACXA,EAAYC,SACZA,EAAQC,iBACRA,EAAgBC,eAChBA,EAAcC,UACdA,EAASC,MACTA,GACEG,EAMJ,QAJcI,IAAVP,IACFC,EAAaD,MAAQQ,QAAQR,SAGZO,IAAfxB,EAA0B,CAC5B,MAAM0B,EAAIC,OAAO3B,GACb2B,OAAOC,SAASF,IAAMA,EAAI,IAC5BR,EAAalB,WAAa6B,KAAKC,IAAI,EAAGD,KAAKE,MAAML,IAErD,CAEA,QAAqBF,IAAjBvB,EAA4B,CAC9B,MAAM+B,EAAIL,OAAO1B,GACb0B,OAAOC,SAASI,IAAMA,GAAK,IAC7Bd,EAAajB,aAAe4B,KAAKE,MAAMC,GAE3C,CAEA,QAAeR,IAAXtB,EAAsB,CACxB,MAAM+B,EAAIN,OAAOzB,GACbyB,OAAOC,SAASK,KAClBf,EAAahB,OAAS2B,KAAKK,MAAMD,GAErC,CAUA,QARmBT,IAAfrB,IACFe,EAAaf,WAAcA,GAAoC,iBAAfA,GAA6D,mBAA3BA,EAAWgC,YAA8BhC,EAAa,WAG9GqB,IAAxBpB,IACFc,EAAad,oBAAsBqB,QAAQrB,SAGvBoB,IAAlBnB,EAA6B,CAC/B,MAAM+B,EAAIC,OAAOhC,GAAiB,QAAQiC,cACtC,CAAC,OAAQ,SAAU,SAASC,SAASH,KACvClB,EAAab,cAAgB+B,EACL,oBAAbI,WACC,WAANJ,EACFI,SAASC,gBAAgBC,aAAa,4BAA6B,UACpD,UAANN,EACTI,SAASC,gBAAgBC,aAAa,4BAA6B,SAEnEF,SAASC,gBAAgBE,gBAAgB,8BAIjD,CAEA,QAAwBnB,IAApBlB,EAA+B,CACjC,MAAMsC,EAAIP,OAAO/B,GAAmB,IAAIgC,cAAcO,OAClDD,IACF1B,EAAaZ,gBAAkBsC,EAEnC,CAEA,QAAcpB,IAAVjB,EAAqB,CACvB,MAAMuC,EAAIT,OAAO9B,GAAS,SAAS+B,cAC/B,CAAC,QAAS,OAAQ,gBAAiB,UAAW,WAAY,SAASC,SAASO,KAC9E5B,EAAaX,MAAQuC,EAEG,oBAAbN,UACTA,SAASC,gBAAgBC,aAAa,mBAAoBI,GAGhE,CAcA,QAZgBtB,IAAZhB,IACFU,EAAaV,QAAUiB,QAAQjB,SAGVgB,IAAnBf,IACFS,EAAaT,eAAiBgB,QAAQhB,SAG1Be,IAAVd,IACFQ,EAAaR,MAAQe,QAAQf,SAGXc,IAAhBb,EAA2B,CAC7B,MAAMoC,EAAKV,OAAO1B,GAAe,UAAU2B,cAAcO,OACrDE,IACF7B,EAAaP,YAAcoC,EAE/B,CAsBA,YApBqBvB,IAAjBZ,IACFM,EAAaN,aAAea,QAAQb,SAGrBY,IAAbX,IACFK,EAAaL,SAAWY,QAAQZ,SAGTW,IAArBV,IACFI,EAAaJ,iBAAmBW,QAAQX,SAGnBU,IAAnBT,IACFG,EAAaH,eAA2C,mBAAnBA,EAAgCA,EAAiB,WAGtES,IAAdR,IACFE,EAAaF,UAAiC,mBAAdA,EAA2BA,EAAY,MAGlEO,GACT,CAOO,SAASyB,IAMd,OALAlD,OAAOmD,OAAO/B,EAAcrB,GACJ,oBAAb2C,WACTA,SAASC,gBAAgBE,gBAAgB,oBACzCH,SAASC,gBAAgBE,gBAAgB,8BAEpCpB,GACT,CAMO,SAASA,IACd,MAAO,IAAKL,EACd,CAgBO,SAASgC,IACd,GAAmC,WAA/BhC,EAAab,cAA4B,OAAO,EACpD,GAAmC,UAA/Ba,EAAab,cAA2B,OAAO,EACnD,IACE,OAAOoB,QACa,oBAAX0B,QACwB,mBAAtBA,OAAOC,YACdD,OAAOC,WAAW,oCAAoCC,QAE5D,CAAE,MACA,OAAO,CACT,CACF,CC/PA,IAAIC,EAAU,EAGd,MAAMC,EAAc1B,KAAKE,MAAsB,MAAhBF,KAAK2B,UACjCC,SAAS,IACTC,SAAS,EAAG,KAMR,SAASC,IACdL,EAAU,CACZ,CAUO,SAASM,EAAgBC,EAAS,SACvC,MAAMC,EACc,iBAAXD,EACHA,EACGhB,OACAP,cACAyB,QAAQ,eAAgB,KACxBA,QAAQ,MAAO,KACfA,QAAQ,SAAU,IACrB,GAEAC,EACJF,IAAgB,SAASG,KAAKH,GAAeA,EAAc,QAEvDI,EAAYC,KAAKC,MAAMX,SAAS,IAGtCH,EAAWA,EAAU,EAAK,SAC1B,MAAMe,EAAYf,EAAQG,SAAS,IAEnC,MAAO,GAAGO,KAAcE,KAAaX,IAAcc,GACrD,CCsEA,MAAMC,EAAa,IAxBnB,MACE,WAAAC,CAAYC,EAAU,KACpBC,KAAKD,QAAUA,EACfC,KAAKC,IAAM,IAAIC,GACjB,CAEA,GAAAC,CAAIC,GACF,IAAKJ,KAAKC,IAAII,IAAID,GAAM,OACxB,MAAME,EAAQN,KAAKC,IAAIE,IAAIC,GAG3B,OAFAJ,KAAKC,IAAIM,OAAOH,GAChBJ,KAAKC,IAAIO,IAAIJ,EAAKE,GACXA,CACT,CAEA,GAAAE,CAAIJ,EAAKE,GACP,GAAIN,KAAKC,IAAII,IAAID,GAAMJ,KAAKC,IAAIM,OAAOH,QAClC,GAAIJ,KAAKC,IAAIQ,MAAQT,KAAKD,QAAS,CACtC,MAAMW,EAAWV,KAAKC,IAAIU,OAAOC,OAAON,MACxCN,KAAKC,IAAIM,OAAOG,EAClB,CACAV,KAAKC,IAAIO,IAAIJ,EAAKE,EACpB,GAG8B,KA0J1BO,EAA6B,CAAA,EAa5B,SAASC,EAAiCC,GAC/C,IAAKA,EAAS,MAAO,UAErB,MAAMX,EAAMxC,OAAOmD,GACbC,EAASnB,EAAWM,IAAIC,GAC9B,GAAIY,EAAQ,OAAOA,EAEnB,GAAIH,EAA2BE,GAASlD,eAAgB,CACtD,MAAMoD,EAAYJ,EAA2BE,EAAQlD,eAErD,OADAgC,EAAWW,IAAIJ,EAAKa,GACbA,CACT,CAEA,IAAItD,EAAGuD,EAAGC,EA2JV,IACE,MAEMC,EA3GR,SAAoBd,GAClB,MAAMe,EAAWf,GAAOgB,MAAM,uDAC9B,GAAID,EAAU,CACZ,IAAIE,EAAMF,EAAS,IAAMA,EAAS,IAAMA,EAAS,GAQjD,GAPmB,IAAfE,EAAIC,QAA+B,IAAfD,EAAIC,SAC1BD,EAAMA,EACHE,MAAM,EAAG,GACTC,MAAM,IACNzB,IAAK0B,GAAMA,EAAIA,GACfC,KAAK,KAENL,EAAIC,QAAU,EAAG,CACnB,MAAM7D,EAAIkE,SAASN,EAAIE,MAAM,EAAG,GAAI,IAC9BP,EAAIW,SAASN,EAAIE,MAAM,EAAG,GAAI,IAC9BN,EAAIU,SAASN,EAAIE,MAAM,EAAG,GAAI,IACpC,GAAIvE,OAAOC,SAASQ,IAAMT,OAAOC,SAAS+D,IAAMhE,OAAOC,SAASgE,GAC9D,MAAO,CAAExD,IAAGuD,IAAGC,IAEnB,CACA,OAAO,IACT,CAEA,MAAMW,EAAkBH,IACtB,GAAiB,iBAANA,EAAgB,OAAOzE,OAAOyE,GACzC,MAAMI,EAAUJ,EAAEvD,OAClB,OAAI2D,EAAQC,SAAS,KACZ5E,KAAK6E,MAAOC,WAAWH,GAAW,IAAO,KAE3C7E,OAAO6E,IAGVI,EAAW7B,GAAOgB,MACtB,mFAEF,GAAIa,EAAU,CACZ,MAAMxE,EAAIP,KAAKgF,IAAI,IAAKhF,KAAKC,IAAI,EAAGyE,EAAeK,EAAS,MACtDjB,EAAI9D,KAAKgF,IAAI,IAAKhF,KAAKC,IAAI,EAAGyE,EAAeK,EAAS,MACtDhB,EAAI/D,KAAKgF,IAAI,IAAKhF,KAAKC,IAAI,EAAGyE,EAAeK,EAAS,MAC5D,GAAIjF,OAAOC,SAASQ,IAAMT,OAAOC,SAAS+D,IAAMhE,OAAOC,SAASgE,GAC9D,MAAO,CAAExD,IAAGuD,IAAGC,IAEnB,CAEA,MAAMkB,EAAgB/B,GAAOgB,MAC3B,4EAEF,GAAIe,EAAe,CACjB,MAAM1E,EAAIP,KAAKgF,IAAI,IAAKhF,KAAKC,IAAI,EAAGyE,EAAeO,EAAc,MAC3DnB,EAAI9D,KAAKgF,IAAI,IAAKhF,KAAKC,IAAI,EAAGyE,EAAeO,EAAc,MAC3DlB,EAAI/D,KAAKgF,IAAI,IAAKhF,KAAKC,IAAI,EAAGyE,EAAeO,EAAc,MACjE,GAAInF,OAAOC,SAASQ,IAAMT,OAAOC,SAAS+D,IAAMhE,OAAOC,SAASgE,GAC9D,MAAO,CAAExD,IAAGuD,IAAGC,IAEnB,CAEA,MAYMmB,EAAWhC,GAAOgB,MACtB,kGAEIiB,GAAiBD,GAAYhC,GAAOgB,MACxC,2FAGIkB,EAAiBF,GAAYC,EACnC,GAAIC,EAAgB,CAClB,MAAMC,EArBUC,KAChB,MAAMX,EAAUW,EAAKtE,OAAOP,cAC5B,IAAI8E,EAAMT,WAAWH,GACrB,OAAK7E,OAAOC,SAASwF,IACjBZ,EAAQC,SAAS,QACnBW,GAAY,IACHZ,EAAQC,SAAS,SAC1BW,EAAa,IAANA,EAAavF,KAAKwF,KAEjBD,EAAM,IAAO,KAAO,IAAO,KANH,GAkBxBE,CAASL,EAAe,IAC5BM,EAAI1F,KAAKgF,IAAI,EAAGhF,KAAKC,IAAI,EAAGH,OAAOsF,EAAe,IAAM,MACxDO,EAAI3F,KAAKgF,IAAI,EAAGhF,KAAKC,IAAI,EAAGH,OAAOsF,EAAe,IAAM,MAC9D,GAAU,IAANM,EAAS,CACX,MAAME,EAAO5F,KAAK6E,MAAU,IAAJc,GACxB,MAAO,CAAEpF,EAAGqF,EAAM9B,EAAG8B,EAAM7B,EAAG6B,EAChC,CACA,MAAMC,EAAU,CAAC9E,EAAGZ,EAAGc,KACrB,IAAI6E,EAAM7E,EAGV,OAFI6E,EAAM,IAAGA,GAAO,GAChBA,EAAM,IAAGA,GAAO,GAChBA,EAAM,EAAI,EAAU/E,EAAc,GAATZ,EAAIY,GAAS+E,EACtCA,EAAM,GAAc3F,EACpB2F,EAAM,EAAI,EAAU/E,GAAKZ,EAAIY,IAAM,EAAI,EAAI+E,GAAO,EAC/C/E,GAEHZ,EAAIwF,EAAI,GAAMA,GAAK,EAAID,GAAKC,EAAID,EAAIC,EAAID,EACxC3E,EAAI,EAAI4E,EAAIxF,EAClB,MAAO,CACLI,EAAGP,KAAK6E,MAAiC,IAA3BgB,EAAQ9E,EAAGZ,EAAGkF,EAAI,EAAI,IACpCvB,EAAG9D,KAAK6E,MAAyB,IAAnBgB,EAAQ9E,EAAGZ,EAAGkF,IAC5BtB,EAAG/D,KAAK6E,MAAiC,IAA3BgB,EAAQ9E,EAAGZ,EAAGkF,EAAI,EAAI,IAExC,CAEA,OAAO,IACT,CAKiBU,CA/IjB,SAAkC7C,GAChC,GAAqB,iBAAVA,EAAoB,OAAOA,EACtC,IAAI8C,EAAU9C,EAAMlC,OAChBiF,EAAQ,EACZ,KAAOD,EAAQvF,cAAcyF,WAAW,SAAWF,EAAQpB,SAAS,MAAQqB,EAAQ,GAAG,CACrFA,IACA,MAAME,EAAQH,EAAQ3B,MAAM,GAAG,GAAIrD,OAC7BoF,EAAaD,EAAME,QAAQ,KAC3BC,IAA2B,IAAfF,EAAoBD,EAAQA,EAAM9B,MAAM,EAAG+B,IAAapF,OACpEuF,GAA6B,IAAfH,EAAoB,GAAKD,EAAM9B,MAAM+B,EAAa,GAAGpF,OAEzE,IAAKsF,EAASJ,WAAW,MAAO,OAAOF,EAEvC,IAAIQ,EAAW,GACf,IAEwB,oBAAb7F,UACqB,mBAArB8F,mBAEPD,EAAWC,iBAAiB9F,SAASC,iBAClC8F,iBAAiBJ,GACjBtF,OAEP,CAAE,MAAO2F,GAAI,CAEb,GAAIH,EACFR,EAAUQ,MACL,KAAID,EAGT,MAFAP,EAAUO,CAGZ,CACF,CACA,OAAOP,CACT,CA4GqBY,CADgB,iBAAZjD,EAAuBA,EAAQ3C,OAASR,OAAOmD,GAAW,KAC5B3C,QAErD,IAAKgD,EAAQ,MAAM,IAAI6C,MAAM,mBAC1BtG,IAAGuD,IAAGC,KAAMC,EACjB,CAAE,MAIAzD,EAAIuD,EAAIC,EAAI,GACd,CAEA,MAgDM+C,EAAY,CAACvG,EAAGuD,EAAGC,KACvB,MAAMgD,EAAI,CAACxG,EAAGuD,EAAGC,GAAGlB,IAAKhD,IACvBA,GAAK,MACO,OAAUA,EAAI,MAAQG,KAAKgH,KAAKnH,EAAI,MAAS,MAAO,MAElE,MAAO,MAASkH,EAAE,GAAK,MAASA,EAAE,GAAK,MAASA,EAAE,IAE9CE,EAAgB,CAACC,EAAMC,KAC3B,MAAMC,EAAKN,KAAaI,GAClBG,EAAKP,KAAaK,GACxB,OAAQnH,KAAKC,IAAImH,EAAIC,GAAM,MAASrH,KAAKgF,IAAIoC,EAAIC,GAAM,MAOzD,IAAKhC,EAAGK,EAAGC,GAjEM,EAACpF,EAAGuD,EAAGC,KACtBxD,GAAK,IACLuD,GAAK,IACLC,GAAK,IACL,MAAM9D,EAAMD,KAAKC,IAAIM,EAAGuD,EAAGC,GACzBiB,EAAMhF,KAAKgF,IAAIzE,EAAGuD,EAAGC,GACvB,IAAIsB,EACFK,EACAC,GAAK1F,EAAM+E,GAAO,EACpB,GAAI/E,IAAQ+E,EAAKK,EAAIK,EAAI,MACpB,CACH,MAAM4B,EAAIrH,EAAM+E,EAEhB,OADAU,EAAIC,EAAI,GAAM2B,GAAK,EAAIrH,EAAM+E,GAAOsC,GAAKrH,EAAM+E,GACvC/E,GACN,KAAKM,EACH8E,GAAKvB,EAAIC,GAAKuD,GAAKxD,EAAIC,EAAI,EAAI,GAC/B,MACF,KAAKD,EACHuB,GAAKtB,EAAIxD,GAAK+G,EAAI,EAClB,MACF,KAAKvD,EACHsB,GAAK9E,EAAIuD,GAAKwD,EAAI,EAEtBjC,GAAK,CACP,CACA,MAAO,CAAK,IAAJA,EAASK,EAAGC,IAwCN4B,CAAShH,EAAGuD,EAAGC,GAE3ByD,EAAQ7B,EAAI,GAAM3F,KAAKgF,IAAIW,EAAI,GAAK,GAAK3F,KAAKC,IAAI0F,EAAI,GAAK,IAC1D8B,EAAIC,EAAIC,GAzCI,EAACtC,EAAGK,EAAGC,KAEtB,IAAIpF,EAAGuD,EAAGC,EACV,GAFAsB,GAAK,IAEK,IAANK,EAASnF,EAAIuD,EAAIC,EAAI4B,MACpB,CACH,MAAME,EAAU,CAAC9E,EAAGZ,EAAGc,KACjBA,EAAI,IAAGA,GAAK,GACZA,EAAI,IAAGA,GAAK,GACZA,EAAI,EAAI,EAAUF,EAAc,GAATZ,EAAIY,GAASE,EACpCA,EAAI,GAAcd,EAClBc,EAAI,EAAI,EAAUF,GAAKZ,EAAIY,IAAM,EAAI,EAAIE,GAAK,EAC3CF,GAEHZ,EAAIwF,EAAI,GAAMA,GAAK,EAAID,GAAKC,EAAID,EAAIC,EAAID,EACxC3E,EAAI,EAAI4E,EAAIxF,EAClBI,EAAIsF,EAAQ9E,EAAGZ,EAAGkF,EAAI,EAAI,GAC1BvB,EAAI+B,EAAQ9E,EAAGZ,EAAGkF,GAClBtB,EAAI8B,EAAQ9E,EAAGZ,EAAGkF,EAAI,EAAI,EAC5B,CACA,MAAO,CAACrF,KAAK6E,MAAU,IAAJtE,GAAUP,KAAK6E,MAAU,IAAJf,GAAU9D,KAAK6E,MAAU,IAAJd,KAsB5C6D,CAASvC,EAAGK,EAAG8B,GAElC,GAAIP,EAAc,CAAC1G,EAAGuD,EAAGC,GAAI,CAAC0D,EAAIC,EAAIC,IAJlB,IAIsC,CACxD,MAAME,EAAgBZ,EAAc,CAAC1G,EAAGuD,EAAGC,GAAI,CAAC,EAAG,EAAG,IAChD+D,EAAgBb,EAAc,CAAC1G,EAAGuD,EAAGC,GAAI,CAAC,IAAK,IAAK,OACzD0D,EAAIC,EAAIC,GAAME,GAAiBC,EAAgB,CAAC,EAAG,EAAG,GAAK,CAAC,IAAK,IAAK,IACzE,CAEA,MAAMC,EAhBW,EAACxH,EAAGuD,EAAGC,IACtB,IAAIxD,EAAEqB,SAAS,IAAIC,SAAS,EAAG,OAAOiC,EAAElC,SAAS,IAAIC,SAAS,EAAG,OAAOkC,EACrEnC,SAAS,IACTC,SAAS,EAAG,OAaFmG,CAASP,EAAIC,EAAIC,GAEhC,OADAlF,EAAWW,IAAIJ,EAAK+E,GACbA,CACT,CAhRA9J,OAAOgK,QAzJa,CAClBC,UAAW,CAAC,IAAK,IAAK,KACtBC,aAAc,CAAC,IAAK,IAAK,KACzBC,KAAM,CAAC,EAAG,IAAK,KACfC,WAAY,CAAC,IAAK,IAAK,KACvBC,MAAO,CAAC,IAAK,IAAK,KAClBC,MAAO,CAAC,IAAK,IAAK,KAClBC,OAAQ,CAAC,IAAK,IAAK,KACnBC,MAAO,CAAC,EAAG,EAAG,GACdC,eAAgB,CAAC,IAAK,IAAK,KAC3BC,KAAM,CAAC,EAAG,EAAG,KACbC,WAAY,CAAC,IAAK,GAAI,KACtBC,MAAO,CAAC,IAAK,GAAI,IACjBC,UAAW,CAAC,IAAK,IAAK,KACtBC,UAAW,CAAC,GAAI,IAAK,KACrBC,WAAY,CAAC,IAAK,IAAK,GACvBC,UAAW,CAAC,IAAK,IAAK,IACtBC,MAAO,CAAC,IAAK,IAAK,IAClBC,eAAgB,CAAC,IAAK,IAAK,KAC3BC,SAAU,CAAC,IAAK,IAAK,KACrBC,QAAS,CAAC,IAAK,GAAI,IACnBC,KAAM,CAAC,EAAG,IAAK,KACfC,SAAU,CAAC,EAAG,EAAG,KACjBC,SAAU,CAAC,EAAG,IAAK,KACnBC,cAAe,CAAC,IAAK,IAAK,IAC1BC,SAAU,CAAC,IAAK,IAAK,KACrBC,UAAW,CAAC,EAAG,IAAK,GACpBC,SAAU,CAAC,IAAK,IAAK,KACrBC,UAAW,CAAC,IAAK,IAAK,KACtBC,YAAa,CAAC,IAAK,EAAG,KACtBC,eAAgB,CAAC,GAAI,IAAK,IAC1BC,WAAY,CAAC,IAAK,IAAK,GACvBC,WAAY,CAAC,IAAK,GAAI,KACtBC,QAAS,CAAC,IAAK,EAAG,GAClBC,WAAY,CAAC,IAAK,IAAK,KACvBC,aAAc,CAAC,IAAK,IAAK,KACzBC,cAAe,CAAC,GAAI,GAAI,KACxBC,cAAe,CAAC,GAAI,GAAI,IACxBC,cAAe,CAAC,GAAI,GAAI,IACxBC,cAAe,CAAC,EAAG,IAAK,KACxBC,WAAY,CAAC,IAAK,EAAG,KACrBC,SAAU,CAAC,IAAK,GAAI,KACpBC,YAAa,CAAC,EAAG,IAAK,KACtBC,QAAS,CAAC,IAAK,IAAK,KACpBC,QAAS,CAAC,IAAK,IAAK,KACpBC,WAAY,CAAC,GAAI,IAAK,KACtBC,UAAW,CAAC,IAAK,GAAI,IACrBC,YAAa,CAAC,IAAK,IAAK,KACxBC,YAAa,CAAC,GAAI,IAAK,IACvBC,QAAS,CAAC,IAAK,EAAG,KAClBC,UAAW,CAAC,IAAK,IAAK,KACtBC,WAAY,CAAC,IAAK,IAAK,KACvBC,KAAM,CAAC,IAAK,IAAK,GACjBC,UAAW,CAAC,IAAK,IAAK,IACtB1F,KAAM,CAAC,IAAK,IAAK,KACjB2F,MAAO,CAAC,EAAG,IAAK,GAChBC,YAAa,CAAC,IAAK,IAAK,IACxBC,KAAM,CAAC,IAAK,IAAK,KACjBC,SAAU,CAAC,IAAK,IAAK,KACrBC,QAAS,CAAC,IAAK,IAAK,KACpBC,UAAW,CAAC,IAAK,GAAI,IACrBC,OAAQ,CAAC,GAAI,EAAG,KAChBC,MAAO,CAAC,IAAK,IAAK,KAClBC,MAAO,CAAC,IAAK,IAAK,KAClBC,SAAU,CAAC,IAAK,IAAK,KACrBC,cAAe,CAAC,IAAK,IAAK,KAC1BC,UAAW,CAAC,IAAK,IAAK,GACtBC,aAAc,CAAC,IAAK,IAAK,KACzBC,UAAW,CAAC,IAAK,IAAK,KACtBC,WAAY,CAAC,IAAK,IAAK,KACvBC,UAAW,CAAC,IAAK,IAAK,KACtBC,qBAAsB,CAAC,IAAK,IAAK,KACjCC,UAAW,CAAC,IAAK,IAAK,KACtBC,WAAY,CAAC,IAAK,IAAK,KACvBC,UAAW,CAAC,IAAK,IAAK,KACtBC,UAAW,CAAC,IAAK,IAAK,KACtBC,YAAa,CAAC,IAAK,IAAK,KACxBC,cAAe,CAAC,GAAI,IAAK,KACzBC,aAAc,CAAC,IAAK,IAAK,KACzBC,eAAgB,CAAC,IAAK,IAAK,KAC3BC,eAAgB,CAAC,IAAK,IAAK,KAC3BC,eAAgB,CAAC,IAAK,IAAK,KAC3BC,YAAa,CAAC,IAAK,IAAK,KACxBC,KAAM,CAAC,EAAG,IAAK,GACfC,UAAW,CAAC,GAAI,IAAK,IACrBC,MAAO,CAAC,IAAK,IAAK,KAClBC,QAAS,CAAC,IAAK,EAAG,KAClBC,OAAQ,CAAC,IAAK,EAAG,GACjBC,iBAAkB,CAAC,IAAK,IAAK,KAC7BC,WAAY,CAAC,EAAG,EAAG,KACnBC,aAAc,CAAC,IAAK,GAAI,KACxBC,aAAc,CAAC,IAAK,IAAK,KACzBC,eAAgB,CAAC,GAAI,IAAK,KAC1BC,gBAAiB,CAAC,IAAK,IAAK,KAC5BC,kBAAmB,CAAC,EAAG,IAAK,KAC5BC,gBAAiB,CAAC,GAAI,IAAK,KAC3BC,gBAAiB,CAAC,IAAK,GAAI,KAC3BC,aAAc,CAAC,GAAI,GAAI,KACvBC,UAAW,CAAC,IAAK,IAAK,KACtBC,UAAW,CAAC,IAAK,IAAK,KACtBC,SAAU,CAAC,IAAK,IAAK,KACrBC,YAAa,CAAC,IAAK,IAAK,KACxBC,KAAM,CAAC,EAAG,EAAG,KACbC,QAAS,CAAC,IAAK,IAAK,KACpBC,MAAO,CAAC,IAAK,IAAK,GAClBC,UAAW,CAAC,IAAK,IAAK,IACtBC,OAAQ,CAAC,IAAK,IAAK,GACnBC,UAAW,CAAC,IAAK,GAAI,GACrBC,OAAQ,CAAC,IAAK,IAAK,KACnBC,cAAe,CAAC,IAAK,IAAK,KAC1BC,UAAW,CAAC,IAAK,IAAK,KACtBC,cAAe,CAAC,IAAK,IAAK,KAC1BC,cAAe,CAAC,IAAK,IAAK,KAC1BC,WAAY,CAAC,IAAK,IAAK,KACvBC,UAAW,CAAC,IAAK,IAAK,KACtBC,KAAM,CAAC,IAAK,IAAK,IACjBC,KAAM,CAAC,IAAK,IAAK,KACjBC,KAAM,CAAC,IAAK,IAAK,KACjBC,WAAY,CAAC,IAAK,IAAK,KACvBC,OAAQ,CAAC,IAAK,EAAG,KACjBC,cAAe,CAAC,IAAK,GAAI,KACzBC,IAAK,CAAC,IAAK,EAAG,GACdC,UAAW,CAAC,IAAK,IAAK,KACtBC,UAAW,CAAC,GAAI,IAAK,KACrBC,YAAa,CAAC,IAAK,GAAI,IACvBC,OAAQ,CAAC,IAAK,IAAK,KACnBC,WAAY,CAAC,IAAK,IAAK,IACvBC,SAAU,CAAC,GAAI,IAAK,IACpBC,SAAU,CAAC,IAAK,IAAK,KACrBC,OAAQ,CAAC,IAAK,GAAI,IAClBC,OAAQ,CAAC,IAAK,IAAK,KACnBC,QAAS,CAAC,IAAK,IAAK,KACpBC,UAAW,CAAC,IAAK,GAAI,KACrBC,UAAW,CAAC,IAAK,IAAK,KACtBC,UAAW,CAAC,IAAK,IAAK,KACtBC,KAAM,CAAC,IAAK,IAAK,KACjBC,YAAa,CAAC,EAAG,IAAK,KACtBC,UAAW,CAAC,GAAI,IAAK,KACrBC,IAAK,CAAC,IAAK,IAAK,KAChBC,KAAM,CAAC,EAAG,IAAK,KACfC,QAAS,CAAC,IAAK,IAAK,KACpBC,OAAQ,CAAC,IAAK,GAAI,IAClBC,YAAa,CAAC,IAAK,IAAK,KACxBC,UAAW,CAAC,GAAI,IAAK,KACrBC,OAAQ,CAAC,IAAK,IAAK,KACnBC,MAAO,CAAC,IAAK,IAAK,KAClBC,MAAO,CAAC,IAAK,IAAK,KAClBC,WAAY,CAAC,IAAK,IAAK,KACvBC,OAAQ,CAAC,IAAK,IAAK,GACnBC,YAAa,CAAC,IAAK,IAAK,MAIEC,QAAQ,EAAEC,GAAOhR,EAAGuD,EAAGC,OACjD,MAAMyN,EAAOjN,IACX,MAAM1E,EAAI0E,EAAI,IACd,OAAO1E,GAAK,OAAUA,EAAI,MAAQG,KAAKgH,KAAKnH,EAAI,MAAS,MAAO,MAE5D4R,EAAI,MAASD,EAAIjR,GAAK,MAASiR,EAAI1N,GAAK,MAAS0N,EAAIzN,GACrD8D,GAAiB4J,EAAI,KAAQ,IAC7B3J,EAAgB,MAAQ2J,EAAI,KAClChO,EAA2B8N,EAAK9Q,eAC9BoH,GAAiBC,EAAgB,UAAY,YC/QjD,MAAM4J,EAAe,IAAIC,IAAI,CAC3B,MACA,OACA,IACA,KACA,SACA,IACA,KACA,IACA,IACA,QACA,KACA,KACA,KACA,IACA,MACA,MACA,OACA,SAWIC,EAAgB,IAAID,IAAI,CAC5B,OACA,MACA,MACA,QACA,QACA,SACA,MACA,YAGIE,EAAiB,IAAIF,IAAI,CAC7B,SACA,QACA,SACA,WACA,SACA,QACA,MACA,OACA,QACA,QACA,SACA,aAGIG,EAAoB,sGAuE1B,SAASC,EAAaC,EAAMC,EAAaC,GACvC,GAAIF,EAAKG,WAAaC,KAAKC,UACzB,OAAO1R,SAAS2R,eAAeN,EAAKO,WAEtC,GAAIP,EAAKG,WAAaC,KAAKI,aACzB,OAAO,KAET,GAAIR,EAAKG,WAAaC,KAAKK,aACzB,OAAO,KAET,MAAMC,EAAMV,EAAKW,QAAQC,cACzB,GACEf,EAAe5O,IAAIyP,IACnBA,EAAIhS,SAAS,WACbgS,EAAIhS,SAAS,MACbgS,EAAIhS,SAAS,KAEb,OAAO,KAET,IAAKuR,EAAYhP,IAAIyP,GAAM,CACzB,MAAMG,EAAOlS,SAASmS,yBAKtB,OAJAtT,MAAMuT,KAAKf,EAAKgB,YAAY1B,QAAS2B,IACnC,MAAMC,EAAYnB,EAAakB,EAAOhB,EAAaC,GAC/CgB,GAAWL,EAAKvS,YAAY4S,KAE3BL,CACT,CACA,MAAMM,EAAKxS,SAASyS,cAAcpB,EAAKW,SASvC,OARAnT,MAAMuT,KAAKf,EAAKqB,YAAc,IAAI/B,QAASgC,IACzCH,EAAGtS,aAAayS,EAAK/B,KAAM+B,EAAKpQ,SAvFpC,SAA4BiQ,EAAIjB,GAC9B,MAAMqB,EAAgB,GACtB/T,MAAMuT,KAAKI,EAAGE,YAAc,IAAI/B,QAASgC,IACvC,MAAM/B,EAAO+B,EAAK/B,KAAK9Q,cACjBqF,EAAMwN,EAAKpQ,MACjB,GAAKgP,EAAajP,IAAIsO,KAASA,EAAKrL,WAAW,MAA/C,CAIA,GAAa,SAATqL,GAA4B,QAATA,EAAgB,CACrC,MAAMiC,EAA4B,iBAAR1N,EAAmBA,EAAI9E,OAAOP,cAAgB,GACxE,IACE+S,EAAWtN,WAAW,gBACtBsN,EAAWtN,WAAW,cACtBsN,EAAWtN,WAAW,YAGX,QAATqL,IACAiC,EAAWtN,WAAW,gBACrBsN,EAAWtN,WAAW,uBAIvB,MAAa,SAATqL,OACF4B,EAAGtS,aAAa,OAAQ,UAG1B0S,EAAcE,KAAKH,EAAK/B,MAI5B,IAAKO,EAAkB1P,KAAK0D,GAC1B,MAAa,SAATyL,OACF4B,EAAGtS,aAAa,OAAQ,UAG1B0S,EAAcE,KAAKH,EAAK/B,KAG5B,CACA,GAAa,WAATA,GAAoC,iBAARzL,GAAiD,WAA7BA,EAAI9E,OAAOP,cAA4B,CACzF,MAAMiT,GAAOP,EAAGQ,aAAa,QAAU,IAAIrP,MAAM,OAAOsP,OAAOhU,SAC1D8T,EAAIhT,SAAS,aAAagT,EAAID,KAAK,YACnCC,EAAIhT,SAAS,eAAegT,EAAID,KAAK,cAC1CN,EAAGtS,aAAa,MAAO6S,EAAIlP,KAAK,KAClC,CArCA,MAFE+O,EAAcE,KAAKH,EAAK/B,QAyC5BgC,EAAcjC,QAASC,GAAS4B,EAAGrS,gBAAgByQ,IAEnD,MAAMsC,EAAcV,EAAGQ,aAAa,UACpC,GAAmB,MAAfR,EAAGR,SAA0C,iBAAhBkB,GAAiE,WAArCA,EAAY7S,OAAOP,cAA4B,CAC1G,MAAMiT,GAAOP,EAAGQ,aAAa,QAAU,IAAIrP,MAAM,OAAOsP,OAAOhU,SAC1D8T,EAAIhT,SAAS,aAAagT,EAAID,KAAK,YACnCC,EAAIhT,SAAS,eAAegT,EAAID,KAAK,cAC1CN,EAAGtS,aAAa,MAAO6S,EAAIlP,KAAK,KAClC,CACF,CAiCEsP,CAAmBX,EAAIjB,GACvB1S,MAAMuT,KAAKf,EAAKgB,YAAY1B,QAAS2B,IACnC,MAAMc,EAAiBhC,EAAakB,EAAOhB,EAAaC,GACpD6B,GAAgBZ,EAAG7S,YAAYyT,KAE9BZ,CACT,CAuBO,SAASa,EAAiBC,GAC/B,IAAKA,GAA0B,iBAAVA,EAAoB,MAAO,GAEhD,MAAMC,EAxBR,SAAwBC,GACtB,GAAyB,oBAAdC,UACT,IACE,MACMC,GADS,IAAID,WACAE,gBAAgBH,EAAM,aACzC,GAAIE,GAAOA,EAAIE,KAAM,OAAOF,EAAIE,IAClC,CAAE,MAAO,CAEX,GAAwB,oBAAb5T,SAA0B,CACnC,MAAM6T,EAAW7T,SAASyS,cAAc,YACxC,GAAI,YAAaoB,EAEf,OADAA,EAASC,UAAYN,EACdK,EAASE,QAElB,MAAMC,EAAMhU,SAASyS,cAAc,OAEnC,OADAuB,EAAIF,UAAYN,EACTQ,CACT,CACA,OAAO,IACT,CAKoBC,CAAeX,GACjC,IAAKC,EAAW,MAAO,GAEvB,MAAMW,EAAUlU,SAASmS,yBACzBtT,MAAMuT,KAAKmB,EAAUlB,YAAY1B,QAAS2B,IACxC,MAAMC,EAAYnB,EAAakB,EAAOvB,EAAcE,GAChDsB,GAAW2B,EAAQvU,YAAY4S,KAGrC,MAAM4B,EAAUnU,SAASyS,cAAc,OAUvC,OATA0B,EAAQxU,YAAYuU,GAEpBC,EAAQC,iBAAiB,sBAAsBzD,QAASvK,IACtD,MAAM2M,GAAO3M,EAAE4M,aAAa,QAAU,IAAIrP,MAAM,OAAOsP,OAAOhU,SACzD8T,EAAIhT,SAAS,aAAagT,EAAID,KAAK,YACnCC,EAAIhT,SAAS,eAAegT,EAAID,KAAK,cAC1C1M,EAAElG,aAAa,MAAO6S,EAAIlP,KAAK,QAG1BsQ,EAAQL,SACjB,CAEO,SAASO,EAAaf,EAAOgB,EAAO,IACzC,GAAqB,iBAAVhB,IAAuBA,EAAMjT,OAAQ,MAAO,GACvD,IACE,IAAKiU,EAAKC,eA7JP,WACL,IACE,OAAOtV,QACa,oBAAX0B,QACPA,OAAO6T,WAC8B,mBAA9B7T,OAAO6T,UAAUC,SAE5B,CAAE,MAAOzO,GAAI,CACb,OAAO,CACT,CAoJ+B0O,GAAgB,CACzC,MACMC,EADYhU,OAAO6T,UACCC,SAASnB,EAAO,CACxCvC,aAAclS,MAAMuT,KAAKrB,GACzB6D,aAAc/V,MAAMuT,KAAKnB,GACzB4D,mBAAoB1D,IAGhBgD,EAAUnU,SAASyS,cAAc,OAcvC,OAbA0B,EAAQL,UAAYa,EACpBR,EAAQC,iBAAiB,WAAWzD,QAASvK,IAC3C,MAAM0O,EAAO1O,EAAE4M,aAAa,SAAW,GAClC7B,EAAkB1P,KAAKqT,IAC1B1O,EAAElG,aAAa,OAAQ,OAG3BiU,EAAQC,iBAAiB,sBAAsBzD,QAASvK,IACtD,MAAM2M,GAAO3M,EAAE4M,aAAa,QAAU,IAAIrP,MAAM,OAAOsP,OAAOhU,SACzD8T,EAAIhT,SAAS,aAAagT,EAAID,KAAK,YACnCC,EAAIhT,SAAS,eAAegT,EAAID,KAAK,cAC1C1M,EAAElG,aAAa,MAAO6S,EAAIlP,KAAK,QAE1BsQ,EAAQL,SACjB,CACF,CAAE,MAAOiB,GACPC,QAAQC,KAAK,+CAAgDF,EAC/D,CACA,OAAO1B,EAAiBC,EAC1B,CCzPO,SAAS4B,EAAaZ,EAAO,IAClC,GAAwB,oBAAbtU,SAA0B,OAAO,KAC5C,MAAMmV,EAAWb,GAAwB,iBAATA,IAAsBzV,MAAMC,QAAQwV,GAAQA,EAAO,CAAA,EAC7Ec,EAAUjW,OAAOgW,EAASzS,MAC1BA,EAAOvD,OAAOC,SAASgW,IAAYA,EAAU,EAAIA,EAAU,GAC3DC,EAAqC,iBAAnBF,EAASG,OAAsBH,EAASG,MAAMjV,OAAS8U,EAASG,MAAMjV,OAAS,eACjGiV,EAAS,cAAc7T,KAAK4T,IAAa,mBAAmB5T,KAAK4T,GAAa,eAAiBA,EAC/FE,EAAqC,iBAAlBJ,EAASK,KAAoBL,EAASK,KAAO,GAChErB,EAAUnU,SAASyS,cAAc,QACvC0B,EAAQsB,UAAY,eACpBtB,EAAQjU,aAAa,OAAQ,UAC7BiU,EAAQjU,aAAa,aAAcqV,GAAa,WAEhD,MAAMG,EAAS3W,IACV2W,EAAO9X,sBACVuW,EAAQwB,MAAMC,QAAU,cACxBzB,EAAQwB,MAAME,WAAa,SAC3B1B,EAAQwB,MAAMG,IAAM,OAGtB,MAAMC,EAAQ,6BACRC,EAAMhW,SAASiW,gBAAgBF,EAAO,OAC5CC,EAAI9V,aAAa,QAASL,OAAO6C,IACjCsT,EAAI9V,aAAa,SAAUL,OAAO6C,IAClCsT,EAAI9V,aAAa,UAAW,aAC5B8V,EAAI9V,aAAa,cAAe,QAChC,MAAMgW,EAASlW,SAASiW,gBAAgBF,EAAO,UAsB/C,GArBAG,EAAOC,UAAUC,IAAI,uBACrBF,EAAOhW,aAAa,KAAM,MAC1BgW,EAAOhW,aAAa,KAAM,MAC1BgW,EAAOhW,aAAa,IAAK,MACzBgW,EAAOhW,aAAa,OAAQ,QAC5BgW,EAAOhW,aAAa,SAAUoV,GAC9BY,EAAOhW,aAAa,eAAgB,KACpCgW,EAAOhW,aAAa,iBAAkB,SACjCwV,EAAO9X,sBACVsY,EAAOP,MAAMU,QAAU,OACvBH,EAAOP,MAAMW,gBAAkB,KAC/BJ,EAAOP,MAAMY,iBAAmB,KAChCL,EAAOP,MAAMa,gBAAkB,SAC1B9V,MACHwV,EAAOP,MAAMc,UAAY,qCAI7BT,EAAIrW,YAAYuW,GAChB/B,EAAQxU,YAAYqW,GAEhBT,EAAW,CACb,MAAMmB,EAAM1W,SAASyS,cAAc,QACnCiE,EAAIjB,UAAY,qBACXC,EAAO9X,sBACV8Y,EAAIf,MAAMgB,SAAW,QAEvBD,EAAIE,YAAcrB,EAClBpB,EAAQxU,YAAY+W,EACtB,CAEA,IAAKhB,EAAO9X,qBAA2C,oBAAboC,WAA6BA,SAAS6W,eAAe,wBAC7F,IACE,MAAMC,EAAK9W,SAASyS,cAAc,SAClCqE,EAAGC,GAAK,uBACRD,EAAGF,YAAc,mGACjB,MAAMI,EAAShX,SAASiX,MAAQjX,SAASC,gBACrC+W,GAAQA,EAAOrX,YAAYmX,EACjC,CAAE,MACA,CAIJ,OAAO3C,CACT,CCvEO,SAAS+C,EAAUC,EAAOvY,EAASwY,GACxC,MAAMC,EAASzY,GAAS0Y,IACxB,IAAKD,GAA4B,iBAAXA,EAAqB,OAE3C,MAAME,EAAU1Y,MAAMC,QAAQuY,GAC1BA,EAAOpE,OAAQuE,GAASA,GAAwB,iBAATA,GACvC,CAACH,GACL,GAAuB,IAAnBE,EAAQ9T,OAAc,OAE1B,MAAMgU,EAAW,GAEjBF,EAAQ5G,QAAQ,CAAC/L,EAAK8S,KACpB,IAAK9S,GAAsB,iBAARA,EAAkB,OACrC,MAAM+S,EAAM,IAAK/S,GAEZ+S,EAAIC,QACPD,EAAIC,MAAQL,EAAQ9T,OAAS,EAAI,UAAUiU,EAAM,IAAM,sBAGzD,MAAMG,EAAyB,SAAhBF,EAAIG,UAAwBH,EAAIG,WAAaH,EAAI7C,KAC1DtC,EAAKxS,SAASyS,cAAcoF,EAAS,IAAM,UAEjD,GAAIA,EAAQ,CACV,GAAIF,EAAI7C,KAAM,CACZ,MAAMiD,EAAclY,OAAO8X,EAAI7C,MAAMzU,OAC/B2X,EAAc,iEAAiEvW,KAAKsW,GAC1FvF,EAAGsC,KAAOkD,EAAc,IAAMD,CAChC,MACEvF,EAAGtS,aAAa,OAAQ,UACxBsS,EAAGyF,SAAW,EAEZN,EAAIX,SAAQxE,EAAGwE,OAASW,EAAIX,QAChC,MAAMkB,EAAS,IAAIlH,KAAK2G,EAAI5E,KAAO,IAAIpP,MAAM,OAAOsP,OAAOhU,UACjC,iBAAf0Y,EAAIX,QAA2D,WAApCW,EAAIX,OAAO3W,OAAOP,gBACtDoY,EAAO9B,IAAI,YACX8B,EAAO9B,IAAI,eAEb5D,EAAGO,IAAMlU,MAAMuT,KAAK8F,GAAQrU,KAAK,IACnC,MACE2O,EAAG2F,KAAO,SAGZ3F,EAAGtS,aAAa,aAAcyX,EAAIS,WAAaT,EAAIC,OAEnD,MAAMS,EACJV,EAAIzU,WACJyU,EAAIrC,OACJ1W,EAAQsE,WACRH,EAAiCnE,EAAQ0Z,iBACrCC,EACJZ,EAAIW,iBACJX,EAAIa,aACH5Z,EAAQ0Z,gBACLG,EAAsB7Z,EAAQ0Z,iBAC9B,0BAGAI,EADiC,iBAAjBL,GAA6B,oBAAoB5W,KAAK4W,EAAahY,QACzD,GAAGgY,EAAahY,WAAa,2BAE7DmS,EAAGiD,UAAY,YACV1W,IAAYnB,qBACfN,OAAOmD,OAAO+R,EAAGmD,MAAO,CACtBgD,WAAoB,IAARjB,EAAY,OAAS,MACjCkB,QAAS,WACTC,aAAc,MACdlC,SAAU,OACVmC,WAAY,MACZC,WAAY,IACZC,OAAQ,aAAaN,IACrBpD,MAAO+C,EACPG,WAAYD,EACZU,OAAQ,UACRC,WAAY,SACZC,WAAY,MAIhB3G,EAAGoE,YAAce,EAAIC,MAErB,MAAMwB,EAAUC,UACd,IACE,GAA2B,mBAAhB1B,EAAIyB,QAAwB,CACrC,MAAME,EAAM3B,EAAIyB,QAAQpT,GACpBsT,GAAKC,YAAYD,CACvB,CACF,CAAE,MAAOvE,GACPC,QAAQwE,MAAM,6BAA8BzE,EAC9C,CAAC,SACuB,IAAlB4C,EAAI8B,WAA0C,mBAAZrC,GACpCA,EAAQD,EAEZ,GAGIuC,EAAa1T,KACb6R,GAAWF,EAAI7C,MAAmB,UAAV9O,EAAE3D,KAA6B,MAAV2D,EAAE3D,MACjD2D,EAAE2T,iBACFP,EAAQpT,KAIZwM,EAAGoH,iBAAiB,QAASR,GACzBvB,IAAWF,EAAI7C,MACjBtC,EAAGoH,iBAAiB,UAAWF,GAGjC,MAAMG,EAAc,KAClBrH,EAAGsH,oBAAoB,QAASV,GAC5BvB,IAAWF,EAAI7C,MACjBtC,EAAGsH,oBAAoB,UAAWJ,IAGtClH,EAAGuH,SAAWF,EACdpC,EAAS3E,KAAK+G,GAEd,MAAMG,EACJ7C,EAAM8C,cAAc,oBACpB9C,EAAM8C,cAAc,qBACpB9C,EAAM8C,cAAc,uBAClBD,EACF7C,EAAM+C,aAAa1H,EAAIwH,GAEvB7C,EAAMxX,YAAY6S,KAItB,MAAM2H,EAAchD,EAAMiD,YAC1BjD,EAAMiD,YAAc,KAClBD,MACA1C,EAAS9G,QAAS/M,GAAMA,KAE5B,CASO,SAASyW,EAAiBlD,EAAOvY,EAASwY,GAC/C,MAAMkD,EAAO1b,GAAS0b,KACtB,IAAKA,EAAM,OAEX,MAAMC,EAAuB,mBAATD,EACpB,IAAKC,IAAyB,iBAATD,GAAqBzb,MAAMC,QAAQwb,IAAQ,OAEhE,MAAME,EAAUD,EAAO,CAAEE,OAAQH,GAAS,IAAKA,GACzCI,EACqB,iBAAlBF,EAAQ5C,OAAsB4C,EAAQ5C,MAAMvX,OAC/Cma,EAAQ5C,MAAMvX,OACd,OAEAsa,EAAgBxb,OAAOP,GAASgc,UAChCC,GACsB,IAA1BL,EAAQK,eACR1b,OAAOC,SAASub,IAChBA,EAAgB,EAEZG,EAAM9a,SAASyS,cAAc,UACnCqI,EAAI3C,KAAO,SACX2C,EAAIrF,UAAY,iBAChBqF,EAAI5a,aAAa,aAAc,GAAGwa,YAElC,MAAMxX,EACJtE,EAAQsE,WACRH,EAAiCnE,EAAQ0Z,iBACrCyC,EAAUnc,EAAQ0Z,gBACpBG,EAAsB7Z,EAAQ0Z,iBAC9B,yBAKE0C,EAFiB,iBAAd9X,GACP,oBAAoBzB,KAAKyB,EAAU7C,QAEjC,GAAG6C,EAAU7C,WACb,4BAECtB,IAAYnB,qBACfN,OAAOmD,OAAOqa,EAAInF,MAAO,CACvBgD,WAAY,OACZC,QAAS,WACTC,aAAc,MACdlC,SAAU,OACVmC,WAAY,MACZC,WAAY,IACZC,OAAQ,aAAagC,IACrB1F,MAAOpS,EACPsV,WAAYuC,EACZ9B,OAAQ,UACRC,WAAY,SACZC,WAAY,IACZvD,QAAS,cACTC,WAAY,SACZC,IAAK,QAIT,IAAImF,EAAe5b,KAAKC,IAAI,EAAGD,KAAK6b,MAAMP,GAAiB,MAAQ,MACnE,MAAMQ,EAAc,KAClBL,EAAIlE,YAAciE,EACd,GAAGH,MAAcO,MACjBP,GAENS,IAEA,IAAIC,EAAa,KACbC,GAAW,EACXR,IACFO,EAAaE,YAAY,KACnBD,IACJJ,EAAe5b,KAAKC,IAAI,EAAG2b,EAAe,GAC1CE,IACIF,GAAgB,GAAKG,IACvBG,cAAcH,GACdA,EAAa,QAEd,KAC8B,mBAAtBA,GAAYI,OACrBJ,EAAWI,SAIfrE,EAAMsE,WAAa,KACjBJ,GAAW,GAEblE,EAAMuE,YAAc,KAClBL,GAAW,GAGb,MAAMM,EAAe,KACfP,IACFG,cAAcH,GACdA,EAAa,MAEfjE,EAAMsE,WAAa,KACnBtE,EAAMuE,YAAc,MAGhBtC,EAAUC,UACdsC,IACAb,EAAIhB,oBAAoB,QAASV,GACjC,IACE,GAA8B,mBAAnBoB,EAAQC,OAAuB,CACxC,MAAMnB,EAAMkB,EAAQC,OAAOzU,EAAGmR,GAC1BmC,GAAKC,YAAYD,CACvB,CACF,CAAE,MAAOvE,GACPC,QAAQwE,MAAM,qBAAsBzE,EACtC,CAAC,QACwB,mBAAZqC,GACTA,EAAQD,EAEZ,GAGF2D,EAAIlB,iBAAiB,QAASR,GAE9B0B,EAAIf,SAAW,KACb4B,IACAb,EAAIhB,oBAAoB,QAASV,IAEnCjC,EAAMyE,aAAe,KACnBD,IACAb,EAAIhB,oBAAoB,QAASV,IAGnC,MAAMY,EACJ7C,EAAM8C,cAAc,qBACpB9C,EAAM8C,cAAc,uBAClBD,EACF7C,EAAM+C,aAAaY,EAAKd,GAExB7C,EAAMxX,YAAYmb,EAEtB,CAEO,SAASe,EAAkB1E,EAAOvY,EAASwY,GAChD,MAAM0E,EAAW9b,SAASyS,cAAc,UACxCqJ,EAAS3D,KAAO,SAChB2D,EAAS5b,aAAa,aAAc,sBACpC4b,EAAS5b,aAAa,QAAS,SAC/B4b,EAASlF,YAAc,IAEvB,MAAMmF,EAAiBnd,EAAQsE,WAAaH,EAAiCnE,EAAQ0Z,iBAErFwD,EAASrG,UAAY,kBAChB1W,IAAYnB,qBACfN,OAAOmD,OAAOqb,EAASnG,MAAO,CAC9B6C,WAAY,OACZQ,OAAQ,OACR1D,MAAOyG,EACPpF,SAAU,OACVgC,WAAY,OACZM,OAAQ,UACRF,WAAY,IACZH,QAAS,UAIX,MAAMQ,EAAU,KACS,mBAAZhC,GAAwBA,EAAQD,IAE7C2E,EAASlC,iBAAiB,QAASR,GAEnCjC,EAAM6E,oBAAsB,KAC1BF,EAAShC,oBAAoB,QAASV,IAGxCjC,EAAMxX,YAAYmc,EACpB,CAEA,SAASrD,EAAsBsC,GAC7B,OAAKA,GAEa,YADAhY,EAAiCgY,GAE1C,mBAHY,wBAMvB,CAsBO,SAASkB,EAAkB9E,EAAOvY,EAAU,IACjD,MAAMsd,EAAclc,SAASyS,cAAc,OAC3CyJ,EAAYzG,UAAY,qBACxB0B,EAAMgF,aAAeD,EACrB,MAAME,EAAkBxd,EAAQia,cAAgB,IAC1CwD,EAAevY,SAASsY,EAAiB,IACzCE,EAAkBnd,OAAOC,SAASid,IAAiBA,EAAe,EAAIA,EAAe,EAE3F,IAAIE,EAAmB,EACnBC,EAAsB,MAC1B,GAAsC,iBAA3B5d,EAAQ6d,gBAA+Btd,OAAOC,SAASR,EAAQ6d,iBAAmB7d,EAAQ6d,eAAiB,EACpHF,EAAmB3d,EAAQ6d,eAC3BD,EAAsB,GAAGD,WACpB,GAAsC,iBAA3B3d,EAAQ6d,gBAA+B7d,EAAQ6d,eAAepc,OAAQ,CACtF,MAAM2D,EAAUpF,EAAQ6d,eAAepc,OACjCqc,EAAcvY,WAAWH,GAC3B7E,OAAOC,SAASsd,IAAgBA,EAAc,IAC5C1Y,EAAQC,SAAS,QAAUD,EAAQC,SAAS,OAC9CsY,EAAiC,GAAdG,EACnBF,EAAsBxY,IAEtBuY,EAAmBG,EACnBF,EAAsB,gBAAgB/a,KAAKuC,GAAW,GAAG0Y,MAAkB1Y,GAGjF,CAEA,MAAM4W,EAAWzb,OAAOP,EAAQgc,UAAY,MACtC+B,EAAmBtd,KAAKC,IAAI,EAAGsb,EAAW,GAE1CgC,EAAavd,KAAKgF,IAAIiY,EAAoC,EAAnBC,GACvCM,EAAaP,EAAkB,EACjC,eAA4B,EAAbM,OACf,OAEEE,EAA0C,YAA9Ble,EAAQme,mBAAiE,eAA9Bne,EAAQme,mBAAoE,QAA9Bne,EAAQme,kBACnHb,EAAYc,YAAcJ,EAC1BV,EAAYe,YAAcJ,EAC1BX,EAAYgB,WAAaJ,EAEzB,MAAMK,EAAave,EAAQwe,kBAAoBxe,EAAQye,eAAiB,eAwBxE,GAtBKte,IAAYnB,qBACfN,OAAOmD,OAAOyb,EAAYvG,MAAO,CAC/B2H,SAAU,WACVC,KAAM,GAAGX,MACTY,OAAQhB,EACRhE,WAAY2E,EACZM,MAAOX,EAAY,KAAO,GAAGD,IAC7Ba,WAAY,SAASf,aACrB,CAA8B,QAA7B/d,EAAQ+e,iBAA6B,MAAQ,UAAW,IACzD9E,aAAiB0D,EAAmB,EAAtB,KACdlG,QAAS,MACT3Y,OAAQ,IACRkgB,WAAY,UAIhBzG,EAAMxX,YAAYuc,GAG2B,kBAArBtd,EAAQif,UAC7B5e,QAAQL,EAAQkf,mBAA0C,IAArBlf,EAAQgc,UAAkBhc,EAAQgc,WAAamD,WAAkC/e,IAArBJ,EAAQif,SAS1G,OANA3B,EAAY/F,UAAUC,IAAI,oCACrBrX,IAAYnB,sBAtFrB,WACE,GAAwB,oBAAboC,UAA4BA,SAAS6W,eAAe,uCAC7D,OAEF,MAAMC,EAAK9W,SAASyS,cAAc,SAClCqE,EAAGC,GAAK,sCACRD,EAAGF,YAAc,mUAUjB,MAAMI,EAAShX,SAASiX,MAAQjX,SAASC,gBACrC+W,GAAQA,EAAOrX,YAAYmX,EACjC,CAqEMkH,GACA9B,EAAYvG,MAAMc,UAAY,gFAEhCyF,EAAYvG,MAAM8H,MAAQZ,GAK5B,QAAyB7d,IAArBJ,EAAQif,SAAwB,CAClC,IAAII,EAAM9e,OAAOP,EAAQif,UAMzB,OALK1e,OAAOC,SAAS6e,KAAMA,EAAM,GAC7BA,EAAM,GAAKA,EAAM,IAAGA,GAAY,KACpCA,EAAM5e,KAAKgF,IAAI,IAAKhF,KAAKC,IAAI,EAAG2e,IAChC/B,EAAYvG,MAAM8H,MAAQ,GAAGQ,UAC7B/B,EAAYvG,MAAM+H,WAAa,mBAEjC,CAEA,GAAyB,IAArB9e,EAAQgc,UAAkBhc,EAAQgc,WAAamD,IAKnD,GAAIrd,IACFwb,EAAYvG,MAAMC,QAAU,YACvB,GAAmC,mBAAxBsG,EAAYgC,QAAwB,CACpD,MAAMC,EAAYrB,EACd,CAAC,CAAEW,MAAO,MAAQ,CAAEA,MAAOZ,IAC3B,CAAC,CAAEY,MAAOZ,GAAc,CAAEY,MAAO,OACrCtG,EAAMiH,mBAAqBlC,EAAYgC,QACrCC,EACA,CACEvD,SAAU+B,EACV0B,OAAQ,SACRC,KAAM,WACNC,MAAO,IAGb,MACErC,EAAYvG,MAAM+H,WAAa,SAASf,aACxC6B,sBAAsB,KACpBtC,EAAYvG,MAAM8H,MAAQX,EAAYD,EAAa,YAtBrDX,EAAYvG,MAAM8H,MAAQ,IAyB9B,CAEO,SAASgB,EAAkBtH,GAChC,IAAKA,EAAO,OACZ,GAAIA,EAAMuH,aAAc,OAExB,GAAIhe,IAMF,OALAyW,EAAMuH,cAAe,EACrBvH,EAAMxB,MAAM+H,WAAa,OACzBvG,EAAMxB,MAAMU,QAAU,IACtBc,EAAMxB,MAAMgJ,UAAY,qBACxBxH,EAAMhB,UAAUC,IAAI,UAItB,MAAMwI,EAAU,KACd,IAAIzH,EAAMuH,aAAV,CACAvH,EAAMuH,cAAe,EAErB,IACOvH,EAAM0H,YACb,CAAE,MAAO,CAETL,sBAAsB,KACpBrH,EAAMxB,MAAMU,QAAU,IACtBc,EAAMxB,MAAMgJ,UAAY,OACxBxH,EAAMhB,UAAUC,IAAI,WAVE,GActBe,EAAM2H,YACRF,IAGAJ,sBAAsB,KAChBrH,EAAM2H,YACRF,IAEAJ,sBAAsB,KACpBI,OAKV,CC9eA,IAAIG,EAAe,KACfC,GAAe,EAKfC,GAAiB,EACrB,GAAsB,oBAAXte,OACT,GAAyB,oBAAdue,WAA6BA,UAAUC,gBAAgBC,cAChEH,GAAiB,MACZ,CACL,MAAMI,EAAY,KAEhB,GADAJ,GAAiB,EACbF,GAAuC,cAAvBA,EAAaO,MAC/B,IACEP,EAAaQ,SAASC,MAAM,OAC9B,CAAE,MAAO,CAEX,IACE7e,OAAOmZ,oBAAoB,cAAeuF,GAAW,GACrD1e,OAAOmZ,oBAAoB,UAAWuF,GAAW,GACjD1e,OAAOmZ,oBAAoB,aAAcuF,GAAW,EACtD,CAAE,MAAO,GAEX,IACE1e,OAAOiZ,iBAAiB,cAAeyF,EAAW,CAAEI,SAAS,EAAMC,MAAM,EAAMC,SAAS,IACxFhf,OAAOiZ,iBAAiB,UAAWyF,EAAW,CAAEI,SAAS,EAAMC,MAAM,EAAMC,SAAS,IACpFhf,OAAOiZ,iBAAiB,aAAcyF,EAAW,CAAEI,SAAS,EAAMC,MAAM,EAAMC,SAAS,GACzF,CAAE,MAAO,CACX,CAOF,MAAMC,EAAqB,IAAIzd,IAQxB,SAAS0d,EAAgBC,GAAc,GAC5C,GAAsB,oBAAXnf,OAAwB,OAAO,KAC1C,MAAMof,EAAWpf,OAAOqf,cAAgBrf,OAAOsf,mBAC/C,IAAKF,EAAU,OAAO,KAEtB,IAAKhB,EACH,IACEA,EAAe,IAAIgB,CACrB,CAAE,MACA,OAAO,IACT,CAGF,MAAMG,EACJjB,GACsB,oBAAdC,WACNA,UAAUC,gBACVD,UAAUC,eAAeC,cAE7B,GAAIL,GAAuC,cAAvBA,EAAaO,QAA0BQ,GAAeI,GACxE,IACEnB,EAAaQ,SAASC,MAAM,OAC9B,CAAE,MAAO,CAGX,OAAOT,CACT,CAEA,IAAIoB,EAAgB,KAMb,SAASC,IACd,MAAMC,EAAMR,GAAgB,GAC5B,IAAKQ,GAAqC,mBAAvBA,EAAIC,eAA+B,OAAO,KAC7D,IAAKH,EACH,IACEA,EAAgBE,EAAIC,iBACpBH,EAAcI,QAAU,IACxBJ,EAAcK,QAAQH,EAAII,YAC5B,CAAE,MACA,OAAO,IACT,CAEF,OAAON,CACT,CAOA,SAASO,EAAWL,EAAKhP,GACnB8O,EACF9O,EAAKmP,QAAQL,GAEb9O,EAAKmP,QAAQH,EAAII,YAErB,CAOO,SAASE,EAAoBC,EAAKC,GAClCD,IACLA,EAAIE,QAAU,KACZ,IACEF,EAAIG,aACJF,GAAME,cACR,CAAE,MAAO,GAEb,CAsbA,MAAMC,EAAkB,CACtBC,OA/aF,SAA0BZ,EAAKa,EAAMtf,GACnC,GAAa,YAATsf,EAEY,CAAC,OAAQ,OAAQ,QACzBvQ,QAAQ,CAACwQ,EAAMzJ,KACnB,MAAMkJ,EAAMP,EAAIe,mBACVP,EAAOR,EAAIgB,aACjBT,EAAIzI,KAAO,OACXyI,EAAIU,UAAUC,eAAeJ,EAAMvf,EAAY,IAAN8V,GAEzCmJ,EAAKA,KAAKU,eAAe,KAAO3f,EAAY,IAAN8V,GACtCmJ,EAAKA,KAAKW,6BAA6B,IAAM5f,EAAY,IAAN8V,EAAa,KAChEmJ,EAAKA,KAAKW,6BAA6B,KAAQ5f,EAAY,IAAN8V,EAAa,KAElEkJ,EAAIJ,QAAQK,GACZH,EAAWL,EAAKQ,GAChBF,EAAoBC,EAAKC,GAEzBD,EAAIa,MAAM7f,EAAY,IAAN8V,GAChBkJ,EAAIc,KAAK9f,EAAY,IAAN8V,EAAa,YAEzB,GAAa,UAATwJ,EAEK,CAAC,IAAK,KACdvQ,QAAQ,CAACwQ,EAAMzJ,KACnB,MAAMkJ,EAAMP,EAAIe,mBACVP,EAAOR,EAAIgB,aACjBT,EAAIzI,KAAO,WACXyI,EAAIU,UAAUC,eAAeJ,EAAMvf,EAAY,GAAN8V,GAEzCmJ,EAAKA,KAAKU,eAAe,KAAO3f,EAAY,GAAN8V,GACtCmJ,EAAKA,KAAKW,6BAA6B,IAAM5f,EAAY,GAAN8V,EAAY,KAC/DmJ,EAAKA,KAAKW,6BAA6B,KAAQ5f,EAAY,GAAN8V,EAAY,KAEjEkJ,EAAIJ,QAAQK,GACZH,EAAWL,EAAKQ,GAChBF,EAAoBC,EAAKC,GAEzBD,EAAIa,MAAM7f,EAAY,GAAN8V,GAChBkJ,EAAIc,KAAK9f,EAAY,GAAN8V,EAAY,YAExB,GAAa,YAATwJ,EAAoB,CAE7B,MAAMN,EAAMP,EAAIe,mBACVP,EAAOR,EAAIgB,aACjBT,EAAIzI,KAAO,OACXyI,EAAIU,UAAUC,eAAe,IAAK3f,GAClCgf,EAAIU,UAAUE,6BAA6B,OAAQ5f,EAAM,KAEzDif,EAAKA,KAAKU,eAAe,KAAO3f,GAChCif,EAAKA,KAAKW,6BAA6B,IAAM5f,EAAM,KACnDif,EAAKA,KAAKW,6BAA6B,KAAQ5f,EAAM,KAErDgf,EAAIJ,QAAQK,GACZH,EAAWL,EAAKQ,GAChBF,EAAoBC,EAAKC,GAEzBD,EAAIa,MAAM7f,GACVgf,EAAIc,KAAK9f,EAAM,GACjB,KAAO,CAEL,MAAMgf,EAAMP,EAAIe,mBACVP,EAAOR,EAAIgB,aACjBT,EAAIzI,KAAO,OACXyI,EAAIU,UAAUC,eAAe,IAAK3f,GAClCgf,EAAIU,UAAUE,6BAA6B,IAAK5f,EAAM,KACtDgf,EAAIU,UAAUE,6BAA6B,IAAK5f,EAAM,KAEtDif,EAAKA,KAAKU,eAAe,KAAO3f,GAChCif,EAAKA,KAAKW,6BAA6B,GAAK5f,EAAM,MAClDif,EAAKA,KAAKW,6BAA6B,KAAQ5f,EAAM,KAErDgf,EAAIJ,QAAQK,GACZH,EAAWL,EAAKQ,GAChBF,EAAoBC,EAAKC,GAEzBD,EAAIa,MAAM7f,GACVgf,EAAIc,KAAK9f,EAAM,IACjB,CACF,EAiWE+f,MAzVF,SAAyBtB,EAAKa,EAAMtf,GAClC,GAAa,YAATsf,EAEY,CAAC,OAAQ,OAAQ,OAAQ,QACjCvQ,QAAQ,CAACwQ,EAAMzJ,KACnB,MAAMkJ,EAAMP,EAAIe,mBACVP,EAAOR,EAAIgB,aACjBT,EAAIzI,KAAO,SACX,MAAMsJ,EAAQ7f,EAAY,KAAN8V,EACpBkJ,EAAIU,UAAUC,eAAeJ,EAAMM,GAEnCZ,EAAKA,KAAKU,eAAe,KAAOE,GAChCZ,EAAKA,KAAKe,wBAAwB,IAAMH,EAAQ,MAChDZ,EAAKA,KAAKW,6BAA6B,KAAQC,EAAQ,MAEvDb,EAAIJ,QAAQK,GACZH,EAAWL,EAAKQ,GAChBF,EAAoBC,EAAKC,GAEzBD,EAAIa,MAAMA,GACVb,EAAIc,KAAKD,EAAQ,aAEd,GAAa,UAATP,EAAkB,CAE3B,MAAMN,EAAMP,EAAIe,mBACVP,EAAOR,EAAIgB,aACjBT,EAAIzI,KAAO,SACXyI,EAAIU,UAAUC,eAAe,IAAK3f,GAClCgf,EAAIU,UAAUE,6BAA6B,GAAI5f,EAAM,KAErDif,EAAKA,KAAKU,eAAe,KAAO3f,GAChCif,EAAKA,KAAKe,wBAAwB,GAAKhgB,EAAM,KAC7Cif,EAAKA,KAAKW,6BAA6B,KAAQ5f,EAAM,KAErDgf,EAAIJ,QAAQK,GACZH,EAAWL,EAAKQ,GAChBF,EAAoBC,EAAKC,GAEzBD,EAAIa,MAAM7f,GACVgf,EAAIc,KAAK9f,EAAM,IACjB,KAAoB,YAATsf,EAET,CAAC,EAAG,KAAMvQ,QAASkR,IACjB,MAAMjB,EAAMP,EAAIe,mBACVP,EAAOR,EAAIgB,aACjBT,EAAIzI,KAAO,SACX,MAAMsJ,EAAQ7f,EAAMigB,EACpBjB,EAAIU,UAAUC,eAAe,IAAKE,GAElCZ,EAAKA,KAAKU,eAAe,KAAOE,GAChCZ,EAAKA,KAAKe,wBAAwB,IAAMH,EAAQ,MAChDZ,EAAKA,KAAKW,6BAA6B,KAAQC,EAAQ,KAEvDb,EAAIJ,QAAQK,GACZH,EAAWL,EAAKQ,GAChBF,EAAoBC,EAAKC,GAEzBD,EAAIa,MAAMA,GACVb,EAAIc,KAAKD,EAAQ,QAIL,CAAC,OAAQ,SACjB9Q,QAAQ,CAACwQ,EAAMzJ,KACnB,MAAMkJ,EAAMP,EAAIe,mBACVP,EAAOR,EAAIgB,aACjBT,EAAIzI,KAAO,SACX,MAAMsJ,EAAQ7f,EAAY,KAAN8V,EACpBkJ,EAAIU,UAAUC,eAAeJ,EAAMM,GAEnCZ,EAAKA,KAAKU,eAAe,KAAOE,GAChCZ,EAAKA,KAAKe,wBAAwB,IAAMH,EAAQ,MAChDZ,EAAKA,KAAKW,6BAA6B,KAAQC,EAAQ,MAEvDb,EAAIJ,QAAQK,GACZH,EAAWL,EAAKQ,GAChBF,EAAoBC,EAAKC,GAEzBD,EAAIa,MAAMA,GACVb,EAAIc,KAAKD,EAAQ,MAGvB,EAwQEK,WAhQF,SAA8BzB,EAAKa,EAAMtf,GACvC,GAAa,YAATsf,EAAoB,CAEtB,MAAMN,EAAMP,EAAIe,mBACVP,EAAOR,EAAIgB,aACjBT,EAAIzI,KAAO,OACXyI,EAAIU,UAAUC,eAAe,IAAK3f,GAClCgf,EAAIU,UAAUE,6BAA6B,KAAM5f,EAAM,IAEvDif,EAAKA,KAAKU,eAAe,KAAO3f,GAChCif,EAAKA,KAAKW,6BAA6B,IAAM5f,EAAM,KACnDif,EAAKA,KAAKW,6BAA6B,KAAQ5f,EAAM,KAErDgf,EAAIJ,QAAQK,GACZH,EAAWL,EAAKQ,GAChBF,EAAoBC,EAAKC,GAEzBD,EAAIa,MAAM7f,GACVgf,EAAIc,KAAK9f,EAAM,IACjB,MAAO,GAAa,UAATsf,EAAkB,CAE3B,MAAMN,EAAMP,EAAIe,mBACVP,EAAOR,EAAIgB,aACjBT,EAAIzI,KAAO,WACXyI,EAAIU,UAAUC,eAAe,IAAK3f,GAClCgf,EAAIU,UAAUE,6BAA6B,IAAK5f,EAAM,KAEtDif,EAAKA,KAAKU,eAAe,KAAO3f,GAChCif,EAAKA,KAAKe,wBAAwB,IAAMhgB,EAAM,KAC9Cif,EAAKA,KAAKW,6BAA6B,KAAQ5f,EAAM,KAErDgf,EAAIJ,QAAQK,GACZH,EAAWL,EAAKQ,GAChBF,EAAoBC,EAAKC,GAEzBD,EAAIa,MAAM7f,GACVgf,EAAIc,KAAK9f,EAAM,IACjB,MAAO,GAAa,YAATsf,EAEK,CAAC,IAAK,KACdvQ,QAASwQ,IACb,MAAMP,EAAMP,EAAIe,mBACVP,EAAOR,EAAIgB,aACjBT,EAAIzI,KAAO,OACXyI,EAAIU,UAAUC,eAAeJ,EAAMvf,GACnCgf,EAAIU,UAAUM,wBAA+B,KAAPT,EAAavf,EAAM,IACzDgf,EAAIU,UAAUM,wBAAwBT,EAAMvf,EAAM,IAElDif,EAAKA,KAAKU,eAAe,KAAO3f,GAChCif,EAAKA,KAAKW,6BAA6B,IAAM5f,EAAM,KACnDif,EAAKA,KAAKW,6BAA6B,KAAQ5f,EAAM,KAErDgf,EAAIJ,QAAQK,GACZH,EAAWL,EAAKQ,GAChBF,EAAoBC,EAAKC,GAEzBD,EAAIa,MAAM7f,GACVgf,EAAIc,KAAK9f,EAAM,WAEZ,CAEL,MAAMgf,EAAMP,EAAIe,mBACVP,EAAOR,EAAIgB,aACjBT,EAAIzI,KAAO,OACXyI,EAAIU,UAAUC,eAAe,KAAM3f,GACnCgf,EAAIU,UAAUE,6BAA6B,KAAM5f,EAAM,KACvDgf,EAAIU,UAAUE,6BAA6B,IAAK5f,EAAM,KAEtDif,EAAKA,KAAKU,eAAe,KAAO3f,GAChCif,EAAKA,KAAKW,6BAA6B,IAAM5f,EAAM,MACnDif,EAAKA,KAAKW,6BAA6B,KAAQ5f,EAAM,KAErDgf,EAAIJ,QAAQK,GACZH,EAAWL,EAAKQ,GAChBF,EAAoBC,EAAKC,GAEzBD,EAAIa,MAAM7f,GACVgf,EAAIc,KAAK9f,EAAM,IACjB,CACF,EAkLEmgB,OA1KF,SAA0B1B,EAAKa,EAAMtf,GACnC,GAAa,YAATsf,EAEF,CAAC,IAAK,MAAMvQ,QAAQ,CAACwQ,EAAMzJ,KACzB,MAAMkJ,EAAMP,EAAIe,mBACVP,EAAOR,EAAIgB,aACjBT,EAAIzI,KAAO,OACX,MAAMsJ,EAAQ7f,EAAY,IAAN8V,EACpBkJ,EAAIU,UAAUC,eAAeJ,EAAMM,GAEnCZ,EAAKA,KAAKU,eAAe,KAAOE,GAChCZ,EAAKA,KAAKe,wBAAwB,IAAMH,EAAQ,MAChDZ,EAAKA,KAAKW,6BAA6B,KAAQC,EAAQ,MAEvDb,EAAIJ,QAAQK,GACZH,EAAWL,EAAKQ,GAChBF,EAAoBC,EAAKC,GAEzBD,EAAIa,MAAMA,GACVb,EAAIc,KAAKD,EAAQ,YAEd,GAAa,UAATP,EAET,CAAC,IAAK,KAAKvQ,QAAQ,CAACwQ,EAAMzJ,KACxB,MAAMkJ,EAAMP,EAAIe,mBACVP,EAAOR,EAAIgB,aACjBT,EAAIzI,KAAO,WACX,MAAMsJ,EAAQ7f,EAAY,IAAN8V,EACpBkJ,EAAIU,UAAUC,eAAeJ,EAAMM,GAEnCZ,EAAKA,KAAKU,eAAe,KAAOE,GAChCZ,EAAKA,KAAKe,wBAAwB,IAAMH,EAAQ,MAChDZ,EAAKA,KAAKW,6BAA6B,KAAQC,EAAQ,MAEvDb,EAAIJ,QAAQK,GACZH,EAAWL,EAAKQ,GAChBF,EAAoBC,EAAKC,GAEzBD,EAAIa,MAAMA,GACVb,EAAIc,KAAKD,EAAQ,YAEd,GAAa,YAATP,EAAoB,CAE7B,MAAMN,EAAMP,EAAIe,mBACVP,EAAOR,EAAIgB,aACjBT,EAAIzI,KAAO,OACXyI,EAAIU,UAAUC,eAAe,IAAK3f,GAElCif,EAAKA,KAAKU,eAAe,KAAO3f,GAChCif,EAAKA,KAAKe,wBAAwB,KAAOhgB,EAAM,MAC/Cif,EAAKA,KAAKW,6BAA6B,KAAQ5f,EAAM,MAErDgf,EAAIJ,QAAQK,GACZH,EAAWL,EAAKQ,GAChBF,EAAoBC,EAAKC,GAEzBD,EAAIa,MAAM7f,GACVgf,EAAIc,KAAK9f,EAAM,IACjB,KAAO,CAEL,MAAMgf,EAAMP,EAAIe,mBACVP,EAAOR,EAAIgB,aACjBT,EAAIzI,KAAO,OACXyI,EAAIU,UAAUC,eAAe,IAAK3f,GAElCif,EAAKA,KAAKU,eAAe,KAAO3f,GAChCif,EAAKA,KAAKe,wBAAwB,KAAOhgB,EAAM,MAC/Cif,EAAKA,KAAKW,6BAA6B,KAAQ5f,EAAM,KAErDgf,EAAIJ,QAAQK,GACZH,EAAWL,EAAKQ,GAChBF,EAAoBC,EAAKC,GAEzBD,EAAIa,MAAM7f,GACVgf,EAAIc,KAAK9f,EAAM,KACjB,CACF,EA+FEogB,KAvFF,SAAwB3B,EAAKa,EAAMtf,GACjC,GAAa,YAATsf,EAEgB,CAAC,OAAQ,OAAQ,MACzBvQ,QAAQ,CAACwQ,EAAMzJ,KACvB,MAAMkJ,EAAMP,EAAIe,mBACVP,EAAOR,EAAIgB,aACjBT,EAAIzI,KAAO,OACXyI,EAAIU,UAAUC,eAAeJ,EAAMvf,GAEnC,MAAMqgB,EAAW,KAAQvK,EAAM,GAC/BmJ,EAAKA,KAAKU,eAAe,KAAO3f,GAChCif,EAAKA,KAAKW,6BAA6BS,EAAUrgB,EAAM,MACvDif,EAAKA,KAAKW,6BAA6B,KAAQ5f,EAAM,KAErDgf,EAAIJ,QAAQK,GACZH,EAAWL,EAAKQ,GAChBF,EAAoBC,EAAKC,GAEzBD,EAAIa,MAAM7f,GACVgf,EAAIc,KAAK9f,EAAM,YAEZ,GAAa,UAATsf,EAET,CAAC,IAAK,KAAKvQ,QAAQ,CAACwQ,EAAMzJ,KACxB,MAAMkJ,EAAMP,EAAIe,mBACVP,EAAOR,EAAIgB,aACjBT,EAAIzI,KAAO,WACXyI,EAAIU,UAAUC,eAAeJ,EAAMvf,GAEnC,MAAMqgB,EAAW,IAAOvK,EAAM,GAC9BmJ,EAAKA,KAAKU,eAAe,KAAO3f,GAChCif,EAAKA,KAAKW,6BAA6BS,EAAUrgB,EAAM,MACvDif,EAAKA,KAAKW,6BAA6B,KAAQ5f,EAAM,KAErDgf,EAAIJ,QAAQK,GACZH,EAAWL,EAAKQ,GAChBF,EAAoBC,EAAKC,GAEzBD,EAAIa,MAAM7f,GACVgf,EAAIc,KAAK9f,EAAM,WAEZ,GAAa,YAATsf,EAAoB,CAE7B,MAAMN,EAAMP,EAAIe,mBACVP,EAAOR,EAAIgB,aACjBT,EAAIzI,KAAO,OACXyI,EAAIU,UAAUC,eAAe,IAAK3f,GAElCif,EAAKA,KAAKU,eAAe,KAAO3f,GAChCif,EAAKA,KAAKW,6BAA6B,GAAK5f,EAAM,MAClDif,EAAKA,KAAKW,6BAA6B,KAAQ5f,EAAM,KAErDgf,EAAIJ,QAAQK,GACZH,EAAWL,EAAKQ,GAChBF,EAAoBC,EAAKC,GAEzBD,EAAIa,MAAM7f,GACVgf,EAAIc,KAAK9f,EAAM,IACjB,KAAO,CAEL,MAAMgf,EAAMP,EAAIe,mBACVP,EAAOR,EAAIgB,aACjBT,EAAIzI,KAAO,OACXyI,EAAIU,UAAUC,eAAe,KAAM3f,GAEnCif,EAAKA,KAAKU,eAAe,KAAO3f,GAChCif,EAAKA,KAAKW,6BAA6B,IAAM5f,EAAM,KACnDif,EAAKA,KAAKW,6BAA6B,KAAQ5f,EAAM,KAErDgf,EAAIJ,QAAQK,GACZH,EAAWL,EAAKQ,GAChBF,EAAoBC,EAAKC,GAEzBD,EAAIa,MAAM7f,GACVgf,EAAIc,KAAK9f,EAAM,GACjB,CACF,GAoBA,IAAIsgB,GAAqB,EAElB,SAASC,EAASC,EAAW,OAAQC,GAC1C,IAAKrD,EAAc,OACnB,IACGkD,GACiB,oBAAXvhB,QACPA,OAAO2hB,mBACsC,mBAAtC3hB,OAAO2hB,kBAAkBH,UAChCxhB,OAAO2hB,kBAAkBH,WAAaA,EAEtC,IAGE,OAFAD,GAAqB,OACrBvhB,OAAO2hB,kBAAkBH,SAASC,EAAUC,EAE9C,CAAC,QACCH,GAAqB,CACvB,CAEF,MAAM7B,EAAMR,IACZ,GAAKQ,EAEL,IACoB,cAAdA,EAAIf,OACNe,EAAId,SAASC,MAAM,QAGrB,MAAM5d,EAAMye,EAAIkC,YAGVC,EAA8B,iBAAbJ,EAAwBA,EAAWje,WAAWie,GACrE,GACEjjB,OAAOC,SAASojB,IAChBA,GAAW,IACXA,GAAW,MACU,iBAAbJ,GAAyB,sBAAsB3gB,KAAK5B,OAAOuiB,GAAU/hB,SAC7E,CACA,MAAMugB,EAAMP,EAAIe,mBACVP,EAAOR,EAAIgB,aAcjB,OAbAT,EAAIzI,KAAO,OACXyI,EAAIU,UAAUC,eAAeiB,EAAS5gB,GAEtCif,EAAKA,KAAKU,eAAe,KAAO3f,GAChCif,EAAKA,KAAKW,6BAA6B,GAAK5f,EAAM,MAClDif,EAAKA,KAAKW,6BAA6B,KAAQ5f,EAAM,KAErDgf,EAAIJ,QAAQK,GACZH,EAAWL,EAAKQ,GAChBF,EAAoBC,EAAKC,GAEzBD,EAAIa,MAAM7f,QACVgf,EAAIc,KAAK9f,EAAM,IAEjB,CAEA,MAAMsf,EAAOrhB,OAAOuiB,GAAY,QAAQtiB,cAAcO,OAChDoiB,EAAe5iB,OACnBwiB,GAAUtjB,IAAYZ,aAAe,UACrC2B,cAAcO,OAGhB,GAAIuf,EAAmBtd,IAAImgB,GACzB,IACE,MAAMC,EAAW9C,EAAmBxd,IAAIqgB,GACxC,GAAwB,mBAAbC,EAET,YADAA,EAASrC,EAAKa,EAAMtf,EAGxB,CAAE,MAAOmT,GACPC,QAAQC,KAAK,yCAA0CF,EACzD,EAIkBiM,EAAgByB,IAAiBzB,EAAgBC,QACzDZ,EAAKa,EAAMtf,EACzB,CAAE,MAAO,CACX,CAQO,SAAS+gB,EAAoB/R,EAAMgS,GACxC,GAAoB,iBAAThS,IAAsBA,EAAKvQ,QAAmC,mBAAlBuiB,EACrD,OAAO,EAET,MAAMC,EAAYjS,EAAK9Q,cAAcO,OAErC,OADAuf,EAAmBnd,IAAIogB,EAAWD,IAC3B,CACT,CAMO,SAASE,IACd,MAAMC,EAAUzlB,OAAOsF,KAAKoe,GACtBgC,EAASnkB,MAAMuT,KAAKwN,EAAmBhd,QAC7C,OAAO/D,MAAMuT,KAAK,IAAIpB,IAAI,IAAI+R,KAAYC,IAC5C,CAMO,SAASC,IACdrD,EAAmBsD,OACrB,CAOO,SAASC,EAAgBC,GAC9BpE,EAAe/f,QAAQmkB,EACzB,CAMO,SAASC,IACd,OAAOrE,CACT,CAMO,SAASsE,IACd,GAAIvE,EACF,IACEA,EAAawE,UAAU/D,QAAQ,OACjC,CAAE,MAAO,CAEXT,EAAe,KACfoB,EAAgB,IAClB,CC5rBO,MAAMqD,EAAiB,CAC5BC,QAAS,CACPC,UAAW,IACXC,QAAS,GACTC,KAAM,EACNC,eAAgB,oCAElBC,OAAQ,CACNJ,UAAW,IACXC,QAAS,GACTC,KAAM,EACNC,eAAgB,iCAElBE,OAAQ,CACNL,UAAW,IACXC,QAAS,GACTC,KAAM,EACNC,eAAgB,oCAElBG,MAAO,CACLN,UAAW,IACXC,QAAS,GACTC,KAAM,EACNC,eAAgB,oCAElBI,OAAQ,CACNP,UAAW,IACXC,QAAS,GACTC,KAAM,IACNC,eAAgB,qCAQdK,EAAsB,IAAI/hB,IAOzB,SAASgiB,EAAqBvT,EAAM8E,GACzC,GAAoB,iBAAT9E,IAAsBA,EAAKvQ,OACpC,MAAM,IAAI+jB,UAAU,yDAEtB,IAAK1O,GAA4B,iBAAXA,GAAuB7W,MAAMC,QAAQ4W,GACzD,MAAM,IAAI0O,UAAU,kDAGtB,MAAMV,EAAYvkB,OAAOuW,EAAOgO,WAC1BC,EAAUxkB,OAAOuW,EAAOiO,SACxBC,EAAOzkB,OAAOuW,EAAOkO,MAE3BM,EAAoBzhB,IAAImO,EAAKvQ,OAAOP,cAAe,CACjD4jB,UAAWvkB,OAAOC,SAASskB,IAAcA,EAAY,EAAIA,EAAY,IACrEC,QAASxkB,OAAOC,SAASukB,IAAYA,EAAU,EAAIA,EAAU,GAC7DC,KAAMzkB,OAAOC,SAASwkB,IAASA,EAAO,EAAIA,EAAO,EACjDC,eACmC,iBAA1BnO,EAAOmO,gBAA+BnO,EAAOmO,eAAexjB,OAC/DqV,EAAOmO,eAAexjB,OACtB,oCAEV,CAMO,SAASgkB,IACd,MAAO,IAAI/mB,OAAOsF,KAAK4gB,MAAoBU,EAAoBthB,OACjE,CAKO,SAAS0hB,IACdJ,EAAoBhB,OACtB,CAOO,SAASqB,EAAoBC,GAClC,IAAKA,EAAQ,OAAO,KAEpB,GAAsB,iBAAXA,EAAqB,CAC9B,MAAMniB,EAAMmiB,EAAOnkB,OAAOP,cAC1B,OAAIokB,EAAoB5hB,IAAID,GACnB6hB,EAAoB9hB,IAAIC,GAE7B/E,OAAOmnB,UAAUC,eAAeC,KAAKnB,EAAgBnhB,GAChDmhB,EAAenhB,GAEjBmhB,EAAeC,OACxB,CAEA,IAAe,IAAXe,EACF,OAAOhB,EAAeC,QAGxB,GAAsB,iBAAXe,IAAwB3lB,MAAMC,QAAQ0lB,GAAS,CACxD,MAAMI,EAAezlB,OAAOqlB,EAAOd,WAC7BmB,EAAa1lB,OAAOqlB,EAAOb,SAC3BmB,EAAU3lB,OAAOqlB,EAAOZ,MAExBF,EAAYvkB,OAAOC,SAASwlB,IAAiBA,EAAe,EAAIA,EAAe,IAC/EjB,EAAUxkB,OAAOC,SAASylB,IAAeA,EAAa,EAAIA,EAAa,GACvEjB,EAAOzkB,OAAOC,SAAS0lB,IAAYA,EAAU,EAAIA,EAAU,EAE3DC,EAAOpB,GAAW,EAAItkB,KAAK2lB,KAAKtB,EAAYE,IAClD,IAAIC,EAAkD,iBAA1BW,EAAOX,gBAA+BW,EAAOX,eAAexjB,OACpFmkB,EAAOX,eAAexjB,OACtB,gCASJ,OARKmkB,EAAOX,iBACNkB,EAAO,GACTlB,EAAiB,mCACRkB,EAAO,MAChBlB,EAAiB,sCAId,CACLH,YACAC,UACAC,OACAC,iBAEJ,CAEA,OAAO,IACT,CAUO,SAASoB,EAAY3kB,EAAGoV,GAC7B,GAAIpV,GAAK,EAAG,OAAO,EAEnB,MAAM4kB,EAAI7lB,KAAKC,IAAI,KAAOoW,GAAQgO,WAAa,KACzC9f,EAAIvE,KAAKC,IAAI,KAAOoW,GAAQiO,SAAW,IACvCwB,EAAI9lB,KAAKC,IAAI,KAAOoW,GAAQkO,MAAQ,GAEpCwB,EAAS/lB,KAAK2lB,KAAKE,EAAIC,GACvBJ,EAAOnhB,GAAK,EAAIvE,KAAK2lB,KAAKE,EAAIC,IAEpC,GAAI9lB,KAAKgmB,IAAIN,EAAO,GAAK,KAEvB,OAAO,EAAI1lB,KAAKimB,KAAKF,EAAS9kB,IAAM,EAAI8kB,EAAS9kB,GAGnD,GAAIykB,EAAO,EAAG,CAEZ,MAAMQ,EAASH,EAAS/lB,KAAK2lB,KAAK,EAAID,EAAOA,GAG7C,OAAO,EAFU1lB,KAAKimB,KAAKP,EAAOK,EAAS9kB,IACvBjB,KAAKmmB,IAAID,EAASjlB,GAAMykB,EAAO1lB,KAAK2lB,KAAK,EAAID,EAAOA,GAAS1lB,KAAKomB,IAAIF,EAASjlB,GAErG,CAGA,MAAMilB,EAASH,EAAS/lB,KAAK2lB,KAAKD,EAAOA,EAAO,GAC1CW,GAAMX,EAAOK,EAASG,EACtBI,GAAMZ,EAAOK,EAASG,EAEtBK,GAAMF,GAAMC,EAAKD,GACvB,OAAO,GAFIC,GAAMA,EAAKD,GAELrmB,KAAKimB,IAAII,EAAKplB,GAAKslB,EAAKvmB,KAAKimB,IAAIK,EAAKrlB,GACzD,CAUO,SAASulB,EAAgCnQ,EAAQoQ,EAAY,MAClE,IAAKpQ,EAAQ,OAAO,IAEpB,MAAMwP,EAAI7lB,KAAKC,IAAI,KAAOoW,EAAOgO,WAAa,KACxC9f,EAAIvE,KAAKC,IAAI,KAAOoW,EAAOiO,SAAW,IACtCwB,EAAI9lB,KAAKC,IAAI,KAAOoW,EAAOkO,MAAQ,GAQzC,IAAImC,EAFe,EAInB,IAAK,IAAIzlB,EAAI,GAAKA,GAJC,EAIgBA,GAHtB,IAGiC,CAC5C,MAAM6E,EAAM8f,EAAY3kB,EAAG,CAAEojB,UAAWwB,EAAGvB,QAAS/f,EAAGggB,KAAMuB,IAC7D,GAAI9lB,KAAKgmB,IAAIlgB,EAAM,IAAM2gB,EAAW,CAElC,IAAIE,GAAe,EACnB,IAAK,IAAIC,EAAY3lB,EAAG2lB,GAAa5mB,KAAKgF,IAT3B,EAS2C/D,EAAI,KAAO2lB,GAR5D,IASP,GAAI5mB,KAAKgmB,IAAIJ,EAAYgB,EAAW,CAAEvC,UAAWwB,EAAGvB,QAAS/f,EAAGggB,KAAMuB,IAAO,GAAKW,EAAW,CAC3FE,GAAe,EACf,KACF,CAEF,GAAIA,EAAc,CAChBD,EAAczlB,EACd,KACF,CACF,CACF,CAEA,MAAM4lB,EAAa7mB,KAAK6E,MAAoB,IAAd6hB,GAC9B,OAAO1mB,KAAKC,IAAI,IAAKD,KAAKgF,IAAI,KAAM6hB,GACtC,CAQO,SAASC,EAA2BzQ,EAAQ0Q,EAAS,IAC1D,MACMC,EADaR,EAAgCnQ,GAClB,IAC3B4Q,EAAS,GAEf,IAAK,IAAIC,EAAI,EAAGA,GAAKH,EAAQG,IAAK,CAChC,MAAM1I,EAAW0I,EAAIH,EAEfI,EAAIvB,EADApH,EAAWwI,EACI3Q,GAEnB+Q,EAAapnB,KAAK6E,MAAU,IAAJsiB,GAAY,IACpCE,EAAUrnB,KAAK6E,MAAiB,IAAX2Z,GAAmB,GAC9CyI,EAAOxT,KAAK,GAAG2T,KAAcC,KAC/B,CAEA,MAAO,UAAUJ,EAAOziB,KAAK,QAC/B,CA0BO,SAAS8iB,GAAoBnC,GAClC,MAAM3e,EAAW0e,EAAoBC,GACrC,IAAK3e,EAAU,OAAO,KAEtB,MAAM+U,EAAWiL,EAAgChgB,GAC3C+gB,EAAeT,EAA2BtgB,GAG1CwY,EA5BD,WACL,GAAsB,oBAAX1d,QAAyC,oBAARkmB,KAA+C,mBAAjBA,IAAIC,SAC5E,OAAO,EAET,IACE,OACED,IAAIC,SAAS,6BAA8B,yBAC3CD,IAAIC,SAAS,6BAA8B,iBAC3CD,IAAIC,SAAS,4BAA6B,uBAE9C,CAAE,MACA,OAAO,CACT,CACF,CAa4BC,GAESH,EAAgB/gB,EAASge,gBAAkB,mCAE9E,MAAO,CACLnO,OAAQ,CACNgO,UAAW7d,EAAS6d,UACpBC,QAAS9d,EAAS8d,QAClBC,KAAM/d,EAAS+d,MAEjBhJ,WACAyD,SACA2I,UAAU,EAEd,CCjTA,MAEMC,GAAmB,IAAIjW,IAAI,CAC/B,MACA,IACA,OACA,SACA,OACA,OACA,WACA,UACA,UACA,QACA,OACA,OACA,WACA,QAGIkW,GAAoB,IAAIlW,IAAI,CAChC,UACA,QACA,SACA,OACA,SACA,eACA,iBACA,kBACA,oBACA,mBACA,oBACA,UACA,eACA,iBACA,IACA,KACA,KACA,IACA,IACA,IACA,KACA,KACA,KACA,KACA,SACA,KACA,KACA,YACA,OACA,cACA,YACA,QACA,sBACA,QACA,KACA,OACA,eAGF,SAASmW,GAAY5kB,EAAQ,IAC3B,MAAO,mBAAmBd,KAAKc,EACjC,CAEA,SAAS6kB,GAAkBC,GACzB,MAAMC,EACiB,oBAAd7T,UACHA,UACkB,oBAAX9S,QAA0BA,OAAO8S,UACtC9S,OAAO8S,UACP,KAER,IAAK6T,EAAa,OAAO,KACzB,IACE,MACMjkB,GADS,IAAIikB,GACG3T,gBAAgB0T,EAAS,iBAC/C,GAAIhkB,EAAO4W,cAAc,eAAgB,OAAO,KAChD,MAAMsN,EAAYlkB,EAAOpD,gBACzB,IAAKsnB,GAAiD,QAApCA,EAAUvV,QAAQlS,cAAyB,OAAO,KAEpE,MAAM0nB,EAAgBnW,IACpB,GAAsB,IAAlBA,EAAKG,SACP,OAAOxR,SAAS2R,eAAeN,EAAKuF,aAAe,IAErD,GAAsB,IAAlBvF,EAAKG,SAAgB,OAAO,KAChC,MAAMO,EAAMV,EAAKW,QAAQlS,cACzB,IAAKmnB,GAAiB3kB,IAAIyP,GAAM,OAAO,KAEvC,MAAM0V,EAASznB,SAASiW,gBAvFhB,6BAuFuClE,GAC/C,GAAIV,EAAKqB,WACP,IAAK,IAAI6T,EAAI,EAAGA,EAAIlV,EAAKqB,WAAWjP,OAAQ8iB,IAAK,CAC/C,MAAM5T,EAAOtB,EAAKqB,WAAW6T,GACvB3V,EAAO+B,EAAK/B,KACZ8W,EAAY9W,EAAK9Q,cACjByC,EAAQoQ,EAAKpQ,OAAS,GAE5B,IAAImlB,EAAUniB,WAAW,OACpB2hB,GAAkB5kB,IAAIolB,GAA3B,CACA,GAAmB,SAAdA,GAAsC,eAAdA,EAA6B,CACxD,GAAIP,GAAY5kB,GAAQ,SACxB,GAAY,QAARwP,GAAiBxP,IAAUA,EAAMgD,WAAW,KAAM,QACxD,CACAkiB,EAAOvnB,aAAa0Q,EAAMrO,EALa,CAMzC,CAGF,GAAI8O,EAAKgB,WACP,IAAK,IAAIsV,EAAI,EAAGA,EAAItW,EAAKgB,WAAW5O,OAAQkkB,IAAK,CAC/C,MAAMC,EAAYJ,EAAanW,EAAKgB,WAAWsV,IAC3CC,GAAWH,EAAO9nB,YAAYioB,EACpC,CAEF,OAAOH,GAGT,OAAOD,EAAaD,EACtB,CAAE,MACA,OAAO,IACT,CACF,CAKA,MAAMM,GAAY,CAChBC,QAAS,qPAKTtO,MAAO,oVAOPuO,QAAS,8ZAOTC,KAAM,0VAcD,SAASC,GAAgBrpB,EAAU,IACxC,MAAMspB,EAActpB,GAA8B,iBAAZA,IAAyBC,MAAMC,QAAQF,GAAWA,EAAU,CAAA,EAClG,IAAIupB,EAAUD,EAAYE,KAC1B,GAAuB,mBAAZD,EACT,IACEA,EAAUA,EAAQD,EACpB,CAAE,MAAOnT,GACPC,QAAQC,KAAK,+BAAgCF,GAC7CoT,EAAU,IACZ,CAGF,IAAgB,IAAZA,GAAiC,KAAZA,GAA8B,OAAZA,EAAkB,OAAO,KACpE,GAAwB,oBAAbnoB,SAA0B,OAAO,KAE5C,MAAMmY,EAAO+P,EAAY/P,KACnBzC,EAAS3W,IAETspB,EAAUroB,SAASyS,cAAc,KAiBvC,GAhBA4V,EAAQ5S,UAAY,aACpB4S,EAAQnoB,aAAa,cAAe,QAE/BwV,EAAO9X,qBACVN,OAAOmD,OAAO4nB,EAAQ1S,MAAO,CAC3BC,QAAS,cACTC,WAAY,SACZyS,eAAgB,SAChBnP,WAAY,IACZoP,YAAa,MACbxP,WAAY,IACZyP,UAAW,WAKXL,GAA+B,iBAAZA,IAA8C,IAArBA,EAAQ3W,UAA0C,oBAAhBiX,aAA+BN,aAAmBM,cACjG,mBAAtBN,EAAQO,UAEjB,OADAL,EAAQ1oB,YAAYwoB,EAAQO,WAAU,IAC/BL,EAKX,GAAuB,iBAAZF,GAAwBA,EAAQ9nB,OAAQ,CACjD,MAAM2D,EAAUmkB,EAAQ9nB,OAYlBsoB,EAXW,CACfC,MAAOf,GAAUC,QACjBe,UAAWhB,GAAUC,QACrBA,QAASD,GAAUC,QACnBgB,MAAOjB,GAAUrO,MACjBA,MAAOqO,GAAUrO,MACjBuP,MAAOlB,GAAUE,QACjBA,QAASF,GAAUE,QACnB7R,OAAQ2R,GAAUG,KAClBA,KAAMH,GAAUG,MAEYhkB,EAAQlE,eACtC,GAAI6oB,EAAc,CAChB,MAAMK,EAAU5B,GAAkBuB,EAAatoB,QAI/C,OAHI2oB,GACFX,EAAQ1oB,YAAYqpB,GAEfX,CACT,CACA,GAAIrkB,EAAQuB,WAAW,SAAWvB,EAAQC,SAAS,UAAW,CAC5D,MAAM+kB,EAAU5B,GAAkBpjB,GAC9BglB,GACFA,EAAQ9oB,aAAa,cAAe,QACpC8oB,EAAQ9oB,aAAa,YAAa,SAC7B8oB,EAAQhW,aAAa,UAAUgW,EAAQ9oB,aAAa,QAAS,MAC7D8oB,EAAQhW,aAAa,WAAWgW,EAAQ9oB,aAAa,SAAU,MACpEmoB,EAAQ1oB,YAAYqpB,IAEpBX,EAAQzR,YAAc5S,CAE1B,MACEqkB,EAAQzR,YAAc5S,EAExB,OAAOqkB,CACT,CAGA,MAAMY,EAAiC,iBAAT9Q,EAAoBA,EAAKrY,cAAcO,OAAS,GAC9E,KAAiB,IAAZ8nB,QAAgCnpB,IAAZmpB,IAA0Bc,GAAkBpB,GAAUoB,GAAiB,CAC9F,MAAMD,EAAU5B,GAAkBS,GAAUoB,GAAgB5oB,QAI5D,OAHI2oB,GACFX,EAAQ1oB,YAAYqpB,GAEfX,CACT,CAEA,OAAO,IACT,CCnOA,SAASa,GAAoB5L,EAAU6L,EAAenC,GACpD,MAAMoC,EAAMvpB,OAAOyd,GAAY,IAAIxd,cAC7BupB,EAAQD,EAAIrpB,SAAS,OACrBupB,EAASF,EAAIrpB,SAAS,QACtBwpB,EAAUH,EAAIrpB,SAAS,SACvBypB,EAAO3pB,OAAOspB,GAAiB,IAAIrpB,cAAcO,OAEvD,MAAa,SAATmpB,EAAwB,OACf,SAATA,GAA4B,UAATA,EAAyB,cACnC,SAATA,EAAwB,oCACf,UAATA,EACEF,EAAe,oBACfC,EAAgB,mBACbF,EAAQ,oBAAsB,mBAGnCrC,GACEoC,EAAIrpB,SAAS,WAAcspB,GAAUD,EAAIrpB,SAAS,UAK/CspB,EAAQ,gCAAkC,+BAJ3CC,EAAe,gCACfC,EAAgB,+BACb,cAKE,WAATC,EACKH,EAAQ,+BAAiC,8BAG3CA,EAAQ,oBAAsB,kBACvC,CAsNOhQ,eAAeoQ,GAAqB7qB,EAAU,CAAA,EAAIwY,GACvD,IACE,MAAM1B,EAAS3W,IACT2qB,EAAY1pB,SAASyS,cAAc,OACnC6K,EAAW1e,GAAS0e,UAAY5H,EAAO5X,gBACvC6rB,EAAW9pB,OAAOyd,GAAUxd,cAAcO,OAChD,IAAIupB,EAAM,OAAQC,EAAS,OAAQtM,EAAO,OAAQuM,EAAQ,OAAQnL,EAAY,OAE1EgL,EAASpkB,WAAW,OAAQqkB,EAAM,QAC7BD,EAASpkB,WAAW,WAAaokB,EAAS5pB,SAAS,YAAU8pB,EAAS,QAE3EF,EAASpkB,WAAW,QAASgY,EAAO,OAC/BoM,EAASpkB,WAAW,SAAUukB,EAAQ,OACzB,WAAbH,GACPpM,EAAO,MAAOqM,EAAM,MAAOjL,EAAY,yBAC9BgL,EAAS5pB,SAAS,UACvB4pB,EAAS5pB,SAAS,SAAWwd,EAAO,OAAQqM,EAAM,MAAOjL,EAAY,oBAChEgL,EAAS5pB,SAAS,UAAY+pB,EAAQ,OAAQF,EAAM,MAAOjL,EAAY,oBACvEgL,EAAS5pB,SAAS,QAAU6pB,EAAM,OAAQrM,EAAO,MAAOoB,EAAY,oBACpEgL,EAAS5pB,SAAS,YAAa8pB,EAAS,OAAQtM,EAAO,MAAOoB,EAAY,qBAEnFmL,EAAQ,OAAQD,EAAS,QAG3BH,EAAUjU,UAAY,kBACjBC,EAAO9X,qBACVN,OAAOmD,OAAOipB,EAAU/T,MAAO,CAC7B6C,WAAY,OACZlD,MAAO,QACPsD,QAAS,YACT0E,SAAU,QACVsM,MACAC,SACAtM,OACAuM,QACAnL,YACAjhB,OAAQmC,OAAO6V,EAAOhY,OAAS,KAC/Bmb,aAAc,MACdkR,SAAU,QACVC,SAAU,aACVC,UAAW,+BAIf,MAAMC,EAAelqB,SAASyS,cAAc,OACtC0X,EAAQnqB,SAASyS,cAAc,QAGrC,GAFA0X,EAAM1U,UAAY,0BACbC,EAAO9X,sBAAqBusB,EAAMxU,MAAMC,QAAU,gBACnDhX,EAAQwrB,UACV,IACE,MAAM7X,EAAY8B,EAChBxU,OAAOjB,EAAQyrB,SAAW,6BAEtBC,EAAMtqB,SAASyS,cAAc,OAEnC,IADA6X,EAAIxW,UAAYvB,EACT+X,EAAIC,YACTJ,EAAMxqB,YAAY2qB,EAAIC,WAE1B,CAAE,MACAJ,EAAMxqB,YACJK,SAAS2R,eACP9R,OAAOjB,EAAQyrB,SAAW,6BAGhC,MAEAF,EAAMvT,YAAc/W,OAClBjB,EAAQyrB,SAAW,qCAGvBH,EAAavqB,YAAYwqB,GAEzB,MAAMK,EAAYxqB,SAASyS,cAAc,UAoBzC,IAnBA+X,EAAUrS,KAAO,SACjBqS,EAAU/U,UAAY,wBACtB+U,EAAUtqB,aAAa,aAAc,gCAChCwV,EAAO9X,qBACVN,OAAOmD,OAAO+pB,EAAU7U,MAAO,CAC7B8U,MAAO,QACP9R,WAAY,OACZG,WAAY,OACZG,OAAQ,UACRT,WAAY,cACZQ,OAAQ,OACR1D,MAAO,UACPsD,QAAS,IACT8R,KAAM,YAGVF,EAAU5T,YAAc,IACxBsT,EAAavqB,YAAY6qB,GAElBd,EAAUa,YAAYb,EAAUiB,YAAYjB,EAAUa,YAC7Db,EAAU/pB,YAAYuqB,GAEtB,IAAIU,EAAQ,KACZ,MAAMxR,EAAU,KACVwR,GAAOC,aAAaD,GACxBJ,EAAU1Q,oBAAoB,QAASV,GACvCsQ,EAAUoB,SACa,mBAAZ1T,GAAwBA,EAAQsS,IAE7Cc,EAAU5Q,iBAAiB,QAASR,GAEpC,MAAMwB,EAAWzb,OAAOP,GAASgc,WAAa,KAQ9C,OAPAgQ,EAAQG,WAAW,KACjBP,EAAU1Q,oBAAoB,QAASV,GACvCsQ,EAAUoB,SACa,mBAAZ1T,GAAwBA,EAAQsS,IAC1C9O,GACyB,mBAAjBgQ,GAAOpP,OAAsBoP,EAAMpP,QAEvCkO,CACT,CAAE,MAAOlQ,GAGP,OAFAxE,QAAQwE,MAAM,mCAAoCA,GAC3B,mBAAZpC,GAAwBA,EAAQ,MACpC,IACT,CACF,CCpXA,MAAM4T,GACJ,WAAAjpB,CAAYkpB,EAAc,EAAGjpB,EAAU,IACrCC,KAAKgpB,YAAc5rB,KAAKC,IAAI,EAAGD,KAAKE,MAAM0rB,IAC1ChpB,KAAKD,QAAU3C,KAAKC,IAAI2C,KAAKgpB,YAAa5rB,KAAKE,MAAMyC,IAErDC,KAAKipB,KAAO,GACZjpB,KAAKkpB,WAAa,EAGlB,IAAK,IAAI5E,EAAI,EAAGA,EAAItkB,KAAKgpB,YAAa1E,IACpCtkB,KAAKipB,KAAKpY,KAAK,CACbsY,QAASnpB,KAAKopB,sBACdC,OAAO,EACPvU,GAAI,MAGV,CAOA,mBAAAsU,GACE,GAAwB,oBAAbrrB,SACT,MAAO,CACLyV,UAAW,QACX,YAAAvV,GAAgB,EAChB,eAAAC,GAAmB,EACnB,WAAAR,GAAe,EACf,WAAAgrB,GAAe,EACfhV,MAAO,CAAA,EACPtD,WAAY,IAGhB,MAAM2B,EAAMhU,SAASyS,cAAc,OAKnC,OAJAuB,EAAIyB,UAAY,QAChBzB,EAAI9T,aAAa,OAAQ,SACzB8T,EAAI9T,aAAa,YAAa,UAC9B8T,EAAIiE,SAAW,EACRjE,CACT,CAOA,OAAAuX,CAAQC,GACN,IAAKA,GAA8B,iBAAZA,EACrB,MAAM,IAAItlB,MAAM,yCAIlB,IAAIulB,EAAYxpB,KAAKipB,KAAKQ,KAAMC,IAAWA,EAAML,QAG5CG,GAAaxpB,KAAKipB,KAAKznB,OAASxB,KAAKD,UACxCypB,EAAY,CACVL,QAASnpB,KAAKopB,sBACdC,OAAO,EACPvU,GAAI,MAEN9U,KAAKipB,KAAKpY,KAAK2Y,IAIjB,IAAIG,GAAa,EAsCjB,OArCKH,IACHA,EAAYxpB,KAAKipB,KAAK,GACtBU,GAAa,EACTH,EAAUL,QAAQS,eAAeJ,EAAUL,QAAQS,gBACnDJ,EAAUL,QAAQpP,qBAAqByP,EAAUL,QAAQpP,sBACzDyP,EAAUL,QAAQhR,aAAaqR,EAAUL,QAAQhR,cACjDqR,EAAUL,QAAQxP,cAAc6P,EAAUL,QAAQxP,eAClD6P,EAAUL,QAAQU,eAAeL,EAAUL,QAAQU,gBACnDL,EAAUL,QAAQrR,UAAU0R,EAAUL,QAAQrR,WAC9C0R,EAAUL,QAAQW,YACpBN,EAAUL,QAAQW,WAAWpB,YAAYc,EAAUL,SAErDK,EAAUL,QAAUnpB,KAAKopB,uBAI3BI,EAAUL,QAAQtX,UAAY,GAC9B2X,EAAUL,QAAQ3V,UAAY,QAC9BgW,EAAUL,QAAQjrB,gBAAgB,SAClCsrB,EAAUL,QAAQlrB,aAAa,OAAQ,SACvCurB,EAAUL,QAAQrU,GAAK,SAASyU,IAChCC,EAAUL,QAAQY,UAAYR,SACvBC,EAAUL,QAAQhN,0BAClBqN,EAAUL,QAAQU,qBAClBL,EAAUL,QAAQS,qBAClBJ,EAAUL,QAAQpP,2BAClByP,EAAUL,QAAQhR,mBAClBqR,EAAUL,QAAQxP,oBAClB6P,EAAUL,QAAQa,YAClBR,EAAUL,QAAQrR,SAEzB0R,EAAUH,OAAQ,EAClBG,EAAU1U,GAAKyU,EACVI,IACH3pB,KAAKkpB,YAAc,GAGdM,EAAUL,OACnB,CAQA,OAAAc,CAAQd,EAASI,GACf,IAAKJ,IAAYI,EACf,OAGF,MAAMW,EAAgBf,aAAmB3C,YAAc2C,EAAU,KAC3DgB,EAA8B,iBAAZZ,EAAuBA,EAA8B,iBAAZJ,EAAuBA,EAAU,KAG5FK,EAAYxpB,KAAKipB,KAAKQ,KACzBC,GACEQ,GAAiBR,EAAMP,UAAYe,GACnCC,GAAYT,EAAM5U,KAAOqV,GAG1BX,GAAaA,EAAUH,QAErBG,EAAUL,QAAQW,YACpBN,EAAUL,QAAQW,WAAWpB,YAAYc,EAAUL,SAGrDK,EAAUL,QAAUnpB,KAAKopB,sBAGzBI,EAAUH,OAAQ,EAClBG,EAAU1U,GAAK,KACf9U,KAAKkpB,WAAa9rB,KAAKC,IAAI,EAAG2C,KAAKkpB,WAAa,GAEpD,CAMA,QAAAkB,GACE,MAAO,CACLC,MAAOrqB,KAAKipB,KAAKznB,OACjB6nB,MAAOrpB,KAAKkpB,WACZoB,UAAWtqB,KAAKipB,KAAKznB,OAASxB,KAAKkpB,WACnCqB,YAAavqB,KAAKipB,KAAKznB,OAAS,EAAKxB,KAAKkpB,WAAalpB,KAAKipB,KAAKznB,OAAU,IAAM,EACjFzB,QAASC,KAAKD,QAElB,CAMA,KAAAkhB,GACEjhB,KAAKipB,KAAKva,QAASgb,IACbA,EAAMP,QAAQW,YAChBJ,EAAMP,QAAQW,WAAWpB,YAAYgB,EAAMP,WAG/CnpB,KAAKipB,KAAO,GACZjpB,KAAKkpB,WAAa,CACpB,CAOA,OAAAsB,GACE,GAAIxqB,KAAKipB,KAAKznB,OAASxB,KAAKgpB,YAAa,CACvC,MAAMsB,EAAYtqB,KAAKipB,KAAKjY,OAAQ0Y,IAAWA,EAAML,OAC/CoB,EAAWrtB,KAAKC,IAAI,EAAGitB,EAAU9oB,OAASxB,KAAKgpB,aAErD,GAAIyB,EAAW,EACb,IAAK,IAAInG,EAAI,EAAGA,EAAImG,EAAUnG,IAAK,CACjC,MAAM7O,EAAMzV,KAAKipB,KAAKxlB,QAAQ6mB,EAAUhG,IACpC7O,GAAM,GACRzV,KAAKipB,KAAKyB,OAAOjV,EAAK,EAE1B,CAEJ,CACF,EAIF,IAAIkV,GAAe,KAQZ,SAASC,GAAa5B,EAAc,EAAGjpB,EAAU,IAItD,OAHK4qB,KACHA,GAAe,IAAI5B,GAAiBC,EAAajpB,IAE5C4qB,EACT,CAKO,SAASE,KACVF,KACFA,GAAa1J,QACb0J,GAAe,KAEnB,CC3NOvT,eAAe0T,GAAmBnuB,EAASwY,GAChD,IAAID,EACJ,MACM9V,EAAS,QAGf,IACE,GAAIzC,GAASouB,QAAS,CACpB,MAAMC,EAAQ7rB,EAAgBC,GAC9B8V,EAAQ0V,KAAetB,QAAQ0B,GAC/B9V,EAAM6U,UAAYiB,CACpB,MACE9V,QTtBCkC,eAAmCrH,EAAS3Q,GAEjD,MAAMmR,EAAKxS,SAASyS,cSUJ,OTRhB,OADAD,EAAGuE,GAAK3V,EAAgBC,GACjBmR,CACT,CSiBoB0a,CAVF,EAU+B7rB,GAG7C,aF4BGgY,eAAgClC,EAAOvY,EAASwY,GACrD,MAAM1B,EAAS3W,IACTouB,EAAmBvuB,GAAS4lB,OAASmC,GAAoB/nB,EAAQ4lB,QAAU,KAC3E0B,EAAaiH,EACfA,EAAiBvS,ePMhBvB,eAAsCuB,GAC3C,GAAwB,iBAAbA,GAAyBzb,OAAOC,SAASwb,IAAaA,GAAY,EAAG,OAAOA,EACvF,GAAwB,iBAAbA,EAAuB,CAChC,MAAM5W,EAAU4W,EAASva,OAAOP,cAChC,GAAIkE,EAAQC,SAAS,OAASD,EAAQC,SAAS,MAAO,CACpD,MAAMZ,EAA+B,IAAtBc,WAAWH,GAC1B,OAAO7E,OAAOC,SAASiE,IAAWA,GAAU,EAAIA,EAAS,GAC3D,CACA,MAAMA,EAASc,WAAWH,GAC1B,OAAO7E,OAAOC,SAASiE,IAAWA,GAAU,EAAIA,EAAS,GAC3D,CACA,OAAO,GACT,COjBY+pB,CAAuBxuB,GAASyuB,mBACpCC,EAAyB,GAAGpH,MAC5B7H,EAAS8O,EACXA,EAAiB9O,OACmB,iBAA7Bzf,GAAS2uB,iBAAgC3uB,EAAQ2uB,gBAAgBltB,OACtEzB,EAAQ2uB,gBAAgBltB,OACxB,OAEF8sB,IACFhW,EAAMqW,QAAUL,GAElBhW,EAAMsW,eAAiB7uB,GAASuqB,cAEhC,MAAMuE,EAA4C,iBAAvB9uB,GAAS6W,WAA0B7W,EAAQ6W,UAAUpV,OAC5E,IAAIzB,EAAQ6W,UAAUpV,SACtB,GACJ8W,EAAM1B,UAAY,eAAe7W,GAASuZ,MAAQ,SAASuV,IAE3D,MAAM7U,EAC6B,iBAA1Bja,GAASia,aACZ,GAAGja,EAAQia,iBACXja,GAASia,aAETkR,EACyB,iBAAtBnrB,GAASmrB,SACZ,GAAGnrB,EAAQmrB,aACXnrB,GAASmrB,SAET4D,EAAkBR,EAAmB,GAAG9tB,KAAKgF,IAAI,IAAK6hB,OAAkBoH,EACxEM,EAAgBT,EAAmB,OAAS9O,EAE7C3I,EAAO9X,qBACVN,OAAOmD,OAAO0W,EAAMxB,MAAO,CACzB6C,WAAY5Z,GAAS0Z,gBACrBM,QAAS,YACTiV,aAAc,OACdhV,eACAiV,SAAU,SACVlY,QAAS,OACTC,WAAY,SACZyS,eAAgB,gBAChB2B,UAAW,+BACX8D,SAAU,QACVhE,WACA1T,QAAS,IACTiH,SAAU,WACVrE,OAAQ,UACR+U,UAAW,aACXC,WAAY,OACZC,cAAe,OACfxQ,WAAY,WAAWiQ,KAAmBC,gBAA4BN,KAA0BjP,IAChGM,UAAWuK,GAAoBtqB,GAAS0e,SAAU1e,GAASuqB,gBAAiBgE,GAC5EzvB,OAAQmC,OAAO6V,EAAOhY,QACtBywB,UACEvvB,GAASwvB,eAA2C,SAA1BxvB,EAAQwvB,cAC9BxvB,EAAQwvB,mBACRpvB,IAIV,MAAMqvB,EAA4B,UAAlBzvB,GAASuZ,KACnBmW,EAAO1vB,GAAS0vB,OAASD,EAAU,QAAWzvB,GAAS0vB,MAAQ,SAC/DC,EAAW3vB,GAAS2vB,WAAaF,EAAU,YAAc,UAC/DlX,EAAMjX,aAAa,OAAQouB,GAC3BnX,EAAMjX,aAAa,YAAaquB,GAChCpX,EAAMc,SAAW,EACjBd,EAAMqX,mBAAqBtI,EAE3B,MAAMuI,EAAczuB,SAASyS,cAAc,QAC3Cgc,EAAYhZ,UAAY,gBACxB0B,EAAMuX,aAAeD,EAGG,aAAtB7vB,GAAS+vB,UACa,aAAtB/vB,GAAS+vB,WACa,IAAtB/vB,GAAS+vB,UAEQ/vB,GAAS+vB,SAYhBjZ,EAAO9X,qBACjBN,OAAOmD,OAAOguB,EAAY9Y,MAAO,CAC/BC,QAAS,QACTsD,WAAY,YAdduV,EAAYtY,UAAUC,IAAI,gBACrBV,EAAO9X,qBACVN,OAAOmD,OAAOguB,EAAY9Y,MAAO,CAC/BC,QAAS,cACTgZ,gBAAiB,WACjBC,gBAAiB,IACjB3V,WAAY,SACZ4U,SAAU,SACVgB,aAAc,cAUpB,MAAMnY,EACyB,iBAAtB/X,GAAS+X,SACZ,GAAG/X,EAAQ+X,aACX/X,GAAS+X,SAEVjB,EAAO9X,qBACVN,OAAOmD,OAAOguB,EAAY9Y,MAAO,CAC/BoZ,KAAM,IACNnW,QAASha,GAASowB,YAClBC,WAAYrwB,GAASqwB,WACrBtY,WACAmC,WAAYla,GAASka,WACrBC,WAAYna,GAASswB,eACrB5Z,MAAO1W,GAASsE,UAChB+qB,WAAY,OACZkB,UAAW,aACXrB,SAAU,SACVgB,aAAc,WACdX,UACEvvB,GAASwvB,eAA2C,SAA1BxvB,EAAQwvB,cAC9BxvB,EAAQwvB,mBACRpvB,IAIV,MAAMorB,IAAcxrB,EAAQwrB,UACtBgF,EAAaxwB,EAAQyrB,SAAW,GAGhCgF,EAASpH,GAAgBrpB,GAK/B,GAJIywB,GACFlY,EAAMxX,YAAY0vB,GAGhBzwB,EAAQ0wB,QAAU1wB,EAAQ2wB,WAAY,CACxC,MAAMC,EAAWta,EAAatW,EAAQ0wB,QAAU,CAAA,GAChDb,EAAY9uB,YAAY6vB,GACxB,MAAMC,EAASzvB,SAASyS,cAAc,QACtCgd,EAAOha,UAAY,uBACdC,EAAO9X,sBACV6xB,EAAO9Z,MAAMC,QAAU,eACvB6Z,EAAO9Z,MAAM8H,MAAQ,OAEvBgR,EAAY9uB,YAAY8vB,EAC1B,CAEA,GACErF,GACsB,iBAAfgF,GACPA,EAAW/uB,OAAOoD,OAAS,EAE3B,IACE,MAAM8O,EAAY8B,EAAa+a,GACzB9E,EAAMtqB,SAASyS,cAAc,OAEnC,IADA6X,EAAIxW,UAAYvB,EACT+X,EAAIC,YACTkE,EAAY9uB,YAAY2qB,EAAIC,WAEhC,CAAE,MAAOxV,GACPC,QAAQC,KACN,0DACAF,GAEF0Z,EAAY9uB,YAAYK,SAAS2R,eAAe9R,OAAOuvB,IACzD,MAEAX,EAAY9uB,YAAYK,SAAS2R,eAAe9R,OAAOuvB,KAGzDX,EAAYvuB,aAAa,QAASuuB,EAAY7X,aAAe,IAC7DO,EAAMxX,YAAY8uB,GAEd7vB,GAAS0Y,KAA8B,iBAAhB1Y,EAAQ0Y,KACjCJ,EAAUC,EAAOvY,EAASwY,GAGxBxY,GAAS0b,MACXD,EAAiBlD,EAAOvY,EAASwY,GAG/BxY,GAAS8wB,iBACX7T,EAAkB1E,EAAOvY,EAASwY,IAGH,IAA7BxY,GAASkf,kBAA8Blf,GAASkf,sBAAyC9e,IAAtBJ,GAASif,UAC9E5B,EAAkB9E,EAAOvY,IAKP,UADUI,IAA5BJ,GAASX,eAA+BW,EAAQX,eAAiByX,EAAOzX,iBJ8PrE,SAA8BkZ,EAAOC,GAC1C,IAAKD,GAA2C,mBAA3BA,EAAMyC,iBAAiC,OAE5D,IAAI+V,EAAS,EACTC,EAAS,EACTC,EAAW,EACXC,EAAY,EACZC,GAAa,EACbC,GAAe,EACfC,EAAU,KAEVC,GAAoB,EAExB,MAAMC,EAAyB,KACzBD,IACFA,GAAoB,EACpBvvB,OAAOmZ,oBAAoB,YAAasW,GACxCzvB,OAAOmZ,oBAAoB,UAAWuW,KAIpCC,EAAiBtqB,IACrB,IAAKA,EAAG,OACR,MAAMgR,EAAShR,EAAEgR,OACjB,GACEA,GAC0B,mBAAnBA,EAAOuZ,SACdvZ,EAAOuZ,QAAQ,6CAEf,OAEF,IAAIC,EAAKxqB,EACLA,EAAEyqB,SAAWzqB,EAAEyqB,QAAQhtB,OAAS,GAClC+sB,EAAKxqB,EAAEyqB,QAAQ,GACfR,EAAUO,EAAGE,YAAc,MAE3BT,EAAU,KAEZN,EAASa,EAAGG,QACZf,EAASY,EAAGI,QACZf,EAAWF,EACXG,EAAYnuB,KAAKC,MACjBmuB,GAAa,EACbC,GAAe,EACf7Y,EAAM0Z,oBAAsB1Z,EAAMxB,MAAM+H,YAAc,GACtDvG,EAAMxB,MAAM+H,WAAa,OACzBvG,EAAMxB,MAAMsY,WAAa,OAEpBiC,GAAuC,oBAAXvvB,SAC/BuvB,GAAoB,EACpBvvB,OAAOiZ,iBAAiB,YAAawW,EAAe,CAAEzQ,SAAS,IAC/Dhf,OAAOiZ,iBAAiB,UAAWyW,EAAc,CAAE1Q,SAAS,MAI1DyQ,EAAiBpqB,IACrB,IAAK+pB,IAAe/pB,EAAG,OACvB,IAAIwqB,EAAKxqB,EACT,GAAIA,EAAEyqB,QACJ,GAAgB,OAAZR,GACF,IAAK,IAAI1J,EAAI,EAAGA,EAAIvgB,EAAEyqB,QAAQhtB,OAAQ8iB,IACpC,GAAIvgB,EAAEyqB,QAAQlK,GAAGmK,aAAeT,EAAS,CACvCO,EAAKxqB,EAAEyqB,QAAQlK,GACf,KACF,OAEOvgB,EAAEyqB,QAAQhtB,OAAS,IAC5B+sB,EAAKxqB,EAAEyqB,QAAQ,IAGnB,MAAMK,EAAIN,EAAGG,QACPnK,EAAIgK,EAAGI,QACPG,EAAKD,EAAInB,EACTqB,EAAKxK,EAAIoJ,EAEf,IAAKI,EACH,GAAI3wB,KAAKgmB,IAAI0L,GAAM,GAAK1xB,KAAKgmB,IAAI0L,GAAM1xB,KAAKgmB,IAAI2L,GAC9ChB,GAAe,OACV,GAAI3wB,KAAKgmB,IAAI2L,GAAM,EAIxB,OAHAjB,GAAa,EACb5Y,EAAMxB,MAAMsY,WAAa,QACzBkC,IAKF,GAAIH,EAAc,CAChBH,EAAWiB,EACX,MAAMza,EAAUhX,KAAKC,IAAI,EAAG,EAAID,KAAKgmB,IAAI0L,GAAM,KAC1ChyB,IAAYnB,qBAAwB8C,MACvCyW,EAAMxB,MAAMgJ,UAAY,cAAcoS,OACtC5Z,EAAMxB,MAAMU,QAAUxW,OAAOwW,IAE3BrQ,EAAEirB,YAAYjrB,EAAE2T,gBACtB,GAGI0W,EAAe,KAGnB,GAFAF,IACAF,EAAU,MACLF,IAAeC,EAGlB,OAFAD,GAAa,OACb5Y,EAAMxB,MAAMsY,WAAa,IAG3B8B,GAAa,EACb5Y,EAAMxB,MAAMsY,WAAa,GAEzB,MAAM8C,EAAKlB,EAAWF,EAChB/U,EAAWvb,KAAKC,IAAI,EAAGqC,KAAKC,MAAQkuB,GAEpCoB,GADWtW,EAAW,EAAIvb,KAAKgmB,IAAI0L,GAAMnW,EAAW,IAC9B,KAAQvb,KAAKgmB,IAAI0L,IAAO,GAC9CjL,EAAYoL,EAAU,GAAK,GAEjC,GAAI7xB,KAAKgmB,IAAI0L,IAAOjL,EAAW,CAC7B,MAAMqL,EAAQJ,EAAK,EAAI,KAAM,IACvBK,EAAeF,EAAU,IAAM,IAChCnyB,IAAYnB,qBAAwB8C,MACvCyW,EAAMxB,MAAM+H,WAAa,aAAa0T,yBAAoCA,eAC1Eja,EAAMxB,MAAMgJ,UAAY,cAAcwS,OACtCha,EAAMxB,MAAMU,QAAU,KAEpBc,EAAMka,eAAexG,aAAa1T,EAAMka,eAC5Cla,EAAMka,cAAgBtG,WAAW,KAC/B5T,EAAMka,cAAgB,KACC,mBAAZja,GAAwBA,EAAQD,IAC1Cia,GACuC,mBAA/Bja,EAAMka,eAAe7V,OAC9BrE,EAAMka,cAAc7V,OAExB,MACE,IAAKzc,IAAYnB,sBAAwB8C,IAAsB,CAC7D,MAAM8jB,EAASrN,EAAMqW,QACf8D,EAAa9M,GAAQnG,QAAU,oCAC/BkT,EAAe/M,GAAQ5J,SAAWvb,KAAKgF,IAAI,IAAKmgB,EAAO5J,UAAY,IACzEzD,EAAMxB,MAAM+H,WAAa,aAAa6T,OAAkBD,wBACxDna,EAAMxB,MAAMgJ,UAAY,gBACxBxH,EAAMxB,MAAMU,QAAU,IAElBc,EAAMqa,gBAAgB3G,aAAa1T,EAAMqa,gBAC7Cra,EAAMqa,eAAiBzG,WAAW,KAChC5T,EAAMqa,eAAiB,KACnBra,EAAM0Z,sBACR1Z,EAAMxB,MAAM+H,WAAavG,EAAM0Z,sBAEhCU,GACwC,mBAAhCpa,EAAMqa,gBAAgBhW,OAC/BrE,EAAMqa,eAAehW,OAEzB,GAINrE,EAAMyC,iBAAiB,aAAc0W,EAAe,CAAE3Q,SAAS,IAC/DxI,EAAMyC,iBAAiB,YAAawW,EAAe,CAAEzQ,SAAS,IAC9DxI,EAAMyC,iBAAiB,WAAYyW,EAAc,CAAE1Q,SAAS,IAC5DxI,EAAMyC,iBAAiB,cAAeyW,EAAc,CAAE1Q,SAAS,IAE/DxI,EAAMyC,iBAAiB,YAAa0W,EAAe,CAAE3Q,SAAS,IAE9DxI,EAAM0U,cAAgB,KAChB1U,EAAMka,gBACRxG,aAAa1T,EAAMka,eACnBla,EAAMka,cAAgB,MAEpBla,EAAMqa,iBACR3G,aAAa1T,EAAMqa,gBACnBra,EAAMqa,eAAiB,MAEzBrB,IAEAhZ,EAAM2C,oBAAoB,aAAcwW,GACxCnZ,EAAM2C,oBAAoB,YAAasW,GACvCjZ,EAAM2C,oBAAoB,WAAYuW,GACtClZ,EAAM2C,oBAAoB,cAAeuW,GACzClZ,EAAM2C,oBAAoB,YAAawW,GAG3C,CI9aImB,CAAqBta,EAAOC,SAIapY,IAAnBJ,GAASV,MAAsBU,EAAQV,MAAQwX,EAAOxX,QAI5EikB,EAFsC,iBAAlBvjB,EAAQV,MAAqBU,EAAQV,MAAQU,GAASuZ,MAAQ,OACnEvZ,GAAST,aAAeuX,EAAOvX,aAAe,UAI/DsgB,EAAkBtH,EACpB,CEzOUua,CAAiBva,EAAOvY,EAASwY,GAChCD,CACT,CAAE,MAAOqC,GACP,GAAI5a,GAASouB,SAAW7V,GAAO6U,UAC7B,IACEa,KAAeX,QAAQ/U,EAAOA,EAAM6U,UACtC,CAAE,MAAO,CAQX,OANAhX,QAAQC,KACN,0DACAuE,GAGFrC,QAAcsS,GAAqB7qB,EAASwY,GACrCD,CACT,CACF,CCvCA,MAAMwa,GAAoB,IAAIxvB,IACxByvB,GAAiB,IAAIzvB,IAOpB,SAAS0vB,GAAqBvU,GACnC,IAAKA,GAAgC,iBAAbA,EAAuB,MAAO,eACtD,MAAM1Y,EAAM0Y,EAASxd,cAAcO,OACnC,OAAKuE,EACWA,EAAIrD,QAAQ,aAAc,UAEvCA,QAAQ,OAAQ,KAChBA,QAAQ,cAAe,KACvBA,QAAQ,SAAU,KALJ,cAMnB,CAOO,SAASuwB,GAAexU,GAE7B,MAAO,mBADKuU,GAAqBvU,IAEnC,CAuCA,SAASyU,GAAyBvf,GAChC,MAAMkD,EAAS3W,IACfyT,EAAGiD,UAAY,uBACXC,EAAO9X,sBAEX4U,EAAGmD,MAAM2H,SAAW,QACpB9K,EAAGmD,MAAMjY,OAASmC,OAAO6V,EAAOhY,QAChC8U,EAAGmD,MAAMuY,cAAgB,OACzB1b,EAAGmD,MAAMqc,MAAQ,sBACjBxf,EAAGmD,MAAMC,QAAU,OACnBpD,EAAGmD,MAAM2S,eAAiB,gBAC1B9V,EAAGmD,MAAME,WAAa,SACtBrD,EAAGmD,MAAMsc,cAAgB,SACzBzf,EAAGmD,MAAMmY,SAAW,SACtB,CAQOzU,eAAe6Y,GAA0BtzB,EAAU,CAAA,EAAIuzB,GAC5D,MAAMzc,EAAS3W,IACTgY,EAAK+a,GAAelzB,GAAS0e,UAAY5H,EAAO5X,iBAChDs0B,GZ9BoB7vB,EA2KH7D,EAAaf,aA1KH,iBAAV4E,GAAmD,mBAAtBA,EAAM5C,YA0KFjB,EAAaf,WAC7C,oBAAbqC,SAAiCA,SAAS4T,KAC9C,KY1LT,IZa4BrR,EY+B1B,IAAK6vB,EAAM,MAAM,IAAIlsB,MAAM,uCAE3B,GAAI0rB,GAAetvB,IAAIyU,GACrB,OAAO6a,GAAexvB,IAAI2U,GAG5B,MAAM3W,EAAI,WACR,MAAM6C,EAAS0uB,GAAkBvvB,IAAI2U,GACrC,GAzCJ,SAA2BvE,EAAI4f,GAC7B,SAAK5f,IAAO4f,KACRA,IAASpyB,SAAS4T,KAAapB,EAAGsM,aAAetM,EAAG6f,gBAAkBryB,SAC7C,mBAAlBoyB,EAAKE,SAAgCF,EAAKE,SAAS9f,GACvDA,EAAGsM,aAAetM,EAAG6f,gBAAkBryB,SAChD,CAoCQuyB,CAAkBtvB,EAAQmvB,GAAO,OAAOnvB,EACxCA,GAAQ0uB,GAAkBnvB,OAAOuU,GAErC,IAAIvE,EAnDR,SAA2B4f,EAAMrb,GAC/B,OAAKqb,EAC8B,mBAAxBA,EAAKvb,eAAsCub,EAAKvb,eAAeE,GACxC,mBAAvBqb,EAAKnY,cAAqCmY,EAAKnY,cAAc,IAAIlD,KACrE,KAHW,IAIpB,CA8Cayb,CAAkBJ,EAAMrb,GACjC,GAAKvE,EAWHuf,GAAyBvf,GACE,mBAAhB2f,SAAkCA,EAAY3f,EAAI5T,OAZtD,CACP,MAAM8U,EAAM0e,GAAMC,gBAAsC,oBAAbryB,SAA2BA,SAAW,MACjF,IAAK0T,EAAK,MAAM,IAAIxN,MAAM,2BAC1BsM,EAAKkB,EAAIjB,cAAc,OACvBD,EAAGuE,GAAKA,EACRvE,EAAGtS,aAAa,OAAQ,UACxBsS,EAAGtS,aAAa,cAAe,QAC/B6xB,GAAyBvf,GACE,mBAAhB2f,SAAkCA,EAAY3f,EAAI5T,GAC7DwzB,EAAKzyB,YAAY6S,EACnB,CAKA,GAAqC,mBAA1B4f,EAAKhe,iBAAiC,CAC/C,MAAMqe,EAAML,EAAKhe,iBAAiB,IAAI2C,KACtC,GAAI0b,EAAIhvB,OAAS,EACf,IAAK,IAAI8iB,EAAI,EAAGA,EAAIkM,EAAIhvB,OAAQ8iB,IAC9B,IACEkM,EAAIlM,GAAGuE,QACT,CAAE,MAAO,CAGf,CAGA,OADA6G,GAAkBlvB,IAAIsU,EAAIvE,GACnBA,CACR,EAlCS,GAoCVof,GAAenvB,IAAIsU,EAAI3W,GACvB,IACE,aAAaA,CACf,CAAC,QACCwxB,GAAepvB,OAAOuU,EACxB,CACF,CC7IA,MAAM2b,GAAuB,IAAI1hB,IAAI,CACnC,WACA,YACA,cACA,eACA,aACA,gBACA,aACA,gBACA,cACA,eACA,cACA,eACA,iBACA,oBACA,WAGI2hB,GAAmB,IAAI3hB,IAAI,CAAC,MAAO,WACnC4hB,GAAgB,IAAIF,MAAyBC,IAa5CtZ,eAAe8Y,GAAY5e,EAAW3U,EAAU,IACrD,IAAK2U,IAAc3U,GAA8B,iBAAZA,EACnC,MAAM,IAAIsH,MAAM,kCAGlB,MAAMwP,EAAS3W,IACT8zB,EAAShzB,OAAOjB,GAAS0e,UAAY5H,EAAO5X,iBAAmB,gBAClEgC,cACAO,OACAkB,QAAQ,OAAQ,KACnB,IAAIuxB,EAAeD,EArBrB,IAA8BzJ,EA+B5B,GA/B4BA,EAuBFyJ,EAtBnBH,GAAqBpwB,IAAI8mB,IAsBMuJ,GAAiBrwB,IAAIuwB,KACzD7d,QAAQC,KAAK,qBAAqBrW,EAAQ0e,2CAC1CwV,EAAe,gBArBnB,SAA8Bvf,GAC5B,GAAKA,GAAW4C,UAChB,IAAK,IAAIoQ,EAAI,EAAGA,EAAIqM,GAAcnvB,OAAQ8iB,IACxChT,EAAU4C,UAAU2U,OAAO,kBAAoB8H,GAAcrM,GAEjE,CAmBEwM,CAAqBxf,GACrBA,EAAU4C,WAAWC,IAAI,kBAAoB0c,GAEzC/zB,IAAYnB,oBACd,QAYJ,SAA8B2V,GAC5BA,EAAUoC,MAAMiU,IAAM,OACtBrW,EAAUoC,MAAMkU,OAAS,OACzBtW,EAAUoC,MAAM4H,KAAO,OACvBhK,EAAUoC,MAAMmU,MAAQ,OACxBvW,EAAUoC,MAAMgJ,UAAY,OAC5BpL,EAAUoC,MAAMoU,SAAW,MAC7B,CAhBEiJ,CAAqBzf,GACrB,MAAM0f,EAiBR,SAAuB3V,GACrB,MAAM8L,EAAM9L,EAASxd,cAAcO,OAE7B6yB,EAAsB,mBAAR9J,GAAoC,sBAARA,EAOhD,MAAO,CACL+J,OAPa/J,EAAI7jB,WAAW,QAAU6jB,EAAInlB,SAAS,OAQnDmvB,UAPgBhK,EAAI7jB,WAAW,WAAa6jB,EAAInlB,SAAS,WAAamlB,EAAIrpB,SAAS,SAQnFszB,QAPcjK,EAAI7jB,WAAW,SAAW6jB,EAAInlB,SAAS,QAQrDqvB,SAPelK,EAAI7jB,WAAW,UAAY6jB,EAAInlB,SAAS,SAQvDsvB,UAPgBnK,EAAIrpB,SAAS,UAQ7ByzB,aAAcN,EAElB,CAnCwBO,CAAcX,IAqCtC,SAAkCvf,EAAWmgB,GAC3C,QAAKA,EAAMF,eAEXjgB,EAAUoC,MAAMoU,SAAW,QAEvB2J,EAAMP,QACR5f,EAAUoC,MAAMiU,IAAM,OACtBrW,EAAUoC,MAAM4H,KAAO,OACvBhK,EAAUoC,MAAMmU,MAAQ,QACjB,KAGL4J,EAAMN,YACR7f,EAAUoC,MAAMkU,OAAS,OACzBtW,EAAUoC,MAAM4H,KAAO,OACvBhK,EAAUoC,MAAMmU,MAAQ,QACjB,GAIX,EAvDM6J,CAAyBpgB,EAAW0f,IAyD1C,SAA+B1f,EAAWmgB,GACxC,QAAKA,EAAMH,aAEPG,EAAMP,QAAWO,EAAML,SAAYK,EAAMJ,UAOzCI,EAAMN,WAAcM,EAAML,SAAYK,EAAMJ,UAO5CI,EAAML,SAAYK,EAAMP,QAAWO,EAAMN,WAOzCM,EAAMJ,UAAaI,EAAMP,QAAWO,EAAMN,YAOzCM,EAAML,SAAYK,EAAMJ,UAAaI,EAAMP,QAAWO,EAAMN,aAC/D7f,EAAUoC,MAAMiU,IAAM,MACtBrW,EAAUoC,MAAM4H,KAAO,MACvBhK,EAAUoC,MAAMgJ,UAAY,yBACrB,IAVPpL,EAAUoC,MAAMmU,MAAQ,OACxBvW,EAAUoC,MAAMiU,IAAM,MACtBrW,EAAUoC,MAAMgJ,UAAY,oBACrB,IAVPpL,EAAUoC,MAAM4H,KAAO,OACvBhK,EAAUoC,MAAMiU,IAAM,MACtBrW,EAAUoC,MAAMgJ,UAAY,oBACrB,IAVPpL,EAAUoC,MAAMkU,OAAS,OACzBtW,EAAUoC,MAAM4H,KAAO,MACvBhK,EAAUoC,MAAMgJ,UAAY,oBACrB,IAVPpL,EAAUoC,MAAMiU,IAAM,OACtBrW,EAAUoC,MAAM4H,KAAO,MACvBhK,EAAUoC,MAAMgJ,UAAY,oBACrB,GAgCX,CA/FMiV,CAAsBrgB,EAAW0f,IAiGvC,SAAkC1f,EAAWmgB,GACvCA,EAAMN,UACR7f,EAAUoC,MAAMkU,OAAS,OAChB6J,EAAMP,OACf5f,EAAUoC,MAAMiU,IAAM,OAEtBrW,EAAUoC,MAAMkU,OAAS,OAGvB6J,EAAMJ,SACR/f,EAAUoC,MAAMmU,MAAQ,OACf4J,EAAML,QACf9f,EAAUoC,MAAM4H,KAAO,QAEvBhK,EAAUoC,MAAM4H,KAAO,MACvBhK,EAAUoC,MAAMgJ,UAAY,mBAEhC,CAhHEkV,CAAyBtgB,EAAW0f,EACtC,CChEO,MAAMa,GACX,WAAA/xB,CAAYgyB,EAAUxV,GACpBtc,KAAK8xB,SAA+B,mBAAbA,EAA0BA,EAAW,OAC5D,MAAMC,EAAazV,IAAUR,IACvBkW,EAAY90B,OAAOC,SAASmf,IAAUA,GAAS,EAAIA,EAASyV,EAAajW,IAAW,EAC1F9b,KAAKsc,MAAQ0V,EACbhyB,KAAKiyB,UAAYD,EACjBhyB,KAAK6tB,UAAY,KACjB7tB,KAAKkyB,UAAY,KACjBlyB,KAAKoZ,UAAW,EAChBpZ,KAAKmyB,aAAc,EACnBnyB,KAAK+xB,WAAaA,CACpB,CAEA,KAAAvS,GACE,OAAIxf,KAAKmyB,aAAenyB,KAAKkyB,WAAalyB,KAAK+xB,aAC/C/xB,KAAKoZ,UAAW,EAChBpZ,KAAK6tB,UAAYnuB,KAAKC,MACtBK,KAAKkyB,UAAYpJ,WAAW,KAC1B9oB,KAAKmyB,aAAc,EACnBnyB,KAAKkyB,UAAY,KACjB,IACElyB,KAAK8xB,UACP,CAAE,MAAOhf,GACPC,QAAQwE,MAAM,gCAAiCzE,EACjD,GACC9S,KAAKiyB,WAC6B,mBAA1BjyB,KAAKkyB,WAAW3Y,OACzBvZ,KAAKkyB,UAAU3Y,SAbiDvZ,IAgBpE,CAEA,KAAAoyB,GACE,GAAIpyB,KAAKoZ,WAAapZ,KAAKkyB,WAAalyB,KAAKmyB,YAAa,OAAOnyB,KACjE4oB,aAAa5oB,KAAKkyB,WAClBlyB,KAAKkyB,UAAY,KACjB,MAAMG,EAAUj1B,KAAKC,IAAI,EAAGqC,KAAKC,MAAQK,KAAK6tB,WAG9C,OAFA7tB,KAAKiyB,UAAY70B,KAAKgF,IAAIpC,KAAKsc,MAAOlf,KAAKC,IAAI,EAAG2C,KAAKiyB,UAAYI,IACnEryB,KAAKoZ,UAAW,EACTpZ,IACT,CAEA,MAAAsd,GACE,OAAKtd,KAAKoZ,UAAYpZ,KAAKmyB,cAC3BnyB,KAAKoZ,UAAW,EAChBpZ,KAAKwf,SAF0Cxf,IAIjD,CAEA,KAAAihB,GAME,OALIjhB,KAAKkyB,YACPtJ,aAAa5oB,KAAKkyB,WAClBlyB,KAAKkyB,UAAY,MAEnBlyB,KAAKmyB,aAAc,EACZnyB,IACT,CAEA,gBAAAsyB,GACE,OAAItyB,KAAKmyB,YAAoB,EACzBnyB,KAAKoZ,SAAiBpZ,KAAKiyB,UAC1BjyB,KAAKkyB,UACH90B,KAAKC,IAAI,EAAG2C,KAAKiyB,WAAavyB,KAAKC,MAAQK,KAAK6tB,YAD3B7tB,KAAKsc,KAEnC,EClDF,MAAMiW,GACJ,WAAAzyB,GAEEE,KAAKwyB,QAAU,KACfxyB,KAAKyyB,MAAQzyB,KAAK0yB,iBAClB1yB,KAAK2yB,WAAY,EAEjB3yB,KAAK4yB,YAAc,KAEnB5yB,KAAK6yB,UAAY,IAAI3yB,IACrBF,KAAK8yB,yBAAuD,oBAArBC,iBAEnC/yB,KAAK8yB,0BACP9yB,KAAKgzB,uBAET,CAWA,cAAAN,GACE,MAAMjzB,EAAYC,KAAKC,MAAMX,SAAS,IACtC,IAAIi0B,EAAU,GAEd,GAAsB,oBAAXC,QAA4D,mBAA3BA,OAAOC,gBACjD,IACE,MAAMC,EAAM,IAAIC,YAAY,GAC5BH,OAAOC,gBAAgBC,GACvBH,EAAU,GAAGG,EAAI,GAAGp0B,SAAS,MAAMo0B,EAAI,GAAGp0B,SAAS,MAAMyC,MAAM,EAAG,EACpE,CAAE,MACA,CAWJ,OAPKwxB,IAEHA,EAAU71B,KAAKE,MAAsB,iBAAhBF,KAAK2B,UACvBC,SAAS,IACTyC,MAAM,EAAG,IAGP,OAAOhC,KAAawzB,GAC7B,CAMA,qBAAAD,GACE,IACEhzB,KAAKwyB,QAAU,IAAIO,iBAAiB,uBAIpC/yB,KAAKwyB,QAAQjZ,UACbvZ,KAAKwyB,QAAQc,UAAaC,GAAUvzB,KAAKwzB,eAAeD,EAAME,MAG9DzzB,KAAK0zB,qBACP,CAAE,MAAOnc,GACPxE,QAAQC,KAAK,kDAAmDuE,GAChEvX,KAAK8yB,0BAA2B,CAClC,CACF,CAMA,mBAAAY,GACO1zB,KAAKwyB,UAGVxyB,KAAK2zB,UAAU,eAAgB,GAAI,CAAA,GAGnC3zB,KAAK4yB,YAAc9J,WAAW,KAC5B9oB,KAAK4yB,YAAc,KACd5yB,KAAK2yB,YACR3yB,KAAK2yB,WAAY,EACjB3yB,KAAK2zB,UAAU,iBAAkB,GAAI,CAAElB,MAAOzyB,KAAKyyB,UAEpD,KAEHzyB,KAAK4yB,YAAYrZ,UACnB,CAQA,SAAAoa,CAAUzd,EAAMqT,EAAU,GAAIqK,EAAU,CAAA,GACtC,IAAK5zB,KAAK8yB,2BAA6B9yB,KAAKwyB,QAC1C,OAGF,IAAIqB,EAAgBtK,EAChBuK,EAAgBF,EAGG,iBAAZrK,GAAoC,OAAZA,GAAoD,IAAhCluB,OAAOsF,KAAKizB,GAASpyB,SAC1EsyB,EAAgBvK,EAChBsK,EAAgB,IAGlB,MAAMzL,EAAU,CACdlS,OACAqT,QAAkC,iBAAlBsK,EAA6BA,EAAgBj2B,OAAOi2B,GAAiB,IACrFD,QAAUE,GAA0C,iBAAlBA,EAA8BA,EAAgB,CAAA,EAChFr0B,UAAWC,KAAKC,MAChB8yB,MAAOzyB,KAAKyyB,OAGd,IACEzyB,KAAKwyB,QAAQuB,YAAY3L,EAC3B,CAAE,MAAO7Q,GACPxE,QAAQC,KAAK,uCAAwCuE,EACvD,CACF,CAOA,cAAAic,CAAepL,GACb,IAAKA,GAAWA,EAAQqK,QAAUzyB,KAAKyyB,MACrC,OAGF,MAAMvc,KAAEA,EAAIqT,QAAEA,EAAOqK,QAAEA,GAAYxL,EAGnC,GAAa,mBAATlS,EAMF,OALIlW,KAAK4yB,cACPhK,aAAa5oB,KAAK4yB,aAClB5yB,KAAK4yB,YAAc,WAErB5yB,KAAK2yB,WAAY,GAIN,kBAATzc,GAA4BlW,KAAK4yB,cACnChK,aAAa5oB,KAAK4yB,aAClB5yB,KAAK4yB,YAAc,MAIR,iBAAT1c,GAA2BlW,KAAK2yB,UAClC3yB,KAAK2zB,UAAU,gBAAiB,aAAc,CAC5CK,OAAQp3B,MAAMuT,KAAKnQ,KAAKi0B,sBAAwB,IAChDC,MAAOl0B,KAAKm0B,sBAAwB,MAMtBn0B,KAAK6yB,UAAU1yB,IAAI+V,IAAS,IACpCxH,QAASojB,IACjB,IACEA,EAAS,CAAEvI,UAASqK,UAASxL,WAC/B,CAAE,MAAO7Q,GACPxE,QAAQC,KAAK,8BAA8BkD,KAASqB,EACtD,GAEJ,CAQA,EAAA6c,CAAGle,EAAM4b,GACP,GAAwB,mBAAbA,EACT,MAAM,IAAI7tB,MAAM,+BAUlB,OAPKjE,KAAK6yB,UAAUxyB,IAAI6V,IACtBlW,KAAK6yB,UAAUryB,IAAI0V,EAAM,IAG3BlW,KAAK6yB,UAAU1yB,IAAI+V,GAAMrF,KAAKihB,GAGvB,KACL,MAAMe,EAAY7yB,KAAK6yB,UAAU1yB,IAAI+V,IAAS,GACxCme,EAAQxB,EAAUpvB,QAAQquB,GAC5BuC,GAAQ,GACVxB,EAAUnI,OAAO2J,EAAO,GAG9B,CAMA,0BAAAC,CAA2BC,GACzBv0B,KAAKi0B,iBAAmBM,CAC1B,CAMA,0BAAAC,CAA2BD,GACzBv0B,KAAKm0B,iBAAmBI,CAC1B,CAMA,WAAAE,GACE,OAAOz0B,KAAK8yB,wBACd,CAMA,QAAA4B,GACE,OAAO10B,KAAKyyB,KACd,CAMA,YAAAkC,GACE,OAAO30B,KAAK2yB,SACd,CAKA,OAAAiC,GAKE,GAJI50B,KAAK4yB,cACPhK,aAAa5oB,KAAK4yB,aAClB5yB,KAAK4yB,YAAc,MAEjB5yB,KAAKwyB,QACP,IACExyB,KAAKwyB,QAAQlR,OACf,CAAE,MAAO/J,GACPxE,QAAQC,KAAK,4CAA6CuE,EAC5D,CAEFvX,KAAK6yB,UAAU5R,QACfjhB,KAAKwyB,QAAU,IACjB,EAIF,IAAIqC,GAAsB,KAMnB,SAASC,KACd,IAAKD,KACHA,GAAsB,IAAItC,GAGJ,oBAAX7zB,QAAwB,CACjC,MAAMq2B,EAAU,KACdF,IAAqBD,UACrBC,GAAsB,MAExBn2B,OAAOiZ,iBAAiB,WAAYod,GACpCr2B,OAAOiZ,iBAAiB,eAAgBod,EAC1C,CAEF,OAAOF,EACT,CAKO,SAASG,KACVH,KACFA,GAAoBD,UACpBC,GAAsB,KAE1B,CC1RA,MAAMI,GAAgB,CACpB1d,MAAO,GACPuO,QAAS,GACTC,KAAM,GACNF,QAAS,IAMLqP,GAAmB,CAEvB,QAAS,WAAY,SAAU,YAAa,UAAW,QAAS,QAChE,SAAU,YAAa,YAAa,YAAa,MAAO,OACxD,WAAY,MAAO,UAAW,UAAW,UACzC,WAAY,SAAU,SAAU,eAAgB,OAChD,OAAQ,UAAW,UAAW,OAAQ,cAGtC,SAAU,WAAY,SAAU,cAAe,SAAU,MACzD,YAAa,aAAc,UAAW,QAAS,YAC/C,UAAW,UAAW,SAAU,SAAU,cAC1C,WAAY,QAAS,QAAS,OAAQ,WAGtC,SAAU,SAAU,SAAU,WAAY,SAAU,UACpD,UAAW,UAAW,cAAe,WAAY,OACjD,UAAW,UAAW,SAAU,cAAe,QAC/C,UAAW,UAAW,WAAY,eAM9BC,GAAwB,CAE5B,UAAW,YAAa,WAAY,OAAQ,QAC5C,OAAQ,cAAe,OAAQ,SAAU,WACzC,WAAY,aAAc,UAAW,SAAU,YAC/C,OAAQ,OAAQ,SAAU,UAAW,cACrC,UAAW,UAAW,WAAY,SAAU,UAC5C,YAAa,eAAgB,SAAU,WAQlC,SAASC,GAAuBC,GACrC,IAAKA,GAA8B,iBAAZA,EACrB,MAAO,CAAEC,MAAO,GAAIC,UAAW,CAAEC,KAAM,IAAMC,SAAU,IAGzD,MAAMvf,KAAEA,EAAIkS,QAAEA,EAAOzP,SAAEA,GAAa0c,EAC9BE,EAAY,CAAA,EACZG,EAAmB,GACzB,IAAIJ,EAAQ,GAGZ,MAAMK,EAAYV,GAAc/e,IAAS,GACzCqf,EAAUrf,KAAOyf,EACjBL,GAA4B,IAAlBK,EAAY,IAGtB,MAAMC,EAAiC,iBAAZxN,EAAuBA,EAAUxqB,OAAOwqB,GAAW,IACxEyN,EAAeD,EAAY/3B,cACjC,IAAIi4B,EAAe,EAGnB,IAAK,MAAMC,KAAWb,GAAkB,CACtC,MAAMc,EAAUD,EAAQz2B,QAAQ,sBAAuB,QACzC,IAAI22B,OAAO,MAAMD,OAAc,KACnCx2B,KAAKo2B,KACbF,EAAiB7kB,KAAKklB,GACtBD,GAAgB,EAEpB,CAEA,IAAK,MAAMC,KAAWZ,GAAuB,CAC3C,MAAMa,EAAUD,EAAQz2B,QAAQ,sBAAuB,QACzC,IAAI22B,OAAO,MAAMD,OAAc,KACnCx2B,KAAKo2B,KACbF,EAAiB7kB,KAAKklB,GACtBD,GAAgB,EAEpB,CAMA,GAJAP,EAAUW,QAAU94B,KAAKgF,IAAIhF,KAAKC,IAAIy4B,GAAc,IAAM,IAC1DR,GAASC,EAAUW,QAGfvd,IAAamD,KAAyB,IAAbnD,EAC3B4c,EAAU5c,SAAW,GACrB2c,GAAS,QACJ,GAAwB,iBAAb3c,GAAyBzb,OAAOC,SAASwb,IAAaA,EAAW,EAAG,CACpF,MAAMwd,EAAgB/4B,KAAKC,IAAI,EAAG,GAAMsb,EAAW,KACnD4c,EAAU5c,SAAWvb,KAAK6E,MAAMk0B,GAChCb,GAAyB,GAAhBa,CACX,CAGA,MAAMC,EAAgBP,EAAar0B,OACnC,GAAI40B,EAAgB,EAAG,CACrB,MAAMC,EAAgBj5B,KAAKgF,IAAI,GAAIhF,KAAKE,MAAM84B,EAAgB,KAC9Db,EAAU/zB,QAAU60B,EACpBf,GAASe,CACX,CAGA,MAAMC,GAAoBV,EAAYt0B,MAAM,OAAS,IAAIE,OACnD+0B,EAAmBn5B,KAAKgF,IAAI,EAAGk0B,GACrCf,EAAUiB,SAAWD,EACrBjB,GAASiB,EAGT,MAAME,GAAgBb,EAAYt0B,MAAM,mBAAqB,IAAIE,OAC3Dk1B,EAAYt5B,KAAKgF,IAAI,EAAGq0B,GAO9B,OANAlB,EAAUoB,KAAOD,EACjBpB,GAASoB,EAGTpB,EAAQl4B,KAAKC,IAAI,EAAGD,KAAKgF,IAAI,IAAKhF,KAAK6E,MAAMqzB,KAEtC,CACLA,QACAC,YACAE,SAAU,IAAI,IAAI1mB,IAAI2mB,IAE1B,CAOO,SAASkB,GAAgBxO,GAC9B,IAAKA,GAA8B,iBAAZA,EAAsB,MAAO,CAAC,WAErD,MAAMyO,EAAWzO,EAAQvqB,cACnBi5B,EAAa,GAqCnB,MAlCI,yDAAyDt3B,KAAKq3B,IAChEC,EAAWjmB,KAAK,YAId,0DAA0DrR,KAAKq3B,IACjEC,EAAWjmB,KAAK,eAId,0DAA0DrR,KAAKq3B,IACjEC,EAAWjmB,KAAK,QAId,2DAA2DrR,KAAKq3B,IAClEC,EAAWjmB,KAAK,UAId,uDAAuDrR,KAAKq3B,IAC9DC,EAAWjmB,KAAK,YAId,0CAA0CrR,KAAKq3B,IACjDC,EAAWjmB,KAAK,MAIQ,IAAtBimB,EAAWt1B,QACbs1B,EAAWjmB,KAAK,WAGXimB,CACT,CCxIO,SAASC,GAAkBC,EAAIC,GACpC,IAAKD,IAAOC,GAAsB,iBAATD,EAAGnI,GAAkC,iBAAToI,EAAGpI,GAAkC,iBAATmI,EAAGzS,GAAkC,iBAAT0S,EAAG1S,EAC9G,OAAO,EAET,MAAMuK,EAAKmI,EAAGpI,EAAImI,EAAGnI,EACfE,EAAKkI,EAAG1S,EAAIyS,EAAGzS,EACrB,OAAOnnB,KAAK2lB,KAAK+L,EAAKA,EAAKC,EAAKA,EAClC,CAQO,SAASmI,GAAkBC,EAAUxe,GAC1C,MAAMjU,EAAIxH,OAAOi6B,GACXC,EAAMl6B,OAAOyb,GACnB,OAAKzb,OAAOC,SAASuH,KAAOxH,OAAOC,SAASi6B,IAAQA,EAAM,EAAU,EACxD,IAARA,EAAwB,IAAN1yB,EAAU,EAAIoX,IAC7B1e,KAAKgmB,IAAI1e,GAAK0yB,CACvB,CAUO,SAASnI,GAAQoI,EAAUF,EAAUG,EAAoB,GAAKC,EAAoB,IACvF,MAAMt6B,EAAIC,OAAOm6B,GACX3yB,EAAIxH,OAAOi6B,GACjB,SAAKj6B,OAAOC,SAASF,KAAOC,OAAOC,SAASuH,KACrCzH,GAAKq6B,GAAqBl6B,KAAKgmB,IAAI1e,IAAM6yB,CAClD,CAOO,SAASC,GAAejE,GAC7B,MAAM/E,EAAU,GAEhB,GAAI+E,EAAM/E,SAAW+E,EAAM/E,QAAQhtB,OAAS,EAC1C,IAAK,IAAI8iB,EAAI,EAAGA,EAAIiP,EAAM/E,QAAQhtB,OAAQ8iB,IAAK,CAC7C,MAAMmT,EAAQlE,EAAM/E,QAAQlK,GAC5BkK,EAAQ3d,KAAK,CACXge,EAAG4I,EAAM/I,QACTnK,EAAGkT,EAAM9I,QACT7Z,GAAI2iB,EAAMhJ,WACViJ,KAAMh4B,KAAKC,OAEf,MACK,GAAI4zB,EAAMoE,gBAAkBpE,EAAMoE,eAAen2B,OAAS,EAC/D,IAAK,IAAI8iB,EAAI,EAAGA,EAAIiP,EAAMoE,eAAen2B,OAAQ8iB,IAAK,CACpD,MAAMmT,EAAQlE,EAAMoE,eAAerT,GACnCkK,EAAQ3d,KAAK,CACXge,EAAG4I,EAAM/I,QACTnK,EAAGkT,EAAM9I,QACT7Z,GAAI2iB,EAAMhJ,WACViJ,KAAMh4B,KAAKC,OAEf,CAGF,OAAO6uB,CACT,CA2CO,SAASoJ,GAAYva,EAAOwa,EAAuB,IACxD,GAA4B,IAAxBxa,EAAMya,eAAiD,IAA1Bza,EAAM0a,gBACrC,MAAO,CAAEC,SAAS,EAAOC,MAAO,EAAG/L,UAAW,QAGhD,MAAMgM,EAAiB7a,EAAM0a,gBAAkB1a,EAAMya,cAMrD,MAAO,CAAEE,QALO56B,KAAKgmB,IAAI8U,IAAmBL,EAK1BI,MAHJ5a,EAAM0a,gBAAkB1a,EAAMya,cAGnB5L,UAFPgM,EAAiB,EAAI,MAAQ,KAEXA,iBACtC,CA8DO,SAASC,GAAsBhP,EAASxsB,EAAU,IACvD,MAAMy7B,QACJA,EAAOC,QACPA,EAAOC,QACPA,EAAOC,uBACPA,EAAyB,GAAGC,uBAC5BA,EAAyB,GAAGC,uBAC5BA,EAAyB,GAAEC,iBAC3BA,EAAmB,IACjB/7B,EAEJ,IAAIg8B,EAAe,KACfC,GAAa,EAEjB,MAAMC,EACW90B,IACb60B,GAAa,EACbD,EA/HC,SAAgCpF,GACrC,MAAM/E,EAAUgJ,GAAejE,GAU/B,MARc,CACZ/E,UACAsK,aAActK,EAAQvuB,IAAK5B,IAAC,IAAWA,KACvCwvB,UAAWnuB,KAAKC,MAChBm4B,cAAetJ,EAAQhtB,QAAU,EAAIu1B,GAAkBvI,EAAQ,GAAIA,EAAQ,IAAM,EACjFuJ,gBAAiBvJ,EAAQhtB,QAAU,EAAIu1B,GAAkBvI,EAAQ,GAAIA,EAAQ,IAAM,EAIvF,CAmHqBuK,CAAuBh1B,IAHpC80B,EAMU90B,IACP60B,GAAeD,IACpBA,EAhHC,SAA4Btb,EAAOkW,GACxC,MAAM/E,EAAUgJ,GAAejE,GAE/B,MAAO,IACFlW,EACHmR,UACAuJ,gBAAiBvJ,EAAQhtB,QAAU,EAAIu1B,GAAkBvI,EAAQ,GAAIA,EAAQ,IAAMnR,EAAM0a,gBAE7F,CAwGqBiB,CAAmBL,EAAc50B,KAR9C80B,EAWS90B,IACX,IAAK60B,IAAeD,EAAc,OAClCC,GAAa,EAGb,MAAMK,EAAQrB,GAAYe,EAAcD,GACpCO,EAAMjB,SAA8B,mBAAZK,GAC1BA,EAAQY,GAIV,MAAMC,EA3FL,SAAwB7b,GAC7B,GAAkC,IAA9BA,EAAMyb,aAAat3B,QAAyC,IAAzB6b,EAAMmR,QAAQhtB,OACnD,MAAO,CAAE21B,SAAU,EAAGE,SAAU,EAAGnL,UAAW,OAAQvT,SAAU,GAGlE,MAAMwgB,EAAa9b,EAAMyb,aAAa,GAGhC3B,GAFe9Z,EAAMmR,QAAQ/E,KAAMprB,GAAMA,EAAEyW,KAAOqkB,EAAWrkB,KAAOuI,EAAMmR,QAAQ,IAE1DK,EAAIsK,EAAWtK,EACvClW,EAAWjZ,KAAKC,MAAQ0d,EAAMwQ,UAIpC,MAAO,CAAEsJ,WAAUE,SAHFH,GAAkBC,EAAUxe,GAGhBuT,UAFXiL,EAAW,EAAI,QAAU,OAEHxe,WAC1C,CA6EoBygB,CAAeT,GAEN1J,GAAQiK,EAAM7B,SAAU6B,EAAM/B,SAAUoB,EAAwB,KAC9C,mBAAZH,GAC3BA,EAAQc,GAGV,MAAMG,EA3EL,SAA8BH,EAAO5B,EAAoB,GAAKC,EAAoB,IACvF,OAAO2B,EAAM7B,UAAYC,GAAqBl6B,KAAKgmB,IAAI8V,EAAM/B,WAAaI,CAC5E,CAyE4B+B,CAAqBJ,EAAOV,EAAwBC,GACtEY,GAAoC,mBAAZf,GAC1BA,EAAQY,GAGVP,EAAe,MAInB,MAAO,CACL,MAAAY,GACOpQ,GAA+C,mBAA7BA,EAAQxR,mBAC/BwR,EAAQxR,iBAAiB,aAAckhB,EAAuB,CAAEnb,SAAS,IACzEyL,EAAQxR,iBAAiB,YAAakhB,EAAsB,CAAEnb,SAAS,IACvEyL,EAAQxR,iBAAiB,WAAYkhB,EAAqB,CAAEnb,SAAS,IACrEyL,EAAQxR,iBAAiB,cAAekhB,EAAqB,CAAEnb,SAAS,IAC1E,EAEA,MAAA8b,GACOrQ,GAAkD,mBAAhCA,EAAQtR,sBAC/BsR,EAAQtR,oBAAoB,aAAcghB,GAC1C1P,EAAQtR,oBAAoB,YAAaghB,GACzC1P,EAAQtR,oBAAoB,WAAYghB,GACxC1P,EAAQtR,oBAAoB,cAAeghB,GAC7C,EAEAY,SAAQ,IACCd,EAGb,CCtTA,MAAM3E,GAAS,IAAI9zB,IACbw5B,GAAU,IAAIx5B,IACdg0B,GAAQ,GACd,IAAIyF,GAAe,EACfC,GAAe,EAMZ,SAASC,KACd,MAAO,CACLC,YAAa9F,GAAOvzB,KACpBs5B,WAAY7F,GAAM1yB,OAClBm4B,gBACAC,gBACAn6B,UAAWC,KAAKC,MAEpB,CAKA,SAASq6B,KACP,MAAMvmB,EAAS3W,IACf,GAAgC,mBAArB2W,EAAOlX,UAChB,IACEkX,EAAOlX,UAAUs9B,KACnB,CAAE,MAAO/mB,GACPC,QAAQwE,MAAM,4BAA6BzE,EAC7C,CAEJ,CAIA,MAAMmnB,GAAcnF,KA8DpB,SAASoF,GAAgB3kB,GACvB,GAAuC,iBAA5BA,GAAM5Y,SAASw9B,UAAyBj9B,OAAOC,SAASoY,EAAK5Y,QAAQw9B,UAC9E,OAAO5kB,EAAK5Y,QAAQw9B,SAEtB,MAAMn5B,EAASuU,GAAM4kB,UAAU7E,MAC/B,GAAsB,iBAAXt0B,GAAuB9D,OAAOC,SAAS6D,GAAS,OAAOA,EAElE,MAAMyS,EAAS3W,IACf,GAAqC,mBAA1B2W,EAAOnX,eAChB,IACE,MAAM+a,EAAM5D,EAAOnX,eAAe,CAChC4Z,KAAMX,GAAM5Y,SAASuZ,MAAQ,OAC7BkS,QAAS7S,GAAM5Y,SAASyrB,SAAW,GACnCzP,SAAUpD,GAAM5Y,SAASgc,SACzBhc,QAAS4Y,GAAM5Y,UAEjB,GAAmB,iBAAR0a,GAAoBna,OAAOC,SAASka,GAAM,OAAOA,EAC5D,GAAIA,GAA4B,iBAAdA,EAAIie,OAAsBp4B,OAAOC,SAASka,EAAIie,OAAQ,OAAOje,EAAIie,KACrF,CAAE,MAAOxiB,GACPC,QAAQC,KAAK,iEAAkEF,EACjF,CAGF,OAAOsiB,GAAuB7f,GAAM5Y,SAAS24B,KAC/C,CAEO,SAAS8E,GAAoB9oB,GAClC,IAAKA,IAAcA,EAAU+oB,SAAU,OAEvC,GAD6D,SAA3C/oB,EAAUP,aAAa,gBACzB,OAEhB,IAAKO,EAAUgpB,qBAA6D,mBAA/BhpB,EAAUqG,iBAAiC,CACtFrG,EAAUgpB,qBAAsB,EAChC,MAAMC,EAAe,KACnBjpB,EAAUkpB,aAAc,EACxBJ,GAAoB9oB,IAEhBmpB,EAAe,KACnBnpB,EAAUkpB,aAAc,EACxBJ,GAAoB9oB,IAEhBopB,EAAY,KAChBppB,EAAUkpB,aAAc,EACxBJ,GAAoB9oB,IAEhBqpB,EAAc52B,IACbuN,EAAU+e,SAAStsB,EAAE62B,iBACxBtpB,EAAUkpB,aAAc,EACxBJ,GAAoB9oB,KAIxBA,EAAUqG,iBAAiB,aAAc4iB,GACzCjpB,EAAUqG,iBAAiB,aAAc8iB,GACzCnpB,EAAUqG,iBAAiB,UAAW+iB,GACtCppB,EAAUqG,iBAAiB,WAAYgjB,GAEvC,IAAIE,EAAW,KAEbA,EAAW1C,GAAsB7mB,EAAW,CAC1C+mB,QAAUY,IACgB,QAApBA,EAAM/M,WAAwB5a,EAAUkpB,YAGb,OAApBvB,EAAM/M,WAAsB5a,EAAUkpB,cAC/ClpB,EAAUkpB,aAAc,EACxBJ,GAAoB9oB,KAJpBA,EAAUkpB,aAAc,EACxBJ,GAAoB9oB,OAO1BupB,EAAStB,SAGXjoB,EAAUwpB,gBAAkB,KAC1BxpB,EAAUuG,oBAAoB,aAAc0iB,GAC5CjpB,EAAUuG,oBAAoB,aAAc4iB,GAC5CnpB,EAAUuG,oBAAoB,UAAW6iB,GACzCppB,EAAUuG,oBAAoB,WAAY8iB,GAC1CE,GAAUrB,WACVloB,EAAUgpB,qBAAsB,EAEpC,CAEA,IAAKhpB,EAAU+oB,UAA0C,IAA9B/oB,EAAU+oB,SAAS74B,OAAc,OAC5D,MAAMu5B,EAAQn+B,MAAMuT,KAAKmB,EAAU+oB,UAC7BW,EAAQD,EAAMv5B,OACdy5B,EAAaj+B,QAAQsU,EAAUkpB,aAC/BpT,EAAQpqB,QAAQsU,EAAUwD,IAAMxD,EAAUwD,GAAGhX,SAAS,QAE5Di9B,EAAMrsB,QAAQ,CAAC6G,EAAM8e,KACnB,MAAM6G,EAAeF,EAAQ,EAAI3G,EAC3B8G,EAAWF,EAAa,WAAcC,GAAgB,EAAI,WAAat9B,OAAOs9B,GAKpF,GAJiC,mBAAtB3lB,EAAKtX,cACdsX,EAAKtX,aAAa,qBAAsBk9B,IAGrCr+B,IAAYnB,oBAIf,GAHA4Z,EAAK7B,MAAM+H,WACT,gHAEEwf,EACF1lB,EAAK7B,MAAMgJ,UAAY,OACvBnH,EAAK7B,MAAM0nB,UAAY,MACvB7lB,EAAK7B,MAAMkY,aAAe,OAC1BrW,EAAK7B,MAAMU,QAAU,IACrBmB,EAAK7B,MAAMjY,OAASmC,OAAO,IAAMy2B,GACjC9e,EAAK7B,MAAMuY,cAAgB,YAE3B,GAAqB,IAAjBiP,EACF3lB,EAAK7B,MAAMgJ,UAAY,WACvBnH,EAAK7B,MAAM0nB,UAAY,MACvB7lB,EAAK7B,MAAMkY,aAAe,MAC1BrW,EAAK7B,MAAMU,QAAU,IACrBmB,EAAK7B,MAAMjY,OAAS,KACpB8Z,EAAK7B,MAAMuY,cAAgB,YACtB,GAAqB,IAAjBiP,EAAoB,CAC7B,MAAM3W,EAAI6C,EAAQ,IAAK,GACvB7R,EAAK7B,MAAMgJ,UAAY,0BAA0B6H,OACjDhP,EAAK7B,MAAM0nB,UAAY,QACvB7lB,EAAK7B,MAAMkY,aAAe,MAC1BrW,EAAK7B,MAAMU,QAAU,MACrBmB,EAAK7B,MAAMjY,OAAS,KACpB8Z,EAAK7B,MAAMuY,cAAgB,MAC7B,MAAO,GAAqB,IAAjBiP,EAAoB,CAC7B,MAAM3W,EAAI6C,EAAQ,IAAK,GACvB7R,EAAK7B,MAAMgJ,UAAY,0BAA0B6H,OACjDhP,EAAK7B,MAAM0nB,UAAY,QACvB7lB,EAAK7B,MAAMkY,aAAe,MAC1BrW,EAAK7B,MAAMU,QAAU,OACrBmB,EAAK7B,MAAMjY,OAAS,KACpB8Z,EAAK7B,MAAMuY,cAAgB,MAC7B,KAAO,CACL,MAAM1H,EAAI6C,EAAQ,IAAK,GACvB7R,EAAK7B,MAAMgJ,UAAY,0BAA0B6H,OACjDhP,EAAK7B,MAAM0nB,UAAY,QACvB7lB,EAAK7B,MAAMkY,aAAe,MAC1BrW,EAAK7B,MAAMU,QAAU,IACrBmB,EAAK7B,MAAMjY,OAAS,IACpB8Z,EAAK7B,MAAMuY,cAAgB,MAC7B,GAIR,CAkBO7U,eAAeikB,GAAU1+B,EAAU,IACxC,IACE,MAAMyD,EAZV,SAAiBzD,EAAU,IACzB,MAAM2+B,EAAO3+B,GAA8B,iBAAZA,EAAuBA,EAAU,CAAA,EAChE,OAAI2+B,EAAKxmB,GAAWlX,OAAO09B,EAAKxmB,IAKzB,GAJMlX,OAAO09B,EAAKplB,MAAQ,QAAQ9X,OAAOP,iBATlD,SAAoB09B,GAClB,IAAI94B,EAAI,KACR,IAAK,IAAI6hB,EAAI,EAAGA,EAAIiX,EAAI/5B,OAAQ8iB,IAAK7hB,GAAKA,GAAK,GAAKA,EAAI84B,EAAIC,WAAWlX,GACvE,OAAO7hB,IAAM,CACf,CAMsBg5B,CAAW79B,OAAO09B,EAAKlT,SAAW,KAAKppB,SAAS,OACnD4wB,GAAqB0L,EAAKjgB,UAAY,iBAGzD,CAIgBqgB,CAAQ/+B,GAEpB,GAAIq3B,GAAO3zB,IAAID,GAAM,CACnB,MAAMqzB,EAAOO,GAAO7zB,IAAIC,GACxB,IAAKqzB,EAAM,MAAM,IAAIxvB,MAAM,yBAAyB7D,eAapD,OAZAqzB,EAAKuH,QAELvH,EAAK9K,OAAO1H,QACZwS,EAAK9K,MAAQgT,GAAmBlI,EAAKve,MAAOvY,SACtCi/B,GAAkBnI,SAClBoI,GAAYpI,GAClBuG,MAGKr9B,EAAQm/B,UAAYh/B,IAAYV,UAAY69B,GAAYxF,eAC3DwF,GAAYtG,UAAU,SAAUvzB,EAAK,CAAE46B,MAAOvH,EAAKuH,QAE9C56B,CACT,CAEA,GAAIs5B,GAAQr5B,IAAID,GAAM,CACpB,MAAMgD,EAAUs2B,GAAQv5B,IAAIC,GAC5B,IAAKgD,EAAS,MAAM,IAAIa,MAAM,0BAA0B7D,eAExD,OADAgD,EAAQ43B,QACD56B,CACT,CAEA,MAAMspB,EAAQ,CAAE/sB,UAASq+B,MAAO,EAAGe,MAAO,GA6E1C,OA5EArC,GAAQl5B,IAAIJ,EAAKspB,GAEjBA,EAAMqS,MAAQxf,sBAAsBnF,UAClC,MAAMhU,EAAUs2B,GAAQv5B,IAAIC,GAC5B,GAAKgD,EAAL,CAGA,GAFAs2B,GAAQn5B,OAAOH,GAEXu5B,IAAgB78B,IAAYvB,WAAY,CAC1C,MAAMga,EAAO,CAAE5Y,QAASyG,EAAQzG,QAASyD,MAAK46B,MAAO53B,EAAQ43B,OACvDgB,EAAOl/B,IAAYtB,cAAgB,IACzC,GAAIwgC,GAAQ,EAGV,OAFApC,UACAI,KAGF,MAAMiC,EACJn/B,IAAYT,kBACZ+G,EAAQzG,SAASN,kBACoB,iBAA9B+G,EAAQzG,SAASw9B,UACxBjG,GAAMgI,KAAMC,GACVA,GAAYx/B,SAASN,kBACoB,iBAAlC8/B,GAAYx/B,SAASw9B,UAOhC,GAJI8B,IACF1mB,EAAK4kB,SAAW/E,GAAuBhyB,EAAQzG,UAG7Cu3B,GAAM1yB,QAAUw6B,EAAM,CACxB,GAAIC,EAAc,CAChB,MAAMG,EAAmBlC,GAAgB3kB,GACzC,IAAI8mB,EAAc,EACdC,EAAiBpC,GAAgBhG,GAAM,IAE3C,IAAK,IAAIG,EAAQ,EAAGA,EAAQH,GAAM1yB,OAAQ6yB,IAAS,CACjD,MAAMkI,EAAoBrC,GAAgBhG,GAAMG,IAC5CkI,EAAoBD,IACtBD,EAAchI,EACdiI,EAAiBC,EAErB,CAEA,GAAIH,GAAoBE,EAGtB,OAFA1C,UACAI,KAIF9F,GAAMxJ,OAAO2R,EAAa,EAC5B,MACEnI,GAAMsI,QAER5C,IACF,CAQA,OANA1F,GAAMrjB,KAAK0E,GACP0mB,GACF/H,GAAMuI,KAAK,CAACt4B,EAAGhD,IAAM+4B,GAAgB/4B,GAAK+4B,GAAgB/1B,IAE5D61B,gBACM0C,IAER,CAEA,UACQC,GAAUv5B,EAAQzG,QAASyD,EAAKgD,EAAQ43B,MAChD,CAAE,MAAOzjB,GACPxE,QAAQwE,MAAM,oBAAqBA,EACrC,CAhEc,KAoEX5a,EAAQm/B,UAAYh/B,IAAYV,UAAY69B,GAAYxF,eAC3DwF,GAAYtG,UAAU,SAAUvzB,EAAK,CAAEzD,YAGlCyD,CACT,CAAE,MAAOmX,GACPxE,QAAQwE,MAAM,oBAAqBA,EACrC,CACF,CAEAH,eAAeulB,GAAUhgC,EAASyD,EAAKw8B,GACrC,IACE,IAAKjgC,GAA8B,iBAAZA,EACrB,MAAM,IAAIwlB,UAAU,6BAGtBwX,KAEA,MAAMroB,QAAkB2e,GAA0BtzB,EAASuzB,IAC3D,IAAK5e,EACH,MAAM,IAAIrN,MAAM,oCAGlB,MAAMiR,QAAc4V,GAAmBnuB,EAASkgC,IAChD,IAAK3nB,EACH,MAAM,IAAIjR,MAAM,iCAGlB,MAAM64B,EAAQ/+B,SAASyS,cAAc,OACrCssB,EAAMtpB,UAAY,sBACb1W,IAAYnB,qBACfN,OAAOmD,OAAOs+B,EAAMppB,MAAO,CAC3B2H,SAAU,WACV1H,QAAS,eACTkY,SAAU,UACVD,aAAc,OACdnwB,OAAQ,IACR+f,MAAO,OACPyQ,cAAe,SAIjB,MAAM1oB,EAAQxF,SAASyS,cAAc,OACrCjN,EAAMiQ,UAAY,sBACb1W,IAAYnB,qBACfN,OAAOmD,OAAO+E,EAAMmQ,MAAO,CAC3B2H,SAAU,WACVwQ,SAAU,SACVpwB,OAAQ,MAIV8H,EAAM7F,YAAYwX,GAClB4nB,EAAMp/B,YAAY6F,GAEd+N,EAAUwD,GAAGhX,SAAS,sBACxBwT,EAAU5T,YAAYo/B,GAClBngC,EAAQZ,SACVuV,EAAUrT,aAAa,eAAgB,QAEM,SAA3CqT,EAAUP,aAAa,iBACzBqpB,GAAoB9oB,IAIxBkL,EAAkBtH,GAElB,MAAM6nB,GACqB,IAAzBpgC,EAAQR,gBACkB,IAAzBQ,EAAQR,gBAA2BQ,EAAQ0Y,KAAOrY,QAAQF,IAAYX,eAEnEs3B,EAAO,CACXqJ,QACA5nB,QACAvY,UACAq+B,MAAO59B,KAAKC,IAAI,EAAGD,KAAKE,MAAMs/B,GAAgB,IAC9CzgC,aAAc4gC,GAEhB/I,GAAOxzB,IAAIJ,EAAKqzB,GAChBve,EAAM8U,KAAO5pB,EAEb45B,KAEIvG,EAAKuH,MAAQ,SAASa,GAAYpI,GAEtCA,EAAK9K,MAAQgT,GAAmBzmB,EAAOvY,SACjCi/B,GAAkBnI,EAC1B,CAAE,MAAO3gB,GACPC,QAAQwE,MAAM,yBAA0BzE,GACxC6mB,GAAev8B,KAAKC,IAAI,EAAGs8B,GAAe,GAC1CK,MAEEj8B,SAASia,cAAc,6BAA+Bja,SAAS4T,MAC9DjU,kBAAkB8pB,GAAqB7qB,EAASkgC,IACrD,CACF,CAjaA5C,GAAY3F,2BAA2B,IAAM13B,MAAMuT,KAAK6jB,GAAOrzB,SAC/Ds5B,GAAYzF,2BAA2B,IAAMN,GAAMj0B,IAAIsV,IAAI,CACzDnV,IAAKmV,EAAKnV,IACVzD,QAAS4Y,EAAK5Y,QACdq+B,MAAOzlB,EAAKylB,UAIVf,GAAYxF,eAAmC,oBAAX/1B,SACtCu7B,GAAY7F,GAAG,SAAU,EAAG7K,UAASqK,cAC9B92B,IAAYV,UAEbmtB,GAAWqK,IAAYI,GAAO3zB,IAAIkpB,KAAamQ,GAAQr5B,IAAIkpB,IAC7D8R,GAAU,IAAKzH,EAAQj3B,QAASm/B,UAAU,MAI9C7B,GAAY7F,GAAG,SAAU,EAAG7K,UAASqK,cACnC,GAAK92B,IAAYV,UAEbmtB,GAAWqK,GAAWI,GAAO3zB,IAAIkpB,GAAU,CAC7C,MAAMkK,EAAOO,GAAO7zB,IAAIopB,GACpBkK,GAAQA,EAAKuH,QAAUpH,EAAQoH,QACjCvH,EAAKuH,MAAQpH,EAAQoH,MACrBa,GAAYpI,GAEhB,IAGFwG,GAAY7F,GAAG,UAAW,EAAG7K,cACtBzsB,IAAYV,UAEbmtB,IAAYyK,GAAO3zB,IAAIkpB,IAAYmQ,GAAQr5B,IAAIkpB,KACjDyT,GAAgBzT,GAAS,KAI7B0Q,GAAY7F,GAAG,gBAAiB,EAAGR,cACjC,GAAK92B,IAAYV,UAEbw3B,GAAWh3B,MAAMC,QAAQ+2B,EAAQM,OACnC,IAAK,MAAM3e,KAAQqe,EAAQM,OACrB3e,GAAM5Y,SAAYq3B,GAAO3zB,IAAIkV,EAAKnV,MAASs5B,GAAQr5B,IAAIkV,EAAKnV,MAC9Di7B,GAAU,IAAK9lB,EAAK5Y,QAASm/B,UAAU,OAmf1C,MAAMmB,GA3HN7lB,iBACL,IACE,GAAoB,IAAhB4c,GAAOvzB,KAAY,CACrB,GAAIi5B,GAAQj5B,KAAO,EAAG,CACpB,MAAOy8B,EAAYC,GAAgBvgC,MAAMuT,KAAKupB,GAAQr0B,WAAW+3B,IAAI,GAIrE,OAHID,GAAcpB,OAAOsB,qBAAqBF,EAAapB,OAC3DrC,GAAQn5B,OAAO28B,QACflD,IAEF,CAEA,OAAI9F,GAAM1yB,OAAS,GACjB0yB,GAAMoJ,WACNtD,WAIF,CACF,CAEA,IAAIuD,EAAc,KAGlB,MAAMC,EAAe5gC,MAAMuT,KAAK6jB,GAAO3P,UACvC,GAAImZ,EAAah8B,OAAS,EAAG,CAC3B,MAAMi8B,EAAWD,EAAaJ,IAAI,GAClCG,EACEE,EAASvoB,OACRuoB,EAASX,OAASW,EAASX,MAAM9kB,cAAc,iBACpD,CAcA,GAZKulB,GACgBx/B,SAASoU,iBAAiB,4BAClCzD,QAAS4C,IAClB,MAAM+oB,EAAWz9B,MAAMuT,KAAKmB,EAAU+oB,UAAY,IAClD,GAAwB,IAApBA,EAAS74B,OAAc,OAC3B,MAAMk8B,EAAYrD,EAAS+C,IAAI,GAC3BM,IACFH,EAAcG,EAAU1lB,cAAc,mBAAqB0lB,MAK5DH,EAAa,OAElB,MAAMI,EAAUJ,EAAYvT,KACxBuT,EACAA,EAAYvlB,cAAc,mBAAqBulB,QAE7CV,GAAWc,EACnB,CAAE,MAAO7qB,GACPC,QAAQwE,MAAM,4BAA6BzE,EAC7C,CACF,EAyEA,SAAS6oB,GAAmBzmB,EAAOvY,GACjC,MAAMgG,EAAMzF,OAAOP,GAASgc,UAC5B,GAAIhc,GAASgc,WAAamD,KAA0C,iBAAtBnf,GAASgc,UAAyBhc,GAASgc,UAAY,EACnG,OAAO,KAET,MAAMA,EAAWzb,OAAOC,SAASwF,IAAQA,EAAM,EAAIA,EAAM,KAEnDgmB,EAAQ,IAAIkJ,GAAcza,eAAkBylB,GAAW3nB,GAD/CyD,EAAW,GAGzB,OADAgQ,EAAMnJ,QACCmJ,CACT,CAEAvR,eAAewkB,GAAkBnI,GAC/B,IAAKA,EAAKt3B,eAAiBs3B,EAAKqJ,QAAUrJ,EAAK9K,MAAO,OAEtD8K,EAAKqJ,MAAMjT,kBAEX,MAAMiT,MAAEA,EAAKnU,MAAEA,EAAKzT,MAAEA,GAAUue,EAE1BmK,EAAmB,KACvB,GAAI1oB,GAAOiH,mBACT,IACEjH,EAAMiH,mBAAmBiW,OAC3B,CAAE,MAAO,MACJ,GAAIld,GAAOgF,aAChB,IACE,MAAM2jB,EAAgBn/B,OAAOmF,iBAAiBqR,EAAMgF,cAAcsB,MAClEtG,EAAMgF,aAAa4jB,aAAeD,EAClC3oB,EAAMgF,aAAaxG,MAAM+H,WAAa,OACtCvG,EAAMgF,aAAaxG,MAAM8H,MAAQqiB,CACnC,CAAE,MAAO,GAIPE,EAAoB,KACxB,GAAI7oB,GAAOiH,mBACT,IACEjH,EAAMiH,mBAAmB6hB,MAC3B,CAAE,MAAO,MACJ,GAAI9oB,GAAOgF,cAAgBhF,EAAMgF,aAAa4jB,aACnD,IACE,MAAMG,EAActV,EAAM2J,sBAAwB,IAC5CzX,EAAY3F,EAAMgF,aAAae,WAC/BL,EAAa1F,EAAMgF,aAAac,aAAe,OACrD9F,EAAMgF,aAAaxG,MAAM+H,WAAa,SAASre,KAAKC,IAAI,EAAG4gC,cAC3D/oB,EAAMgF,aAAaxG,MAAM8H,MAAQX,EAAYD,EAAa,KAC1D1F,EAAMgF,aAAa4jB,aAAe,IACpC,CAAE,MAAO,GAIPvD,EAAe,KACnB5R,EAAMyJ,QACNwL,IACA1oB,GAAOsE,eACPtE,GAAOhB,UAAUC,IAAI,iBAEjBsmB,EAAe,KACnB9R,EAAMrL,SACNygB,IACA7oB,GAAOuE,gBACPvE,GAAOhB,UAAU2U,OAAO,iBAGpB6R,EAAa32B,IACbA,EAAEgR,OAAOnW,QAAQ,sCACnB+pB,EAAMyJ,QACNwL,IACA1oB,GAAOsE,eACPtE,GAAOhB,UAAUC,IAAI,kBAInBwmB,EAAc52B,IACb+4B,EAAMzM,SAAStsB,EAAE62B,iBACpBjS,EAAMrL,SACNygB,IACA7oB,GAAOuE,gBACPvE,GAAOhB,UAAU2U,OAAO,kBAI5BiU,EAAMnlB,iBAAiB,aAAc4iB,GACrCuC,EAAMnlB,iBAAiB,aAAc8iB,GACrCqC,EAAMnlB,iBAAiB,UAAW+iB,GAClCoC,EAAMnlB,iBAAiB,WAAYgjB,GAEnCmC,EAAMjT,cAAgB,KACpBiT,EAAMjlB,oBAAoB,aAAc0iB,GACxCuC,EAAMjlB,oBAAoB,aAAc4iB,GACxCqC,EAAMjlB,oBAAoB,UAAW6iB,GACrCoC,EAAMjlB,oBAAoB,WAAY8iB,GAE1C,CAEOvjB,eAAeylB,GAAW3nB,GAC/B,GAAKA,GAAO8U,KACZ,OAAOgT,GAAgB9nB,EAAM8U,KAC/B,CAUO5S,eAAe4lB,GAAgB58B,EAAK07B,GAAW,GACpD,IACE,IAAK17B,EAAK,QAGL07B,GAAYh/B,IAAYV,UAAY69B,GAAYxF,eACnDwF,GAAYtG,UAAU,UAAWvzB,EAAK,CAAA,GAiBxC,MAAM+8B,EAAezD,GAAQv5B,IAAIC,GACjC,GAAI+8B,EAIF,OAHAE,qBAAqBF,EAAapB,OAClCrC,GAAQn5B,OAAOH,QACf45B,KAQF,MAAMkE,EAAahK,GAAMiK,UAAW5oB,GAASA,EAAKnV,MAAQA,GAC1D,IAAoB,IAAhB89B,EAGF,OAFAhK,GAAMxJ,OAAOwT,EAAY,QACzBlE,KAIF,MAAMvG,EAAOO,GAAO7zB,IAAIC,GACxB,IAAKqzB,EAAM,OASX,GAPAA,EAAK9K,OAAO1H,QACZwS,EAAKqJ,OAAOjT,kBACZ4J,EAAKve,OAAO6E,wBACZ0Z,EAAKve,OAAOiD,gBACZsb,EAAKve,OAAOyE,iBACZ8Z,EAAKve,OAAO0U,kBACZ6J,EAAKve,OAAO4C,aACR2b,EAAKve,OAAOiH,mBAAoB,CAClC,IACEsX,EAAKve,MAAMiH,mBAAmBiiB,QAChC,CAAE,MAAO,CACT3K,EAAKve,MAAMiH,mBAAqB,IAClC,CACA,MAAMkiB,EAAQ5K,EAAKqJ,OAAO9kB,cAAc,sBACpCqmB,GAAOC,cACT1V,aAAayV,EAAMC,aACnBD,EAAMC,YAAc,MAGtB,MAAMC,EAAQ9K,EAAKve,OAAO8C,cAAc,aACxCumB,GAAOzmB,aAEPkc,GAAOzzB,OAAOH,GACdu5B,GAAev8B,KAAKC,IAAI,EAAGs8B,GAAe,GAC1CK,KAEIqE,GAAOA,EAAMxV,SAEjB,MAAM2V,EAAe/K,EAAKve,OAAOqX,oBAAsB,IACjD4C,EAAe/xB,KAAKgF,IAAIo8B,EAAc,KAE5C,GAAI/K,EAAKve,MAAO,CACd,IAAKpY,IAAYnB,oBAAqB,CACpC,MAAMwrB,EAAMvpB,OAAO61B,EAAK92B,SAAS0e,UAAYoY,EAAKqJ,OAAO2B,eAAe3pB,IAAM,IAAIjX,cAC5EupB,EAAQD,EAAIrpB,SAAS,OACrBupB,EAASF,EAAIrpB,SAAS,QACtBwpB,EAAUH,EAAIrpB,SAAS,SACvBypB,EAAO3pB,OAAO61B,EAAK92B,SAASuqB,eAAiB,IAAIrpB,cAAcO,OAErE,IAAIsgC,EAAgB,mBACpB,MAAMnc,EAASkR,EAAKve,OAAOqW,QAEvB9sB,KACFg1B,EAAKve,MAAMxB,MAAM+H,WAAa,OAC9BgY,EAAKve,MAAMxB,MAAMU,QAAU,MAEd,SAATmT,EACFmX,EAAgB,OACE,SAATnX,GAA4B,UAATA,EAC5BmX,EAAgB,cACE,SAATnX,EACTmX,EAAgB,qCACE,UAATnX,EACTmX,EAAgBrX,EAAS,oBAAsBC,EAAU,mBAAqBF,EAAQ,oBAAsB,mBAC1F,WAATG,EACTmX,EAAgBtX,EAAQ,+BAAiC,8BAChD7E,IACTmc,EAAgBtX,EAAQ,gCAAkC,gCAG5DqM,EAAKve,MAAMxB,MAAM+H,WAAa,WAAW0T,0BAAqCA,cAC9EsE,EAAKve,MAAMxB,MAAMU,QAAU,IAC3Bqf,EAAKve,MAAMxB,MAAMgJ,UAAYgiB,EAEjC,CACAjL,EAAKve,MAAMhB,UAAU2U,OAAO,SAC9B,CAEA,MAAM8V,EAAkBlL,EAAKqJ,OAAO2B,cAGpC,SAkDJrnB,eAAoC7G,EAAIquB,EAAUC,EAAsB,KACtE,OAAKtuB,EAEE,IAAIuuB,QAASC,IAClB,IAAIC,GAAO,EACPC,EAAgB,KACpB,MAAMC,EAASN,GAAYruB,EAAG4uB,mBAAqB5uB,EAE7C6uB,EAAS,KACb,GAAIJ,EAAM,OACVA,GAAO,EACHC,IACFrW,aAAaqW,GACbA,EAAgB,MAElB,IACEC,GAAQrnB,sBAAsB,gBAAiBwnB,GAAO,EACxD,CAAE,MAAO,CACT,MAAM1B,EAAUptB,EAAGyH,gBAAgB,WAAazH,EAChD,GAAIotB,GAAS5T,UACX,IACEa,KAAeX,QAAQ0T,EAASA,EAAQ5T,UAC1C,CAAE,MAAO,EhBr1BV3S,eAA6B7G,GAClC,IAAKA,EAAI,OAAO,EAEhB,IACE,GAAyB,mBAAdA,EAAGsY,OAEZ,OADAtY,EAAGsY,UACI,CAEX,CAAE,MAAO,CAET,IACE,GAAItY,EAAGuZ,WAEL,OADAvZ,EAAGuZ,WAAWpB,YAAYnY,IACnB,CAEX,CAAE,MAAO,CAGX,CgBq0BM+uB,CAAc/uB,GACdwuB,KAGIM,EAASt7B,IACb,IACE,GAAIA,EAAEgR,SAAWmqB,EAAQ,QAEJ,cAAnBn7B,EAAEw7B,eACAL,EAAOxrB,MAAMgJ,WAAgC,YAAnB3Y,EAAEw7B,eAE9BH,GAEJ,CAAE,MAAO7nB,GACPxE,QAAQwE,MAAM,8BAA+BA,EAC/C,GAGF,IAAK2nB,EAAQ,OAAOE,IAEpB,IACEF,EAAOvnB,iBAAiB,gBAAiB0nB,GAAO,EAClD,CAAE,MAAO9nB,GACPxE,QAAQwE,MAAM,8BAA+BA,EAC/C,CAIA0nB,EAAgBnW,WAAWsW,EADHP,EAAsB,KAEV,mBAAzBI,GAAe1lB,OACxB0lB,EAAc1lB,UArDFulB,QAAQC,SAwD1B,CA7GUS,CAAqB/L,EAAKqJ,MAAOrJ,EAAKve,MAAOia,GAGjDwP,GACoC,IAApCA,EAAgBtE,SAAS74B,QACzBm9B,EAAgB7pB,IAAIxR,WAAW,oBAE/B,IACEq7B,EAAgB7D,oBNtxBjB,SAA6B2E,GAClC,IAAKA,EAAc,OACnB,MAAM3qB,EAA6B,iBAAjB2qB,GAA6BA,EAAan8B,WAAW,oBACnEm8B,EACA5P,GAAe4P,GACnB/P,GAAkBnvB,OAAOuU,GACzB6a,GAAepvB,OAAOuU,EACxB,CMgxBQ4qB,CAAoBf,EAAgB7pB,IACpC6pB,EAAgB9V,QAClB,CAAE,MAAO,MACA8V,GAAoE,SAAjDA,EAAgB5tB,aAAa,iBACzDqpB,GAAoBuE,SAGhBjC,IACR,CAAE,MAAOnlB,GACPxE,QAAQwE,MAAM,0BAA2BA,EAC3C,CACF,CAEA,IAAIooB,IAAa,EAEjBvoB,eAAeslB,KACb,IAAIiD,GAAJ,CACAA,IAAa,EACb,IACE,MAAMlsB,EAAS3W,IAOf,KAJK2W,EAAOpX,kBAAoB63B,GAAMgI,KAAK5X,GAAKA,EAAE3nB,SAASN,kBAAmD,iBAAxBioB,EAAE3nB,SAASw9B,YAA2BjG,GAAM1yB,OAAS,GACzI0yB,GAAMuI,KAAK,CAACt4B,EAAGhD,IAAM+4B,GAAgB/4B,GAAK+4B,GAAgB/1B,IAGrDw1B,GAAelmB,EAAOlY,YAAc24B,GAAM1yB,QAAQ,CACvD,MAAM+T,EAAO2e,GAAMsI,QACnB,GAAIxI,GAAO3zB,IAAIkV,EAAKnV,KAAM,CACxB,MAAMqzB,EAAOO,GAAO7zB,IAAIoV,EAAKnV,KAC7BqzB,EAAKuH,OAASzlB,EAAKylB,YACba,GAAYpI,GAClBuG,KACA,QACF,OACM2C,GAAUpnB,EAAK5Y,QAAS4Y,EAAKnV,IAAKmV,EAAKylB,MAC/C,CACAhB,IACF,CAAC,QACC2F,IAAa,CACf,CAxBgB,CAyBlB,CA6DAvoB,eAAeykB,IAAYiB,MAAEA,EAAK9B,MAAEA,IAClC,KAAK8B,GAAWA,aAAiBtW,aAC/B,MAAM,IAAIviB,MAAM,kDAGlB,GAAI+2B,EAAQ,EAAG,CACb,MAAMqD,EAAQvB,EAAM9kB,cAAc,sBAElC,YADIqmB,GAAOA,EAAMxV,SAEnB,CAEA,IAAIwV,EAAQvB,EAAM9kB,cAAc,sBAC3BqmB,IACHA,EAAQtgC,SAASyS,cAAc,QAC/B6tB,EAAM7qB,UAAY,oBAClB6qB,EAAMpgC,aAAa,aAAc,GAAG+8B,6BAE/Bl+B,IAAYnB,qBACfN,OAAOmD,OAAO6/B,EAAM3qB,MAAO,CAC3B2H,SAAU,WACVsM,IAAK,MACLE,MAAO,MACPxR,gBAAiB,UACjBhD,MAAO,OACPuD,aAAc,MACdkV,SAAU,OACVvQ,OAAQ,OACR7G,SAAU,OACVmC,WAAY,MACZlD,QAAS,OACTC,WAAY,SACZyS,eAAgB,SAChBtP,OAAQ,iBACRiR,UAAW,4BACXvsB,OAAQ,IACRwwB,cAAe,OACfxQ,WAAY,yBAIdqhB,EAAMp/B,YAAY2gC,IAGpBA,EAAM1pB,YAAcqmB,EAAQ,GAAK,MAAQp9B,OAAOo9B,GAEhD,IACOv8B,MACC4/B,EAAMC,aAAa1V,aAAayV,EAAMC,aAC1CD,EAAM3qB,MAAMgJ,UAAY,aACxB2hB,EAAMC,YAAcxV,WAAW,KAC7BuV,EAAM3qB,MAAMgJ,UAAY,WACxB2hB,EAAMC,YAAc,MACnB,KACqC,mBAA7BD,EAAMC,aAAa/kB,OAC5B8kB,EAAMC,YAAY/kB,QAGxB,CAAE,MAAOhC,GACPxE,QAAQwE,MAAM,+BAAgCA,EAChD,CACF,CAOOH,eAAewoB,GAAiBx/B,EAAKy/B,EAAa,IACvD,IAAKz/B,GAA6B,iBAAfy/B,GAA0C,OAAfA,EAAqB,OAEnE,GAAInG,GAAQr5B,IAAID,GAAM,CACpB,MAAMspB,EAAQgQ,GAAQv5B,IAAIC,GAE1B,YADAspB,EAAM/sB,QAAU,IAAK+sB,EAAM/sB,WAAYkjC,GAEzC,CAEA,MAAMC,EAAS5L,GAAMzK,KAAMlsB,GAAMA,EAAE6C,MAAQA,GAC3C,GAAI0/B,EAEF,YADAA,EAAOnjC,QAAU,IAAKmjC,EAAOnjC,WAAYkjC,IAI3C,MAAMpM,EAAOO,GAAO7zB,IAAIC,GACxB,IAAKqzB,IAASA,EAAKve,MAAO,OAE1B,MAAM6qB,EAAc,IAAKtM,EAAK92B,SAC9B82B,EAAK92B,QAAU,IAAK82B,EAAK92B,WAAYkjC,GACrC,MAAM3qB,EAAQue,EAAKve,MACbsX,EACJtX,EAAMuX,cACNvX,EAAM8C,cAAc,mBACpB9C,EAAM8C,cAAc,gCAGtB,QAA2Bjb,IAAvB8iC,EAAWzX,QAAuB,CACpC,MAAM+E,EAAavvB,OAAOiiC,EAAWzX,SAAW,IAC1CD,OACqBprB,IAAzB8iC,EAAW1X,UACPnrB,QAAQ6iC,EAAW1X,WACnBnrB,QAAQy2B,EAAK92B,QAAQwrB,WAErB6X,GACiB,YAApBH,EAAW3pB,MAA0C,UAApB2pB,EAAW3pB,QACnB,IAA1B2pB,EAAWvS,WAEb,GAAId,EAAa,CACf,MAAMyT,EAAiBzT,EAAYxU,cAAc,iBAEjD,GADAwU,EAAY3a,UAAY,GAEtBouB,IAC0B,IAA1BJ,EAAWvS,YACW,OAAtBuS,EAAWxS,SACV2S,EACD,CACAxT,EAAY9uB,YAAYuiC,GACxB,MAAMzS,EAASzvB,SAASyS,cAAc,QACtCgd,EAAO9Z,MAAMC,QAAU,eACvB6Z,EAAO9Z,MAAM8H,MAAQ,MACrBgR,EAAY9uB,YAAY8vB,EAC1B,CAEA,GAAIrF,GAAagF,EAAW/uB,OAAOoD,OAAS,EAC1C,IACE,MAAM8O,EAAY8B,EAAa+a,GACzB9E,EAAMtqB,SAASyS,cAAc,OAEnC,IADA6X,EAAIxW,UAAYvB,EACT+X,EAAIC,YACTkE,EAAY9uB,YAAY2qB,EAAIC,WAEhC,CAAE,MACAkE,EAAY9uB,YAAYK,SAAS2R,eAAeyd,GAClD,MAEAX,EAAY9uB,YAAYK,SAAS2R,eAAeyd,IAGlDX,EAAYvuB,aAAa,QAASuuB,EAAY7X,aAAe,GAC/D,CACF,CAGA,MAAMqrB,GACiB,YAApBH,EAAW3pB,MAA0C,UAApB2pB,EAAW3pB,QACnB,IAA1B2pB,EAAWvS,WAEb,IAC4B,IAA1BuS,EAAWvS,YACW,OAAtBuS,EAAWxS,QACX2S,EACA,CACA,MAAMzS,EAAWf,GAAaxU,cAAc,iBACxCuV,IACEA,EAAS2S,aAAiD,SAAlC3S,EAAS2S,YAAYC,UAC/C5S,EAAS2S,YAAYrX,SAEvB0E,EAAS1E,SAEb,MAAO,KACsB,IAA1BgX,EAAWvS,YACTuS,EAAWxS,QAAuC,iBAAtBwS,EAAWxS,SAC1Cb,IACCA,EAAYxU,cAAc,iBAC3B,CACA,MAAMuV,EAAWta,EAAa4sB,EAAWxS,QAAU,CAAA,GACnDb,EAAYvU,aAAasV,EAAUf,EAAYlE,YAC/C,MAAMkF,EAASzvB,SAASyS,cAAc,QACtCgd,EAAO9Z,MAAMC,QAAU,eACvB6Z,EAAO9Z,MAAM8H,MAAQ,MACrBgR,EAAYvU,aAAauV,EAAQD,EAAS2S,YAC5C,CAGA,GAAIL,EAAW3pB,KAAM,CACnB,MAAMkqB,EAAUxiC,OAAOiiC,EAAW3pB,MAAMrY,cAAcO,OACtD8W,EAAM1B,UAAY0B,EAAM1B,UAAUlU,QAChC,0CACA,SAAS8gC,KAEX,MAAMC,EAAoB,UAAZD,EAQd,GAPIP,EAAWxT,KACbnX,EAAMjX,aAAa,OAAQ4hC,EAAWxT,MAEtCnX,EAAMjX,aAAa,OAAQ,SAE7BiX,EAAMjX,aAAa,YAAa4hC,EAAWvT,WAAa+T,EAAQ,YAAc,YAEzER,EAAWxpB,gBAAiB,CAC/B,MAAMiqB,EAAa,CACjBza,QAAS,UACTtO,MAAO,UACPuO,QAAS,UACTC,KAAM,WAEJua,EAAWF,KACblrB,EAAMxB,MAAM6C,WAAa+pB,EAAWF,GAExC,CACF,CAGA,QAAwBrjC,IAApB8iC,EAAW1Z,WAA0CppB,IAApB8iC,EAAW3pB,KAAoB,CAClE,MAAMqqB,EAAerrB,GAAO8C,cAAc,eACtCuoB,GAAcA,EAAa1X,SAC/B,MACM2X,EAAYxa,GADI,IAAKyN,EAAK92B,WAAYkjC,IAExCW,IACEhU,EACFtX,EAAM+C,aAAauoB,EAAWhU,GAE9BtX,EAAMxX,YAAY8iC,GAGxB,CAMA,GAJIX,EAAWxpB,kBACbnB,EAAMxB,MAAM6C,WAAaspB,EAAWxpB,iBAGlCwpB,EAAW5+B,UACbiU,EAAMxB,MAAML,MAAQwsB,EAAW5+B,UAC3BurB,IAAaA,EAAY9Y,MAAML,MAAQwsB,EAAW5+B,gBACjD,GAAI4+B,EAAW3pB,MAAQ2pB,EAAWxpB,gBAAiB,CACxD,MAAMoqB,EAAKvrB,EAAMxB,MAAM6C,WACvB,GAAIkqB,EAAI,CACN,MAAMC,EAAe5/B,EAAiC2/B,GACtDvrB,EAAMxB,MAAML,MAAQqtB,EAChBlU,IAAaA,EAAY9Y,MAAML,MAAQqtB,EAC7C,CACF,CAEA,QAAgC3jC,IAA5B8iC,EAAWjpB,aAA4B,CACzC,MAAM+pB,EAAwC,iBAA5Bd,EAAWjpB,aAA4B,GAAGipB,EAAWjpB,iBAAmBipB,EAAWjpB,aACrG1B,EAAMxB,MAAMkD,aAAe+pB,CAC7B,CAEA,QAA4B5jC,IAAxB8iC,EAAW/X,SAAwB,CACrC,MAAM8Y,EAAoC,iBAAxBf,EAAW/X,SAAwB,GAAG+X,EAAW/X,aAAe+X,EAAW/X,SAC7F5S,EAAMxB,MAAMoU,SAAW8Y,CACzB,CAEA,QAAiC7jC,IAA7B8iC,EAAW1T,cAA6B,CAC1C,MAAM0U,EAAmC,SAA7BhB,EAAW1T,cAA2B0T,EAAW1T,cAAgB,GAC7EjX,EAAMxB,MAAMwY,UAAY2U,EACpBrU,IAAaA,EAAY9Y,MAAMwY,UAAY2U,EACjD,CAEA,QAA4B9jC,IAAxB8iC,EAAWnrB,SAAwB,CACrC,MAAMosB,EAAoC,iBAAxBjB,EAAWnrB,SAAwB,GAAGmrB,EAAWnrB,aAAemrB,EAAWnrB,SAC7FQ,EAAMxB,MAAMgB,SAAWosB,EACnBtU,IAAaA,EAAY9Y,MAAMgB,SAAWosB,EAChD,CAOA,QAL8B/jC,IAA1B8iC,EAAW7S,aACb9X,EAAMxB,MAAMsZ,WAAa6S,EAAW7S,WAChCR,IAAaA,EAAY9Y,MAAMsZ,WAAa6S,EAAW7S,kBAG/BjwB,IAA1B8iC,EAAWhpB,WAA0B,CACvC,MAAMkqB,EAAsC,iBAA1BlB,EAAWhpB,WAA0BjZ,OAAOiiC,EAAWhpB,YAAcgpB,EAAWhpB,WAClG3B,EAAMxB,MAAMmD,WAAakqB,EACrBvU,IAAaA,EAAY9Y,MAAMmD,WAAakqB,EAClD,CAcA,QAZkChkC,IAA9B8iC,EAAW5S,iBACb/X,EAAMxB,MAAMoD,WAAa+oB,EAAW5S,eAChCT,IAAaA,EAAY9Y,MAAMoD,WAAa+oB,EAAW5S,sBAGrClwB,IAApB8iC,EAAWxT,MACbnX,EAAMjX,aAAa,OAAQ4hC,EAAWxT,WAEZtvB,IAAxB8iC,EAAWvT,UACbpX,EAAMjX,aAAa,YAAa4hC,EAAWvT,eAGhBvvB,IAAzB8iC,EAAWrsB,UAAyB,CACtC,MAAMwtB,EAAYjB,EAAYvsB,UAC1BwtB,GAAkC,iBAAdA,GACtB9rB,EAAMhB,UAAU2U,UAAUmY,EAAU5iC,OAAOsD,MAAM,QAE/Cm+B,EAAWrsB,WAA6C,iBAAzBqsB,EAAWrsB,WAC5C0B,EAAMhB,UAAUC,OAAO0rB,EAAWrsB,UAAUpV,OAAOsD,MAAM,OAE7D,CACA,QAA4B3E,IAAxB8iC,EAAWjkB,SAAwB,CACrC,IAAII,EAAM9e,OAAO2iC,EAAWjkB,UACvB1e,OAAOC,SAAS6e,KAAMA,EAAM,GAC7BA,EAAM,GAAKA,EAAM,IAAGA,GAAY,KACpCA,EAAM5e,KAAKgF,IAAI,IAAKhF,KAAKC,IAAI,EAAG2e,IAEhC,IAAI/B,EAAc/E,EAAM8C,cAAc,uBAQtC,GANGiC,IACA4lB,EAAWhkB,kBAAmB4X,EAAK92B,QAAQkf,kBAE5C7B,EAAkB9E,EAAO,IAAKue,EAAK92B,WAAYkjC,IAC/C5lB,EAAc/E,EAAM8C,cAAc,wBAEhCiC,EAAa,CACf,GAAI/E,EAAMiH,mBAAoB,CAC5B,IACEjH,EAAMiH,mBAAmBiiB,QAC3B,CAAE,MAAO,CACTlpB,EAAMiH,mBAAqB,IAC7B,CACAlC,EAAYvG,MAAM+H,WAAa,mBAC/BxB,EAAYvG,MAAM8H,MAAQ,GAAGQ,IAC/B,CACF,MAAO,IAAmC,IAA/B6jB,EAAWhkB,gBAA2B,CAC/C,MAAMolB,EAAM/rB,EAAM8C,cAAc,uBAC5BipB,GAAKA,EAAIpY,QACf,CAEA,GAAIgX,EAAW1kB,kBAAoB0kB,EAAWzkB,cAAe,CAC3D,MAAM6lB,EAAM/rB,EAAM8C,cAAc,uBAC5BipB,IACFA,EAAIvtB,MAAM6C,WAAaspB,EAAW1kB,kBAAoB0kB,EAAWzkB,cAErE,CAEA,GAAIykB,EAAWnkB,iBAAkB,CAC/B,MAAMulB,EAAM/rB,EAAM8C,cAAc,uBAC5BipB,IACFA,EAAIvtB,MAAMiU,IAAsC,QAAhCkY,EAAWnkB,iBAA6B,IAAM,OAC9DulB,EAAIvtB,MAAMkU,OAAyC,WAAhCiY,EAAWnkB,iBAAgC,IAAM,OAExE,CAEA,QAAkC3e,IAA9B8iC,EAAWrlB,eAA8B,CAC3C,MAAMymB,EAAM/rB,EAAM8C,cAAc,uBAChC,GAAIipB,EAAK,CACP,MAAMC,EAA0C,iBAA9BrB,EAAWrlB,eAA8B,GAAGqlB,EAAWrlB,mBAAqBqlB,EAAWrlB,eACzGymB,EAAIvtB,MAAM6H,OAAS2lB,CACrB,CACF,CAQA,QANiCnkC,IAA7B8iC,EAAW3Y,gBACbuM,EAAK92B,QAAQuqB,cAAgB2Y,EAAW3Y,cACxChS,EAAMsW,eAAiBqU,EAAW3Y,oBAIRnqB,IAAxB8iC,EAAWlnB,SAAwB,CACrC8a,EAAK9K,OAAO1H,QACZ,MAAMte,EAAMzF,OAAO2iC,EAAWlnB,UAC1Bzb,OAAOC,SAASwF,IAAQA,EAAM,GAChC8wB,EAAK9K,MAAQgT,GAAmBzmB,EAAO,CAAEyD,SAAUhW,UAC7Ci5B,GAAkBnI,IAExBA,EAAK9K,MAAQ,IAEjB,MAC6B,IAA1B8K,EAAK92B,QAAQgc,UAAmB8a,EAAK9K,OACjB,YAApBkX,EAAW3pB,MACU,UAApB2pB,EAAW3pB,MACS,YAApB2pB,EAAW3pB,OACe,IAA1B2pB,EAAWvS,aAIbmG,EAAK9K,OAAO1H,QACZwS,EAAK9K,MAAQgT,GAAmBzmB,EAAO,CAAEyD,SAAU,aAC7CijB,GAAkBnI,IAgC1B,QA5BuB12B,IAAnB8iC,EAAWxqB,MACTH,EAAMiD,cACRjD,EAAMiD,cACNjD,EAAMiD,YAAc,MAEtBjD,EAAM/C,iBAAiB,cAAczD,QAAS6B,GAAOA,EAAGsY,UAEpDgX,EAAWxqB,KAAiC,iBAAnBwqB,EAAWxqB,MAEtCJ,EAAUC,EADS,IAAKue,EAAK92B,WAAYkjC,GACZhD,SAKT9/B,IAApB8iC,EAAWxnB,OACTnD,EAAMyE,eACRzE,EAAMyE,eACNzE,EAAMyE,aAAe,MAEvBzE,EAAM/C,iBAAiB,mBAAmBzD,QAAS6B,GAAOA,EAAGsY,UAEzDgX,EAAWxnB,OAEbD,EAAiBlD,EADE,IAAKue,EAAK92B,WAAYkjC,GACLhD,SAKL9/B,IAA/B8iC,EAAWpS,gBAA+B,CAC5C,MAAM0T,EAAmBjsB,EAAM8C,cAAc,qBACV,IAA/B6nB,EAAWpS,iBACTvY,EAAM6E,sBACR7E,EAAM6E,sBACN7E,EAAM6E,oBAAsB,MAE1BonB,GAAkBA,EAAiBtY,WACC,IAA/BgX,EAAWpS,iBAA6B0T,GACjDvnB,EAAkB1E,EAAOue,EAAK92B,QAASkgC,GAE3C,OAIuB9/B,IAArB8iC,EAAW5jC,MACPe,QAAQ6iC,EAAW5jC,OACnBe,QAAQ6iC,EAAW3pB,OAASud,EAAK92B,QAAQV,OAASa,IAAYb,UAYlEikB,EAR8B,iBAArB2f,EAAW5jC,MACd4jC,EAAW5jC,MACX4jC,EAAW3pB,MAAQud,EAAK92B,QAAQuZ,MAAQ,OAE5C2pB,EAAW3jC,aACXu3B,EAAK92B,QAAQT,aACbY,IAAYZ,aACZ,UAKJ,MAAMoV,EAAY4D,EAAMoZ,QAAQ,4BAC5Bhd,GAAwD,SAA3CA,EAAUP,aAAa,iBACtCqpB,GAAoB9oB,EAExB,CChpCA,IAAI8vB,GAAgB,CAClBvb,QAAS,UACTtO,MAAO,UACPuO,QAAS,UACTC,KAAM,WAGJsb,GAAkB,CACpBxb,QAAS,oCACTtO,MAAO,wBACPuO,QAAS,mBACTC,KAAM,wBAGJub,IAAW,EACXC,GAAkB,KAuEtB,SAASC,GAAsBC,EAAkBC,GAC/C,MAAMC,EACoB,iBAAjBD,GAA8C,OAAjBA,GAA0B9kC,MAAMC,QAAQ6kC,GAExE,CAAA,EADAA,EAGN,MAC8B,iBAArBD,GACqB,iBAArBA,GACqB,kBAArBA,GACqB,iBAArBA,EAEA,IACFE,EACHvZ,QAASxqB,OAAO6jC,IAIhBA,aAA4Bx9B,MACvB,IACF09B,EACHvZ,QAASqZ,EAAiBrZ,SAAWxqB,OAAO6jC,IAIhB,iBAArBA,GAAsD,OAArBA,GAA8B7kC,MAAMC,QAAQ4kC,GAOjF,IAAKE,GANH,IACFA,KACAF,EAKT,CAsGA,SAASG,GAAiBC,GACxB,IACE,GAAIA,GAA4B,iBAAXA,IAAwBjlC,MAAMC,QAAQglC,GAAS,CAClE,MAAMC,EAAa,CAAC,UAAW,QAAS,UAAW,QAC7CC,EAAY,CAAA,EAClB,IAAK,MAAO3hC,EAAKE,KAAUjF,OAAOgK,QAAQw8B,GACpCC,EAAWhkC,SAASsC,IAAyB,iBAAVE,GAAsBA,EAAMlC,SACjE2jC,EAAU3hC,GAAOE,EAAMlC,QAGvB/C,OAAOsF,KAAKohC,GAAWvgC,OAAS,IAClC4/B,GAAgB,IAAKA,MAAkBW,GAE3C,CACF,CAAE,MAAOxqB,GACPxE,QAAQwE,MAAM,2BAA4BA,EAC5C,CACF,CAMA,SAASyqB,GAAmBC,GAC1B,IACE,GAAIA,GAAgC,iBAAbA,IAA0BrlC,MAAMC,QAAQolC,GAAW,CACxE,MAAMH,EAAa,CAAC,UAAW,QAAS,UAAW,QAC7CC,EAAY,CAAA,EAClB,IAAK,MAAO3hC,EAAKE,KAAUjF,OAAOgK,QAAQ48B,GACpCH,EAAWhkC,SAASsC,IAAyB,iBAAVE,GAAsBA,EAAMlC,SACjE2jC,EAAU3hC,GAAOE,EAAMlC,QAGvB/C,OAAOsF,KAAKohC,GAAWvgC,OAAS,IAClC6/B,GAAkB,IAAKA,MAAoBU,GAE/C,CACF,CAAE,MAAOxqB,GACPxE,QAAQwE,MAAM,6BAA8BA,EAC9C,CACF,CAEA,IAAI2qB,IAAkB,EAClBC,GAAe,KAgBnB,MAAMC,GA3NNhrB,eAA2Bza,EAAU,IAInC,MAFoB,oBAAX+B,QAA8C,oBAAbX,gBA9C5CqZ,iBACMkqB,IAEkB,oBAAX5iC,QAA8C,oBAAbX,WAKlB,aAAxBA,SAASskC,YACe,gBAAxBtkC,SAASskC,YAMNd,KACHA,GAAkB,IAAIzC,QAASC,IAC7BhhC,SAAS4Z,iBACP,mBACA,KACE2pB,IAAW,EACXvC,KAEF,CAAEthB,MAAM,aAKR8jB,IAjBJD,IAAW,EAkBf,CA0BQgB,SAxBRlrB,eAA8Bza,EAAU,IACtC,IACE,MAAM4lC,QAuEVnrB,eAAoCorB,GAClC,MAAM7lC,EAAU6kC,GAAsBgB,GAChC/uB,EAAS3W,IACT2lC,EAAe7kC,OAAOjB,GAAS0e,UAAY5H,EAAO5X,iBAAiBgC,cAAcO,OACjFskC,EACJD,GAAc3kC,SAAS,mBACvB2kC,GAAc3kC,SAAS,qBACnB,QACA,QAgCA6kC,EAAQ,CA7BZxa,WAAW,EACX/V,cAAc,EACdjW,kBAAcY,EACd4b,SAAU,KACV0C,SAAU5H,EAAO5X,gBACjBqa,KAAM,OACNU,aAAc,OACdP,qBAAiBtZ,EACjBkE,eAAWlE,EACX0wB,iBAAiB,EACjBrC,kBAAmB,OACnBE,gBAAiB,OACjBzP,iBAAiB,EACjBT,mBAAere,EACfoe,sBAAkBpe,EAClByd,eAAgB,MAChBkB,iBAAkB,SAClBZ,kBAAmB,aACnBoM,cAAe,UACf8F,WACE,gJACFtY,SAAU,OACVmC,WAAY,MACZoW,eAAgB,MAChBd,cAAe,OACfO,SAAU,SACV5E,SAAU4a,KAKP/lC,GAGLgmC,EAAMva,QAAUzrB,GAASyrB,SAAWua,EAAMva,QAE1C,IACOua,EAAMtsB,kBACTssB,EAAMtsB,gBACJ+qB,KAAgBuB,EAAMzsB,QACrBxX,OAAOC,WAAW,gCAAgCC,QAC/C,UACA,WAEV,CAAE,MAAO2Y,GACPxE,QAAQC,KAAK,sCAAuCuE,EACtD,CAEA,IACEorB,EAAMva,QACJua,EAAMva,SAAWiZ,KAAkBsB,EAAMzsB,OAAS,sBACtD,CAAE,MAAOqB,GACPxE,QAAQC,KAAK,qCAAsCuE,EACrD,CAEA,KACOorB,EAAM1hC,WAAa0hC,EAAMtsB,kBAC5BssB,EAAM1hC,UAAYH,EAAiC6hC,EAAMtsB,iBAE7D,CAAE,MAAOkB,GACPxE,QAAQC,KAAK,gCAAiCuE,EAChD,CAEA,IACE,MAAMqrB,EAAmBjmC,GAASwe,kBAAoBxe,GAASye,cAC3DwnB,GACFD,EAAMvnB,cAAgBwnB,EACtBD,EAAMxnB,iBAAmBynB,IACfD,EAAMvnB,eAAiBunB,EAAMtsB,kBACvCssB,EAAMvnB,cACJunB,EAAM1hC,WACNH,EAAiC6hC,EAAMtsB,iBACzCssB,EAAMxnB,iBAAmBwnB,EAAMvnB,cAEnC,CAAE,MAAO7D,GACPxE,QAAQC,KAAK,wCAAyCuE,EACxD,CAMA,MAJ6B,iBAAlBorB,EAAMva,UACfua,EAAMva,QAAU,wBAGXua,CACT,CArKmCE,CAAqBlmC,GAIpD,aAuBJya,eAAyCza,GACvC,IACE,aAAaszB,GAA0BtzB,EAASuzB,GAClD,CAAE,MAAO3Y,GAEP,OADAxE,QAAQwE,MAAM,oCAAqCA,GAC5Cza,IAAYpB,YAAcqC,SAAS4T,IAC5C,CACF,CAhCUmxB,CAA0BP,SAEnBlH,GAAUkH,EACzB,CAAE,MAAOhrB,GAEP,OADAxE,QAAQwE,MAAM,sBAAuBA,GAC9B,IACT,CACF,CAeewrB,CAAepmC,KAR1BoW,QAAQC,KACN,4EAEK,KAMX,EAuNAoE,eAAe4rB,GAAwBvB,EAAmB,CAAA,EAAIC,GAC5D,MAAMuB,EAAazB,GAAsBC,EAAkBC,GACrDthC,QA1BRgX,iBACE,GAAI8qB,IAAmBC,GACrB,UACQA,EACR,CAAE,MAAOe,GACPnwB,QAAQC,KACN,uDACAkwB,EAEJ,CAEF,OAe6Cd,GAAoBa,EAdnE,CAcoBE,GAClB,MAAO,CACLruB,GAAI1U,EACJ68B,QAAS,IAAO78B,EAAM48B,GAAgB58B,GAAO0+B,QAAQC,UACrDqE,OAASvD,GACPz/B,EAAMw/B,GAAiBx/B,EAAKy/B,GAAcf,QAAQC,UAExD,CAQAiE,GAAwBnd,QAAU,CAAC4b,EAAkB9kC,IAE5CqmC,GAAwB,IADZxB,GAAsBC,EAAkB9kC,GACXuZ,KAAM,YASxD8sB,GAAwBzrB,MAAQ,CAACkqB,EAAkB9kC,IAE1CqmC,GAAwB,IADZxB,GAAsBC,EAAkB9kC,GACXuZ,KAAM,UASxD8sB,GAAwBld,QAAU,CAAC2b,EAAkB9kC,IAE5CqmC,GAAwB,IADZxB,GAAsBC,EAAkB9kC,GACXuZ,KAAM,YASxD8sB,GAAwBjd,KAAO,CAAC0b,EAAkB9kC,IAEzCqmC,GAAwB,IADZxB,GAAsBC,EAAkB9kC,GACXuZ,KAAM,SASxD8sB,GAAwBK,QAAU,CAAC5B,EAAkB9kC,IAE5CqmC,GAAwB,CAC7B9sB,KAAM,OACNoX,YAAY,EACZ3U,SAAU,EACVkD,iBAAiB,EACjB1f,cAAc,KANGqlC,GAAsBC,EAAkB9kC,KAiB7DqmC,GAAwBjiB,OAAS,CAAC0gB,EAAkB9kC,IAE3CqmC,GAAwB,CAC7B7a,WAAW,KAFMqZ,GAAsBC,EAAkB9kC,KAO7D,MAAMkpB,GAAUmd,GAAwBnd,QAClCtO,GAAQyrB,GAAwBzrB,MAChCuO,GAAUkd,GAAwBld,QAClCC,GAAOid,GAAwBjd,KAC/Bsd,GAAUL,GAAwBK,QAClCtiB,GAASiiB,GAAwBjiB,OAmBjCuiB,GAAelsB,UACnB,IAAImsB,EAAiBxuB,EACrB,GAAIA,GAAiC,mBAAhBA,EAAOuC,KAC1B,IACEisB,QAAuBxuB,CACzB,CAAE,MACA,MACF,CAGFmtB,IAAkB,EAClBC,GAAe,WACb,IACgC,iBAAnBoB,GAA+BA,EAAe/hC,OAAS,QAC1Dw7B,GAAgBuG,GACbA,GAA4C,iBAAnBA,EACI,mBAA3BA,EAAetG,cAClBsG,EAAetG,UACZsG,EAAevZ,MAAuC,iBAAxBuZ,EAAevZ,WAChDgT,GAAgBuG,EAAevZ,MAC5BuZ,EAAezuB,IAAmC,iBAAtByuB,EAAezuB,SAC9CkoB,GAAgBuG,EAAezuB,UAE/BmoB,WAGFA,IAEV,CAAC,QACCiF,IAAkB,EAClBC,GAAe,IACjB,CACD,EArBc,SAsBTA,IAEFqB,GAAUpsB,UACd8qB,IAAkB,EAClBC,GAAe,WACb,UD1GG/qB,iBACL,IACE,IAAK,MAAM,CAAGsS,KAAUgQ,GAClBhQ,GAAOqS,OAAOsB,qBAAqB3T,EAAMqS,OAE/CrC,GAAQzY,QACRiT,GAAM1yB,OAAS,EACfw4B,KAEA,MAAMyJ,EAAe7mC,MAAMuT,KAAK6jB,GAAO3P,UACpCpkB,IAAKyE,GAAMA,EAAEwQ,OACblE,OAAOhU,eAEJ8hC,QAAQ4E,WACZD,EAAaxjC,IAAImX,UACf,UACQylB,GAAWx+B,EACnB,CAAE,MAAOslC,GACP5wB,QAAQC,KAAK,6CAA8C2wB,EAC7D,IAGN,CAAE,MAAO7wB,GACPC,QAAQwE,MAAM,yBAA0BzE,EAC1C,CACF,CCkFY8wB,EACR,CAAC,QACC1B,IAAkB,EAClBC,GAAe,IACjB,CACD,EAPc,SAQTA,IAEFlhB,GAAQuiB,GACRK,GAAaL,GAGbM,GAAoC,MAU1C1sB,eAAe2sB,GAAaC,EAAa/B,EAAW,CAAA,EAAItlC,EAAU,CAAA,GAChE,MAAMsnC,EAAehC,GAAgC,iBAAbA,EAAwBA,EAAW,CAAA,EACrEhc,EAActpB,GAA8B,iBAAZA,EAAuBA,EAAU,CAAA,EAEjEunC,EAAeD,EAAaZ,SAAW,aACvCc,EACoB,iBAAjBD,GAA8C,OAAjBA,GAA0BtnC,MAAMC,QAAQqnC,GAUxE,IACKje,EACH/P,KAAM,OACNkS,QAASxqB,OAAOsmC,GAChBvrB,SAAUmrB,GACVjoB,iBAAiB,EACjB1f,cAAc,EACdmxB,WAAYrH,EAAYqH,aAAc,GAhBxC,IACKrH,EACH/P,KAAM,OACNyC,SAAUmrB,GACVjoB,iBAAiB,EACjB1f,cAAc,EACdmxB,YAAY,KACT4W,GAYLE,QAAsBpB,GAAwBmB,GAE9CE,EAAc,IACfpe,EACH9pB,aAAc8pB,EAAY9pB,cAG5B,IACE,MAAMmoC,EACmB,mBAAhBN,EAA6BA,IAAgBA,EAChD7+B,QAAem/B,EAErB,GAAIF,GAAkD,mBAA1BA,EAAcnH,QACxC,UACQmH,EAAcnH,SACtB,CAAE,MACA,CAIJ,MAAMsH,EAC4B,mBAAzBN,EAAape,QAChBoe,EAAape,QAAQ1gB,GACpB8+B,EAAape,SAAW,QAEzB2e,EACqB,iBAAlBD,GAAgD,OAAlBA,GAA2B3nC,MAAMC,QAAQ0nC,GAE1E,IAAKF,EAAanuB,KAAM,UAAWkS,QAASxqB,OAAO2mC,IADnD,IAAKF,EAAanuB,KAAM,aAAcquB,GAK5C,aAFMvB,GAAwBwB,GAEvBr/B,CACT,CAAE,MAAO2N,GACP,GAAIsxB,GAAkD,mBAA1BA,EAAcnH,QACxC,UACQmH,EAAcnH,SACtB,CAAE,MACA,CAIJ,MAAMwH,EAC0B,mBAAvBR,EAAa1sB,MAChB0sB,EAAa1sB,MAAMzE,GAClBmxB,EAAa1sB,OAAS,wBAEvBmtB,EACmB,iBAAhBD,GAA4C,OAAhBA,GAAyB7nC,MAAMC,QAAQ4nC,GAEtE,IAAKJ,EAAanuB,KAAM,QAASkS,QAASxqB,OAAO6mC,IADjD,IAAKJ,EAAanuB,KAAM,WAAYuuB,GAK1C,YAFMzB,GAAwB0B,GAExB5xB,CACR,CACF,CAEAkwB,GAAwB2B,QAAUZ,GAClCf,GAAwB/F,QAAUqG,GAClCN,GAAwBa,WAAaL,GACrCR,GAAwB/hB,MAAQuiB,GAGhC,MAAMoB,GAA+C,SA4CrD,GAAsB,oBAAXlmC,QAA8C,oBAAbX,WACrCW,OAAOmmC,kCAAmC,CAC7CnmC,OAAOmmC,mCAAoC,EAC3C,MAAMptB,EAAa1T,IACjB,GAAc,WAAVA,EAAE3D,KAA8B,QAAV2D,EAAE3D,IAC1B,WACE,IACE8hC,IAAkB,EAClBC,GAAe,WACb,UACQlF,IACR,CAAC,QACCiF,IAAkB,EAClBC,GAAe,IACjB,CACD,EAPc,SAQTA,EACR,CAAE,MAAO5qB,GACPxE,QAAQwE,MAAM,6BAA8BA,GAC5C2qB,IAAkB,EAClBC,GAAe,IACjB,CACD,EAjBD,QAkBK,GAAc,OAAVp+B,EAAE3D,MAAkB2D,EAAE+gC,QAAU/gC,EAAEghC,WAAuB,MAAVhhC,EAAE3D,KAAyB,MAAV2D,EAAE3D,KAAe,CAE1F,MAAMqjC,EAAe1lC,SAASoU,iBAAiB,2CAC/C,GAAIsxB,EAAajiC,OAAS,EAAG,CAC3B,MAAMwjC,EAAcvB,EAAaA,EAAajiC,OAAS,GAEjDyjC,EAAcD,EAAYhtB,cAAc,6BAC1CitB,GAA4C,mBAAtBA,EAAYC,MACpCD,EAAYC,QAC0B,mBAAtBF,EAAYE,OAC5BF,EAAYE,OAEhB,CACF,GAEFxmC,OAAOiZ,iBAAiB,UAAWF,EAAW,CAAEiG,SAAS,GAC3D,CAGF,IACwB,oBAAXhf,SACTA,OAAO2hB,kBAAoB,CACzB3jB,YACAI,YACAyB,cACAE,qBACAmmC,WACAO,YAAanC,GACbnd,WACAtO,SACAuO,WACAC,QACAsd,WACAtiB,UACA6gB,oBACAI,sBACAoD,KAAM5B,GACNvG,QAASqG,GACTO,WAAYL,GACZviB,MAAOuiB,GACPO,gBACAY,QAASZ,GACTnE,oBACA1e,kBACAE,iBACAlB,WACAQ,sBACAG,kBACAG,oBACAK,oBACAuJ,gBACAC,kBACAiK,uBACAE,yBACAI,0BACAwB,mBACAuB,yBACAP,eACA3I,WACAiI,qBACA/3B,kBACAD,sBACA26B,mBACA3X,uBACAE,mBACAC,qBACAC,sBACAU,cACAY,kCACAM,6BACAQ,uBACA9G,kBACAO,oBAGN,CAAE,MAAO5G,IACPxE,QAAQwE,MAAM,4BAA6BA,GAC7C,k3BP91BO,WACLmY,GAAkBzO,QAClB0O,GAAe1O,OACjB,oJM2gBO,WACL,IAAK,MAAM,CAAGyI,KAAUgQ,GAClBhQ,GAAOqS,OAAOsB,qBAAqB3T,EAAMqS,OAE/CrC,GAAQzY,QACRiT,GAAM1yB,OAAS,EACf,IAAK,MAAM,CAAGiyB,KAASO,GAAQ,CAQ7B,GAPAP,EAAK9K,OAAO1H,QACZwS,EAAKqJ,OAAOjT,kBACZ4J,EAAKve,OAAO6E,wBACZ0Z,EAAKve,OAAOiD,gBACZsb,EAAKve,OAAOyE,iBACZ8Z,EAAKve,OAAO0U,kBACZ6J,EAAKve,OAAO4C,aACR2b,EAAKve,OAAOiH,mBAAoB,CAClC,IACEsX,EAAKve,MAAMiH,mBAAmBiiB,QAChC,CAAE,MAAO,CACT3K,EAAKve,MAAMiH,mBAAqB,IAClC,CACA,MAAMkiB,EAAQ5K,EAAKqJ,OAAO9kB,cAAc,sBACpCqmB,GAAOC,cACT1V,aAAayV,EAAMC,aACnBD,EAAMC,YAAc,KAExB,CACwB,oBAAbvgC,UACUA,SAASoU,iBAAiB,4BAClCzD,QAAS/M,IAClB,IACEA,EAAEm5B,mBACJ,CAAE,MAAO,IAGb9G,GAAO/S,QACP0Y,GAAe,EACfC,GAAe,EACf+F,IAAa,EACb3F,IACF"}
|